Как автоматизировать рассылку отчетов из множества баз 1С, включая облачные?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В практике разработчика 1С часто возникает задача централизованного сбора отчетности из нескольких информационных баз. Ситуация осложняется, когда часть баз находится в локальной сети, а одна или несколько — в облаке с ограниченным доступом. Рассмотрим ситуацию: необходимо рассылать один и тот же отчет из 20 практически идентичных баз. Для локальных баз традиционно используется COM-соединение, но для облака такой метод не подходит. Разберем по шагам, как эффективно решить эту задачу, используя современные инструменты платформы 1С.

Вариант 1: Использование типового функционала БСП «Рассылка отчетов»

Прежде чем приступать к написанию собственного кода, проанализируем возможности, которые предоставляет Библиотека стандартных подсистем (БСП). В большинстве современных типовых конфигураций подсистема РассылкаОтчетов уже встроена и позволяет автоматизировать процесс без внешних скриптов.

Основные преимущества этого метода:

  1. Отсутствие необходимости в COM-соединении или внешних обработчиках.
  2. Возможность настройки расписания для каждой базы индивидуально.
  3. Поддержка различных форматов (XLS, PDF, MXL).

Однако, если баз много (как в нашем случае — 20), ручная настройка рассылки в каждой из них становится трудозатратной. Тем не менее, это самый надежный способ для баз, находящихся во «Фреше» или других закрытых облаках.

Вариант 2: Реализация через Web-сервис в облачной базе

Если облако позволяет публиковать собственные сервисы, это открывает путь к наиболее гибкому решению. Рассмотрим архитектуру, к которой пришел автор темы: центральная база инициирует запрос к облачной базе через Web-сервис.

Алгоритм взаимодействия выглядит следующим образом:

  1. Центральная база вызывает метод Web-сервиса облачной базы.
  2. В метод передаются параметры: ИдентификаторОтчета, настройки в формате XML и дополнительные параметры (например, период).
  3. Облачная база формирует отчет на сервере, конвертирует результат в Base64 и возвращает строку центральной базе.

Пример программного интерфейса Web-сервиса может выглядеть так:


Функция СформироватьОтчет(ИдентификаторОтчета, НастройкиXML)
    // Восстанавливаем настройки отчета из XML
    Настройки = СериализаторXDTO.ПрочитатьXML(НастройкиXML);
    
    // Формируем отчет программно
    ТабДок = Новый ТабличныйДокумент;
    Отчеты[ИдентификаторОтчета].Сформировать(ТабДок, Настройки);
    
    // Сохраняем во временный файл и кодируем в Base64
    ИмяФайла = ПолучитьИмяВременногоФайла("xls");
    ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS);
    
    ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайла);
    Возврат Base64Строка(ДвоичныеДанные);
КонецФункции

Вариант 3: Использование современных HTTP-сервисов

Более современным и производительным подходом является использование HTTP-сервисов. В отличие от SOAP (Web-сервисов), HTTP-сервисы легче отлаживать и они работают быстрее за счет отсутствия избыточности XML-конвертов. Мы можем передавать настройки в формате JSON, что значительно упрощает интеграцию.

Проанализируем продвинутую схему с асинхронным выполнением. Это критично для «тяжелых» отчетов, которые могут не успеть сформироваться до истечения таймаута HTTP-соединения:

  1. Запрос на формирование: Центральная база отправляет POST-запрос. Облачная база запускает фоновое задание и сразу возвращает ID задания.
  2. Проверка статуса: Центральная база периодически опрашивает сервис, передавая ID.
  3. Получение результата: Как только статус задания становится «Завершено», центральная база скачивает готовый файл.

Пример обработки запроса в HTTP-сервисе:


Функция ОтчетыPOST(Запрос)
    ПараметрыЗапроса = ЧтениеJSON(Запрос.ПолучитьТелоКакСтроку());
    
    // Запуск фонового задания
    ПараметрыЗадания = Новый Массив;
    ПараметрыЗадания.Добавить(ПараметрыЗапроса.ИмяОтчета);
    
    Задание = ФоновыеЗадания.Выполнить("МодульОтчетов.СформироватьДляИнтеграции", ПараметрыЗадания);
    
    Ответ = Новый HTTPСервисОтвет(202); // Accepted
    Ответ.УстановитьТелоИзСтроки(Строка(Задание.УникальныйИдентификатор));
    Возврат Ответ;
КонецФункции

Автоматизация обслуживания множества баз

Одной из проблем, озвученных в обсуждении, является сложность обновления кода (например, расширений) сразу в 20 базах. Для решения этой задачи рекомендуется использовать инструменты автоматизации, такие как OneScript.

С помощью скриптов можно реализовать массовое обновление расширений во всех базах по списку без ручного вмешательства. Проанализируем пример логики такого скрипта:

  1. Скрипт обходит список строк подключения к базам.
  2. Для каждой базы запускается конфигуратор в пакетном режиме: 1cv8.exe DESIGNER /ConfigurationRepositoryUpdate или через загрузку расширения /LoadConfigFromFiles.
  3. После успешного обновления скрипт переходит к следующей базе.

Это снимает возражение о том, что «обновлять расширение на 20 базах — то еще удовольствие». Современный DevOps в 1С позволяет делать это одной командой.

Сравнение подходов: COM vs Web-сервисы

Рассмотрим, почему при работе с большим количеством баз стоит постепенно уходить от COM-соединения в пользу сервисов:

Таким образом, для решения задачи автора наиболее эффективным и перспективным является использование HTTP-сервисов в сочетании с асинхронным выполнением задач. Это обеспечивает масштабируемость системы и стабильную работу даже в условиях нестабильного облачного соединения.

← На главную