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