Как объединить данные из разных баз в отчете на СКД?

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

При разработке аналитических отчетов часто возникает задача сопоставления данных, хранящихся в разных информационных базах. Например, у вас есть данные об остатках товаров в основной учетной системе 1С и данные складской или сторонней системы. Столкнувшись с необходимостью не просто вывести эти данные рядом, а произвести их математическую обработку, группировку и расчет коэффициентов до вывода в отчет, разработчики часто задаются вопросом: как правильно организовать такой набор данных в СКД?

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

Метод первый: Использование источника данных «Объект»

Многие разработчики опасаются использовать набор данных Объект, полагая, что он ограничивает возможности дальнейшей обработки. Однако это не так. Если ваша бизнес-логика требует сложной математики, группировок по номенклатуре или характеристикам и расчета коэффициентов, лучшим решением будет выполнение всей подготовительной работы на языке 1С.

Разберем процесс по шагам:

  1. Получение данных: Сначала считываем данные из сторонней базы (через COM-соединение или HTTP-сервисы) и сохраняем их в ТаблицуЗначений. Параллельно считываем необходимые данные из текущей базы стандартным запросом.
  2. Объединение и обработка: На языке 1С производим Свернуть или ВыбратьСтроки для объединения двух таблиц. Именно на этом этапе вы проводите все вычисления, усреднения и расчеты коэффициентов.
  3. Передача в СКД: Полученную итоговую таблицу передаем в схему компоновки данных как набор данных Объект.

Почему этот путь эффективнее попыток сделать всё в одном запросе СКД? Потому что язык 1С гораздо гибче для работы с промежуточными вычислениями, чем язык запросов SQL в рамках ограниченных конструкций СКД. Пример логики обработки данных:


// Получаем данные из сторонней системы
ТаблицаВнешнихДанных = ПолучитьДанныеИзВнешнейСистемы();

// Получаем данные из текущей базы
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Номенклатура, Количество ИЗ РегистрНакопления.Товары";
ТаблицаВнутреннихДанных = Запрос.Выполнить().Выгрузить();

// Объединяем и обрабатываем
ТаблицаВнутреннихДанных.ВыгрузитьКолонку(ТаблицаВнешнихДанных); // Логика объединения
ТаблицаРезультат = ОбработатьДанные(ТаблицаВнутреннихДанных, ТаблицаВнешнихДанных);

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

Метод второй: Комбинированный набор данных

Если данные из текущей базы являются первичными и не требуют сложной предварительной свертки, вы можете использовать механизм связей наборов данных внутри самой СКД. Рассмотрим этот подход:

Разделите отчет на два набора данных:

В настройках СКД перейдите на вкладку «Связи наборов данных». Здесь вы можете указать связь между Набором 1 (запрос) и Набором 2 (объект) по ключевым полям (например, Номенклатура или Код). Таким образом, СКД самостоятельно выполнит операцию соединения данных, позволяя вам использовать все возможности визуализации, группировки и вычисляемых полей уже внутри системы отчетов.

Рекомендации по выбору архитектуры

При выборе метода ориентируйтесь на следующие правила:

Помните, что СКД — это мощный инструмент для визуализации и объединения результатов. Оставляя самую сложную вычислительную часть на стороне кода 1С, вы делаете свое приложение более надежным и легким в поддержке.

← На главную