"Семь чудес" СКД

02.02.26

Разработка - СКД

Случалось ли у Вас, что результат запроса в отчёте СКД отличается от результата запроса в консоли запросов; в отчёте СКД не отображается колонка контрагент; в отчёте СКД не отображается отбор по контрагенту? Это и есть "чудеса" СКД, о борьбе с которыми эта публикация.

"Чудо" №1: в запросе для СКД-отчёта присутствует регистр накопления или регистр бухгалтерии, при этом в параметрах СКД самостоятельно появляется параметр "Период", а при формировании отчета СКД вы недосчитываетесь некоторых строк, которые видели при запуске запроса отчёта в консоли запросов

Существует два способа свести на нет это самоуправство СКД:

Первый - использовать набор данных объект вместо набора данных запрос. При этом нужно будет вручную вводить колонки отчёта и их типы, извлечь из СКД значения параметров/отборов отчёта, получить таблицу значений с результатом запроса отчёта и передать её СКД в процедуре "ПриКомпоновкеРезультата".

Второй способ менее затратен, в набор данных мы вводим запрос-макет колонок отчёта, а на этапе формирования отчёта в модуле объекта подменяем текст запроса макета на реальный запрос формирования отчёта.


"Чудо" №2: в отчете СКД не отображается колонка Контрагент

В запросе, результат которого СКД записывает в колонки, нужно сделать соединение таблицы "Справочник.Контрагенты" по ссылке на элемент справочника "Контрагенты" и в колонку контрагента, брать ссылку из присоединённой таблицы "Справочник.Контрагенты"

 

"Чудо" №3: в отчете СКД не отображается отбор по Контрагенту

В запросе, результат которого СКД записывает в колонки, нужно переименовать колонку "Контрагент". Колонка должна иметь любое другое имя кроме "Контрагент" (помогает даже просто символ подчёркивания, добавленный к слову Контрагент), например ("Контрагент_", "Клиент", "Поставщик" )

Если для пользователей важно, чтобы отбор по контрагенту назывался "Контрагент", то в пользовательских настройках отбора, в реквизит "Представление" нужно записать "Контрагент".


Давайте на примере конкретного отчёта рассмотрим способы сведения на нет всех описанных "чудес":

На картинке ниже представлен вид запроса-макета (используется объединение двух запросов, так как колонка "РасчетныйДокумент" может быть ссылкой как на документ "ПриобретениеТоваровУслуг", так и ссылкой на документ "ПриобретениеУслугПрочихАктивов"):



 

Ниже представлены параметры отчёта (кроме параметров, доступных пользователю, есть служебный параметр "Свойство", который заполняется программно в процедуре "ПриКомпоновкеРезультата")

 

 

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

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

КонецПроцедуры //  ПриКомпоновкеРезультата


Процедура УстановитьПараметрСКД(ИмяПараметра, Значение)
	
	Перем	ПараметрДанных, Настройки;
			
	Настройки = ЭтотОбъект.КомпоновщикНастроек.Настройки;
		
	ПараметрДанных = Настройки.ПараметрыДанных.Элементы.Найти(ИмяПараметра);
	
	Попытка
	
		ПараметрДанных.Использование = Истина;
		ПараметрДанных.Значение = Значение;
	Исключение
		
		ВызватьИсключение(СтрШаблон("Не найден параметр СКД ""%1""!", ИмяПараметра));
	КонецПопытки;	
	
КонецПроцедуры  //  УстановитьПараметрСКД 

 
Ниже представлен листинг функции, возвращающей текст запроса формирования отчёта, в комментариях внутри скобок есть номера, которые означают номера "чудес", для исправления которых служат строки кода ниже комментариев (так как все корректирующие действия осуществляются в финальном запросе, то рекомендую переместиться сразу в конец листинга).
 

Функция СформироватьТекстЗапроса()
	
	Перем ТекстЗапроса;

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

 

Данный код испытывался на платформе 1С 8.3.27.1688 и конфигурации 1С: КА 2.5.22.134.

Вступайте в нашу телеграмм-группу Инфостарт

результат СКД отличается от результата в консоли запросов не отображается колонка контрагент не отображается отбор по контрагенту

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С:Предприятие 8 Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

16500 руб.

02.09.2020    249765    1384    421    

1141

Инструментарий разработчика СКД Программист 1С 8.3 Бесплатно (free)

В этой статье представлен СКДБилдер — общий модуль-обёртка над объектной моделью СКД, который сокращает код в 3-4 раза и делает его читаемым.

29.01.2026    5649    300    shapa_pro    25    

