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