При разработке систем автоматизации в 1С:Предприятии 8.3 часто возникает задача перенести выполнение рутинных действий (например, выгрузку прайс-листа в XML или обмен данными с сайтом) на «плечи» системы. Для этого используются регламентные задания. Однако начинающие разработчики часто сталкиваются с ошибками при попытке вызвать ту же логику, которая работает в форме обработки. Разберем подробно, как правильно подготовить и программно запустить обработку без участия пользователя.
Рассмотрим типичную ситуацию: у вас есть обработка, в форме которой по нажатию кнопки выполняется некое действие. Попытка вызвать эту форму в регламентном задании через метод ПолучитьФорму() или ОткрытьФорму() неизбежно приведет к ошибке. Проанализируем причину: регламентные задания всегда выполняются на сервере в фоновом сеансе. В этом сеансе отсутствует пользовательский интерфейс, а значит, объекты типа «Форма» недоступны. Любое обращение к модулю формы из фонового задания — это программная ошибка.
Для решения задачи нам необходимо полностью отделить логику выполнения (алгоритм формирования XML, расчеты) от визуального представления (кнопок, полей ввода).
Первым делом выясним, где находится ваш программный код. Если он написан в модуле формы, его нужно переместить. Рассмотрим алгоритм действий:
Экспорт. Это позволит обращаться к процедуре «снаружи» объекта.Пример структуры кода в модуле объекта:
// В модуле объекта обработки
Процедура СформироватьXmlФайл() Экспорт
// Здесь располагается основной алгоритм
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл("C:\temp\price.xml");
// ... логика заполнения ...
Запись.Закрыть();
ЗаписьЖурналаРегистрации("ВыгрузкаXML", УровеньЖурналаРегистрации.Информация, , , "Файл успешно сформирован");
КонецПроцедуры
Важный момент: если в коде использовались данные из реквизитов формы, их нужно заменить на использование реквизитов самого объекта обработки или передавать как параметры в процедуру.
Теперь разберем, как вызвать эту процедуру программно, например, из модуля регламентного задания или другого общего модуля. Проанализируем последовательность команд:
// Создаем экземпляр объекта обработки
ОбъектОбработки = Обработки.ПрайсЛистXML.Создать();
// Вызываем экспортную процедуру модуля объекта
ОбъектОбработки.СформироватьXmlФайл();
Метод Создать() инициализирует объект в памяти сервера, что дает нам доступ ко всем его экспортным методам и реквизитам, при этом никакие окна не открываются.
Если ваша обработка не встроена в конфигурацию, а хранится как отдельный файл, механизм вызова будет отличаться. Выясним, как подключить её программно на сервере:
// Путь к файлу на сервере
ПутьКФайлу = "C:\ExternalProc\MyProcessing.epf";
// Безопасный режим лучше отключать, если обработка пишет файлы на диск
ИмяОбработки = ВнешниеОбработки.Подключить(ПутьКФайлу, , Ложь);
// Создаем объект по полученному внутреннему имени
ОбъектОбработки = ВнешниеОбработки.Создать(ИмяОбработки);
// Запускаем выполнение
ОбъектОбработки.СформироватьXmlФайл();
Обратите внимание, что при работе в регламентном задании сервер 1С должен иметь права доступа к указанной папке в файловой системе.
В современных конфигурациях (УП, ERP, КА 2.4+, ЗУП 3) наиболее правильным и надежным способом является использование подсистемы «Дополнительные отчеты и обработки». Это позволяет настраивать расписание запуска прямо в пользовательском режиме без изменения кода конфигурации.
Для этого в модуле объекта обработки должна быть специальная функция СведенияОВнешнейОбработке(). Рассмотрим пример минимального наполнения:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Наименование = "Автоматическая выгрузка XML";
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Запустить выгрузку";
НоваяКоманда.Идентификатор = "ВыгрузкаПрайса";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Возврат ПараметрыРегистрации;
КонецФункции
// Эта процедура будет вызвана БСП при запуске задания
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
Если ИдентификаторКоманды = "ВыгрузкаПрайса" Тогда
СформироватьXmlФайл();
КонецЕсли;
КонецПроцедуры
После добавления такой обработки в справочник «Дополнительные отчеты и обработки», вы сможете нажать кнопку «Настроить расписание», и система сама создаст регламентное задание.
Поскольку регламентное задание выполняется в фоновом режиме, вы не увидите сообщений об ошибках на экране. Проанализируем, как контролировать процесс:
ЗаписьЖурналаРегистрации() внутри вашей обработки. Это единственный надежный способ понять, что пошло не так (например, если файл не записался из-за отсутствия прав).-debug. В конфигураторе в меню «Отладка» выберите «Подключение» и найдите ваш фоновый сеанс.Таким образом, мы выяснили, что ключ к успеху — в строгом разделении кода на интерфейсный и исполнительный. Вынос алгоритмов в экспортные методы модуля объекта делает вашу обработку универсальной: её можно запустить как кнопкой с формы, так и программно по расписанию в любое время суток.