При автоматизации бизнес-процессов часто возникает задача регулярной выгрузки данных (например, отчетов в формат Excel) без постоянного вмешательства пользователя и без внесения изменений в типовую конфигурацию. В этой статье мы подробно разберем, как реализовать автозапуск внешней обработки по расписанию в типовых конфигурациях на платформе 1С:Предприятие 8.3 (таких как ЗУП 3.1, ERP, КА, УТ), как решить проблему хранения настроек (например, пути выгрузки) для фоновых заданий и какие подводные камни могут возникнуть при работе с файлами на сервере.
В типовых конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП), предусмотрен стандартный механизм интеграции внешнего кода. Для этого используется справочник Дополнительные отчеты и обработки.
Важно понимать одно принципиальное отличие: в БСП автоматический запуск по расписанию поддерживается только для обработок. У внешних отчетов такой встроенной функции нет. Если перед нами стоит задача регулярно формировать отчет (например, на базе системы компоновки данных — СКД) и сохранять его, мы пишем внешнюю обработку, которая программно инициализирует схему компоновки, выполняет ее и записывает результат в нужный файл.
Для регистрации обработки в системе необходимо правильно описать ее свойства в модуле объекта в экспортной функции СведенияОВнешнейОбработке(). Рассмотрим пример заполнения этой структуры:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("3.1.3.1");
ПараметрыРегистрации.Вид = ПолучитьВидДополнительнойОбработки();
ПараметрыРегистрации.Наименование = "Автоматическая выгрузка данных в Excel";
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.БезопасныйРежим = Ложь; // Для записи файлов на сервере
// Добавление команд
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Выполнить выгрузку по расписанию";
НоваяКоманда.Идентификатор = "ВыгрузитьДанные";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипЗапускаВызовСерверногоМетода();
Возврат ПараметрыРегистрации;
КонецФункции
После добавления такой обработки в справочник Дополнительные отчеты и обработки в режиме "1С:Предприятие" у нее появится вкладка Расписание, где можно гибко настроить периодичность ее выполнения.
Частой ошибкой при переносе интерактивного кода в фоновое задание является попытка использовать привычные пути к файлам. Разберем типичную ситуацию: в коде формы было прописано сохранение по пути D:\Export\data.xlsx. При ручном запуске все работало, а в фоновом задании файл перестал создаваться.
Выясним причину этого поведения. Фоновое (регламентное) задание выполняется на сервере 1С:Предприятия в неинтерактивном режиме. Это влечет за собой важные последствия:
D:\Export\data.xlsx при выполнении на сервере указывает на локальный диск самого физического сервера, где установлена служба 1С, а не на диск вашего рабочего компьютера.Z:\Folder), сервер 1С его не увидит, так как сетевые диски монтируются в сессии конкретного пользователя Windows, а служба сервера работает в своей изолированной сессии. Для работы с сетью необходимо использовать только UNC-пути вида \\имя_сервера\общая_папка\file.xlsx.Пользователю часто требуется изменить путь выгрузки, имя файла или другие параметры. Использование стандартной галочки в свойствах реквизитов формы "Сохранять данные в настройках" здесь не сработает. Данная галочка сохраняет настройки в привязке к конкретному пользователю информационной базы для интерактивного сеанса. Фоновое же задание выполняется без открытой формы, на сервере, и "не знает" о сохраненных интерактивных настройках.
Для решения этой проблемы рассмотрим два надежных способа хранения параметров.
Справочник ДополнительныеОтчетыИОбработки содержит специальный реквизит ХранилищеНастроек с типом ХранилищеЗначения. Мы можем использовать его для записи структуры наших параметров.
Разберем по шагам, как это реализовать. Сначала создадим интерактивную форму для нашей обработки, где пользователь сможет выбрать путь выгрузки и нажать кнопку "Сохранить параметры". В модуле формы пропишем процедуру записи настроек в элемент справочника дополнительных обработок:
&НаСервере
Процедура СохранитьНастройкиНаСервере()
// Параметр ДополнительнаяОбработкаСсылка передается БСП при открытии формы обработки
Если Не Параметры.Свойство("ДополнительнаяОбработкаСсылка") Тогда
Возврат;
КонецЕсли;
СсылкаНаОбработку = Параметры.ДополнительнаяОбработкаСсылка;
// Формируем структуру с настройками, которые нужно хранить
НастройкиОбработки = Новый Структура;
НастройкиОбработки.Вставить("ПутьКФайлу", Объект.ПутьКФайлу);
НастройкиОбработки.Вставить("ФорматВыгрузки", Объект.ФорматВыгрузки);
// Записываем настройки непосредственно в объект справочника БСП
ОбъектСправочника = СсылкаНаОбработку.ПолучитьОбъект();
ОбъектСправочника.ХранилищеНастроек = Новый ХранилищеЗначения(НастройкиОбработки);
Попытка
ОбъектСправочника.Записать();
СообщитьПользователю("Настройки успешно сохранены для фонового выполнения.");
Исключение
ВызватьИсключение "Не удалось сохранить настройки: " + ОписаниеОшибки();
КонецПопытки;
КонецПроцедуры
Теперь проанализируем, как прочитать эти настройки непосредственно при выполнении регламентного задания в модуле объекта внешней обработки:
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
// БСП автоматически передает ссылку на текущую обработку в параметрах выполнения
Если Не ПараметрыВыполненияКоманды.Свойство("ДополнительнаяОбработкаСсылка") Тогда
Возврат;
КонецЕсли;
СсылкаНаОбработку = ПараметрыВыполненияКоманды.ДополнительнаяОбработкаСсылка;
// Получаем реквизит ХранилищеНастроек из базы данных
Хранилище = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаНаОбработку, "ХранилищеНастроек");
Настройки = Хранилище.Получить();
ПутьКФайлу = "";
Если ТипЗнч(Настройки) = Тип("Структура") Тогда
Настройки.Свойство("ПутьКФайлу", ПутьКФайлу);
КонецЕсли;
Если ПустаяСтрока(ПутьКФайлу) Тогда
ЗаписатьВЖурналРегистрации("ВыгрузкаДанных", УровеньЖурналаРегистрации.Ошибка, , , "Не задан путь к файлу в настройках обработки!");
Возврат;
КонецЕсли;
// Логика формирования отчета и записи файла на сервере
ВыполнитьЭкспортДанных(ПутьКФайлу);
КонецПроцедуры
Если вы не хотите программно изменять и записывать элементы справочника БСП, можно воспользоваться платформенным механизмом ХранилищеОбщихНастроек. При сохранении настроек крайне важно не привязывать их к конкретному пользователю ИБ, чтобы регламентное задание (которое запускается под системным или выделенным пользователем) имело к ним беспрепятственный доступ.
Для сохранения настроек из формы используем следующий код:
&НаСервере
Процедура СохранитьНастройкиВОбщееХранилище(ВыбранныйПуть)
// Третий параметр ИмяПользователя оставляем пустым (""), чтобы настройки были общими для всех
ХранилищеОбщихНастроек.Сохранить("АвтовыгрузкаДанныхExcel", "ПутьКФайлу", ВыбранныйПуть, , "");
КонецПроцедуры
Для получения этих настроек в фоновом задании в модуле объекта пишем:
// Чтение настроек без привязки к имени пользователя
ПутьКФайлу = ХранилищеОбщихНастроек.Загрузить("АвтовыгрузкаДанныхExcel", "ПутьКФайлу", , "");
Даже при абсолютно корректном коде выгрузка может завершаться ошибкой, если на уровне платформы или операционной системы не настроены соответствующие разрешения. Выделим основные параметры, которые необходимо проверить:
ПараметрыРегистрации.БезопасныйРежим = Ложь;). В безопасном режиме платформа 1С блокирует любые попытки работы с локальными дисками сервера и внешними COM-объектами.usr1cv8 на Windows или 1c на Linux), должна обладать полными правами (на чтение, запись и изменение) к целевой папке на сервере или сетевом ресурсе, куда планируется осуществлять экспорт документов.Применяя данные подходы, мы получаем надежное и полностью автономное решение для выгрузки аналитических данных из систем 1С, которое легко администрируется пользователями напрямую в пользовательском режиме предприятия.