Нюансы преобразования запроса СКД

31.05.19

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

Описание некоторых нюансов преобразования запроса в СКД.

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

Известно, что СКД создана в том числе и для минимизации действий кодировщика и проделывает за него некоторые скрытые действия, которые не всегда оказываются очевидными.

1. Поведение соединений к основной таблице 

Создаю новый внешний отчет, для него создаю основную схему компоновки данных. Пишу в ней такой  ТЗ СКД

 

 

ВЫБРАТЬ
	РеализацияТоваровУслугТовары.Ссылка,
	ДокРеализация.Дата,
	РеализацияТоваровУслугТовары.Номенклатура,
	РеализацияТоваровУслугТовары.КоличествоУпаковок,
	РеализацияТоваровУслугТовары.Цена,
	РеализацияТоваровУслугТовары.Сумма
ИЗ
	Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
{
внутреннее соединение Документ.РеализацияТоваровУслуг ДокРеализация по ДокРеализация.Ссылка=РеализацияТоваровУслугТовары.Ссылка
}	
{где 
ДокРеализация.Дата = &ДатаОтчета
}
 
 

 

Фигурные скобки в ТЗ СКД означают для соединений и условий то, что данная часть ТЗ СКД будет включаться в результирующий текст запроса только при определенных пользовательских настройках.

Для того, чтобы увидеть результат преобразования в модуле отчета создаю следующую процедуру:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	СтандартнаяОбработка=ложь;
	
	НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиОтчета, ДанныеРасшифровки);
	
	сообщить(МакетКомпоновки.НаборыДанных.НаборДанных1.Запрос);
	
КонецПроцедуры

Вывожу параметр ДатаОтчета на форму, создаю простую настройку с одной группировкой "Номенклатура" без каких либо полей и запускаю формирование отчета - вначале с отключенной галочкой отбора по параметру. В окне сообщений получаю результирующий запрос, который будет использоваться системой для получения необходимых для отчета данных:

ВЫБРАТЬ
    РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
    ПРЕДСТАВЛЕНИЕССЫЛКИ(РеализацияТоваровУслугТовары.Номенклатура) КАК НоменклатураПредставление,
    РеализацияТоваровУслугТовары.Номенклатура.Наименование КАК НоменклатураНаименование
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары

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

Если установить фильтр по дата, то получаем результирующий запрос

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

Внутреннее соединение появилось. То же самое произойдет если не включать фильтр по дате, а попробовать в настройках вывести поле Дата:

ВЫБРАТЬ
    ДокРеализация.Дата КАК Дата,
    РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
    ПРЕДСТАВЛЕНИЕССЫЛКИ(РеализацияТоваровУслугТовары.Номенклатура) КАК НоменклатураПредставление,
    РеализацияТоваровУслугТовары.Номенклатура.Наименование КАК НоменклатураНаименование
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК ДокРеализация
        ПО (ДокРеализация.Ссылка = РеализацияТоваровУслугТовары.Ссылка)

Теперь дописываю ТЗ СКД, включая еще одно соединение - со справочником Партнеры:

 
Текст запроса СКД

Формирую с условием по партнеру, но без условия по дате и без полей-группировок по дате в запросе. В результирующем запросе получаю не совсем то, что ожидал:

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

Для избежания подобного результата нужно либо убирать фигурные скобки в первом соединении - тогда оно будет включатся в результирующий запрос всегда, либо оба соединения заключать в общие фигурные скобки - тогда оба соединения будут включены в текст запроса в случаях, когда в пользовательских настройках требуется либо получение даты либо получение партнера. Четкой рекомендации для подобных случаев дать не могу, кроме как просматривать результирующий текст запроса при отладке отчета при разных вариантах настроек.

2. Неочевидное включение фильтров

В приведенном примере требуется показать номенклатуру из документов Реализация по определенному складу и вывести дополнительно остаток по номенклатуре по всем складам суммарно. Пишу следующий ТЗ СКД:

 
Текст запроса СКД

формирую отчет с фильтром по складу и получаю результирующий запрос в таком виде:

 
 Результирующий запрос

Здесь видно, что система сама включила фильтр по складу во виртуальную таблицу остатков. Не очень ожидаемое действие. Приходится для избежания этого назначать другое имя переменной для фильтра по складу документа:

...
{где 
ДокРеализация.Дата = &ДатаОтчета,
ДокРеализация.Склад.* Как СкладРеализации
}

Тогда отбор в виртуальной таблице уже отсутствует.

3. Управление формированием временных таблиц

