Имя: Пароль:
1C
 
Почему не выводятся колонки в отчете СКД?
0 1сПупс
 
25.11.25
08:18
Добрый день!
Заказчик просит добавить пару колонок в существующий отчет СКД.
Источником данных является регистр сведений:



Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
	
	//...и настройки
	Настройки = КомпоновщикНастроек.ПолучитьНастройки();
	ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
	
	
	мПериод = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ПериодСтр")).Значение;
	Если НЕ ЗначениеЗаполнено(мПериод) Тогда
		мПериод = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ПериодСтр")).Значение;
	КонецЕсли;
	
	//Заголовок отчета
	НачПериода = мПериод.ДатаНачала;	
	КонПериода = мПериод.ДатаОкончания;	
	
	
	ПодразделениеОтчетаПар = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Подразделение")).Значение;
	Если Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Подразделение")).Использование Тогда
		мМагазин = ПодразделениеОтчетаПар;
	Иначе
		мМагазин = "";
	КонецЕсли; 
	
	СотрудникДляРасчетаПар = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Сотрудник")).Значение;
	Если Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Сотрудник")).Использование Тогда
		СотрудникДляРасчета = СотрудникДляРасчетаПар;
	Иначе
		СотрудникДляРасчета = "";
	КонецЕсли;

	
	//Создаем компоновщик макета и получаем макет компоновки
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, ДанныеРасшифровки);
	
	ТаблицаДанных= Новый ТаблицаЗначений;
	СформироватьТаблицуДанных(ТаблицаДанных);	
	
	ВнешниеНаборыДанных = Новый Структура;
	ВнешниеНаборыДанных.Вставить("ТаблицаДанных",ТаблицаДанных);
	
	//Инициализируем процессор компоновки
	ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки, Истина);
	//<--------------------------------------------------------------------------------------->//
	//Очищаем документ результата
	ДокументРезультат.Очистить();
	
	//Выводим отчет в документ
	ПроцессорВывода = Новый
	ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
	
	ДокументРезультат.ФиксацияСлева = 1;
	
КонецПроцедуры

Процедура СформироватьТаблицуДанных(ТаблицаДанных)
	
	Перем КолонкиДляСвертки;
	НачПериода = мПериод.ДатаНачала;	
	КонПериода = КонецДня(мПериод.ДатаОкончания);	
	
	Если Не ЗначениеЗаполнено(НачПериода)  Тогда
		Сообщить("Заполните дату");
		Возврат;
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(КонПериода)  Тогда
		Сообщить("Заполните дату");
		Возврат;
	КонецЕсли;
	
		
	КЧ = Новый КвалификаторыЧисла(20,2);
	Массив = Новый Массив;
	Массив.Добавить(Тип("Число"));
	ОписаниеТиповЧ = Новый ОписаниеТипов(Массив, , ,КЧ);
	
	
	КЧ = Новый КвалификаторыЧисла(10);
	Массив = Новый Массив;
	Массив.Добавить(Тип("Число"));
	ОписаниеТиповЧ2 = Новый ОписаниеТипов(Массив, , ,КЧ);

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

	
	Запрос.Текст = Текст;
	Запрос.УстановитьПараметр("ДатаНачала",НачПериода);
	Запрос.УстановитьПараметр("КонПериода",КонПериода);
	Запрос.УстановитьПараметр("Магазин",мМагазин);
	Запрос.УстановитьПараметр("СотрудникДляРасчета",СотрудникДляРасчета);
	
	
	Выборка = Запрос.Выполнить().Выбрать();
	СуммаБаллы = 0;
	Пока Выборка.Следующий() Цикл 


		НоваяСтрока = ТаблицаДанных.Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрока,выборка);
		//НоваяСтрока.ИТОГ = НоваяСтрока.БаллыЗаТовар + НоваяСтрока.БаллыЗаУслугиРабочего +НоваяСтрока.БаллыЗаУслугиИнженера +НоваяСтрока.БаллыЗаТретийТовар;
		
		
	КонецЦикла;
	

КонецПроцедуры







Скд берет данные из ТЗ(Источник - набор данных), туда добавил новые поля (из запроса где выбор).
добавил эти поля как ресурсы, На вкладке настройки добавил свои ресурсы в выбранные поля.
Почему нет моих колонок в отчете?
1 lEvGl
 
гуру
25.11.25
09:26
Источник - набор данных

интересно

имена полей должны совпадать, и для чего создание тз, можно выгрузить из запроса
а может выбранные поля для группировки работают
2 unenu
 
25.11.25
09:44
(0) Почистить кеши, переименовать отчет если не знаете как новые настройки отчета применить.

Я бы переписал отчет к живому виду с дифференцированием параметров прямо в исходном тексте запроса.

УПП-шная условная технология
Текст = Текст + "                                                    
|
вызывает у меня смешанные чувства грусти и негодования, иногда до крайностей - казнить :-(
3 lEvGl
 
гуру
25.11.25
10:01
да да и период можно между задать!
4 1сПупс
 
25.11.25
14:04
(2) оказалось что в системе был отчет с таким же наименованием, и он тянулся при запуске внешнего отчета. Изменил имя, встроил в конфигурацию - все работает, спасибо!
5 1cVandal
 
25.11.25
14:31
(2) "Почистить кеши, переименовать отчет" как же это задрало в скд...
6 Gucci76
 
25.11.25
14:55
(5) Поддерживаю. Кучу времени бывает потратишь, чтобы убедиться, что все должно работать, но не фурычит.
Чистишь кеш и вуаля - нужный результат.
Сейчас уже первым делом меняю имя отчета, чтобы отмести ошибку кеша (он быстрее, но вернуть старое имя бывает забываю)
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший