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