В практике разработчика 1С часто возникает задача централизованного сбора отчетности из нескольких информационных баз. Ситуация осложняется, когда часть баз находится в локальной сети, а одна или несколько — в облаке с ограниченным доступом. Рассмотрим ситуацию: необходимо рассылать один и тот же отчет из 20 практически идентичных баз. Для локальных баз традиционно используется COM-соединение, но для облака такой метод не подходит. Разберем по шагам, как эффективно решить эту задачу, используя современные инструменты платформы 1С.
Прежде чем приступать к написанию собственного кода, проанализируем возможности, которые предоставляет Библиотека стандартных подсистем (БСП). В большинстве современных типовых конфигураций подсистема РассылкаОтчетов уже встроена и позволяет автоматизировать процесс без внешних скриптов.
Основные преимущества этого метода:
COM-соединении или внешних обработчиках.Однако, если баз много (как в нашем случае — 20), ручная настройка рассылки в каждой из них становится трудозатратной. Тем не менее, это самый надежный способ для баз, находящихся во «Фреше» или других закрытых облаках.
Если облако позволяет публиковать собственные сервисы, это открывает путь к наиболее гибкому решению. Рассмотрим архитектуру, к которой пришел автор темы: центральная база инициирует запрос к облачной базе через Web-сервис.
Алгоритм взаимодействия выглядит следующим образом:
ИдентификаторОтчета, настройки в формате XML и дополнительные параметры (например, период).Base64 и возвращает строку центральной базе.Пример программного интерфейса Web-сервиса может выглядеть так:
Функция СформироватьОтчет(ИдентификаторОтчета, НастройкиXML)
// Восстанавливаем настройки отчета из XML
Настройки = СериализаторXDTO.ПрочитатьXML(НастройкиXML);
// Формируем отчет программно
ТабДок = Новый ТабличныйДокумент;
Отчеты[ИдентификаторОтчета].Сформировать(ТабДок, Настройки);
// Сохраняем во временный файл и кодируем в Base64
ИмяФайла = ПолучитьИмяВременногоФайла("xls");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS);
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайла);
Возврат Base64Строка(ДвоичныеДанные);
КонецФункции
Более современным и производительным подходом является использование HTTP-сервисов. В отличие от SOAP (Web-сервисов), HTTP-сервисы легче отлаживать и они работают быстрее за счет отсутствия избыточности XML-конвертов. Мы можем передавать настройки в формате JSON, что значительно упрощает интеграцию.
Проанализируем продвинутую схему с асинхронным выполнением. Это критично для «тяжелых» отчетов, которые могут не успеть сформироваться до истечения таймаута HTTP-соединения:
ID задания.ID.Пример обработки запроса в HTTP-сервисе:
Функция ОтчетыPOST(Запрос)
ПараметрыЗапроса = ЧтениеJSON(Запрос.ПолучитьТелоКакСтроку());
// Запуск фонового задания
ПараметрыЗадания = Новый Массив;
ПараметрыЗадания.Добавить(ПараметрыЗапроса.ИмяОтчета);
Задание = ФоновыеЗадания.Выполнить("МодульОтчетов.СформироватьДляИнтеграции", ПараметрыЗадания);
Ответ = Новый HTTPСервисОтвет(202); // Accepted
Ответ.УстановитьТелоИзСтроки(Строка(Задание.УникальныйИдентификатор));
Возврат Ответ;
КонецФункции
Одной из проблем, озвученных в обсуждении, является сложность обновления кода (например, расширений) сразу в 20 базах. Для решения этой задачи рекомендуется использовать инструменты автоматизации, такие как OneScript.
С помощью скриптов можно реализовать массовое обновление расширений во всех базах по списку без ручного вмешательства. Проанализируем пример логики такого скрипта:
1cv8.exe DESIGNER /ConfigurationRepositoryUpdate или через загрузку расширения /LoadConfigFromFiles.Это снимает возражение о том, что «обновлять расширение на 20 базах — то еще удовольствие». Современный DevOps в 1С позволяет делать это одной командой.
Рассмотрим, почему при работе с большим количеством баз стоит постепенно уходить от COM-соединения в пользу сервисов:
COM работает только в среде Windows. Если сервер 1С переедет на Linux, ваше решение перестанет работать. Сервисы (HTTP/Web) работают везде.COM-соединение чувствительно к версиям платформы (необходима регистрация соответствующих библиотек). Сервисы не зависят от разрядности клиента или версии платформы на вызывающей стороне.Таким образом, для решения задачи автора наиболее эффективным и перспективным является использование HTTP-сервисов в сочетании с асинхронным выполнением задач. Это обеспечивает масштабируемость системы и стабильную работу даже в условиях нестабильного облачного соединения.