Когда учет нескольких юридических лиц ведется в раздельных информационных базах одной конфигурации (например, в типовых базах УПП или УТ), руководство неизбежно сталкивается с необходимостью оперативно видеть сводную картину. Типичные примеры: получение общего остатка материалов по складам группы компаний, анализ консолидированной дебиторской задолженности или сопоставление взаиморасчетов. Разберем доступные варианты решения этой задачи, их архитектурные плюсы, скрытые технические подводные камни и вопросы синхронизации нормативно-справочной информации.
Самый надежный способ устранить расхождения в оперативных отчетах — посадить всех пользователей в одну центральную базу, разделив учет по организациям. Если по требованиям безопасности или географической удаленности прямое подключение невозможно, организуется распределенная информационная база с фильтрацией по узлам.
Проанализируем преимущества и сложности этого подхода:
Если базы должны оставаться независимыми, сводный отчет создается во внешней обработке или в одной из баз с получением данных из остальных баз через программные интерфейсы.
Выясним технические особенности реализации через V83.COMConnector:
Connect() запускает полноценную внешнюю сессию в целевой информационной базе. Пока объект соединения удерживается в памяти, эта сессия занимает лицензию из пула. Если отчет формируют несколько пользователей одновременно, пул лицензий может быстро исчерпаться.Рассмотрим альтернативу в виде публикации SOAP Web-сервисов или HTTP-сервисов в каждой подчиненной базе. В целевых базах создается сервис, принимающий параметры отчета (период, склад, организация) и возвращающий готовый сжатый пакет данных (например, XML или JSON).
Преимущества веб-сервисов:
Для объединения разнородных данных в красивый пользовательский отчет оптимально использовать Систему компоновки данных с внешними наборами данных. Модуль отчета опрашивает внешние источники, объединяет строки в общую структуру и передает управление процессору компоновки.
Посмотрим на пример структуры модуля отчета, агрегирующего остатки из двух баз:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Получаем остатки из локальной базы
ТаблицаЛокальная = ПолучитьОстаткиТекущейБазы();
// Получаем остатки из удаленной базы через сервис
ТаблицаВнешняя = ПолучитьОстаткиУдаленнойБазы();
// Объединяем полученные данные в одну универсальную таблицу
ТаблицаДанных = ТаблицаЛокальная.Скопировать();
Для Каждого Стр Из ТаблицаВнешняя Цикл
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), Стр);
КонецЦикла;
ВнешниеНаборы = Новый Структура("НаборДанныхОстатки", ТаблицаДанных);
СхемаКомпоновки = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборы, ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
СКД берет на себя всю сложную работу по группировкам, иерархии, расчету итогов и оформлению таблицы, избавляя разработчика от ручного рисования макета табличного документа.
Главная практическая сложность сводных отчетов заключается не в технологии передачи байтов по сети, а в сопоставлении аналитики. Если один и тот же материал в одной базе заведен как «Кабель ВВГнг 3х1.5», а во второй — как «Кабель силовой 3х1,5 ВВГ-НГ», автоматический сводный отчет разделит остатки на две независимые строки.
Разберем способы решения проблемы НСИ:
Когда баз становится больше трех или объем строк исчисляется сотнями тысяч, выполнять онлайн-запрос ко всем источникам в момент нажатия кнопки «Сформировать» становится неэффективно: пользователи сталкиваются с длительными зависаниями интерфейса и сетевыми таймаутами.
Проанализируем схему с витриной данных:
РегламентноеЗадание, которое с заданной периодичностью (например, раз в час или ночью) выгружает дельту движений и остатков в единую промежуточную базу данных.