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

14.08.25

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

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

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

 

 

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

 

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

 

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

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

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

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

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

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

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

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

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

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


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

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

 

 

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

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

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

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

См. также

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

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

16500 руб.

02.09.2020    249948    1387    421    

1141

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

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

29.01.2026    5683    301    shapa_pro    25    

67

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

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

29.10.2025    17020    ovetgana    112    

107

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

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

01.07.2025    9852    krasnoshchekovpavel    5    

67

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

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

10.04.2025    9147    Neti    0    

41

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

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

27.02.2025    15919    ovetgana    50    

93

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

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

24.12.2024    13539    Akcium    17    

46

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

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

20.08.2024    10099    AlexeyPROSTO_1C    1    

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

Пример того, что не работает, в виде обработки получится сделать?
5. TMV 2 15.08.25 18:10 Сейчас в теме
для тз:
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

для табдока:
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, УсловияОтбора,,,Тип("ГенераторМакетаКомпоновкиДанных"));

может, в этом дело?
6. user1884101 7 18.08.25 10:12 Сейчас в теме
Для отправки сообщения требуется регистрация/авторизация