Почему после перевода справочника в иерархический отчет стал выводить не все данные?

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

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

Шаг 1. Диагностика количества записей

Первое, что необходимо сделать при потере данных — это убедиться, на каком этапе запроса происходит «отсечение» строк. Часто разработчики сразу грешат на настройки СКД, но проблема кроется в самом тексте запроса или условиях ЛЕВОЕ СОЕДИНЕНИЕ.

Рассмотрим метод проверки через Консоль запросов:

  1. Сначала выполните запрос, который формирует вашу временную таблицу ВТ. Посчитайте количество строк, которые он возвращает.
  2. Затем выполните итоговый запрос, где происходит соединение с таблицей Справочник.Изображение.
  3. Если количество строк в итоговом запросе меньше, чем в ВТ, значит, условие соединения исключает записи.

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

Шаг 2. Анализ условий соединения

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

Посмотрим на пример отладочного выражения:


// Вместо использования функции ЕСТЬNULL, упростим условие для теста
ВЫБРАТЬ 
    ВТ.Номенклатура,
    ВЫБОР 
        КОГДА Изображение.Картинка ЕСТЬ NULL ТОГДА "Нет фото" 
        ИНАЧЕ "Есть фото" 
    КОНЕЦ КАК СтатусКартинки
ИЗ ВТ КАК ВТ
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Изображение КАК Изображение
ПО ВТ.Номенклатура = Изображение.Номенклатура

Используйте этот метод, чтобы проверить, возвращает ли система данные для всех позиций номенклатуры. Если после этой замены данные «появились», значит, проблема была в том, как СКД интерпретировала поле с NULL или в неявном приведении типов.

Шаг 3. Влияние иерархии на Справочник

Когда вы переводите справочник в режим иерархии, меняется метаданное объекта. В 1С это может привести к тому, что ссылки на элементы (GUID) остаются прежними, но структура таблиц в СУБД обновляется. Иногда после таких структурных изменений необходимо:

Практические советы по работе с СКД

При работе с иерархическими данными в СКД всегда обращайте внимание на параметры виртуальных таблиц. Если вы используете СрезПоследних, убедитесь, что условия отбора (например, по ВидЦен) не отсекают записи, относящиеся к группам справочника. Если справочник иерархический, всегда лучше явно указывать в запросе: ГДЕ Не Номенклатура.ЭтоГруппа, если отчет предназначен только для товаров.

Запомните: самая частая причина исчезновения строк — это неочевидные условия в ГДЕ, которые накладываются на результат левого соединения. Всегда начинайте отладку с того, чтобы максимально упростить запрос, убирая все лишние поля и соединения, постепенно возвращая их назад до момента обнаружения проблемного фрагмента.

← На главную