Платформа 8.2 помогите составить небольшой запрос в СКД

Платформа 8.2 помогите составить небольшой запрос в СКД

Нужно получить отбор по ВидуЦен виртуальной таблицы РегистраСведений СрезПоследних, при этом некоторое поле, пусть ФайлКартинки справочника Номенклатура, должен выводиться всегда! То есть должен работать отбор по записям таблицы, КРОМЕ записей, представляющих собой поле ФайлКартинки.

Это прайс лист, в котором для Групп Справочника Номенклатура должны всегда выводиться картинки, а элементы этого справочника участвуют в фильтрации по Видам Цен.

Сейчас всё выводится только при выключенном отборе:

Что и как изменить в этом запросе, в условии, чтобы отбор ПРОПУСКАЛ все поля

Поле ФайлКартинки какого типа?

> То есть должен работать отбор по записям таблицы, КРОМЕ записей, представляющих собой поле ФайлКартинки.

Переведите на технический язык. "КРОМЕ записей, представляющих собой поле ФайлКартинки." - это просто набор не связанных между собой слов.

Ну вот собственно всё получилось через такую "шляпу":

В модуле отчёта:

Картинка прилагается. При этом остаёются пока вопросы об оптимальности + вопрос посложнее: выводятся вообще все картинки, даже для тех Групп Номенклатуры, в составе которой по отбору НЕТ Цены! Вот тут проверки и сравнения посложнее будут. И + я как-то задавал вопрос мне никто не ответил. по умолчанию отчёт формируется с раскрытыми группировками (плюсиками). это ужасно. хотелось бы чтобы все группировки были свёрнуты. не нашёл как это сделать.

Проблема тут существенная ещё такая: это всё работает до тех пор, пока пользователь не решится что-нибудь изменить в Варианте Отчёта, например добавить Поле ЕдиницаИзмерения. и тогда пиши-пропало.

Это даже не проблема - это просто ошибка в построении отчета. Так делать просто нельзя, по той самой причине, которую вы и указали. Отчет не должен ломаться от пролетевшего на орбите метеора.

Я примерно такой алгоритм реализовывал, но в моем случае и проблема была сложнее, и ее решение таким алгоритмом было гораздо сложнее и тоньше, и как следствие - отчет не ломается от действий пользователя.

В вашем же случае этого делать похоже вообще не надо. Сергей подсказал примерно, как надо сделать.

Единственный нюанс во всем этом - если я правильно понял, то надо еще определить, есть ли в номенклатуре картинка или нет, и в зависимости от этого выводить или не выводить ее в отчет, так?

По поводу группировок - там же, где вы написали ваш код, в самом конце напишите:

и все группировки свернутся.

Ещё пара мелких вопросиков:

1)ДокументРезультат.ПоказатьУровеньГруппировокСтрок(0); - сворачивает самый верхний уровень, а так чтобы все вложенные уровни были свёрнутыми? Какой-то цикл писать нужно?

2)Сложно ли сделать для строк отчёта меняющийся цвет фона через один, как это реализовано по умолчанию для Динамического списка ??

1) Не понял вопрос честно говоря.

2) Нет, у табличного документа только "красить руками" (то бишь кодом) через одну строчку. Грустно конечно, но вот так.

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

В прикреплённом файле я раскрываю МЕТРИКА, а все вложения также оказываются раскрытыми.

А, в этом смысле. Как-то так:

Для к = 1 По КоличествоГруппировок Цикл

ДокументРезультат.ПоказатьУровеньГруппировокСтрок (КоличествоГруппировок - к);

Без проблем :)))))))))) Раскрасить строки табличного документа сначала попробую сам )))

Александр, скажите только, если я хочу раскрасить строки табличного элемента, мне где оптимальней этим заниматься? Опять же при поэлементном выводе ПроцессораВывода, или ещё раньше на уровне какой-нибудь настройки КомпоновщикаНастроек . Или вообще в самом СКД ?

Я бы это делал в модуле объекта в событии ПриКомпоновкеРезультата, но уже после вывода, на готовом табличном документе.

Опять есть какие-то нюансы, о которых я не знаю. Код в конце ПриКомпоновкеРезультата

должен работать, а не работает ничего! При этом в отладчике я конкретно вижу, что получаю табличныйДокумент (в виде ячейки в этом случае) какой хочу, о чём свидетельствует ппп.ТекущаяОбласть.Текст

Александр спасибо что отозвались. Как раз с техническим языком и проблема :))) На прикреплённой картинке вы видите таблицу - результат процессора вывода в табличный документ. Должны остаться записи таблицы, в которых есть значение в колонке Цена и в колонке ФайлКартинки, если таковой имеется.

Записи результирующей таблицы, которые представляют из себя лишь одну заполненную колонку Ссылка (оно же наименование Номенклатуры) не должны выводиться.

