Как найти обработчик параметризуемой команды "Создать на основании" для документа "Отчет комиссионера" в 1С:Управление торговлей 11?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При работе с конфигурациями на платформе 1С:Предприятие 8.3, особенно с типовыми решениями, такими как 1С:Управление торговлей 11 (УТ11), мы часто сталкиваемся с необходимостью разобраться в механизмах работы стандартных команд. Одной из таких команд является "Создать на основании", которая позволяет быстро формировать новые документы на базе уже существующих. В этой статье мы подробно рассмотрим, как найти обработчик параметризуемой команды "Отчет комиссионера" при ее создании на основании документа "Поступление товаров и услуг" в УТ11, учитывая активное использование Библиотеки стандартных подсистем (БСП).

Понимание параметризуемых команд и механизма "Создать на основании"

Прежде чем углубляться в поиск кода, давайте выясним, что представляют собой параметризуемые команды и как работает механизм "Создать на основании".

  1. Параметризуемые команды: Это команды, которые принимают один или несколько входных параметров для выполнения своих действий. В контексте команд "Создать на основании" таким входным параметром обычно является ссылка на исходный документ, на основании которого создается новый. Например, при создании "Отчета комиссионера" на основании "Поступления товаров и услуг", параметром будет ссылка на конкретный документ "Поступление товаров и услуг". Этот параметр позволяет обработчику команды получить всю необходимую информацию из документа-основания и корректно заполнить поля нового документа.

  2. Механизм "Создать на основании": Этот механизм является одной из ключевых удобств в 1С. Он позволяет значительно ускорить процесс ввода данных, автоматически перенося информацию из одного документа в другой. Когда мы выбираем команду "Создать на основании", система не просто создает пустой новый документ, а запускает специальную логику, которая определяет, какие данные и как должны быть перенесены. В типовых конфигурациях, особенно в УТ11, этот механизм тесно интегрирован с подсистемой БСП "Подключаемые команды", что придает ему дополнительную гибкость и централизованное управление.

Таким образом, когда мы ищем обработчик такой команды, мы фактически ищем код, который отвечает за получение данных из исходного документа и их корректное размещение в реквизитах нового документа.

Где искать обработчик: процедура ОбработкаЗаполнения

Для команд, которые создают новые документы на основании существующих, существует типовое и наиболее вероятное место реализации логики заполнения. Этим местом является процедура с именем ОбработкаЗаполнения.

Эта процедура, как правило, располагается в Модуле менеджера или Модуле объекта целевого документа. В нашем случае, поскольку мы создаем документ "Отчет комиссионера (агента) о продажах" (именно так он называется в УТ11), на основании документа "Поступление товаров и услуг", нам следует искать процедуру ОбработкаЗаполнения в Модуле менеджера документа ОтчетКомиссионераОПродажах.

Давайте разберем структуру этой процедуры и ее назначение:


Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) Экспорт
    // Эта процедура вызывается системой 1С, когда документ создается
    // на основании другого документа или других данных.

    // Параметр "ДанныеЗаполнения"
    // ---------------
    // Это ключевой параметр. Он содержит информацию, на основании которой
    // нужно заполнить текущий документ. Тип этого параметра может быть разным:
    // - Ссылка на документ-основание (наиболее частый случай).
    // - Структура, содержащая несколько ссылок или дополнительные параметры.
    // - Массив, содержащий несколько ссылок на документы.

    // В нашем случае, если "Отчет комиссионера" создается на основании
    // "Поступления товаров и услуг", то "ДанныеЗаполнения"
    // скорее всего будет иметь тип "ДокументСсылка.ПоступлениеТоваровУслуг".

    // Пример получения ссылки на документ-основание и использования ее:
    // Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ПоступлениеТоваровУслуг") Тогда
    //     ДокументОснование = ДанныеЗаполнения;
    //
    //     // Заполнение реквизитов Отчета комиссионера из Поступления товаров и услуг
    //     // Например:
    //     ЭталонныйОбъект.Контрагент = ДокументОснование.Контрагент;
    //     ЭталонныйОбъект.Организация = ДокументОснование.Организация;
    //     ЭталонныйОбъект.Договор = ДокументОснование.Договор;
    //
    //     // Для табличных частей потребуется более сложная логика:
    //     // Перебрать товары из ДокументОснование.Товары
    //     // и добавить их в ЭталонныйОбъект.ТоварыОтчетаКомиссионера
    //     // с учетом особенностей комиссионной торговли (например, себестоимости).
    // КонецЕсли;
    // ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда
    //     // Если ДанныеЗаполнения передаются как структура
    //     // с более сложными параметрами.
    // КонецЕсли;

    // Параметр "СтандартнаяОбработка"
    // -------------------
    // Это булевый параметр, который позволяет нам управлять стандартной логикой
    // заполнения. Если мы полностью переопределяем заполнение, мы можем
    // установить СтандартнаяОбработка = Ложь, чтобы предотвратить
    // выполнение каких-либо стандартных действий. Однако в большинстве случаев
    // мы дополняем стандартную обработку, а не полностью заменяем ее.

    // Внутри этой процедуры может быть как непосредственная логика заполнения
    // реквизитов документа, так и вызовы общих процедур из других модулей,
    // в том числе из модулей БСП, которые специализируются на типовом заполнении
    // определенных видов документов.
