Как собрать данные из нескольких баз 1С для одного отчета на СКД?

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

При разработке сложных аналитических систем часто возникает задача консолидации данных. Представьте ситуацию: у вас есть 10 различных информационных баз (например, филиалы или разные направления бизнеса), и вам нужно построить единый отчет в одной «мастер-базе» с помощью Системы компоновки данных (СКД). В этой статье мы подробно разберем, как реализовать такой механизм, какие существуют подводные камни при использовании COM-соединения и какие современные альтернативы стоит рассмотреть.

Метод 1: Последовательное подключение через COM-соединение

Самый очевидный и простой в реализации способ — это последовательный перебор списка баз и подключение к каждой из них через V83.COMConnector. Проанализируем, как это выглядит на практике. Мы создаем цикл, в котором для каждой базы устанавливаем соединение, выполняем запрос и выгружаем результат в таблицу значений.

Разберем основные шаги реализации:

  1. Создаем объект V83.COMConnector.
  2. В цикле подключаемся к базе-источнику, используя строку соединения.
  3. Выполняем запрос в контексте внешней базы.
  4. Получаем данные и копируем их в общую таблицу значений (ТЗ).
  5. Передаем накопленную ТЗ в СКД как внешний набор данных.

Важный нюанс: при работе с COM важно помнить о лицензировании. Каждое такое подключение занимает одну клиентскую лицензию. Если вы подключаетесь к 10 базам по очереди, вам нужна как минимум одна свободная лицензия. Если же вы попытаетесь распараллелить процесс, лицензий потребуется больше.

Метод 2: Параллельная обработка через Фоновые задания

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

Рассмотрим алгоритм работы:

  1. Для каждой информационной базы запускается отдельное ФоновоеЗадание.
  2. Внутри задания происходит подключение через COM-соединение или Web-сервис.
  3. Результат выполнения запроса помещается во ВременноеХранилище.
  4. Основной поток ожидает завершения всех заданий с помощью метода ОжидатьЗавершенияВыполнения.
  5. После завершения всех потоков данные из всех адресов временного хранилища собираются в одну таблицу.

Проанализируем пример кода для запуска такого процесса:


ПараметрыЗадания = Новый Массив;
ПараметрыЗадания.Добавить(СтрокаПодключения);
ПараметрыЗадания.Добавить(ТекстЗапроса);

Задание = ФоновыеЗадания.Выполнить("ИнтеграцияОбщегоНазначения.ВыполнитьЗапросВнешнейБазы", ПараметрыЗадания);
ИдентификаторыЗаданий.Добавить(Задание.УникальныйИдентификатор);

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

Метод 3: Использование HTTP-сервисов и расширений

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

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

Как предложили участники обсуждения, можно реализовать схему с «двухэтапным» запросом. Сначала клиент запрашивает данные, сервер возвращает статус 102 Processing и начинает готовить отчет. Когда отчет готов (например, в виде двоичных данных в специальном регистре сведений), клиент забирает его повторным запросом.

Метод 4: Внешние источники данных (Прямой SQL)

Если все ваши базы находятся на одном SQL-сервере или в одной локальной сети, использование механизма Внешние источники данных в 1С будет самым производительным решением. Вы подключаете таблицы СУБД напрямую к вашей основной конфигурации.

Рассмотрим, как это упрощает работу с СКД:

В схеме компоновки данных вы просто выбираете таблицы из внешнего источника так же, как обычные объекты метаданных. 1С сама сформирует SQL-запросы. Однако здесь есть сложность: имена таблиц в SQL (например, _InfoRg1234) не интуитивны. Чтобы решить эту проблему, проанализируем использование SQL Views (представлений). Создайте в SQL-базе представление с понятными именами полей и подключайте в 1С именно его.

Технические нюансы: Разрядность и Регистрация

Если вы все же решили использовать COM-соединение, нужно помнить о технической стороне вопроса. При использовании 64-битного сервера 1С:Предприятия вам необходимо убедиться, что comcntcfg.xml настроен правильно, а сама компонента V83.COMConnector зарегистрирована в системе. Для решения проблем с настройкой и установкой COM-соединений можно использовать руководство по устранению ошибок подключения по COM.

Часто возникает ошибка: «Класс не зарегистрирован». Посмотрим на шаги по её устранению:

  1. Найдите файл comcntr.dll в каталоге установки 1С.
  2. Запустите командную строку от имени администратора.
  3. Выполните команду regsvr32 "C:\Path\To\comcntr.dll".
  4. Если сервер 64-битный, проверьте настройки в консоли Component Services (Настройка DCOM), чтобы разрешить запуск компоненты под нужной учетной записью.

Подготовка данных для СКД

Независимо от способа получения данных (COM, Web, SQL), для СКД их нужно подготовить. Посмотрим, как правильно настроить «Внешний набор данных».

Во-первых, в схеме компоновки добавьте «Набор данных - объект». Имя этого набора должно совпадать с ключом в структуре, которую вы передадите в ПроцессорКомпоновкиДанных.


СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;

// Подготавливаем внешние данные
ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("ОбщаяТаблицаДанных", ИтоговаяТаблица);

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);

Важное предостережение: при использовании внешних наборов данных вся фильтрация (отборы) должна происходить до того, как данные попадут в СКД. Если вы выгрузите миллион строк из 10 баз и попытаетесь наложить отбор средствами СКД в основной базе, вы рискуете переполнить оперативную память сервера.

Выводы и рекомендации

Подводя итог, можно сказать следующее: если задача разовая или данных немного, используйте последовательное COM-соединение. Если баз много и отчет должен работать быстро — рассмотрите HTTP-сервисы или прямые SQL-запросы через Внешние источники данных. Для крупных корпоративных систем идеальным вариантом будет использование 1С:Шина для асинхронного сбора агрегатов в одну аналитическую базу, из которой отчет будет строиться мгновенно.

← На главную