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