Как программно вызвать процедуру модуля формы для создаваемого объекта в 1С 8.3?

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

При разработке алгоритмов пакетного создания или загрузки документов (например, документа РасходныйКассовыйОрдер в конфигурации 1С:Бухгалтерия предприятия) часто возникает желание переиспользовать логику, заложенную в событиях формы, такую как ВидОперацииПриИзменении. Однако прямая попытка вызвать процедуру формы из серверного кода создания объекта приводит к ошибкам. Рассмотрим, почему это происходит и какими правильными способами следует решать данную задачу.

Почему нельзя вызвать процедуру формы из объекта или на сервере

Проанализируем архитектурные ограничения платформы 1С:Предприятие 8.3 в режиме управляемого приложения:

  1. Разделение контекстов формы и данных: процедуры модуля формы и вспомогательных модулей (с суффиксами ФормыКлиентСервер или Формы) спроектированы исключительно для взаимодействия с элементами интерфейса. Они управляют видимостью полей, доступностью кнопок и страниц панели. На вход такие процедуры ожидают контекст УправляемаяФорма или тип ДанныеФормыСтруктура, а не прикладной ДокументОбъект. Передача объекта базы данных в процедуру формы вызывает ошибки несовместимости типов.
  2. Недоступность метода ПолучитьФорму() на сервере: в управляемом приложении вызов метода ПолучитьФорму() на стороне сервера запрещен платформой. Создавать виртуальную форму без пользователя только ради выполнения алгоритма противоречит клиент-серверной модели.
  3. Ограничения компиляции общих модулей: специализированные модули форм часто имеют флаги компиляции, запрещающие прямой вызов в фоновых заданиях или чистом серверном контексте без переданных параметров формы.

Способ 1. Использование стандартного механизма заполнения через модуль объекта

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

Посмотрим на пример правильного создания и заполнения документа:


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

// Вызываем стандартную процедуру ОбработкаЗаполнения модуля объекта
Док.Заполнить(ПараметрыЗаполнения);

Внутри процедуры ОбработкаЗаполнения система сама проверит переданную структуру и установит значения по умолчанию для счетов учета, кассы и сопутствующей аналитики.

Способ 2. Заполнение счетов учета через подсистемы конфигурации

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

Разберем по шагам заполнение счетов учета перед проведением документа:


Док = Документы.РасходныйКассовыйОрдер.СоздатьДокумент();
Док.Дата = ТекущаяДатаСеанса();
Док.Организация = ВыбраннаяОрганизация;
Док.ВидОперации = Перечисления.ВидыОперацийРКО.ВыдачаПодотчетномуЛицу;
Док.ФизическоеЛицо = ВыбранноеФизЛицо;
Док.СуммаДокумента = 15000;

// Заполняем незаполненные счета учета и аналитику по правилам регистра сведений
СчетаУчетаВДокументах.ЗаполнитьПередЗаписью(Док);

Док.Записать(РежимЗаписиДокумента.Проведение);

Способ 3. Использование экспортных методов модуля менеджера

Когда требуется выполнить типовые расчеты или комплексные проверки, которые не зависят от экранной формы, обратимся к модулю менеджера документа. Модуль менеджера (Документы.РасходныйКассовыйОрдер) компилируется на сервере и доступен для вызова из любых серверных обработок и фоновых заданий без необходимости создания контекста формы.

Способ 4. Явная установка бизнес-реквизитов документа

Если требуется полностью сымитировать поведение документа под определенный вид операции при программном формировании, наиболее надежным решением является явное заполнение только тех реквизитов, которые участвуют в проводках и движениях регистров:

  1. Устанавливаем требуемый ВидОперации.
  2. Заполняем обязательные поля: Организация, Касса, СчетУчета, СчетУчетаРасчетов, СтатьяДвиженияДенежныхСредств.
  3. Очищаем реквизиты и табличные части, не относящиеся к выбранному виду операции (например, очищаем данные по договорам контрагентов, если операция оформлена на подотчетное лицо).
  4. Записываем объект с проведением методом Записать(РежимЗаписиДокумента.Проведение).
← На главную