Как программно заполнить документ на основании, сохранив системный тип данных?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Часто в процессе разработки возникает задача программного создания документа «на основании» другого. При стандартном нажатии пользователем кнопки Ввод на основании система автоматически передает в процедуру ОбработкаЗаполнения ссылку на документ-основание. Однако при попытке реализовать это программно многие разработчики начинают передавать Структуру с данными, что усложняет код и вынуждает использовать «костыли» в виде дополнительных проверок типов. Давайте разберем, как сделать это правильно, сохранив чистоту архитектуры.

Почему передача Структуры — это не лучший путь?

Когда вы передаете Структуру в качестве параметра ДанныеЗаполнения, процедура ОбработкаЗаполнения перестает работать в «штатном» режиме. Вам приходится вручную описывать каждое поле внутри структуры, что делает код трудноподдерживаемым и не масштабируемым. Основная задача — добиться того, чтобы ДанныеЗаполнения имели тип ДокументСсылка.<ИмяДокумента>. Это позволит использовать уже написанный алгоритм заполнения реквизитов, заложенный в конфигурации.

Использование метода Заполнить() для имитации ввода на основании

Самый эффективный и правильный способ имитировать системный ввод на основании — это использование метода Заполнить(). Данный метод является стандартным для всех объектов ДокументОбъект. Когда вы вызываете Заполнить(Основание), платформа 1С автоматически вызывает обработчик ОбработкаЗаполнения и передает туда Основание в качестве параметра ДанныеЗаполнения.

Рассмотрим пошаговый алгоритм реализации:

  1. Создайте новый объект документа, который вы хотите заполнить, используя конструктор СоздатьДокумент().
  2. Подготовьте ссылку на документ-основание, который будет являться источником данных.
  3. Вызовите метод Заполнить(Основание) у созданного объекта.

Посмотрим на пример кода:


// Предположим, у нас есть ссылка на документ ЗаказНаПроизводство
СсылкаНаОснование = Документы.ЗаказНаПроизводство.НайтиПоНомеру("000001", ТекущаяДата());

// Создаем новый документ
НовыйДокумент = Документы.НашНовыйДокумент.СоздатьДокумент();

// Выполняем заполнение стандартным методом
НовыйДокумент.Заполнить(СсылкаНаОснование);

// Теперь НовыйДокумент содержит все данные, перенесенные согласно логике в ОбработкаЗаполнения
// Мы можем открыть его для пользователя или записать
НовыйДокумент.Записать();

Как быть с дополнительными параметрами?

Часто разработчики переходят на Структуру именно потому, что им нужно передать дополнительные данные, которых нет в объекте-основании. Чтобы сохранить чистоту кода, рекомендуем следующий подход: сначала выполните стандартное заполнение через Заполнить(), а затем, уже после вызова этого метода, дозаполните объект вручную.

Рассмотрим структуру работы с дополнительными данными:


// 1. Создание и стандартное заполнение
НовыйДокумент = Документы.НашНовыйДокумент.СоздатьДокумент();
НовыйДокумент.Заполнить(СсылкаНаОснование);

// 2. Ручное дозаполнение специфических полей
НовыйДокумент.ДополнительноеПоле = ЗначениеИзСтруктуры.Поле;
НовыйДокумент.Комментарий = "Заполнено программно с доп. параметрами";

// 3. Сохранение или вывод формы
НовыйДокумент.Записать();

Почему это решение лучше?

Разберем основные преимущества данного подхода:

Если же вам необходимо расширить возможности ввода на основании, рекомендуем использовать механизм ДобавитьКомандыСозданияНаОсновании в менеджере документа. Это позволит добавить вашу кнопку в командную панель документа-основания штатным способом, не нарушая архитектуру системы.

Подводя итог, помните: метод Заполнить() — это ваш главный инструмент. Если вы используете его правильно, вам больше никогда не придется анализировать ТипЗнч(ДанныеЗаполнения) = Тип("Структура"), так как все данные будут передаваться через штатную ссылку на документ.

← На главную