При составлении запросов в 1С начинающие разработчики часто сталкиваются с ситуацией, когда результатом выполнения ЛЕВОЕ СОЕДИНЕНИЕ становится пустая таблица или данные берутся только из первой таблицы, а поля соединенной сущности остаются не задействованными (содержат NULL). Разберем на практическом примере, почему так происходит и как правильно связывать справочники с детальными данными.
Проанализируем типовую ситуацию. Пусть перед нами стоит задача вывести список номенклатуры вместе с принадлежащими ей характеристиками (цвет, размер) для последующей выгрузки данных. Попытка связать таблицы запросом следующего вида не приводит к успеху:
ПО Номенклатура.НомерМоделиДляРезаков = ХарактеристикиНоменклатуры.Артикул.Ссылка
Выясним причину этой ошибки. В платформе 1С проверка равенства значений в секции ПО проверяет не только наглядное текстовое представление, но и тип данных. Если левое поле НомерМоделиДляРезаков имеет тип Строка, а правое выражение Артикул.Ссылка является ссылкой на другой справочник (СправочникСсылка...), СУБД не сможет сопоставить строки со ссылочными идентификаторами GUID. В результате условие соединения не выполняется ни для одной строки, и реквизиты присоединяемой таблицы возвращают пустые значения.
Если в предметной области учет ведется таким образом, что связующее звено хранится в виде текста (например, модель или артикул записаны строкой и в номенклатуре, и в наименовании артикула характеристики), необходимо приписать условия к полям одинаковых строковых типов.
Рассмотрим рабочий пример запроса с исправленным типом связи по наименованию артикула:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура,
Номенклатура.Наименование КАК Наименование,
Номенклатура.Сезонность.Ссылка КАК Сезонность,
Номенклатура.НомерМоделиДляРезаков КАК НомерМоделиДляРезаков,
ХарактеристикиНоменклатуры.Размер.Ссылка КАК Размер,
ХарактеристикиНоменклатуры.Артикул.Ссылка КАК Артикул
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
ПО Номенклатура.НомерМоделиДляРезаков = ХарактеристикиНоменклатуры.Артикул.Наименование
ГДЕ
Номенклатура.ВыгрузкаНаСайт = ИСТИНА
В данном случае оба проверяемых выражения (НомерМоделиДляРезаков и Артикул.Наименование) возвращают тип Строка, благодаря чему СУБД успешно находит совпадения.
С точки зрения архитектуры платформы 1С соединение справочников по текстовым полям является неоптимальным. В большинстве конфигураций справочник ХарактеристикиНоменклатуры объявляется подчиненным справочнику Номенклатура (или справочнику ВидыНоменклатуры). В этом случае стандартный реквизит подчиненного справочника Владелец хранит прямую ссылку на товар.
Перепишем запрос, используя наиболее эффективное и правильное соединение по ссылочному полю:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура,
Номенклатура.Наименование КАК Наименование,
Номенклатура.Сезонность КАК Сезонность,
Номенклатура.НомерМоделиДляРезаков КАК НомерМоделиДляРезаков,
ХарактеристикиНоменклатуры.Ссылка КАК Характеристика,
ХарактеристикиНоменклатуры.Размер КАК Размер
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
ПО Номенклатура.Ссылка = ХарактеристикиНоменклатуры.Владелец
ГДЕ
Номенклатура.ВыгрузкаНаСайт = ИСТИНА
При выборе способа построения запроса важно учитывать следующие технологические особенности платформы 1С:
ЛЕВОЕ СОЕДИНЕНИЕ приведет к дублированию строк основной таблицы Номенклатура. Если добавить в запрос числовые показатели (например, остатки или цены), их обычное суммирование исказит итоговые показатели.ПО Ссылка = Владелец) человеческий фактор полностью исключается.Посмотрим, как рекомендуется поступить при выводе результатов. Если отчёт формируется для выгрузки на сайт или печати, рекомендуем использовать Систему компоновки данных (СКД) вместо ПостроительОтчета. СКД умеет группировать подчиненные характеристики и при необходимости сворачивать их в одну строку с помощью функции СоединитьСтроки() в языке выражений компоновки данных.