Как правильно заполнять реквизиты документа при программном создании в 1С:Управляемые формы?

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

При переходе от обычных форм к управляемым многие разработчики сталкиваются с вопросом: как программно заполнить документ так, чтобы автоматически сработали все алгоритмы пересчета и заполнения связанных реквизитов (например, ДоговорКонтрагента при смене контрагента)? В обычных формах мы привыкли вызывать процедуры ПриИзменении напрямую из модуля объекта, но в Управляемых формах этот путь ведет к ошибкам, так как логика часто завязана на контекст формы.

Разберемся с архитектурой управляемых форм

Важно понимать, что процедуры ПриИзменении в модулях форм — это не платформенные механизмы, а кастомная логика, написанная разработчиками конкретной конфигурации. Основная проблема заключается в том, что эти процедуры требуют передачи объекта Форма в качестве параметра. Если вы попытаетесь вызвать такую функцию из фонового задания или внешней обработки, где формы не существует, вы неизбежно столкнетесь с ошибкой.

Когда вы создаете документ программно, вы работаете с Объектом (данными), а не с Формой (интерфейсом). Попытка подсунуть форму в серверную процедуру — это архитектурная ошибка. Рассмотрим, как поступать правильно.

Шаг 1: Использование механизма ОбработкаЗаполнения

Самый правильный и «чистый» способ инициализировать данные документа — это использование стандартного события ОбработкаЗаполнения в модуле объекта. Это событие автоматически вызывается платформой при создании документа методом Заполнить() или Документы.ИмяДокумента.СоздатьДокумент().

Если вам нужно создать документ на основании другого, используйте этот метод:


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

Шаг 2: Вынос логики в общие модули

Если в типовой конфигурации нужная вам логика расчетов «спрятана» в модуле формы и требует параметр Форма, не пытайтесь её копировать или вызывать напрямую. Поступите следующим образом:

  1. Найдите в коде конфигурации процедуру, которая выполняет пересчет (например, обновление договора при смене контрагента).
  2. Если эта логика пересчета полезна для других задач, создайте новый ОбщийМодуль (серверный).
  3. Перенесите логику из модуля формы в этот общий модуль, изменив входной параметр с Форма на Объект.

Теперь ваша функция будет выглядеть примерно так:


// В общем модуле
Процедура ЗаполнитьРеквизитыПоКонтрагенту(ОбъектДокумента) Экспорт
    // Здесь выполняем все пересчеты, не привязываясь к форме
    ОбъектДокумента.Договор = ПолучитьДоговорПоУмолчанию(ОбъектДокумента.Контрагент);
    // ... другие расчеты ...
КонецПроцедуры

Шаг 3: Работа с объектом через форму

Если по каким-то причинам (например, при сложной интеграции с UI) вам все же необходимо создать документ с участием формы, помните, что Форма.Объект — это и есть данные вашего документа. Вы можете заполнить реквизиты объекта, находясь в серверном контексте формы:


// Получение формы
Форма = ПолучитьФорму("Документ.ПоступлениеНаРасчетныйСчет.Форма.ФормаДокумента");
ОбъектДокумента = Форма.Объект;

// Заполнение
ОбъектДокумента.Контрагент = ВыбранныйКонтрагент;

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

Итог: основные рекомендации

Чтобы ваша разработка была профессиональной и не вызывала проблем при обновлениях:

Следуя этим простым шагам, вы сможете автоматизировать создание документов в 1С, сохранив чистоту кода и стабильность системы. Главное — разделять логику данных и логику представления данных на экране.

← На главную