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

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

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

Постановка задачи и анализ исходного запроса

Рассмотрим ситуацию: нам необходимо вывести список номенклатуры и проверить, заполнены ли такие поля, как Описание, Вес, Артикул, а также произвольное количество дополнительных реквизитов. Автор темы предложил начальный вариант запроса, который использует ЛЕВОЕ СОЕДИНЕНИЕ с табличной частью дополнительных реквизитов. Проанализируем его структуру:


ВЫБРАТЬ РАЗЛИЧНЫЕ
	Номенклатура.Ссылка КАК Ссылка,
	ВЫБОР
		КОГДА НЕ ЕСТЬNULL(Номенклатура.Описание, 0) = 0
			ТОГДА "Описание заполнено"
		ИНАЧЕ "Описание не заполнено"
	КОНЕЦ КАК Описание,
	ВЫБОР
		КОГДА ЕСТЬNULL(Номенклатура.ВесЧислитель, 0) = 0
			ТОГДА "Реквизит не заполнен"
		ИНАЧЕ "Реквизит заполнен"
	КОНЕЦ КАК ВесЧислитель,
	НоменклатураДополнительныеРеквизиты.Свойство КАК Свойство,
	НоменклатураДополнительныеРеквизиты.Значение КАК Значение
ИЗ
	Справочник.Номенклатура КАК Номенклатура
		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
		ПО (Номенклатура.Ссылка = НоменклатураДополнительныеРеквизиты.Ссылка)

Проблема данного подхода: при таком соединении каждая позиция номенклатуры будет дублироваться столько раз, сколько у нее задано дополнительных реквизитов. Нам же нужно получить одну строку на одну номенклатуру, где каждое свойство будет представлено в отдельной колонке или аккуратно собрано в одну строку.

Метод 1: Использование механизма «Характеристики» в СКД

Проанализируем наиболее правильный и «чистый» способ решения задачи в рамках платформы 1С — использование механизма характеристик. Этот метод позволяет динамически расширять набор доступных полей отчета без написания сложного программного кода.

Разберем по шагам, как настроить характеристики в схеме компоновки данных:

  1. Откроем конструктор СКД и перейдем на закладку Характеристики.
  2. Добавим новую строку и укажем следующие параметры:
    • Тип объекта: СправочникСсылка.Номенклатура.
    • Виды характеристик: выберем таблицу, где хранятся описания свойств (обычно это ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения).
    • Поле ключа: Ссылка.
    • Поле имени: Наименование.
    • Значения характеристик: выберем табличную часть Номенклатура.ДополнительныеРеквизиты.
    • Поле объекта: Ссылка.
    • Поле вида: Свойство.
    • Поле значения: Значение.

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

Метод 2: Программное формирование запроса в ПриКомпоновкеРезультата

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

В модуле объекта отчета переопределим процедуру ПриКомпоновкеРезультата. Нам нужно получить список всех существующих свойств и для каждого из них добавить ЛЕВОЕ СОЕДИНЕНИЕ в тексте запроса. Посмотрим на пример кода:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // Получаем текущую схему
    Схема = ЭтотОбъект.СхемаКомпоновкиДанных;
    НаборДанных = Схема.НаборыДанных.НаборДанных1;
    ТекстЗапроса = НаборДанных.Запрос;
    
    // Сначала получим все уникальные свойства, которые есть в базе
    ЗапросСвойств = Новый Запрос;
    ЗапросСвойств.Текст = 
        "ВЫБРАТЬ РАЗЛИЧНЫЕ
        |	ДополнительныеРеквизиты.Свойство КАК Свойство,
        |	ДополнительныеРеквизиты.Свойство.Наименование КАК ИмяПоля
        |ИЗ
        |	Справочник.Номенклатура.ДополнительныеРеквизиты КАК ДополнительныеРеквизиты";
    
    ВыгрузкаСвойств = ЗапросСвойств.Выполнить().Выгрузить();
    
    Индекс = 0;
    Для Каждого Стр Из ВыгрузкаСвойств Цикл
        ИмяВТ = "ДопРеквизит" + Индекс;
        ИмяПоля = "П" + Индекс; // Безопасное имя для колонки
        
        // Добавляем поле в выборку
        ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ИЗ", ", " + ИмяВТ + ".Значение КАК " + ИмяПоля + " ИЗ");
        
        // Добавляем само соединение
        ТекстЗапроса = ТекстЗапроса + Символы.ПС + 
            "ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК " + ИмяВТ + 
            " ПО " + ИмяВТ + ".Ссылка = Номенклатура.Ссылка И " + ИмяВТ + ".Свойство = &Свойство" + Индекс;
        
        // Устанавливаем параметр для конкретного соединения
        НаборДанных.Запрос = ТекстЗапроса;
        // Важно: не забудьте программно добавить новое поле в коллекцию Поля Набора Данных СКД
        НовоеПоле = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
        НовоеПоле.ПутьКДанным = Стр.ИмяПоля;
        НовоеПоле.Поле = ИмяПоля;
        НовоеПоле.Заголовок = Стр.ИмяПоля;
        
        Индекс = Индекс + 1;
    КонецЦикла;

    // Далее стандартный вывод отчета через КомпоновщикМакета...