КонецПроцедуры

Если вы не обнаружите процедуру ОбработкаЗаполнения непосредственно в Модуле менеджера, не отчаивайтесь. Она все равно может быть вызвана из других модулей, которые, в свою очередь, вызываются из Модуля менеджера или Модуля объекта. Главное - это понимание того, что именно эта процедура является точкой входа для логики заполнения.

Роль Библиотеки стандартных подсистем (БСП) и "Подключаемые команды"

Как уже упоминалось, 1С:Управление торговлей 11 активно использует Библиотеку стандартных подсистем (БСП). Одной из ключевых подсистем в контексте нашего вопроса является "Подключаемые команды".

  1. Централизованное управление командами: Подсистема ПодключаемыеКоманды БСП позволяет централизованно управлять всеми командами, которые могут быть подключены к различным объектам конфигурации (документам, справочникам, отчетам и т.д.). Разработчики регистрируют команды через специальные механизмы БСП, указывая их имя, группу (например, "Создать на основании"), видимость, а также связь с конкретным обработчиком.

  2. Абстракция вызова: Когда мы видим команду "Отчет комиссионера" в группе "Создать на основании" для документа "Поступление товаров и услуг", это означает, что данная команда была зарегистрирована через механизм ПодключаемыеКоманды. БСП берет на себя задачу отображения этой команды в интерфейсе и последующего вызова связанного с ней обработчика. Сама БСП, как правило, не содержит *конкретную* логику заполнения для каждого документа, но она *инициирует* вызов этой логики.

  3. Связь с ОбработкаЗаполнения: Обычно, когда команда, зарегистрированная через БСП, предназначена для создания нового документа на основании, она косвенно или прямо вызывает процедуру ОбработкаЗаполнения целевого документа. То есть, БСП выступает в роли посредника, который по запросу пользователя вызывает стандартный обработчик заполнения документа. Таким образом, даже если БСП участвует в процессе, процедура ОбработкаЗаполнения остается ключевым местом для поиска специфической логики.

  4. Поиск в общих модулях БСП: Иногда, если вы хотите понять, как именно команда регистрируется или как БСП организует вызов, вы можете обратиться к общим модулям ПодключаемыеКомандыКлиентСервер, ПодключаемыеКоманды. В этих модулях содержатся экспортные процедуры и функции, которые позволяют регистрировать команды (например, ПодключаемыеКоманды.ДобавитьКоманду()) и выполнять их. Изучение этих модулей может дать более глубокое понимание всего процесса.

Знание того, что УТ11 использует БСП, помогает сузить область поиска и понять архитектурные решения, лежащие в основе работы команд.

Пошаговая стратегия поиска обработчика

