Перенос логики из интерактивной обработки в автоматический фоновый режим — это стандартный этап развития любого корпоративного решения. Часто разработчики сталкиваются с ситуацией, когда весь код обмена или расчетов сосредоточен в модуле управляемой формы, а настройки хранятся в экранных реквизитах. Разберем подробно, как профессионально выполнить этот переход, минимизировать рутину при копировании реквизитов и правильно адаптировать код для работы на сервере.
Первое, что нам необходимо осознать: управляемая форма не существует в контексте регламентного задания. Регламентное задание выполняется на сервере в фоновом сеансе, где нет понятий «экран», «кнопка» или «реквизит формы». Все данные, которые ранее вводил пользователь, теперь должны стать частью метаданных самой обработки или храниться в базе данных.
Автор темы столкнулся с проблемой: при выгрузке конфигурации в файлы XML реквизиты формы не переносятся в объект автоматически. Это происходит потому, что в структуре XML 1С описание формы (файл Form.xml) и описание самого объекта (файл ManagerModule.bsl или Object.xml) находятся в разных пространствах имен. Реквизиты формы — это временные данные сеанса визуализации, а реквизиты объекта — это типизированная структура данных в метаданных.
Если у вас 30–40 реквизитов, ручное создание каждого из них в конфигураторе действительно утомляет. Рассмотрим способы ускорения этого процесса:
Form.xml, найдите секцию <Attributes>. Вам нужно преобразовать эти записи в формат, понятный для основного файла обработки (обычно это Processing.mdo или аналогичный файл в выгрузке). Хотя теги различаются, типы данных и имена совпадают. С помощью текстового редактора с поддержкой регулярных выражений (например, VS Code) можно быстро переформатировать список реквизитов формы в список реквизитов объекта.Проанализируем ситуацию, когда код «зашит» в модуле формы. Нам нужно переместить его в Модуль объекта. Рассмотрим пример трансформации кода.
Было в модуле формы:
&НаСервере
Процедура ВыполнитьОбменНаСервере()
// Обращаемся напрямую к реквизитам формы
ПутьКФайлу = Объект.КаталогВыгрузки + "\data.xml";
Для Каждого Строка Из Объект.ТаблицаДанных Цикл
// Какая-то логика
КонецЦикла;
КонецПроцедуры
Должно стать в модуле объекта:
Процедура ВыполнитьОбмен() Экспорт
// Теперь ПутьКФайлу и ТаблицаДанных - это реквизиты самого объекта (обработки)
Файл = Новый Файл(КаталогВыгрузки + "\data.xml");
Если Не Файл.Существует() Тогда
ЗаписьЖурналаРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Ошибка, , , "Файл не найден");
Возврат;
КонецЕсли;
Для Каждого Строка Из ТаблицаДанных Цикл
// Логика обмена
КонецЦикла;
КонецПроцедуры
Важные изменения, которые мы должны внести:
Сообщить(), Предупреждение() и Вопрос() на ЗаписьЖурналаРегистрации(). В регламентном задании некому отвечать на вопросы.ЭтаФорма, Элементы, ТекущийЭлемент.ПараметрыСеанса.ТекущийПользователь, убедитесь, что этот параметр инициализирован или замените его на явную передачу настроек.Поскольку регламентное задание работает автономно, оно должно откуда-то брать значения тех самых 40 реквизитов. Рассмотрим два варианта решения этой задачи:
Создадим регистр сведений НастройкиНашихОбменов. В нем будем хранить настройки в разрезе узлов обмена или просто одной строкой. Перед запуском логики в регламентном задании обработка будет считывать данные из регистра и заполнять свои реквизиты.
// В модуле регламентного задания
Процедура ЗапуститьОбменПоРасписанию() Экспорт
ОбработкаОбъект = Обработки.НашОбменДанными.Создать();
// Заполняем реквизиты из настроек в базе
Настройки = РегистрыСведений.НастройкиНашихОбменов.ПолучитьПоследние();
ЗаполнитьЗначенияСвойств(ОбработкаОбъект, Настройки);
ОбработкаОбъект.ВыполнитьОбмен();
КонецПроцедуры
Если вы не хотите создавать 40 реквизитов в объекте, вы можете оставить логику в модуле объекта, но сделать процедуру, принимающую структуру параметров. Разберем этот пример подробнее. Проанализируем, как это упрощает жизнь: вам не нужно менять метаданные, достаточно передать «мешок» с данными.
В модуле объекта пишем универсальный метод:
Процедура ВыполнитьОбменСПараметрами(СтруктураНастроек) Экспорт
// Вместо Реквизит1 используем СтруктураНастроек.Реквизит1
ИмяСервера = СтруктураНастроек.Сервер;
Логин = СтруктураНастроек.Пользователь;
// ... и так далее
КонецПроцедуры
В этом случае в регламентном задании вы просто формируете структуру (например, восстанавливая её из сохраненных настроек пользователя через ЗначениеИзСтрокиВнутр или JSON) и передаете в обработку.
После того как код подготовлен, нам нужно создать объект РегламентноеЗадание в дереве метаданных:
Важный нюанс: если ваша обработка использует COM-объекты или внешние компоненты, убедитесь, что они установлены на сервере 1С:Предприятие, а не только на вашем рабочем компьютере. Также проверьте права доступа пользователя, под которым работает служба 1С, к файловым путям, если обмен идет через файловую систему.
Таким образом, переход к регламентному заданию — это не просто копирование кода, а архитектурное отделение данных (настроек) от алгоритма их обработки. Использование инструментов автоматизации XML или программная передача параметров через структуры позволяют избежать «тупой» работы и сосредоточиться на качестве самого алгоритма обмена.