"Чудо" №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.
Вступайте в нашу телеграмм-группу Инфостарт
