При разработке отчетов или выборок данных в 1С часто возникает задача: необходимо получить полный список элементов справочника и при этом «подтянуть» информацию из регистров сведений, если она существует. Часто начинающие разработчики сталкиваются с тем, что часть элементов справочника просто пропадает из результата запроса. Давайте разберемся, почему это происходит и как правильно настроить связь таблиц.
Основная причина кроется в использовании Внутреннего соединения (INNER JOIN). Когда мы пишем ВНУТРЕННЕЕ СОЕДИНЕНИЕ, база данных 1С ищет соответствия в обеих таблицах. Если в левой таблице (нашем справочнике) есть элемент, а в правой таблице (регистре) для него не нашлось записи, то такая строка не попадет в итоговую выборку. Если элементов в регистре меньше, чем в справочнике, запрос «отсечет» всё лишнее, оставив только те записи, где данные присутствуют в обоих местах.
Чтобы увидеть все 800 элементов справочника, вне зависимости от наличия данных в регистре, нам необходимо изменить тип соединения на Левое соединение (LEFT JOIN). При таком подходе система берет все записи из «левой» таблицы (справочника) и пытается найти им пару в «правой» таблице (регистре). Если соответствие найдено — данные выводятся. Если нет — поля из регистра просто заполняются значением NULL.
В тексте запроса это выглядит следующим образом:
ВЫБРАТЬ
ПриборыУчета.Ссылка КАК Ссылка,
...
ВложенныйЗапрос1.Регистратор КАК РегистраторПоверки
ИЗ
Справочник.ПриборыУчета КАК ПриборыУчета
ЛЕВОЕ СОЕДИНЕНИЕ
(ВЫБРАТЬ ...) КАК ВложенныйЗапрос1
ПО
ПриборыУчета.Ссылка = ВложенныйЗапрос1.ПриборУчета
Когда вы переключаетесь на Левое соединение, поля, по которым не нашлось данных, будут возвращать NULL. В интерфейсе пользователя или при дальнейшей обработке данных это может быть неудобно. Чтобы вместо NULL получать конкретное значение (например, пустую строку или специальную метку), используйте функцию ЕСТЬNULL.
Разберем, как это работает на практике:
ЕСТЬNULL(ВложенныйЗапрос.ЛицевойСчёт, "") КАК ЛицевойСчёт
Функция ЕСТЬNULL проверяет значение: если оно равно NULL, она подставляет второе значение (в данном примере — пустую строку ""). Это позволяет сделать отчет более чистым и предсказуемым.
СрезПоследних), убедитесь, что вы связываете их с основным справочником именно через ЛЕВОЕ СОЕДИНЕНИЕ.ЕСТЬNULL. Это защитит отчет от появления неопределенных значений.ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ. Это позволит выводить «+» или «-» вместо данных, что значительно повышает читаемость отчета.Пример использования такой логики для создания индикатора наличия поверки:
ВЫБОР
КОГДА ВложенныйЗапрос1.Регистратор ЕСТЬ NULL ТОГДА "-"
ИНАЧЕ "+"
КОНЕЦ КАК ЕстьПоверка
При работе с большими объемами данных (как в вашем случае, где около 800 элементов) помните о следующих правилах:
СрезПоследних), так как они оптимизированы платформой 1С на уровне запросов к СУБД.ПриборУчета, Ссылка), должны быть проиндексированы. Это значительно ускорит работу запроса.Используя Левое соединение и функцию ЕСТЬNULL, вы получите корректный и полный список элементов справочника, что позволит отобразить все необходимые данные без потерь строк.