На самом деле я этот вопрос уже практически решил, созданием двух Наборов Данных в СКД (одна к таблице Справочники - Номенклатура; другой запрос к Регистру Сведений - ЦеныНоменклатуры.СрезПоследних), Связью Наборов Данных по ссылке на Номенклатуру и измерением РегистраСведений типа Справочники.Номенклатура, а также поэлементным выводом ПроцессораКомпоновкиДанных.

Я отфильтровал все записи результирующей таблицы кроме тех, в которых есть цена! Правда отфильтровались и записи с картинками, но я думаю приду домой сделаю проверку добавочную и надеюсь получится.

Другой вопрос, что возможно этот способ не является оптимальным. ФайлКартинки это реквизит Справочника Номенклатура, имеющий тип Справчники.ХранилищеФайлов, который в свою очередь имеет реквизит ИмяФайла и СодержимоеФайла типа ХранилищеЗначений.

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

Почему тогда не сделать одним Набором Данных с левым соединением (как у меня наверху в коде)? Потому что в этом же запросе придётся накладывать отбор в условии ГДЕ, и тогда результирующая таблица сразу получится отфильтрованной, вместе с записями - названием Группы Номенклатуры и Картинкой. А я своим способом сначала получил все записи Номенклатуры "склеенные" с ценами в колонке Цена в зависимости от параметра отбора Вид Цены, и сейчас имею возможность фильтровать таблицу как хочу.

Проще будет не создавать два набора данных, а использовать пакетный запрос. Если нет необходимости накладывать какие то отборы на таблицу справочника номенклатуры, то в итоге выглядеть все будет примерно так (если конечно я правильно понял вопрос):

| ЦеныНоменклатурыСрезПоследних.Номенклатура,

| ЦеныНоменклатурыСрезПоследних.Цена

|ПОМЕСТИТЬ ЦеныНоменклатуры

| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ) КАК ЦеныНоменклатурыСрезПоследних

| ТаблицаНоменклатура.Ссылка КАК Номенклатура,

| ТаблицаНоменклатура.ФайлКартинки,

| ЕСТЬNULL(ЦеныНоменклатуры.Цена, 0) КАК Цена

| Справочник.Номенклатура КАК ТаблицаНоменклатура

| ЛЕВОЕ СОЕДИНЕНИЕ ЦеныНоменклатуры КАК ЦеныНоменклатуры

| ПО ЦеныНоменклатуры.Номенклатура = ТаблицаНоменклатура.Ссылка"

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

1)Во-первых спасибо за отклик Александру и Вам Сергей. Сергей Вы всё правильно абсолютно поняли. Но такую таблицу я уже получил двумя наборами данных и связью. Различие лишь в том, что, спасибо научили, Ваш способ конечно наиболее правильный, скажем так. Проблема-то в этой результирующей таблице УБРАТЬ все позиции Номенклатуры, для которой нет цены из первого пакетного запроса. Сами понимаете, мы выводим прайс-лист, зачем там выводить все 15 000 000 Номенклатуры, из которой только у 100 позиций к примеру есть цена ))) ПРИ ЭТОМ записи таблицы представляющие из себя название Группы и Картинку к ней не должны отфильтроваться вместе с этой номенклатурой без цены.

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

2)Александр почти правильно поняли, сейчас объясню на пальцах))) Я не только хочу решить проблему и забыть про неё, я хочу учиться. У меня есть иерархический справочник Номенклатура. Картинки предназначены и устанавливаются только для Групп Номенклатуры, не для элементов номенклатуры. Моя задача вывести Группы с Картинками и элементы Номенклатуры, для которой есть Цена в РегистреСведений. Собственно всё. Нюанс заключается в том, что хорошо бы не выводить скажем все 300 Групп, если для элементов Номенклатуры в ней (потомков группы) нет цены! То есть не выводить пустые Группы с Картинкой, а выводить Группу с Картинкой, если в её составе есть Номенклатура с ценой. :)))

Мы получили левое соединение ВСЕЙ Номенклатуры и с ценой в колонке Цена там, где она есть в зависимости от отбора.

Теперь нам нужно оставить в этой таблице ТОЛЬКО номенклатуру с ценой и только ГРУППЫ с картинкой, в которых есть хоть одна номенклатура с ценой!

3)Правильно ли я понял, что обойтись только РегистромСведений не удастся, хоть в его составе есть измерение на Номенклатуру и её реквизит ФайлКартинки, именно потому, что поле\реквизит ФайлКартинки в принципе никогда не попадёт в таблицу данных этого РегистраСведений?

Мы соединяем-то две таблицы только из-за ФайлаКартинки, ибо без неё РегистрСведений ЦеныНоменклатуры с отбором сразу легко и просто получает ту таблицу, которую мы формируем пакетным запросом или наборами данных, да ещё и отфильтровывается всё, для чего не сопоставлена цена ))

📎📎📎📎📎📎📎📎📎📎