67

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Статья написана по результатам проведенного внутреннего обучающего вебинара для разработчиков ГК «СофтБаланс». Если осилить 25 000 знаков - задача для вас непосильная, где-то на бескрайних просторах интернета видео есть (или будет). Но здесь информация точнее. Разберем, чем запрос для СКД принципиально отличается от обычного запроса и как модифицируется в зависимости от настроек. Изучим «базовый рецепт» написания запроса для СКД, сформируем чек-лист. Полезно будет всем – от стажеров до тех. лидов. Всем, кто не снимает галку «автозаполнение» и пишет запросы для отчетов в консоли запросов – читать (вдумчиво) обязательно.

29.10.2025    16960    ovetgana    112    

107

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Описан способ заполнения списка доступных значений для полей наборов данных и параметров в схеме компоновки данных для любых конфигураций (с использованием БСП или без).

01.07.2025    9817    krasnoshchekovpavel    5    

67

СКД Программист Стажер 1С:Предприятие 8 Россия Бесплатно (free)

Несколько способов управления формами выбора параметров и отборов СКД.

10.04.2025    9101    Neti    0    

41

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Хорошая отчетная форма - сродни искусству. Есть какое-то невероятное эстетическое удовольствие в том, чтобы разобраться в логике учета и анализируемых показателях, спроектировать архитектуру хранения данных так, чтобы оптимально собрать эти показатели вместе с аналитическими разрезами в запросе, а затем настроить отображение так, чтобы, глядя на результат, сразу было понятно, что это за отчет и какие задачи он призван решать. Система компоновки данных - это моя первая, главная и, наверное, единственная "рабочая" любовь. Ее я использую везде, где только можно и где нельзя тоже. Хочу поделиться с вами некоторыми практическими приемами в работе с отчетами на СКД, которые, надеюсь, будут полезны.

27.02.2025    15899    ovetgana    50    

93

СКД Программист 1С:Предприятие 8 Бесплатно (free)

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

24.12.2024    13521    Akcium    17    

46

СКД Механизмы типовых конфигураций Запросы Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    10075    AlexeyPROSTO_1C    1    

32
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Angoleiro 03.02.26 04:48 Сейчас в теме
Здравствуйте. Хоть статья и посвящена СКД, именно механизм компоновки данных тут игнорируется, хотя в нем и кроются все эти "чудеса".

"Чудо" №1.
Если у вас есть, например, виртуальная таблица остатков и вы хотите переопределить её параметр период, то это можно сделать просто заключив этот параметр в фигурные скобки, например:

ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки({(&ПериодКомпоновки)}, ) КАК ТоварыНаСкладахОстатки


"Чудо" №2.
Если СКД оптимизирует ваш запрос и какие-то поля в итоговом запросе "исчезают", то обычно проблему можно решить указав признак "обязательное" в роли поля СКД.

"Чудо" №3.
Тут не совсем понял, что имеется в виду. Если вам нужно сделать условие, которое бы действовало на поле из какого-то конкретного фрагмента запроса (например, временную таблицу), то опять же стоит воспользоваться механизмом компоновки данных, например:
{ГДЕ ТоварыНаСкладахОстатки.Номенклатура.* КАК НоменклатураКомопновки}
2. Eugen-S 440 03.02.26 08:44 Сейчас в теме
Механизм игнорируется именно потому, что он чудит. У меня большой вопрос к разрабочикам СКД, зачем они накручивают свой период если в запросе используется параметр периода, определённый разработчиком?
А колонку с алиасом "Контрагент", они зачем вырезают?


(1)
"Чудо" №2.
Если СКД оптимизирует ваш запрос и какие-то поля в итоговом запросе "исчезают", то обычно проблему можно решить указав признак "обязательное" в роли поля СКД.

Вы сначала сами попробуйте, потом давайте совет.

(1)
"Чудо" №3.
Тут не совсем понял, что имеется в виду. Если вам нужно сделать условие, которое бы действовало на поле из какого-то конкретного фрагмента запроса (например, временную таблицу), то опять же стоит воспользоваться механизмом компоновки данных, например:


Проблема заключается в том, что если в запросе алиас колонки "Контрагент", то отбор по этой колонке не появляется на форме отчёта. Хотя Вы его и добавили в СКД и установили реквизит "Включать в пользовательские настройки"
3. Бубузяка 62 09.02.26 12:29 Сейчас в теме
На ИТС можно найти внешнюю обработку КонсольСистемыКомпоновкиДанных или DCSConsole, возможны оба варианта представления. Работает в толстом клиенте, незаменимая вещь при отладке СКД. Так вот в ней можно увидеть текст исполняемого запроса, режим соединения таблиц, если в СКД присутствует соединение, и многое другое.
Да, иногда, СКД вызывает недоумение, но исключительно из-за не понимания особенностей работы. Особенности описаны на ИТС.
Для отправки сообщения требуется регистрация/авторизация