Пустая строка в группировке отчета СКД

1. user1403055 19.08.20 11:59 Сейчас в теме
Здравствуйте, товарищи!
1С:Предприятие 8.2 (8.2.19.116), не типовая конфигурация.
Столкнулся с такой проблемой. Отчет СКД, выбор полей и параметров выполняется программно. В итоговом отчете, при выборе определенных полей, появляется пустая строка на определенной уровне группировки.
Во вложении скрин лишней пустой строки.
Процедура формирования отчета:

Процедура Сформировать(ВарОтчета = 1)
	Если НачПериода = Дата(1,1,1) ИЛИ КонПериода = Дата(1,1,1) Тогда 
		Возврат;
	КонецЕсли;
	Начало = ТекущаяДата();
	
	//********************************************************
	Если ВарОтчета = 1 Тогда
		ВариантНастроек = СхемаКомпоновкиДанных.ВариантыНастроек.Основной;
	ИначеЕсли ВарОтчета = 2 Тогда
		ВариантНастроек = СхемаКомпоновкиДанных.ВариантыНастроек.Горизонтальный;
	КонецЕсли;
	Настройки = ВариантНастроек.Настройки;
	
	// Разворот
	Настройки.Структура.Получить(1).Строки.Очистить();
	//Получаем элемент группировки и устанавливаем группируемое поле
	ЭлементыСтрок = Настройки.Структура.Получить(1).Строки;// Первый элемент структуры таблица
	Отбор = Новый Структура("Показывать",Истина);
	ВыгрГруппировки = ГруппировкаОтчета.Выгрузить(Отбор);
	Для Каждого Группировка Из ВыгрГруппировки Цикл
		ЭлементыСтрок = СтруктураЦикл(ЭлементыСтрок,Группировка).Структура;
	КонецЦикла;
	
	// Показать поля
	ВыводимыеПоля = Настройки.Выбор.Элементы;
	КолвоПолей = ВыводимыеПоля.Количество()-1;
	Для i = 0 По КолвоПолей Цикл
		Строка = ВыводимыеПоля[i];
		Если Строка(Строка.Поле) = "Сумма" Тогда 
			Настройки.Выбор.Элементы[i].Использование = ПоказатьСуммы;
			Продолжить;
		КонецЕсли;    
		Если Строка(Строка.Поле) = "Количество" Тогда 
			Настройки.Выбор.Элементы[i].Использование = ПоказатьКоличество;
			Продолжить;
		КонецЕсли;
		Если Строка(Строка.Поле) = "Себестоимость" Тогда 
			Настройки.Выбор.Элементы[i].Использование = ПоказатьСебестоимость;
			Продолжить;
		КонецЕсли;                                                    
		Если Строка(Строка.Поле) = "КолПозВариант2" Тогда 
			//КолПоз
			//Ресурс = Сумма(ВычислитьВыражениеСГруппировкойМассив ("Количество(Различные КолПоз)","КолПоз"))
			Настройки.Выбор.Элементы[i].Использование = ПоказатьSKU;     
			Продолжить;
		КонецЕсли;
		Если Строка(Строка.Поле) = "Скидка" Тогда 
			Настройки.Выбор.Элементы[i].Использование = ПоказатьСкидки;
			Продолжить;
		КонецЕсли;
		Если Строка(Строка.Поле) = "БазаОборот" Тогда 
			Настройки.Выбор.Элементы[i].Использование = ПоказатьБазу;
			Продолжить;
		КонецЕсли;
		Если Строка.Поле = Неопределено Тогда
			ВыводимыеПоляГруппа = Строка.Элементы;
			Для Каждого Стр ИЗ ВыводимыеПоляГруппа Цикл 
				Если Строка(Стр.Поле) = "Товар.Код" Тогда 
					Стр.Использование = ПоказатьКод;     
					Продолжить;
				КонецЕсли;
				Если Строка(Стр.Поле) = "Товар.Артикул" Тогда 
					Стр.Использование = ПоказатьАртикул;     
					Продолжить;
				КонецЕсли;
				Если Строка(Стр.Поле) = "Товар.ШтрихКод" Тогда 
					Стр.Использование = ПоказатьШтрихкод;     
					Продолжить;
				КонецЕсли;
				Если Строка(Стр.Поле) = "Товар.Бренд" Тогда 
					Стр.Использование = ПоказатьБренд;     
					Продолжить;
				КонецЕсли;
				Если Строка(Стр.Поле) = "Товар.Категория" Тогда 
					Стр.Использование = ПоказатьКатегорию;     
					Продолжить;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
	КонецЦикла;
	
	// устанавливаем параметры
	Отбор = Настройки.ПараметрыДанных.Элементы;
	КолвоПолей = Отбор.Количество()-1;
	Для i = 0 По КолвоПолей Цикл
		Строка = Отбор[i];
		Настройки.ПараметрыДанных.Элементы[i].Использование = Ложь;
		Если Строка(Строка.Параметр) = "НачалоПериода" И НачПериода <> Дата(1,1,1) Тогда
			Настройки.ПараметрыДанных.Элементы[i].Значение = НачПериода;
			Настройки.ПараметрыДанных.Элементы[i].Использование = Истина;
			Продолжить;
		КонецЕсли;
		Если Строка(Строка.Параметр) = "КонецПериода" И КонПериода <> Дата(1,1,1) Тогда
			Настройки.ПараметрыДанных.Элементы[i].Значение = КонПериода;
			Настройки.ПараметрыДанных.Элементы[i].Использование = Истина;
			Продолжить;
		КонецЕсли;
		Если Строка(Строка.Параметр) = "Периодичность" Тогда
			Настройки.ПараметрыДанных.Элементы[i].Значение = ?(Периодичность.Пустая() = Истина,Перечисления.Периодичность.Месяц,Периодичность);
			Настройки.ПараметрыДанных.Элементы[i].Использование = Истина;
			Продолжить;
		КонецЕсли;
		Если Строка(Строка.Параметр) = "Район" И ЗначениеЗаполнено(Район) = Истина Тогда
			Если НесколькоРайон Тогда
				Настройки.ПараметрыДанных.Элементы[i].Значение = Район;
				Настройки.ПараметрыДанных.Элементы[i].Использование = Истина;
			ИначеЕсли Район.Пустая() = Ложь Тогда
				РайонСЗ = Новый СписокЗначений;
				РайонСЗ.Добавить(Район);
				Настройки.ПараметрыДанных.Элементы[i].Значение = РайонСЗ;
				Настройки.ПараметрыДанных.Элементы[i].Использование = Истина;     
			КонецЕсли;
			Продолжить;
		КонецЕсли;
		Если Строка(Строка.Параметр) = "Контрагент" И СписокКонтрагентов.Количество()<>0 Тогда
			Настройки.ПараметрыДанных.Элементы[i].Значение = СписокКонтрагентов;
			Настройки.ПараметрыДанных.Элементы[i].Использование = Истина;
			Продолжить;
		КонецЕсли;
		Если Строка(Строка.Параметр) = "КонтрагентИсключение" И КонтрагентИсключение.Пустая() = Ложь Тогда
			Настройки.ПараметрыДанных.Элементы[i].Значение = КонтрагентИсключение;
			Настройки.ПараметрыДанных.Элементы[i].Использование = Истина;
			Продолжить;
		КонецЕсли;
		Если Строка(Строка.Параметр) = "Дистрибуция" И Дистрибуция.Пустая() = Ложь Тогда
			Настройки.ПараметрыДанных.Элементы[i].Значение = Дистрибуция;
			Настройки.ПараметрыДанных.Элементы[i].Использование = Истина;
			Продолжить;
		КонецЕсли;                                                    
		Если Строка(Строка.Параметр) = "Подразделение" И ЗначениеЗаполнено(Подразделение) = Истина Тогда
			Если НесколькоПодразд Тогда
				Настройки.ПараметрыДанных.Элементы[i].Значение = Подразделение;
				Настройки.ПараметрыДанных.Элементы[i].Использование = Истина;
			ИначеЕсли Подразделение.Пустая() = Ложь Тогда
				ПодразделениеСЗ = Новый СписокЗначений;
				ПодразделениеСЗ.Добавить(Подразделение);
				Настройки.ПараметрыДанных.Элементы[i].Значение = ПодразделениеСЗ;
				Настройки.ПараметрыДанных.Элементы[i].Использование = Истина;     
			КонецЕсли;
			Продолжить;
		КонецЕсли;
		Если Строка(Строка.Параметр) = "Агент" И ЗначениеЗаполнено(Агент) = Истина Тогда 
			Если Несколько Тогда
				Настройки.ПараметрыДанных.Элементы[i].Значение = Агент;
				Настройки.ПараметрыДанных.Элементы[i].Использование = Истина;
			ИначеЕсли Агент.Пустая() = Ложь Тогда
				АгентСЗ = Новый СписокЗначений;
				АгентСЗ.Добавить(Агент);
				Настройки.ПараметрыДанных.Элементы[i].Значение = АгентСЗ;
				Настройки.ПараметрыДанных.Элементы[i].Использование = Истина;     
			КонецЕсли;
			Продолжить;
		КонецЕсли;
		Если Строка(Строка.Параметр) = "Товар" И СписокТоваров.Количество()<>0 Тогда 
			Настройки.ПараметрыДанных.Элементы[i].Значение = СписокТоваров; 
			Настройки.ПараметрыДанных.Элементы[i].Использование = Истина; 
			Продолжить;
		КонецЕсли;
		Если Строка(Строка.Параметр) = "Логистика" И ПолеДоставка <> "ДоставкаСамовывоз" Тогда
			Если ПолеДоставка = "ТолькоДоставка" Тогда
				 УсловиеЛогистика = 2;
			ИначеЕсли ПолеДоставка = "ТолькоСамовывоз" Тогда
				УсловиеЛогистика = 3;
			КонецЕсли;
			Настройки.ПараметрыДанных.Элементы[i].Значение = УсловиеЛогистика;
			Настройки.ПараметрыДанных.Элементы[i].Использование = Истина;     
			Продолжить;
		КонецЕсли;                                             
		Если Строка(Строка.Параметр) = "Возвраты" И ПолеВозвраты <> "ПродажиСВозвратами" Тогда 
			Если ПолеВозвраты = "ТолькоПродажи" Тогда
				УсловиеВозвраты = 2;
			ИначеЕсли ПолеВозвраты = "ТолькоВозвраты" Тогда
				УсловиеВозвраты = 3;
			КонецЕсли;
			Настройки.ПараметрыДанных.Элементы[i].Значение = УсловиеВозвраты; 
			Настройки.ПараметрыДанных.Элементы[i].Использование = Истина; 
			Продолжить;
		КонецЕсли;
		Если Строка(Строка.Параметр) = "Бонусы" И ПолеБонусы <> "ПродажиСБонусами" Тогда 
			Если ПолеБонусы = "ТолькоПродажи" Тогда
				 УсловиеБонусы = 2;
			ИначеЕсли ПолеБонусы = "ТолькоБонусы" Тогда
				УсловиеБонусы = 3;
			КонецЕсли;
			Настройки.ПараметрыДанных.Элементы[i].Значение = УсловиеБонусы; 
			Настройки.ПараметрыДанных.Элементы[i].Использование = Истина; 
			Продолжить;
		КонецЕсли;
		Если Строка(Строка.Параметр) = "ДопПродажи" И ПолеДопПродажи <> "ВсеПродажи" Тогда 
			Если ПолеДопПродажи = "ТолькоПродажи" Тогда
				УсловиеДопПродажи = 2;
			ИначеЕсли ПолеДопПродажи = "ТолькоДопПродажи" Тогда
				УсловиеДопПродажи = 3;
			КонецЕсли;
			Настройки.ПараметрыДанных.Элементы[i].Значение = УсловиеДопПродажи; 
			Настройки.ПараметрыДанных.Элементы[i].Использование = Истина; 
			Продолжить;
		КонецЕсли;
	КонецЦикла;                                

	////******************************************************
	//ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	//		ЭлементОтбора.ВидСравнения=ВидСравненияКомпоновкиДанных.ВИерархии;
	//		ЭлементОтбора.ЛевоеЗначение=Новый ПолеКомпоновкиДанных("УчастокОбращенияТПС");//поле отбора
	//		ЭлементОтбора.ПравоеЗначение=РезультатЗапроса.УчастокОбращенияТПС;
	//		ЭлементОтбора.Использование=Истина;
	//ЭлементОтбора.ИдентификаторПользовательскойНастройки=Новый УникальныйИдентификатор();
	////добавляет отбор  в состав пользовательских настроек
	////******************************************************
	
	//Помещаем в переменную данные о расшифровке данных
	ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
	
	//Формируем макет, с помощью компоновщика макета
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	
	//Передаем в макет компоновки схему, настройки и данные расшифровки
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,Настройки, ДанныеРасшифровки);
	
	//Выполним компоновку с помощью процессора компоновки
	ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки,,ДанныеРасшифровки);
	
	//Очищаем поле табличного документа
	Результат = ЭлементыФормы.Результат;
	Результат.Очистить();
	
	//Выводим результат в табличный документ
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(Результат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
	
	РасчетШириныКолонок(ЭлементыФормы.Результат);
	
	ЭлементыФормы.Результат.ПоказатьУровеньГруппировокСтрок(1);
	СгенерироватьКнопкиУправленияГруппировкой();
	ЭлементыФормы.Панель1.ТекущаяСтраница = ЭлементыФормы.Панель1.Страницы.Отчет;
	ЭлементыФормы.Время.Значение = "Время создания отчета: "+ СтандартныеКоды.ВремяВыполнения(Начало);
КонецПроцедуры
Показать
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. Nadushka74 5 19.08.20 15:58 Сейчас в теме
(1) Данные по этой строке есть? по другим столбцам?
4. user1403055 20.08.20 07:05 Сейчас в теме
Данные непонятно как расшифровываются. При двойном клике выводится число. Число, по порядку слева направо, с разницей между строками (скрин во вложении).
(3)
Прикрепленные файлы:
2. MikhailDr 19.08.20 12:55 Сейчас в теме
Скорее всего в результате запроса есть строка без полей, выводимых в отчете или со значением NULL.

Как пример в регистр накопления попала запись без номенклатуры.
5. user1403055 20.08.20 09:08 Сейчас в теме
Тоже была такая версия. В макете СКД идет объединение 2-х наборов данных (скрин во вложении). Буквально сегодня пробовал в запросе добавить условие к виртуальной таблице регистра: НЕ Товар ЕСТЬ NULL, Товар <> Значение(Справочник.Товары.ПустаяСсылка), результата не дает. Указывал в макете отбор по Товар Не Заполнено, по Товар Не Равно Справочник.Товары.ПустаяСсылка - результата не было. По поводу пустых записей в регистре - вряд ли, так как уже годами отлажено, явные косяки давно устранены.
(2)
Прикрепленные файлы:
6. MikhailDr 20.08.20 09:14 Сейчас в теме
(5) А если в консоли запросов посмотреть результат? Напишите пакетный запрос с таким же объединением как в СКД. Я бы копал в сторону результата запроса, надо понять что тащит система без настроек СКД.
9. user1403055 20.08.20 09:20 Сейчас в теме
(6) Обязательно попробую, но мне не понятно, каким образом объединение запросов выполняет именно СКД. В отладке тоже не удалось посмотреть, видно только 2 отдельных запроса, как бы "итоговый" текст получить не удалось. Если глобально, правильно было бы наверное переделать отчет, сделать итоговый вариант запроса, убрать объединение именно средствами СКД.
На данный момент, интересно понять, есть ли в текущих обстоятельствах корректное решение.
11. MikhailDr 20.08.20 09:25 Сейчас в теме
(9) Посмотрите связи наборов данных. Неужели там ничего нет?
12. user1403055 20.08.20 09:27 Сейчас в теме
(11)
Кроме галочки "Обязательная связь", ничего.
Прикрепленные файлы:
13. user1403055 20.08.20 09:28 Сейчас в теме
(12)
попробовал ее убрать, видимых изменений не произошло.
14. MikhailDr 20.08.20 09:30 Сейчас в теме
(12) К своему сожалению я мало работал с наборами данных, сложно что-то подсказать. Но я почти уверен, что ошибка в наборе данных, в том какой запрос строится. У меня бывало уже, что СКД выводил пустые строки и это всегда было связано с ошибками в запросе.
7. user1403055 20.08.20 09:15 Сейчас в теме
Огромное спасибо за погружение в мою проблему.
На данный момент, ситуация решена, но она не решена :)
В условное форматирование отчета добавлено условие (скрин во вложении). В данном условии ограничена максимальная высота строки в случае если Товар не Заполнено. И оно выдает следующий результат (скрин прилагается). Строки как бы и нет, но она никуда не делась. Логично, что все-таки Товар = ПустаяСсылка. Но, считаю это не решением проблемы.
Прикрепленные файлы:
8. MikhailDr 20.08.20 09:17 Сейчас в теме
(7) Везет))

У меня бы такую задачу не приняли.
10. user1403055 20.08.20 09:23 Сейчас в теме
(8) Дело в том, что чисто моя инициатива разобраться в этом, у пользователей вопросов нет? нет! Значит нет :) А так как впоследствии планирую пользоваться данным отчетом для программной выгрузки статистики, решил хотя бы в очевидном поправить.
15. PiotrLoginov 21.08.20 18:57 Сейчас в теме
Выше не зря спрашивали
Данные по этой строке есть? по другим столбцам?

Если в других столбцах также пусто, и саму строку в принципе выводить не надо, то неплохим решением было бы не уменьшать высоту строки, а вообще не выводить ее, т.е. добавить отбор.
16. user1403055 24.08.20 06:51 Сейчас в теме
(15)
отбор уже пробовал (5), не помогает.
17. user2067713 17.03.24 11:31 Сейчас в теме
На примере Регистратора в качестве поля группировки:
1. В запросе Регистратор определять через выражение
2. В настройке роли установить "Игнорировать значения NULL"
Прикрепленные файлы:
Stradivari; +1 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот