Имя: Пароль:
1C
 
Внешний отчет для проверки незаполненных реквизитов номенклатуры
0 Max57
 
17.10.23
12:43
Здравствуйте, уважаемые форумчане. Мне нужно создать внешний отчет для проверки заполненности реквизитов (в том числе и дополнительных) у номенклатуры. Написал такой запрос.

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


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

https://disk.yandex.ru/i/4qDR4Sbwd7MLlg
2 BDA80
 
17.10.23
12:21
Делайте соединение на каждое свойство

ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
        ПО (Номенклатура.Ссылка = НоменклатураДополнительныеРеквизиты.Ссылка) И НоменклатураДополнительныеРеквизиты.Свойство.Имя = "ИмяСвойства"
3 Max57
 
17.10.23
12:29
(2) Спасибо, а как тогда быть если будут добавлены новые дополнительные реквизиты? Тогда они не будут выводиться, верно?
4 BDA80
 
17.10.23
12:41
(3) Если нужно учитывать возможность добавления новых доп. реквизитов, тогда собирать запрос динамически, в цикле перебирая свойства

ТекстЗапроса = ТекстЗапроса + "|ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
        ПО (Номенклатура.Ссылка = НоменклатураДополнительныеРеквизиты.Ссылка) И НоменклатураДополнительныеРеквизиты.Свойство.Имя = "ИмяСвойства""
5 Max57
 
17.10.23
12:51
(4) Благодарю, правильно ли я понимаю, что одной СКД в этом случае не обойтись? Придется создавать макет и в модуле объекта выполнять запрос и перебирать свойства, а затем заполнять макет?
6 BDA80
 
17.10.23
13:01
(5) ПриКомпоновкеРезультата() или функция СоединитьСтроки()
7 Max57
 
17.10.23
17:03
(6) Скажите, пожалуйста, что-то такое должно получиться?
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
ТекстЗапроса = СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос;

ТекстЗапроса = СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос;    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ РАЗЛИЧНЫЕ
        |    НоменклатураДополнительныеРеквизиты.Свойство.Имя КАК СвойствоИмя
        |ИЗ
        |    Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты";
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выгрузить();
    Свойства = Новый Массив;
Для каждого Элемент Из ВыборкаДетальныеЗаписи Цикл

          Свойства.Добавить(Элемент.СвойствоИмя);

      КонецЦикла;
Для Индекс = 0 По Свойства.Количество()-1 Цикл

ТекстЗапроса = ТекстЗапроса + Символы.ПС +
        "ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты"+(Индекс)+ Символы.ПС +
        "ПО (Номенклатура.Ссылка = НоменклатураДополнительныеРеквизиты"+ (Индекс) +".Ссылка)" + Символы.ПС +
            "И (НоменклатураДополнительныеРеквизиты"+(Индекс)+".Свойство.Имя ="+Строка(Свойства[Индекс])+")";
КонецЦикла;

    СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос = ТекстЗапроса;

КонецПроцедуры
8 Max57
 
18.10.23
10:16
(6) Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
ТекстЗапроса = СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос;

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

    СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос = ТекстЗапроса;
КонецПроцедуры
Подскажите, пожалуйста.
У меня получилось такая процедура. Какие теперь мне сделать настройки в СКД, чтобы поля выводились?
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.