В практике разработчика 1С часто возникает задача автоматизации процессов, которые заложены внутри отчетов. Например, когда отчет на системе компоновки данных (СКД) не просто выводит цифры на экран, а выполняет проверку условий и рассылает уведомления пользователям. Если такой отчет уже подключен в справочник Дополнительные отчеты и обработки, возникает вопрос: как заставить его работать автономно на сервере по заданному графику? Рассмотрим подробнее все доступные способы реализации этой задачи.
Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), это самый простой и надежный метод. Он не требует написания сложного кода для создания регламентных заданий вручную. Разберем этот механизм по шагам.
Основная идея заключается в том, что система рассылки отчетов умеет запускать любой отчет (в том числе внешний) по расписанию. Даже если вам не нужно отправлять результат по электронной почте, вы можете настроить рассылку так, чтобы отчет просто «выполнялся».
ПриКомпоновкеРезультата.Важный нюанс: процедура ПриКомпоновкеРезультата вызывается на сервере при каждом формировании отчета. Когда механизм рассылки начинает «собирать» отчет для отправки, этот код выполнится автоматически. Проанализируем ситуацию: если нам не нужен сам файл отчета, в настройках рассылки можно указать способ доставки «Публиковать в папку» и выбрать пустой сетевой каталог или просто не указывать получателей, если система позволяет сохранить такую настройку.
Если типовые рассылки по какой-то причине не подходят, мы можем реализовать программный запуск. Для этого нам понадобится написать небольшую вспомогательную обработку или создать регламентное задание, которое будет имитировать нажатие кнопки «Сформировать». Посмотрим на пример кода, который позволяет выполнить внешний отчет на сервере без открытия форм.
Сначала нам нужно получить объект внешнего отчета из справочника ДополнительныеОтчетыИОбработки. Для этого используем метод ОбъектВнешнейОбработки. Выясним, как выглядит процесс инициализации компоновки:
// 1. Получаем объект внешнего отчета
ВнешнийОтчетСсылка = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("ИмяВашегоОтчета");
ОтчетОбъект = ДополнительныеОтчетыИОбработкиВызовСервера.ОбъектВнешнейОбработки(ВнешнийОтчетСсылка);
// 2. Получаем схему и настройки
СхемаКомпоновкиДанных = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
НастройкиКомпоновкиДанных = ОтчетОбъект.КомпоновщикНастроек.ПолучитьНастройки();
// 3. Устанавливаем параметры, если это необходимо
ПараметрПериод = НастройкиКомпоновкиДанных.ПараметрыДанных.Элементы.Найти("Период");
Если ПараметрПериод <> Неопределено Тогда
ПараметрПериод.Значение = ТекущаяДата();
ПараметрПериод.Использование = Истина;
КонецЕсли;
После того как настройки подготовлены, переходим к этапу выполнения. Процесс состоит из работы трех объектов: КомпоновщикМакетаКомпоновкиДанных, ПроцессорКомпоновкиДанных и ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент.
// 4. Подготовка макета компоновки
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновкиДанных);
// 5. Инициализация процессора компоновки
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
// 6. Вывод результата (даже если он нам не нужен визуально, это инициирует выполнение запросов)
ТабличныйДокумент = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Этот код полностью заменяет интерактивное нажатие кнопки пользователем. Все запросы в СКД будут выполнены, и если в модуле объекта прописана логика уведомлений, она отработает.
Проанализируем архитектуру БСП. В справочнике ДополнительныеОтчетыИОбработки для элементов с видом Дополнительная обработка штатно предусмотрена возможность настройки расписания прямо в карточке (вкладка «Команды»). Для Дополнительных отчетов такая возможность часто скрыта.
Рассмотрим вариант решения: изменить вид вашего внешнего файла с «Отчета» на «Обработку». Для этого в модуле объекта в функции СведенияОВнешнейОбработке нужно изменить тип:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.ПараметрыРегистрацииВнешнейОбработки();
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидДополнительнойОбработки(); // Меняем здесь
// ... остальной код
Возврат ПараметрыРегистрации;
КонецФункции
После этого в модуле объекта необходимо добавить процедуру ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды). Внутри этой процедуры вы можете вызвать метод СкомпоноватьРезультат(), который запустит ваш отчет программно. Теперь в интерфейсе 1С в карточке этой обработки появится кнопка Настроить расписание, и система сама создаст регламентное задание.
Разберем, как упростить программный код из Способа 2. В современных версиях платформы 8.3 у объекта отчет есть встроенный метод СкомпоноватьРезультат(). Он инкапсулирует в себе создание макета, процессора компоновки и вывода.
Пример сокращенного вызова:
ТабличныйДокумент = Новый ТабличныйДокумент;
ОтчетОбъект.СкомпоноватьРезультат(ТабличныйДокумент);
Важное замечание: При выполнении этого метода система автоматически заглядывает в КомпоновщикНастроек.Настройки. Если вам нужно применить настройки конкретного варианта отчета, не забудьте их загрузить перед вызовом метода, используя КомпоновщикНастроек.ЗагрузитьНастройки().
При реализации запуска по расписанию мы должны помнить о специфике работы серверного контекста. Проанализируем основные ограничения:
Сообщить(), Предупреждение() или Вопрос(). Они вызовут ошибку выполнения фонового задания.ЭтаФорма. Вся логика должна быть строго в модуле объекта или в общих модулях с признаком Вызов сервера.Для реализации уведомлений в таких условиях лучше всего использовать запись в ЖурналРегистрации, отправку электронных писем через системную учетную запись или создание записей в специальных регистрах сведений, которые потом увидит пользователь при входе в систему.
Таким образом, мы рассмотрели три основных пути решения задачи. Выбор конкретного метода зависит от того, насколько глубоко вы готовы погружаться в программирование и насколько стандартными средствами БСП хотите обойтись.