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