СКД: ошибка при выводе в таблицу значений

14.08.25

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

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

Имеются такие условия:

 

 

Применяем условия для документа:

 

 

В документе имеются 2 товара. Геркулес с кодом 90000 (ветсертификация = Да) и Абрикос с кодом 27591 (ветсертификация = нет). 

Имеется макет СКД с запросом вида, которым выбираются документы Приходная накладная и ее табличная часть, попадающие под условия, в результате получаем таблицу с 3 полями Ссылка, Товар, Код (в запросе также для Номенклатуры подключены характеристики):

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

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ 
    ПриходнаяНакладнаяСостав.Ссылка КАК Ссылка,
    СпрНоменклатура.Ссылка КАК Товар,
    СоответствиеКодовДляФронтОфиса.КодДляФронтОфиса
ИЗ
    Документ.ПриходнаяНакладная.Состав КАК ПриходнаяНакладнаяСостав
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоответствиеКодовДляФронтОфиса КАК СоответствиеКодовДляФронтОфиса
        ПО ПриходнаяНакладнаяСостав.Номенклатура = СоответствиеКодовДляФронтОфиса.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура
        ПО ПриходнаяНакладнаяСостав.Номенклатура = СпрНоменклатура.Ссылка
ГДЕ ПриходнаяНакладнаяСостав.Ссылка = (&Ссылка)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ 
    втПараметры.Ссылка,
    втПараметры.Товар,
    втПараметры.КодДляФронтОфиса
ИЗ
    втПараметры КАК втПараметры
{ХАРАКТЕРИСТИКИ
    ТИП(Справочник.Номенклатура)
    ВИДЫХАРАКТЕРИСТИК (ВЫБРАТЬ
            СвойстваОбъектов.Ссылка КАК Ссылка,
            СвойстваОбъектов.ТипЗначения КАК ТипЗначения,
            СвойстваОбъектов.Наименование + " (свойство)" КАК Наименование
        ИЗ
            ПланВидовХарактеристик.СвойстваОбъектов КАК СвойстваОбъектов
        ГДЕ
            СвойстваОбъектов.НазначениеСвойства = ЗНАЧЕНИЕ(ПланВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Справочник_Номенклатура))
    ПОЛЕКЛЮЧА Ссылка
    ПОЛЕИМЕНИ Наименование
    ПОЛЕТИПАЗНАЧЕНИЯ ТипЗначения
    ЗНАЧЕНИЯХАРАКТЕРИСТИК (ВЫБРАТЬ
            ЗначенияСвойствОбъектов.Свойство КАК Свойство,
            ЗначенияСвойствОбъектов.Объект КАК Объект,
            ЗначенияСвойствОбъектов.Значение КАК Значение
        ИЗ
            РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов)
    ПОЛЕОБЪЕКТА Объект
    ПОЛЕВИДА Свойство
    ПОЛЕЗНАЧЕНИЯ Значение}

Программный код, для формирования данных такой:

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

        ПараметрВывода = УсловияОтбора.ПараметрыВывода.Элементы.Найти("ВыводитьПараметрыДанных");
        ПараметрВывода.Значение = ТипВыводаТекстаКомпоновкиДанных.НеВыводить;
        ПараметрВывода.Использование = Истина;
        ПараметрВывода = УсловияОтбора.ПараметрыВывода.Элементы.Найти("ВыводитьОтбор");
        ПараметрВывода.Значение = ТипВыводаТекстаКомпоновкиДанных.НеВыводить;
        ПараметрВывода.Использование = Истина;
        ПараметрВывода = УсловияОтбора.ПараметрыВывода.Элементы.Найти("ФиксацияСлева");
        ПараметрВывода.Значение = ФиксацияКомпоновкиДанных.НеИспользовать;
        ПараметрВывода.Использование = Истина;
        ПараметрВывода = УсловияОтбора.ПараметрыВывода.Элементы.Найти("ФиксацияСверху");
        ПараметрВывода.Значение = ФиксацияКомпоновкиДанных.НеИспользовать;
        ПараметрВывода.Использование = Истина;
        
        Параметр = УсловияОтбора.ПараметрыДанных.Элементы.Найти("Ссылка");
        Если Параметр <> Неопределено Тогда
            Параметр.Значение = Док;
        КонецЕсли;

        КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
        КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
        КомпоновщикНастроек.ЗагрузитьНастройки(УсловияОтбора);

        КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
        МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

//Вывод в таблицу значений

        ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
        ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);
        ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
        ПроцессорВывода.УстановитьОбъект(ТЗРезультат);
        ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

//Вывод в табличный документ

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

В результате работы такой процедуры формируются следующие данные:

 

 

Как видно из картинки, в табличном документе отработало все верно, 1 строка только с товаром Геркулес, а таблицу значений СКД выдал 3 строки по данному элементу справочника условий, причем включил туда и Абрикос, у которого родитель не является Каши.

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

Находим такие строки в коде:

//вывод данных СКД в таблицу значений

        ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
        ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);
        ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
        ПроцессорВывода.УстановитьОбъект(ТЗРезультат);
        ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

И заменяем такими:

//Получаем текст запроса

        ТекстЗапроса = МакетКомпоновки.НаборыДанных[0].Запрос;
        Запрос = Новый Запрос(ТекстЗапроса);

//получаем параметры

        Для каждого ТекПарам ИЗ МакетКомпоновки.ЗначенияПараметров Цикл
            Запрос.УстановитьПараметр(ТекПарам.Имя, ТекПарам.Значение);
        КонецЦикла;


Что мы сделали, все очень просто, результат будем получать обычным объектом Запрос, текст и параметры для которого возьмем из МакетаКомпоновки, т.е. из СКД, в котором мы пропустили данные и СКД сформировал нужный нам запрос с параметрами. 

В результате получим:

 

 

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

ВЫВОД: в платформе 8.3.25 точно есть какая-то ошибка при работе СКД с таблицей значений. Возможно, что-то некорректно работает с параметрами или их типами. Но зачем разбираться,  если есть гениальное решение данной проблемы.

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

СКД таблица значений табличный документ ПроцессорВывода СхемаКомпоновки ошибка СКД

См. также

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

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

15500 руб.

02.09.2020    205639    1129    410    

1027

СКД Программист Система компоновки данных Бесплатно (free)

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

01.07.2025    3416    krasnoshchekovpavel    3    

61

СКД Программист 1С v8.3 Система компоновки данных Бесплатно (free)

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

27.02.2025    11864    ovetgana    50    

89

СКД Программист 1С v8.3 Система компоновки данных Бесплатно (free)

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

24.12.2024    9168    Akcium    16    

46

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

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

15.05.2024    16875    implecs    8    

52

Инструментарий разработчика СКД Программист 1С v8.3 1C:Бухгалтерия Абонемент ($m)

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

3 стартмани

05.02.2024    10531    72    obmailok    21    

84

Запросы СКД Программист 1С v8.3 Управляемые формы 1C:Бухгалтерия Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    4116    7    Yashazz    2    

34
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. plushko 34 14.08.25 14:36 Сейчас в теме
Все условия с параметрами в запросе заключи в фигурные скобки
{}
, должно заработать
2. plushko 34 14.08.25 14:39 Сейчас в теме
(1) типа так:
{ГДЕ ПриходнаяНакладнаяСостав.Ссылка = (&Ссылка)}
3. user1884101 14.08.25 16:44 Сейчас в теме
попробовал, не работает, пока описанный метод решения остается самым идеальным
Оставьте свое сообщение