КонецПроцедуры

Важный нюанс: программное изменение текста запроса требует ручного управления параметрами и полями компоновки. Если вы просто измените ТекстЗапроса, СКД не узнает о новых колонках автоматически.

Метод 3: Использование функции «СоединитьСтроки» (Группировка в одну колонку)

Если задача стоит не в выводе широкой таблицы, а в простом перечислении «чего не хватает», рассмотрим более изящный способ. Мы можем собрать все пустые реквизиты в одну строку через запятую.

Для этого в запросе выберем номенклатуру и все ее незаполненные свойства:


ВЫБРАТЬ
	Номенклатура.Ссылка КАК Номенклатура,
	НоменклатураДополнительныеРеквизиты.Свойство.Наименование КАК ИмяПустогоСвойства
ИЗ
	Справочник.Номенклатура КАК Номенклатура
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
		ПО Номенклатура.Ссылка = НоменклатураДополнительныеРеквизиты.Ссылка
ГДЕ
	(НоменклатураДополнительныеРеквизиты.Значение = ЗНАЧЕНИЕ(Справочник.ЗначенияСвойствОбъектов.ПустаяСсылка)
	ИЛИ НоменклатураДополнительныеРеквизиты.Значение = ""
	ИЛИ НоменклатураДополнительныеРеквизиты.Значение ЕСТЬ NULL)

В настройках СКД на закладке Ресурсы для поля ИмяПустогоСвойства укажем выражение: СоединитьСтроки(ИмяПустогоСвойства, ", "). В результате для каждого товара мы получим компактную строку вида: «Цвет, Размер, Материал», что очень удобно для быстрой визуальной проверки.

Проверка типов данных и «пустоты»

Разберем, как правильно проверять на «пустоту» различные типы данных в запросе 1С. Помните, что NULL, неопределено и пустая ссылка — это разные вещи.

  1. Ссылочные поля (Производитель, Склад): используйте ГДЕ Реквизит = ЗНАЧЕНИЕ(Справочник.ИмяСправочника.ПустаяСсылка).
  2. Строковые поля (Описание, Артикул): используйте ГДЕ Реквизит = "".
  3. Числовые поля (Вес, Цена): используйте ГДЕ Реквизит = 0.
  4. Дополнительные реквизиты: здесь значение может быть разных типов. Универсальный способ проверки в запросе — это ЕСТЬNULL(ДополнительныеРеквизиты.Значение.Ссылка, НЕОПРЕДЕЛЕНО) = НЕОПРЕДЕЛЕНО (если значение ссылочное) или проверка на пустую строку для текстовых свойств.

Оптимизация производительности

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

Используя предложенные методы, вы сможете создать мощный инструмент для аудита данных, который поможет поддерживать справочник номенклатуры в идеальном порядке.

← На главную