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