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