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