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