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

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

При разработке отчетов на базе СКД в УТ 11.5 часто возникает необходимость объединить данные из разных источников по значению дополнительного реквизита. Ситуация осложняется тем, что один реквизит может быть представлен ссылкой на СправочникСсылка.ЗначенияСвойствОбъектов, а другой — хранить значение примитивного типа или иметь иную структуру хранения. Давайте разберем, как грамотно настроить связь в такой конфигурации.

Вариант 1: Приведение типов через ВЫРАЗИТЬ

Если вы решили использовать два набора данных (два запроса) и планируете соединять их средствами самой СКД во вкладке «Связи наборов данных», вам необходимо привести поля к единому типу. Самым доступным способом является приведение к строковому типу.

Рассмотрим по шагам, как это реализовать:

  1. В тексте обоих запросов получите значение дополнительного реквизита.
  2. Используйте функцию ВЫРАЗИТЬ, чтобы привести эти значения к типу СТРОКА. Например, ВЫРАЗИТЬ(МоеПоле КАК СТРОКА(100)).
  3. Перейдите на вкладку «Связи наборов данных» в настройках СКД.
  4. Укажите связь по полученным строковым полям.

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

Вариант 2: Использование единого запроса (рекомендуемый способ)

Чтобы избежать сложностей с настройкой связей внутри СКД, рекомендуем перенести логику объединения на уровень языка запросов 1С. Это позволит системе оптимизировать выборку данных на уровне СУБД.

Рассмотрим, как это сделать структурно:

  1. Создайте один набор данных «Запрос».
  2. Используйте ЛЕВОЕ СОЕДИНЕНИЕ для присоединения таблиц, содержащих дополнительные реквизиты.
  3. В условиях соединения приведите типы данных к общему знаменателю, если это необходимо, или связывайте по внутреннему ключу ссылки.

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


ВЫБРАТЬ
    Документы.Ссылка КАК Документ,
    ЗначенияСвойств.Значение КАК Свойство
ИЗ
    Документ.РеализацияТоваровУслуг КАК Документы
ЛЕВОЕ СОЕДИНЕНИЕ
    РегистрСведений.ДополнительныеСведения КАК ЗначенияСвойств
ПО
    Документы.Ссылка = ЗначенияСвойств.Объект

Использование ЛЕВОЕ СОЕДИНЕНИЕ позволяет не терять данные из основного документа, даже если значение дополнительного реквизита не заполнено.

Особенности работы с дополнительными реквизитами

Помните, что архитектура БСП (Библиотеки Стандартных Подсистем), на которой построена УТ 11.5, предполагает хранение доп. реквизитов в специализированных регистрах ДополнительныеСведения или непосредственно в табличных частях объектов. Пытаться обращаться к ним «точечной нотацией» через свойства метаданных в СКД не всегда эффективно.

Если вы работаете с СправочникСсылка.ЗначенияСвойствОбъектов, учитывайте, что это составной тип. Чтобы отчет работал корректно:

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

← На главную