Случается, что для организации фильтра удобно использование временных таблиц. Опишу, каким образом удобно включать/отключать формирование временной таблицы только тогда, когда она требуется по текущим настройкам пользователя. ТЗ СКД:

 
Текст запроса

Модуль отчета будет выглядеть таким образом:

 
Модуль отчета

В данном примере запрос к формирования временной таблицы ТаблицаОстаткиНоменклатуры будет выполняться при условии, когда пользователь выбирает фильтр либо по СкладОстатков, либо по Номенклатура.

4. Неожиданное в преобразовании для периодов ВТ

Как то неоднократно сталкивался, не искал, что про это пишут в документации, был бы признателен, если бы кто-нибудь указал. Пример запроса:

 
 Текст запроса
ВЫБРАТЬ
	ТоварыНаСкладахОстатки.Номенклатура,
	ТоварыНаСкладахОстатки.ВНаличииОстаток
поместить ОстаткиНаДата1	
ИЗ
	РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОтчета,{Номенклатура.* как Номенклатура} ) КАК ТоварыНаСкладахОстатки
;

ВЫБРАТЬ
	ТоварыНаСкладахОстатки.Номенклатура,
	ОстаткиНаДата1.ВНаличииОстаток Остаток1,
	ТоварыНаСкладахОстатки.ВНаличииОстаток Остаток2
ИЗ
	РегистрНакопления.ТоварыНаСкладах.Остатки(,{Номенклатура.* как Номенклатура} ) КАК ТоварыНаСкладахОстатки

левое соединение ОстаткиНаДата1 по ОстаткиНаДата1.Номенклатура=ТоварыНаСкладахОстатки.Номенклатура

 

В параметрах у нас при этом появится предопределенный параметр "Период". Назначим на форме значения параметров Период и ДатаОтчета. В результирующем запросе получаю:

 
 Результат выполнения компоновщика макета

То есть у обеих ВТ установлен один период. И он равен параметру Период. Не поможет и то, что во второй ВТ я явно укажу Период:

...
ИЗ
	РегистрНакопления.ТоварыНаСкладах.Остатки(&Период,{Номенклатура.* как Номенклатура} ) КАК ТоварыНаСкладахОстатки
...

Результат выполнения компоновщика будет тот же. Решается только в том случае, если я напишу запрос СКД таким образом:

 
 ТЗ СКД
 
 Результат, который нужен

Все получилось. Но все равно одна засада остается. Если пресловутый предопределенный параметр под названием Период все же вывести на форму и активизировать его, то при последнем варианте запроса у нас все равно старый косяк - у обеих ВТ один Период. Что тут можно посоветовать - поосторожней пользоваться предопределенным параметром Период, поскольку система так и норовит вставить его во все ВТ остатков. Аналогичное можно сказать про предопределенные параметры НачалоПериода и КонецПериода у ВТ Обороты или ОстаткиИОбороты. Я с ними тоже как то натерпелся. То есть, если виртуальных таблиц более одной и у них разные периоды, то предопределенные лучше не трогать.

См. также

SALE! 15%

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

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    159409    872    399    

861

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

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

15.05.2024    8684    implecs_team    6    

47

Инструментарий разработчика СКД Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

3 стартмани

05.02.2024    6995    56    obmailok    21    

79

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

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

1 стартмани

31.01.2024    3148    5    Yashazz    1    

34

СКД WEB-интеграция Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Долгое время поддерживаю web-портал, в котором появилась необходимость создавать отчеты. Просмотрев различные фреймворки на js, я решил сделать свое решение, которое позволяло бы быстро разрабатывать и добавлять новые отчеты на web-портал.

2 стартмани

11.12.2023    10804    23    John_d    25    

124

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

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

05.12.2023    8016    PROSTO-1C    15    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Поручик 4692 31.05.19 07:31 Сейчас в теме
2. dhurricane 31.05.19 08:05 Сейчас в теме
Не удалось воспроизвести проблему соединения со справочником партнеров из п.1, а вернее отсутствие соединения. Быть может это ошибка платформы, на которой Вы получили такой результат? И нет, так быть не должно, СКД не требует объединять в единые фигурные скобки все присоединяемые таблицы. В конструкторе запросов на закладке "Компоновка данных \ Таблицы" для этого разделения предусмотрена даже отдельная колонка "Номер группы".
4. waol 319 31.05.19 10:01 Сейчас в теме
(2) п.1 - на платформе 8.3.10.2580. выборка

...
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
{
внутреннее соединение Документ.РеализацияТоваровУслуг ДокРеализация по ДокРеализация.Ссылка=РеализацияТоваровУслугТовары.Ссылка
}

