При переходе с обычных форм на управляемое приложение разработчики часто сталкиваются с изменением архитектуры типовых конфигураций. В обычных формах логика заполнения и пересчета данных часто находилась непосредственно в модуле объекта документа или в модуле формы. В управляемых формах работа интерактивного интерфейса строится вокруг типов ДанныеФормыСтруктура и ДанныеФормыКоллекция, а процедуры формы работают в контексте &НаКлиенте и не принимают объект ДокументОбъект напрямую.
Рассмотрим, как правильно организовать программное создание и заполнение документов в современных типовых решениях (1С:БП 3.0, 1С:ЗУП 3.1, 1С:ERP) без необходимости эмулировать работу клиентской формы.
Проанализируем устройство кода в типовых конфигурациях. Вся ключевая бизнес-логика, расчеты и алгоритмы заполнения вынесены из модулей форм. В управляемом приложении применяются следующие принципы:
Документы.НачислениеЗарплаты.МодульМенеджера).Разберем по шагам практические методы работы с документами на сервере.
Штатный механизм платформы 1С требует инициализации документа через метод Заполнить(). В качестве параметра передается структура с необходимыми данными, которая затем обрабатывается в событии ОбработкаЗаполнения модуля объекта.
Посмотрим на пример заполнения документа на сервере:
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("Организация", СсылкаНаОрганизацию);
ПараметрыЗаполнения.Вставить("Подразделение", СсылкаНаПодразделение);
ПараметрыЗаполнения.Вставить("ПериодРегистрации", НачалоМесяца(ТекущаяДата()));
НовыйДокумент = Документы.Премирование.СоздатьДокумент();
НовыйДокумент.Заполнить(ПараметрыЗаполнения);
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
Если стандартного заполнения недостаточно и требуется пересчет табличных частей (например, в сложных конфигурациях вроде ЗУП или ERP), необходимо обращаться к экспортным функциям модуля менеджера. Процедуры в модуле менеджера принимают либо сам ДокументОбъект, либо структуру с его параметрами.
Рассмотрим пример вызова функции заполнения из модуля менеджера:
НовыйДокумент = Документы.НачислениеЗарплаты.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Организация = СсылкаОрганизация;
// Вызов экспортного метода модуля менеджера для расчета и заполнения
Документы.НачислениеЗарплаты.ЗаполнитьДокумент(НовыйДокумент);
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
В случаях, когда алгоритм вызывается из клиентского сценария (например, во внешней обработке) и требуется передать контекст формы на сервер, применяются платформенные функции конвертации:
ДанныеФормыВЗначение() — преобразует ДанныеФормыСтруктура в экземпляр ДокументОбъект для выполнения серверных операций и расчетов.ЗначениеВДанныеФормы() — переносит измененный объект обратно в структурированные данные формы для отображения пользователю.Проанализируем пример серверной процедуры, работающей с данными формы:
&НаСервере
Процедура ЗаполнитьНаСервере()
// Преобразуем данные формы в полноценный объект
ДокументОбъект = ДанныеФормыВЗначение(Объект, Тип("ДокументОбъект.БольничныйЛист"));
// Вызываем логику заполнения
Документы.БольничныйЛист.ЗаполнитьРасчетЛисткаНетрудоспособности(ДокументОбъект);
// Возвращаем обновленный объект в данные формы
ЗначениеВДанныеФормы(ДокументОбъект, Объект);
КонецПроцедуры
В конфигурациях, построенных на базе БСП, для заполнения объектов рекомендуется использовать методы подсистемы ЗаполнениеОбъектов. Это позволяет корректно применить механизмы ввода на основании и правила заполнения по умолчанию:
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("Основание", СсылкаНаОснование);
ДокументОбъект = Документы.ЗаказПокупателя.СоздатьДокумент();
ЗаполнениеОбъектов.ЗаполнитьДокумент(ДокументОбъект, ПараметрыЗаполнения);
ДокументОбъект.Записать();
При программной работе с документами в управляемых формах нет необходимости вызывать код формы или программно открывать её экранные экземпляры. Вся расчетная и заполнительная логика находится в модулях менеджеров и общих модулях, которые принимают `ДокументОбъект` или передаваемые структуры данных.