При разработке аналитических отчетов часто возникает задача сопоставления данных, хранящихся в разных информационных базах. Например, у вас есть данные об остатках товаров в основной учетной системе 1С и данные складской или сторонней системы. Столкнувшись с необходимостью не просто вывести эти данные рядом, а произвести их математическую обработку, группировку и расчет коэффициентов до вывода в отчет, разработчики часто задаются вопросом: как правильно организовать такой набор данных в СКД?
Рассмотрим детально, как решить эту задачу, избегая создания лишних промежуточных объектов в базе, таких как РегистрыСведений, которые засоряют метаданные.
Многие разработчики опасаются использовать набор данных Объект, полагая, что он ограничивает возможности дальнейшей обработки. Однако это не так. Если ваша бизнес-логика требует сложной математики, группировок по номенклатуре или характеристикам и расчета коэффициентов, лучшим решением будет выполнение всей подготовительной работы на языке 1С.
Разберем процесс по шагам:
COM-соединение или HTTP-сервисы) и сохраняем их в ТаблицуЗначений. Параллельно считываем необходимые данные из текущей базы стандартным запросом.1С производим Свернуть или ВыбратьСтроки для объединения двух таблиц. Именно на этом этапе вы проводите все вычисления, усреднения и расчеты коэффициентов.Объект.Почему этот путь эффективнее попыток сделать всё в одном запросе СКД? Потому что язык 1С гораздо гибче для работы с промежуточными вычислениями, чем язык запросов SQL в рамках ограниченных конструкций СКД. Пример логики обработки данных:
// Получаем данные из сторонней системы
ТаблицаВнешнихДанных = ПолучитьДанныеИзВнешнейСистемы();
// Получаем данные из текущей базы
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Номенклатура, Количество ИЗ РегистрНакопления.Товары";
ТаблицаВнутреннихДанных = Запрос.Выполнить().Выгрузить();
// Объединяем и обрабатываем
ТаблицаВнутреннихДанных.ВыгрузитьКолонку(ТаблицаВнешнихДанных); // Логика объединения
ТаблицаРезультат = ОбработатьДанные(ТаблицаВнутреннихДанных, ТаблицаВнешнихДанных);
// Передаем в СКД
КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("ТаблицаДанных", ТаблицаРезультат);
Если данные из текущей базы являются первичными и не требуют сложной предварительной свертки, вы можете использовать механизм связей наборов данных внутри самой СКД. Рассмотрим этот подход:
Разделите отчет на два набора данных:
В настройках СКД перейдите на вкладку «Связи наборов данных». Здесь вы можете указать связь между Набором 1 (запрос) и Набором 2 (объект) по ключевым полям (например, Номенклатура или Код). Таким образом, СКД самостоятельно выполнит операцию соединения данных, позволяя вам использовать все возможности визуализации, группировки и вычисляемых полей уже внутри системы отчетов.
При выборе метода ориентируйтесь на следующие правила:
Набор данных — Объект. Сначала подготовьте итоговую таблицу в модуле отчета, затем передайте её в СКД. Это упростит отладку кода и ускорит формирование отчета, так как 1С быстрее справляется с табличными вычислениями, чем сервер SQL с перегруженными подзапросами.Связи наборов данных в СКД. Это позволяет сохранять структуру отчета гибкой и независимой от типов данных в источниках.РегистрыСведений оправдана только в том случае, если данные используются множеством разных отчетов одновременно. Для одного конкретного отчета это избыточно и усложняет администрирование системы.Помните, что СКД — это мощный инструмент для визуализации и объединения результатов. Оставляя самую сложную вычислительную часть на стороне кода 1С, вы делаете свое приложение более надежным и легким в поддержке.