Как автоматизировать создание документов установки цен без использования управляемой формы?

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

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

Понимание проблемы: почему код требует форму?

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

Решение 1: Анализ и вызов низкоуровневых серверных процедур

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

Разберем алгоритм поиска:

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

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

Решение 2: Адаптация кода через расширения

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

  1. Создать собственную серверную процедуру в общем модуле расширения.
  2. Скопировать туда логику типового расчета, исключив или заменив вызовы, требующие объект формы (например, обращение к Элементы.ИмяЭлемента).
  3. Если процедура требует ДанныеФормыСтруктура, попробуйте передать туда объект, полученный методом ЗначениеВДанныеФормы(), если это применимо к вашему сценарию.

Решение 3: Имитация контекста данных

Если процедура расчета ожидает Форму, но использует из неё только данные, можно попробовать подготовить структуру, имитирующую нужные реквизиты. Однако помните, что методы типа ДанныеФормыКоллекция симулировать практически невозможно. В этом случае мы рекомендуем:

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


// Пример правильного подхода через ДокументОбъект:
ДокОбъект = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
ДокОбъект.Дата = ТекущаяДата();
// Заполняем табличную часть данными
ЗаполнитьДанныеПоЦенам(ДокОбъект); 
// Вызываем метод, который пересчитывает цены, 
// если он вынесен в общий модуль отдельно от формы
ДокОбъект.Записать();

Рекомендации по поддержанию кода в актуальном состоянии

Главный риск при копировании типового кода — «отрыв» от обновлений. Чтобы минимизировать этот риск:

Подводя итог: попытка получения формы на сервере «из пустоты» обречена на провал, так как форма — это интерактивный элемент. Работайте с ДокументОбъект и ищите низкоуровневые серверные функции в общих модулях — это позволит создать надежный и поддерживаемый код для автоматизации ваших бизнес-процессов.

← На главную