При работе с конфигурациями на платформе 1С:Предприятие 8.3, особенно с типовыми решениями, такими как 1С:Управление торговлей 11 (УТ11), мы часто сталкиваемся с необходимостью разобраться в механизмах работы стандартных команд. Одной из таких команд является "Создать на основании", которая позволяет быстро формировать новые документы на базе уже существующих. В этой статье мы подробно рассмотрим, как найти обработчик параметризуемой команды "Отчет комиссионера" при ее создании на основании документа "Поступление товаров и услуг" в УТ11, учитывая активное использование Библиотеки стандартных подсистем (БСП).
Прежде чем углубляться в поиск кода, давайте выясним, что представляют собой параметризуемые команды и как работает механизм "Создать на основании".
Параметризуемые команды: Это команды, которые принимают один или несколько входных параметров для выполнения своих действий. В контексте команд "Создать на основании" таким входным параметром обычно является ссылка на исходный документ, на основании которого создается новый. Например, при создании "Отчета комиссионера" на основании "Поступления товаров и услуг", параметром будет ссылка на конкретный документ "Поступление товаров и услуг". Этот параметр позволяет обработчику команды получить всю необходимую информацию из документа-основания и корректно заполнить поля нового документа.
Механизм "Создать на основании": Этот механизм является одной из ключевых удобств в 1С. Он позволяет значительно ускорить процесс ввода данных, автоматически перенося информацию из одного документа в другой. Когда мы выбираем команду "Создать на основании", система не просто создает пустой новый документ, а запускает специальную логику, которая определяет, какие данные и как должны быть перенесены. В типовых конфигурациях, особенно в УТ11, этот механизм тесно интегрирован с подсистемой БСП "Подключаемые команды", что придает ему дополнительную гибкость и централизованное управление.
Таким образом, когда мы ищем обработчик такой команды, мы фактически ищем код, который отвечает за получение данных из исходного документа и их корректное размещение в реквизитах нового документа.
Для команд, которые создают новые документы на основании существующих, существует типовое и наиболее вероятное место реализации логики заполнения. Этим местом является процедура с именем ОбработкаЗаполнения.
Эта процедура, как правило, располагается в Модуле менеджера или Модуле объекта целевого документа. В нашем случае, поскольку мы создаем документ "Отчет комиссионера (агента) о продажах" (именно так он называется в УТ11), на основании документа "Поступление товаров и услуг", нам следует искать процедуру ОбработкаЗаполнения в Модуле менеджера документа ОтчетКомиссионераОПродажах.
Давайте разберем структуру этой процедуры и ее назначение:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) Экспорт
// Эта процедура вызывается системой 1С, когда документ создается
// на основании другого документа или других данных.
// Параметр "ДанныеЗаполнения"
// ---------------
// Это ключевой параметр. Он содержит информацию, на основании которой
// нужно заполнить текущий документ. Тип этого параметра может быть разным:
// - Ссылка на документ-основание (наиболее частый случай).
// - Структура, содержащая несколько ссылок или дополнительные параметры.
// - Массив, содержащий несколько ссылок на документы.
// В нашем случае, если "Отчет комиссионера" создается на основании
// "Поступления товаров и услуг", то "ДанныеЗаполнения"
// скорее всего будет иметь тип "ДокументСсылка.ПоступлениеТоваровУслуг".
// Пример получения ссылки на документ-основание и использования ее:
// Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ПоступлениеТоваровУслуг") Тогда
// ДокументОснование = ДанныеЗаполнения;
//
// // Заполнение реквизитов Отчета комиссионера из Поступления товаров и услуг
// // Например:
// ЭталонныйОбъект.Контрагент = ДокументОснование.Контрагент;
// ЭталонныйОбъект.Организация = ДокументОснование.Организация;
// ЭталонныйОбъект.Договор = ДокументОснование.Договор;
//
// // Для табличных частей потребуется более сложная логика:
// // Перебрать товары из ДокументОснование.Товары
// // и добавить их в ЭталонныйОбъект.ТоварыОтчетаКомиссионера
// // с учетом особенностей комиссионной торговли (например, себестоимости).
// КонецЕсли;
// ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда
// // Если ДанныеЗаполнения передаются как структура
// // с более сложными параметрами.
// КонецЕсли;
// Параметр "СтандартнаяОбработка"
// -------------------
// Это булевый параметр, который позволяет нам управлять стандартной логикой
// заполнения. Если мы полностью переопределяем заполнение, мы можем
// установить СтандартнаяОбработка = Ложь, чтобы предотвратить
// выполнение каких-либо стандартных действий. Однако в большинстве случаев
// мы дополняем стандартную обработку, а не полностью заменяем ее.
// Внутри этой процедуры может быть как непосредственная логика заполнения
// реквизитов документа, так и вызовы общих процедур из других модулей,
// в том числе из модулей БСП, которые специализируются на типовом заполнении
// определенных видов документов.
КонецПроцедуры
Если вы не обнаружите процедуру ОбработкаЗаполнения непосредственно в Модуле менеджера, не отчаивайтесь. Она все равно может быть вызвана из других модулей, которые, в свою очередь, вызываются из Модуля менеджера или Модуля объекта. Главное - это понимание того, что именно эта процедура является точкой входа для логики заполнения.
Как уже упоминалось, 1С:Управление торговлей 11 активно использует Библиотеку стандартных подсистем (БСП). Одной из ключевых подсистем в контексте нашего вопроса является "Подключаемые команды".
Централизованное управление командами: Подсистема ПодключаемыеКоманды БСП позволяет централизованно управлять всеми командами, которые могут быть подключены к различным объектам конфигурации (документам, справочникам, отчетам и т.д.). Разработчики регистрируют команды через специальные механизмы БСП, указывая их имя, группу (например, "Создать на основании"), видимость, а также связь с конкретным обработчиком.
Абстракция вызова: Когда мы видим команду "Отчет комиссионера" в группе "Создать на основании" для документа "Поступление товаров и услуг", это означает, что данная команда была зарегистрирована через механизм ПодключаемыеКоманды. БСП берет на себя задачу отображения этой команды в интерфейсе и последующего вызова связанного с ней обработчика. Сама БСП, как правило, не содержит *конкретную* логику заполнения для каждого документа, но она *инициирует* вызов этой логики.
Связь с ОбработкаЗаполнения: Обычно, когда команда, зарегистрированная через БСП, предназначена для создания нового документа на основании, она косвенно или прямо вызывает процедуру ОбработкаЗаполнения целевого документа. То есть, БСП выступает в роли посредника, который по запросу пользователя вызывает стандартный обработчик заполнения документа. Таким образом, даже если БСП участвует в процессе, процедура ОбработкаЗаполнения остается ключевым местом для поиска специфической логики.
Поиск в общих модулях БСП: Иногда, если вы хотите понять, как именно команда регистрируется или как БСП организует вызов, вы можете обратиться к общим модулям ПодключаемыеКомандыКлиентСервер, ПодключаемыеКоманды. В этих модулях содержатся экспортные процедуры и функции, которые позволяют регистрировать команды (например, ПодключаемыеКоманды.ДобавитьКоманду()) и выполнять их. Изучение этих модулей может дать более глубокое понимание всего процесса.
Знание того, что УТ11 использует БСП, помогает сузить область поиска и понять архитектурные решения, лежащие в основе работы команд.
Теперь, когда мы понимаем теорию, давайте разработаем практическую пошаговую стратегию для поиска обработчика команды "Отчет комиссионера".
Шаг 1: Прямой поиск в модуле менеджера целевого документа
Это самый быстрый и наиболее вероятный путь к решению. Начнем с того, что именно здесь, согласно типовым практикам 1С, должна находиться основная логика заполнения.
ОтчетКомиссионераОПродажах (именно так он называется в УТ11).Модуль менеджера.ОбработкаЗаполнения. Важно, чтобы она была экспортной, то есть имела ключевое слово Экспорт после объявления процедуры.Пример искомой процедуры:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) Экспорт
// Здесь находится код, который нас интересует.
// Он будет заполнять реквизиты нового Отчета комиссионера
// на основе данных, переданных в ДанныеЗаполнения.
КонецПроцедуры
Если вы обнаружили эту процедуру, вы, скорее всего, нашли основную часть искомого обработчика. Изучите ее содержимое. Она может как содержать всю логику заполнения, так и вызывать другие внутренние или общие процедуры для выполнения этой работы.
Шаг 2: Глобальный поиск по всей конфигурации
Если на Шаге 1 ничего не найдено, или вы подозреваете, что логика раскидана по нескольким модулям, перейдем к более широкому поиску.
ПодключаемыеКоманды.ДобавитьКоманду или ПодключаемыеКоманды.ВыполнитьКоманду. Эти вызовы обычно находятся в модулях менеджеров или общих модулях, отвечающих за инициализацию команд.Шаг 3: Использование отладчика для динамического анализа
Отладчик — это наш самый мощный инструмент для понимания того, как система работает в runtime. Он позволяет пошагово проследить выполнение кода.
ОбработкаЗаполнения в Модуле менеджера документа ОтчетКомиссионераОПродажах, даже если вы не до конца уверены, что именно она будет вызвана.ПриСозданииНаСервере формы документа ОтчетКомиссионераОПродажах. Эта процедура вызывается при создании новой формы документа. Оттуда вы сможете увидеть, какие инициализирующие процедуры вызываются, и, возможно, обнаружите косвенный вызов к логике заполнения.ПодключаемыеКомандыКлиентСервер или ПодключаемыеКоманды, которые, по вашему мнению, могут иметь отношение к регистрации или выполнению команды. Это поможет понять, как БСП передает управление вашей логике.Шаг 4: Изучение документации по БСП
Документация по Библиотеке стандартных подсистем (БСП) является бесценным источником информации, особенно когда мы имеем дело с типовыми конфигурациями, построенными на ее основе. Она описывает архитектурные решения и рекомендуемые подходы к разработке.
ОбработкаЗаполнения).Шаг 5: Анализ модулей форм исходного документа
Иногда полезно посмотреть, как команда отображается и вызывается со стороны исходного документа.
ПоступлениеТоваровУслуг (с которой вызывается команда "Создать на основании").Модуле формы найдите вызовы общих модулей, связанных с БСП, например, ПодключаемыеКомандыКлиентСервер.ПриСозданииНаСервере или ОбновитьКоманды.Применяя эту комбинацию подходов, мы с большой вероятностью найдем искомый обработчик и разберемся в логике работы параметризуемой команды "Создать на основании" для "Отчета комиссионера" в 1С:Управление торговлей 11.