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

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

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

Разберем фундаментальное различие: Объект и Форма

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

Способ №1: Вызов экспортной процедуры через получение формы

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

  1. Создаем объект документа и записываем его в информационную базу.
  2. Получаем форму документа с помощью метода ПолучитьФорму().
  3. Обращаемся к методу формы по его имени.

Пример реализации вызова:


// Создаем новый документ
НовДок = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
НовДок.Записать();

// Получаем форму документа
ФормаДока = НовДок.Ссылка.ПолучитьФорму("ФормаДокумента");

// Вызываем экспортную процедуру
ФормаДока.МояЭкспортнаяПроцедура();

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

Способ №2: Работа через Модуль менеджера (Рекомендуемый подход)

Если вы имеете возможность внести изменения в конфигурацию, самым архитектурно правильным решением будет вынос логики из модуля формы в Модуль менеджера или в Общий модуль. Это позволит вызывать расчеты напрямую, не прибегая к «симуляции» формы.

Почему это лучше? Во-первых, вы не зависите от наличия или отсутствия интерфейса. Во-вторых, код становится более читаемым и легко поддерживаемым при обновлении конфигурации.


// В модуле менеджера документа
Процедура РассчитатьДанныеДокумента(СсылкаНаДокумент) Экспорт
    // Логика расчетов
КонецПроцедуры

// Вызов из любого места системы
Документы.РеализацияТоваровУслуг.РассчитатьДанныеДокумента(СсылкаНаДокумент);

Особенности работы с внешними печатными формами

Часто вопрос вызова процедур формы возникает из-за желания программно распечатать документ. Если печатная форма добавлена в систему как дополнительная внешняя обработка, нет необходимости пытаться вызвать её через ПолучитьФорму. Используйте механизм УниверсальныеМеханизмы или ДополнительныеОтчетыИОбработки.

Рассмотрим пример программной печати внешней печатной формы:


// Получаем ссылку на внешнюю обработку
СсылкаНаВПФ = Справочники.ВнешниеОбработки.НайтиПоНаименованию("Печать РКО");

// Формируем структуру параметров
Расшифровка = Новый Структура;
Расшифровка.Вставить("ВидПечатнойФормы", Перечисления.ВидыДополнительныхВнешнихОбработок.ПечатнаяФорма);
Расшифровка.Вставить("СсылкаНаВнешнююОбработку", СсылкаНаВПФ);

// Печатаем
ТабДокумент = УниверсальныеМеханизмы.НапечататьВнешнююФорму(ДокСсылка, Расшифровка);
ТабДокумент.Показать();

Ключевые рекомендации и предостережения

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

← На главную