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