Теперь, когда мы понимаем теорию, давайте разработаем практическую пошаговую стратегию для поиска обработчика команды "Отчет комиссионера".

  1. Шаг 1: Прямой поиск в модуле менеджера целевого документа

    Это самый быстрый и наиболее вероятный путь к решению. Начнем с того, что именно здесь, согласно типовым практикам 1С, должна находиться основная логика заполнения.

    1. Откройте конфигурацию 1С:Предприятие в режиме "Конфигуратор".
    2. В дереве объектов конфигурации перейдите к ветке "Документы".
    3. Найдите документ с именем ОтчетКомиссионераОПродажах (именно так он называется в УТ11).
    4. Разверните его и дважды щелкните на Модуль менеджера.
    5. В открывшемся модуле используйте поиск (Ctrl+F) для нахождения процедуры с именем ОбработкаЗаполнения. Важно, чтобы она была экспортной, то есть имела ключевое слово Экспорт после объявления процедуры.
    6. Пример искомой процедуры:

      
      Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) Экспорт
          // Здесь находится код, который нас интересует.
          // Он будет заполнять реквизиты нового Отчета комиссионера
          // на основе данных, переданных в ДанныеЗаполнения.
      КонецПроцедуры
      

      Если вы обнаружили эту процедуру, вы, скорее всего, нашли основную часть искомого обработчика. Изучите ее содержимое. Она может как содержать всю логику заполнения, так и вызывать другие внутренние или общие процедуры для выполнения этой работы.

  2. Шаг 2: Глобальный поиск по всей конфигурации

    Если на Шаге 1 ничего не найдено, или вы подозреваете, что логика раскидана по нескольким модулям, перейдем к более широкому поиску.

    1. В конфигураторе нажмите Ctrl+Shift+F (или "Конфигурация" -> "Найти во всех модулях").
    2. В окне поиска задайте следующие параметры:
      • В поле "Искать" введите "ОбработкаЗаполнения" и выполните поиск. Это может выявить вызовы этой процедуры из других мест.
      • Затем повторите поиск, используя имя или часть имени команды, например, "ОтчетКомиссионера". Проанализируйте результаты: возможно, вы найдете места, где команда регистрируется или ее обработчики явно указываются.
      • Также полезно искать вызовы процедур БСП, связанных с командами: ПодключаемыеКоманды.ДобавитьКоманду или ПодключаемыеКоманды.ВыполнитьКоманду. Эти вызовы обычно находятся в модулях менеджеров или общих модулях, отвечающих за инициализацию команд.
    3. Тщательно проанализируйте найденные фрагменты кода. Они могут привести вас к модулю или процедуре, содержащей нужную логику.
  3. Шаг 3: Использование отладчика для динамического анализа

    Отладчик — это наш самый мощный инструмент для понимания того, как система работает в runtime. Он позволяет пошагово проследить выполнение кода.

    1. Откройте конфигурацию в режиме "Конфигуратор".
    2. Установите точку останова (F9) в начале процедуры ОбработкаЗаполнения в Модуле менеджера документа ОтчетКомиссионераОПродажах, даже если вы не до конца уверены, что именно она будет вызвана.
    3. Запустите 1С:Предприятие в режиме отладки (F5 или "Отладка" -> "Начать отладку").
    4. В 1С:Предприятии откройте любой документ "Поступление товаров и услуг".
    5. В меню документа (обычно это кнопка "Создать на основании") выберите "Отчет комиссионера".
    6. Если точка останова сработает, поздравляем! Вы нашли место, где начинается обработка. Далее вы можете пошагово пройтись по коду (F10 - шагнуть через, F11 - шагнуть в), чтобы понять всю логику заполнения.
    7. Если точка останова не сработала:
      • Установите точку останова в процедуре ПриСозданииНаСервере формы документа ОтчетКомиссионераОПродажах. Эта процедура вызывается при создании новой формы документа. Оттуда вы сможете увидеть, какие инициализирующие процедуры вызываются, и, возможно, обнаружите косвенный вызов к логике заполнения.
      • Если вы подозреваете активное участие БСП, можно установить точки останова в экспортных процедурах общих модулей ПодключаемыеКомандыКлиентСервер или ПодключаемыеКоманды, которые, по вашему мнению, могут иметь отношение к регистрации или выполнению команды. Это поможет понять, как БСП передает управление вашей логике.
  4. Шаг 4: Изучение документации по БСП

    Документация по Библиотеке стандартных подсистем (БСП) является бесценным источником информации, особенно когда мы имеем дело с типовыми конфигурациями, построенными на ее основе. Она описывает архитектурные решения и рекомендуемые подходы к разработке.

    1. Обратитесь к официальной документации БСП. В частности, найдите разделы, посвященные подсистеме "Подключаемые команды".
    2. Мы увидим, что именно там могут быть описаны типовые подходы к реализации функционала "Создать на основании", как регистрируются команды, какие параметры передаются в обработчики и какие соглашения по именованию процедур используются (например, та самая ОбработкаЗаполнения).
    3. Изучение этой документации поможет не только решить текущую проблему, но и глубже понять механизмы работы других команд в типовых конфигурациях.
  5. Шаг 5: Анализ модулей форм исходного документа

    Иногда полезно посмотреть, как команда отображается и вызывается со стороны исходного документа.

    1. Откройте форму документа ПоступлениеТоваровУслуг (с которой вызывается команда "Создать на основании").
    2. В ее Модуле формы найдите вызовы общих модулей, связанных с БСП, например, ПодключаемыеКомандыКлиентСервер.ПриСозданииНаСервере или ОбновитьКоманды.
    3. Эти вызовы отвечают за инициализацию и отображение подключаемых команд на форме. Анализ кода в этих местах может дать подсказку о том, как команда "Отчет комиссионера" была зарегистрирована (например, через какую процедуру) и какой обработчик ей назначен, даже если это всего лишь метаданные.

Применяя эту комбинацию подходов, мы с большой вероятностью найдем искомый обработчик и разберемся в логике работы параметризуемой команды "Создать на основании" для "Отчета комиссионера" в 1С:Управление торговлей 11.

← На главную