Как соединить справочники Номенклатура и ХарактеристикиНоменклатуры в запросе 1С

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

При составлении запросов в 1С начинающие разработчики часто сталкиваются с ситуацией, когда результатом выполнения ЛЕВОЕ СОЕДИНЕНИЕ становится пустая таблица или данные берутся только из первой таблицы, а поля соединенной сущности остаются не задействованными (содержат NULL). Разберем на практическом примере, почему так происходит и как правильно связывать справочники с детальными данными.

Разбор проблемы: несовпадение типов полей при левом соединении

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


ПО Номенклатура.НомерМоделиДляРезаков = ХарактеристикиНоменклатуры.Артикул.Ссылка

Выясним причину этой ошибки. В платформе 1С проверка равенства значений в секции ПО проверяет не только наглядное текстовое представление, но и тип данных. Если левое поле НомерМоделиДляРезаков имеет тип Строка, а правое выражение Артикул.Ссылка является ссылкой на другой справочник (СправочникСсылка...), СУБД не сможет сопоставить строки со ссылочными идентификаторами GUID. В результате условие соединения не выполняется ни для одной строки, и реквизиты присоединяемой таблицы возвращают пустые значения.

Решение 1: Соединение по совпадению текстовых реквизитов

Если в предметной области учет ведется таким образом, что связующее звено хранится в виде текста (например, модель или артикул записаны строкой и в номенклатуре, и в наименовании артикула характеристики), необходимо приписать условия к полям одинаковых строковых типов.

Рассмотрим рабочий пример запроса с исправленным типом связи по наименованию артикула:


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

В данном случае оба проверяемых выражения (НомерМоделиДляРезаков и Артикул.Наименование) возвращают тип Строка, благодаря чему СУБД успешно находит совпадения.

Решение 2: Использование стандартного механизма подчинения (Владелец)

С точки зрения архитектуры платформы 1С соединение справочников по текстовым полям является неоптимальным. В большинстве конфигураций справочник ХарактеристикиНоменклатуры объявляется подчиненным справочнику Номенклатура (или справочнику ВидыНоменклатуры). В этом случае стандартный реквизит подчиненного справочника Владелец хранит прямую ссылку на товар.

Перепишем запрос, используя наиболее эффективное и правильное соединение по ссылочному полю:


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

Архитектурные риски и особенности работы со связью «один ко многим»

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

  1. Падение производительности при текстовых соединениях: Сравнение таблиц по строкам выполняется существенно медленнее, чем по внутренним уникальным идентификаторам (ссылкам). СУБД не может эффективно задействовать первичные индексы, что приводит к сканированию всей таблицы.
  2. Умножение строк (размножение записей): Поскольку у одной номенклатуры может быть множество характеристик, использование ЛЕВОЕ СОЕДИНЕНИЕ приведет к дублированию строк основной таблицы Номенклатура. Если добавить в запрос числовые показатели (например, остатки или цены), их обычное суммирование исказит итоговые показатели.
  3. Чувствительность к вводу данных: При соединении по строковым полям невидимые пробелы на конце текста, различие в регистре или опечатки разорвут связь объектов. При использовании ссылок (ПО Ссылка = Владелец) человеческий фактор полностью исключается.

Посмотрим, как рекомендуется поступить при выводе результатов. Если отчёт формируется для выгрузки на сайт или печати, рекомендуем использовать Систему компоновки данных (СКД) вместо ПостроительОтчета. СКД умеет группировать подчиненные характеристики и при необходимости сворачивать их в одну строку с помощью функции СоединитьСтроки() в языке выражений компоновки данных.

← На главную