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