Автоматизация рутинных задач, таких как выгрузка или загрузка данных, — одна из самых частых задач программиста 1С. Основным инструментом для этого являются регламентные задания. Однако при их настройке новички часто сталкиваются с техническими сложностями, связанными с разграничением прав доступа и контекстом выполнения кода. В этой статье мы подробно разберем, как правильно реализовать запуск обработок по расписанию, проанализируем типичные ошибки и рассмотрим различные способы реализации.
Прежде чем приступать к написанию кода, важно уяснить фундаментальное правило: регламентные задания всегда выполняются на стороне сервера в фоновом сеансе. Это означает, что у такого процесса нет графического интерфейса. Мы не можем использовать привычные методы взаимодействия с пользователем, такие как Сообщить(), Вопрос() или Предупреждение(). Вместо них для логирования следует использовать ЗаписьЖурналаРегистрации().
Рассмотрим ошибку, возникшую в ходе обсуждения в сообщении №22. Программист попыталась использовать переменную Объект и директиву &НаКлиенте в общем модуле. Это привело к ошибке компиляции «Переменная не определена», так как на сервере в фоновом задании не существует никакой формы и, соответственно, переменной Объект.
Для того чтобы регламентное задание могло вызвать ваш код, его необходимо разместить в неглобальном общем модуле. Проанализируем настройки этого модуля:
Разберем правильный пример процедуры для выгрузки данных. Мы не можем полагаться на данные формы, поэтому должны создать объект обработки программно и заполнить его параметры. Посмотрим на код:
Процедура ВыгрузитьДанныеВФайл_XML() Экспорт
// Создаем экземпляр обработки, встроенной в конфигурацию
ОбработкаОбъект = Обработки.ВыгрузкаДанныхВФайл.Создать();
// Настройки лучше брать из констант или параметров сеанса
КаталогСохранения = Константы.ПутьДляОбмена.Получить();
ПутьКФайлу = КаталогСохранения + "/СписокКонтрагентов.xml";
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПутьКФайлу);
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("ContragentList");
// Получаем данные запросом, а не из табличной части формы
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка, Наименование, УНП ИЗ Справочник.Контрагенты");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("Contragent");
ЗаписьXML.ЗаписатьАтрибут("NAME", Выборка.Наименование);
ЗаписьXML.ЗаписатьАтрибут("UNP", Выборка.УНП);
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.Закрыть();
ЗаписьЖурналаРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Информация, , , "Выгрузка успешно завершена");
КонецПроцедуры
После того как процедура в общем модуле готова, перейдем в дерево метаданных (конфигуратор):
РегЗадачи.ВыгрузитьДанныеВФайл_XML.Если ваши обработки не встроены в конфигурацию, а хранятся в виде файлов .epf, процедура запуска будет отличаться. Выясним причину: сервер 1С должен сначала подключить внешний файл в безопасном или небезопасном режиме. Рассмотрим программный вызов внешней обработки:
Процедура ВыполнитьВнешнююОбработку() Экспорт
ПутьКФайлу = "C:\ExternalTools\UploadData.epf";
ОбработкаОбъект = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
// Если в обработке есть экспортный метод "ВыполнитьЗадачу"
ОбработкаОбъект.ВыполнитьЗадачу();
КонецПроцедуры
Важный нюанс: Убедитесь, что служба сервера 1С (обычно пользователь usr1cv8) имеет права доступа к папке на диске, где лежит файл. Если вы используете клиент-серверный вариант, путь к файлу должен быть доступен серверу (лучше использовать UNC-пути, например \\ServerName\Folder\file.epf).
Если ваша конфигурация построена на базе БСП (как большинство современных типовых решений), мы можем избежать написания кода для регламентного задания вручную. Проанализируем возможности подсистемы «Дополнительные отчеты и обработки»:
Это самый безопасный и правильный способ для современных систем, так как БСП берет на себя все вопросы логирования, обработки ошибок и управления очередью заданий.
Выясним ситуацию с выполнением заданий в файловой базе. В отличие от клиент-серверного варианта, где задания выполняет менеджер кластера, в файловой базе регламентные задания не запускаются сами по себе. Для их работы должен быть запущен отдельный сеанс пользователя, который будет играть роль «планировщика». В современных версиях платформы часто используется параметр запуска /AllowExecuteScheduledJobs.
Поскольку код выполняется в фоне, обычная точка останова может не сработать. Чтобы отладить процедуру, воспользуемся следующими приемами:
Таким образом, для успешного запуска обработки по расписанию необходимо вынести логику из формы в серверный общий модуль, обеспечить доступ сервера к файловой системе и правильно сконфигурировать объект регламентного задания.