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