{
левое соединение Справочник.Партнеры СпрПартнеры по СпрПартнеры.Ссылка=ДокРеализация.Партнер
}


преобразовывается в

ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары,
Справочник.Партнеры КАК СпрПартнеры



проверил сейчас на 8.3.13.1690 - аналогично
5. dhurricane 31.05.19 10:20 Сейчас в теме
(4) Прошу прощения, действительно воспроизводится. Я не правильно проверял, нужно было полностью скопировать Ваш код, чтобы получить аналогичный Вашему результат.

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

Но вот если связать таблицу товаров непосредственно с таблицей партнеров (через ссылку), то никуда связь не будет пропадать.
9. A_Max 20 03.06.19 13:11 Сейчас в теме
(5)
(4)А вот так:

Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
{
внутреннее соединение Документ.РеализацияТоваровУслуг ДокРеализация по ДокРеализация.Ссылка=РеализацияТоваровУслугТовары.Ссылка
{
левое соединение Справочник.Партнеры СпрПартнеры по СпрПартнеры.Ссылка=ДокРеализация.Партнер
}}
10. waol 319 03.06.19 16:23 Сейчас в теме
(9)
то же самое

ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары,
Справочник.Партнеры КАК СпрПартнеры


при установке фильтра только по партнеру. на 8.3.10.2580
16. mtv79 15.03.23 20:53 Сейчас в теме
(10) думается, условие "по ДокРеализация.Ссылка=РеализацияТоваровУслугТовары.Ссылка" д.б. после соединения с Партнерами
3. ixijixi 1913 31.05.19 09:00 Сейчас в теме
Что-то как-то сумбурно - ни тебе выводов, ни закономерностей. Прост я поэкспериментировал, гляньте и вы.
avk_avk; rpgshnik; Jimbo; +3 Ответить
6. ids79 8535 31.05.19 18:06 Сейчас в теме
Добрый день.
1. В конструкторе запроса, в расширение компоновки, при указании таблиц, как необязательные, присутствует реквизит "Номер группы". Он как раз и отвечает за то, включаются ли две разные таблицы в одну группу или в разные. В Вашем случае необходимо включить таблицы в одну группу, так как одна без другой не имеет смысла. В этом случае обе таблицы будут в одних скобках, как Вы пишете.
2. Это стандартное поведение системы, и оно описано. При указании отбора, СКД будет пытаться применить его для всех запросов в пакете. Также, если включено автозаполнение, отбор будет применен к параметрам виртуальных таблиц, если это возможно.
kalyaka; A_Max; +2 Ответить
7. VmvLer 31.05.19 18:17 Сейчас в теме
тема отражает некий профессиональный рост автора в познании определенных методов работы СКД и несет чисто развлекательный характер.

спасибо всем, кто вник и придал ускорение мыслям автора.
8. azmievsky 01.06.19 07:42 Сейчас в теме
Если пытаться разбираться с СКД самостоятельно, без документации и курсов, - каждый день будешь открывать для себя все новые и новые "нюансы".
11. sergey_garin 204 04.06.19 10:13 Сейчас в теме
Почему-то не написано о механизме оптимизации СКД: о том, как она иногда меняет запросы и выкидывает из них нужные поля, в результате чего результат получается совсем не тот, который ожидаешь.
Неоднократно сталкивается с тем, что СКД удаляет из выборки те поля, которые не выводятся в табличный документ, несмотря на то, что по ним есть нужные группировки во временных таблицах.
12. waol 319 04.06.19 14:13 Сейчас в теме
(11) было бы интересно посмотреть на примеры, это было бы как раз по теме
13. Stas-ch 35 04.10.19 11:17 Сейчас в теме
(12) На вскидку - две таблицы соединяются по двум полям (Допустим контрагент и договор), однако выбирается только одно поле (к примеру, Контрагент). Вроде в этом случае объединение по договору будет исключено.
14. Stas-ch 35 04.10.19 11:19 Сейчас в теме
(13) В этом случае надо на закладке Наборы данных - Поля - в колонке Роль поставить флаг Обязательный.
max_zhilin; +1 Ответить
15. tiger12 1 23.06.21 12:15 Сейчас в теме
Нет набора данных в процедуре

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	НастройкиОтчета   = КомпоновщикНастроек.ПолучитьНастройки();
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки   = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиОтчета, ДанныеРасшифровки);
	
	Сообщить( МакетКомпоновки.НаборыДанных.НаборДанных1.Запрос );   
	
КонецПроцедуры
Показать
Прикрепленные файлы:
Оставьте свое сообщение