Методика разработки СКД-отчетов по сверке между базами с COM-запросом в другую базу






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

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

К примеру, необходимо найти «проблемный» регистратор при переносе движений по складу по документам в УТ 10.2 в ERP2.1.

В результате, проблема должна быстро находиться в массиве данных:

Теперь собственно методика разработки отчета:

  1. В СКД добавляем набор данных – объект. Собственно объектом является таблица значений, в которую выгружаем результат запроса (см. рисунок ниже) в процессе выполнения процедуры ПриКомпоновкеРезультата(…).
  2. Формируем запрос к данным другой базы. В моем случае я использовал COM-соединение, т.к. базы лежали в одной сети и ограничений в доступе к данным у меня не было. Особенности регистрации такого отчета по технологии «внешнего» для работы в безопасном режиме — написал отдельно (//infostart.ru/public/552950/)
  3. Показатели одной базы формируем со знаком «плюс», движения второй базы с «минусом». Если движения по всем измерениям (кроме измерения «база») совпадают – тогда в отчете отображается результат – 0. Если присутствует разница, то будет некое число, которое необходимо быстро и удобно найти.
  4. Поскольку была возможность сопоставить регистраторы в обеих база по ГУИД – сопоставляем программно, после чего таблица значений передается в СКД во внешние данные
  5. Настраиваем группировки отчета, чтобы быстро найти проблему – в данном случае, по виду регистратора, а затем по регистратору (см рисунок)
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;

Настройки = КомпоновщикНастроек.ПолучитьНастройки();
ПараметрПериод = Новый ПараметрКомпоновкиДанных("Период");

СтруктураПараметров = Новый Соответствие;

Для каждого ЭлементКоллекции Из Настройки.ПараметрыДанных.Элементы Цикл
Если ЭлементКоллекции.Параметр = ПараметрПериод Тогда
СтруктураПараметров.Вставить("ДатаНачала", ЭлементКоллекции.Значение.ДатаНачала);
СтруктураПараметров.Вставить("ДатаОкончания", ЭлементКоллекции.Значение.ДатаОкончания);
КонецЕсли;
КонецЦикла;

ТаблицаВнешниеДанные = ПолучитьТаблицу(СтруктураПараметров.Получить("ДатаНачала"), СтруктураПараметров.Получить("ДатаОкончания"));

ВнешниеНаборыДанных = Новый Структура("ТаблицаВнешниеДанные", ТаблицаВнешниеДанные);

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

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

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных,);

КонецПроцедуры

Если данные идентичны – можно развернуть и посмотреть детальные записи.

Если различаются – открываем раздел, затем регистратор

А можем и провалиться непосредственно в форму документа

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

5 Comments

  1. tindir

    Была подобная задача на собеседовании. Решал через хттп-сервисы на демо 8.3.9. Как у вас происходит сериализация объектов для обменов?

    Reply
  2. papche

    Обмен — это отдельная тема. Написал некий простой формат для выгрузки в XML-файл: некие разделы с атрибутами, внутри сами объекты (ЗаписатьXML(ЗаписьXML, Объект)). На стороне загрузки — разбор XML, там уже логика по полной задействована.

    Reply
  3. DitriX

    это через внешние источники данных в скд сделано

    или вы просто получили таблицу и подставили в запрос?

    Reply
  4. papche

    Объект метаданных — «Внешние источники данных» не использовал.

    Набор данных в СКД — типа объект — получил в виде таблицы значений, которую заполнил объединением данных как к собственной ИБ, так и внешних данных через COM-соединение.

    Reply
  5. starik-2005

    Можно все и проще делать, и сложнее. Я, помнится, делал по GUID, т.е. отдельно выгружал колонку GUID, отдельно колонку наименований — с одной стороны меньше времени на приведение типов, с другой — больше времени на заполнение таблицы. Но т.к. две базы по 1кк операциям сравнивались небыстро, то переписали на прямой SQL запрос, который возвращал только разницу. И вот этот результат запроса использовали как внешний источник (для СКД, а не то, что некоторые подумали).

    В принципе тут простор для творчества никак не ограничен.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *