Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
23 июн 2021, 08:36

ПостроительОтчета - Отборы

Автор AIFrame, 22 июн 2017, 17:50

0 Пользователей и 1 гость просматривают эту тему.

AIFrame

Относится к - http://forum-1c.ru/index.php?topic=66968.0
У меня некая фундаментальная проблема в понимании.
Предположим такой запрос:
Построитель.Текст =
"ВЫБРАТЬ Разрешенные _.* ИЗ " + ТекущееПВД.ИмяОбъектаДляЗапроса + " КАК _
|
|
|{ГДЕ _.Ссылка.* КАК " + СтрЗаменить(ТекущееПВД.ИмяОбъектаДляЗапроса, ".", "_") + "}";

И отборы для него:

Отбор = Построитель.Отбор;

Если Отбор.Найти("Справочник_Склады") = Неопределено Тогда
Отбор.Добавить("Справочник_Склады");
КонецЕсли;

Массив = Новый Массив;
Массив.Добавить(Тип("СправочникСсылка.Склады"));
ОписаниеТиповС = Новый ОписаниеТипов(Массив, , );

Отбор["Справочник_Склады"].Использование = Истина;
Отбор["Справочник_Склады"].Значение = Справочники.Склады.НайтиПоКоду("000000071");
Отбор["Справочник_Склады"].ВидСравнения = ВидСравнения.ВИерархии;

ДоступностьПостроителя = Истина;

Если Построитель.Отбор.Количество() > 0 Тогда
ТекущееПВД.НастройкиПостроителя = Построитель.ПолучитьНастройки();
ТекущееПВД.ИспользоватьОтбор    = ИСТИНА;
КонецЕсли;

В результате такой "НастройкиПостроителя" обработка УниверсальныйОбменДаннымиXML все делает правильно.

А вот с таким запросом и отбором:

ИмяРеквизита = "ВидНоменклатуры";
ИмяПВД = СтрЗаменить(ТекущееПВД.ИмяОбъектаДляЗапроса, ".", "_");                
                        Построитель.Текст =
"ВЫБРАТЬ Разрешенные _.* ИЗ " + ТекущееПВД.ИмяОбъектаДляЗапроса + " КАК _
|
|
|{ГДЕ _.ВидНоменклатуры.* КАК " + ИмяПВД + "}";

Если Отбор.Найти(ИмяПВД) = Неопределено Тогда
Отбор.Добавить(ИмяПВД, ИмяПВД, ИмяПВД + "." + ИмяРеквизита);
КонецЕсли;



Отбор[ИмяПВД].Использование = Истина;
Отбор[ИмяПВД].Значение = Справочники.ВидыНоменклатуры.НайтиПоКоду("000000007");
Отбор[ИмяПВД].ВидСравнения = ВидСравнения.Равно;

ДоступностьПостроителя = Истина;

Если Построитель.Отбор.Количество() > 0 Тогда
ТекущееПВД.НастройкиПостроителя = Построитель.ПолучитьНастройки();
ТекущееПВД.ИспользоватьОтбор    = ИСТИНА;
КонецЕсли;

Обработка не принимает отбор. Вместо
ЦитироватьИмя: Справочник_Номенклатура
Представление: Справочник_Номенклатура.Вид номенклатуры
ТипЗначения: Виды номенклатуры
Значение: Товар
ПутьКДанным: Справочник_Номенклатура.ВидНоменклатуры
Выводит мне
ЦитироватьИмя: Справочник_Номенклатура
Представление: Справочник_Номенклатура
ТипЗначения: Виды номенклатуры
Значение: Товар
ПутьКДанным: Справочник_Номенклатура

Что я делаю не так?

AIFrame

Все, разобрался сам.
Хинт:
// Номенклатура
// Ссылка.ВидНоменклатуры = "Товар"
Если Наименование = "Номенклатура" Тогда
ТекущееПВД = СтрокаУровня2;

Построитель = Новый ПостроительОтчета;
Если ТекущееПВД.ИмяОбъектаДляЗапроса <> Неопределено Тогда
Построитель.Текст =
"ВЫБРАТЬ Разрешенные _.* ИЗ " + ТекущееПВД.ИмяОбъектаДляЗапроса + " КАК _
|
|
|{ГДЕ _.Ссылка.* КАК " + СтрЗаменить(ТекущееПВД.ИмяОбъектаДляЗапроса, ".", "_") + "}";
КонецЕсли;
Построитель.Отбор.Добавить("Справочник_Номенклатура.ВидНоменклатуры");
Построитель.Отбор[0].Использование = Истина;
Построитель.Отбор[0].Значение = Справочники.ВидыНоменклатуры.НайтиПоКоду("000000007");
Построитель.Отбор[0].ВидСравнения = ВидСравнения.Равно;

ДоступностьПостроителя = Истина;

Если Построитель.Отбор.Количество() > 0 Тогда
ТекущееПВД.НастройкиПостроителя = Построитель.ПолучитьНастройки();
ТекущееПВД.ИспользоватьОтбор    = ИСТИНА;
КонецЕсли;
КонецЕсли;

Ключевой момент:
1. В запросе остается _.Ссылка.*
2. Вместо Отбор[ИмяОтбора] используем конструкцию Построитель.Отбор.Добавить("Справочник_Номенклатура.ВидНоменклатуры");
Построитель.Отбор[0].БлаБлаБла

Добавлено: 23 июн 2017, 04:58


Критичный момент для работы с Построителем по регистру для той же обработки:
// Штрихкоды
// ЕдиницаИзмерения.ЕдиницаПоКлассификатору = шт.
Если Наименование = "Штрихкоды" Тогда
ТекущееПВД = СтрокаУровня2;
//Псевдоним = СтрЗаменить(ТекущееПВД.ИмяОбъектаДляЗапросаРегистра, ".", "_");
Псевдоним = "ЕдиницаИзмерения";
Построитель = Новый ПостроительОтчета;
Если ТекущееПВД.ИмяОбъектаДляЗапросаРегистра <> Неопределено Тогда
Построитель.Текст =
"ВЫБРАТЬ Разрешенные _.*
|
|ИЗ " + ТекущееПВД.ИмяОбъектаДляЗапросаРегистра + " КАК _
|
|{ГДЕ _.ЕдиницаИзмерения.* КАК " + Псевдоним + "}";
КонецЕсли;
Построитель.ЗаполнитьНастройки();

Построитель.Отбор.Добавить("ЕдиницаИзмерения.ЕдиницаПоКлассификатору");
Построитель.Отбор[0].Использование = Истина;
Построитель.Отбор[0].Значение = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("шт.");
Построитель.Отбор[0].ВидСравнения = ВидСравнения.Равно;

ДоступностьПостроителя = Истина;
Если Построитель.Отбор.Количество() > 0 Тогда
ТекущееПВД.НастройкиПостроителя = Построитель.ПолучитьНастройки();
ТекущееПВД.ИспользоватьОтбор    = ИСТИНА;
КонецЕсли;
КонецЕсли;

Без Построитель.ЗаполнитьНастройки(); запрос будет пустой.
Добавлено: 23 июн 2017, 09:05


UPD.
В случае с регистрами для настроек построителя также нужно сразу указывать пустые реквизиты выборки.
Построитель.Текст =
"ВЫБРАТЬ Разрешенные _.*
|,
|
|NULL КАК Активность,
|NULL КАК Регистратор,
|NULL КАК НомерСтроки,
|NULL КАК Период
|
|ИЗ " + ТекущееПВД.ИмяОбъектаДляЗапросаРегистра + " КАК _
|
|{ГДЕ _.ЕдиницаИзмерения.* КАК " + Псевдоним + "}";

Как что указывается можно найти в процедуре НастроитьПостроитель() в модуле формы обработки УниверсальныйОбменДаннымиXML
Без указание NULL-ов будет ошибка при обходе Выборки.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск