Работа с запросами в 1С СКД. Особенности работы запросов в СКД. Часть 3

21.04.20

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

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

 

 

 

Работа с запросами в 1С СКД. Особенности работы запросов в СКД.  Часть 3

 

Добавление отбора ко всем таблицам пакета

 

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

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

Вот такой исходный запрос будет в нашем отчете:

 

1С СКД

 

Если в отчете не установлен отбор по заказу покупателя, то выполняемый запрос получается верный:

 

1С СКД

 

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

 

1С СКД

 

Здесь мы видим, что в результате замены текста запроса система компоновки данных добавила в параметры виртуальной таблицы отбор по заказу покупателя. Что не соответствует логике работы нашего отчета. Мы уже рассматривали один из способов как можно исправить данную ошибку – отключаем опцию «Автозаполнение», настраиваем с помощью расширения языка запросов поля для условий и место применения этих условий, настраиваем также список выбираемых полей (так как  автозаполнение мы отключили).

Можно решить эту проблему проще. Для этого мы установим алиас для поля «ЗаказПокупателя» в секции «ГДЕ», а также установим ограничение использования в условии для поля «ЗаказПокупателя»:

 

1С СКД

 

Как видно на картинке, при установке алиаса, в поля набора добавляется новое поле с именем равным алиасу. Это поле может использоваться только в условии.  Если не установить ограничения на использование в условии для поля «ЗаказПокупателя», то пользователь сможет установить отбор по этому полю, и отчет снова будет формироваться неверно.

В таком подходе есть один минус – если выключить автозаполнение и снова его включить, установленные вами ограничения не сохранятся. Поэтому, какой вариант решения использовать – выбирать вам.

 

Добавление отбора в объединение

 

Кроме добавления отбора во все запросы пакета СКД добавляет отбор также в части запроса выполненного с помощью оператора «ОБЪЕДИНИТЬ». Рассмотрим такой исходный запрос:

 

1С СКД

 

Если установить отбор по номенклатуре, то получим такой запрос:

 

1С СКД

 

Если установить отбор по полю расход, то получим вот такой запрос:

 

Такая замена производится при включенном автозаполнении.

 

При включенном автозаполнении и при использовании отбора по реквизиту одного из полей производится такая замена:

 

1С СКД

 

Здесь видно, чтоб отбор был добавлен только в ту часть запроса, в которой склад не NULL. Замена работает согласно документации 1С:

 

1С СКД

 

При отключенном автозаполнении в таком исходном запросе и при установленных отборах:

 

 

Получим такой выполняемый запрос:

 

1С СКД

Такое поведение платформы работает, начиная с релиза 1С 8.3.14. До этого релиза даже при отключенной опции «Автозаполнение», отбор по полю со значением NULL (склад в нашем случае) добавлялся и в первую часть объединения (что не всегда бывает необходимо и при отключенной опции ожидалось, что отбор будет срабатывать как указано).

 

Отборы в наборах

 

При использовании связанных наборов имеется также особенность работы СКД при установке отбора. В документации 1С написано:

«При использовании в схеме нескольких наборов данных, если в главном отборе накладывается условие на поле некоторого дочернего набора данных, то в сгенерированном макете компоновки данных дочерний набор данных будет связан с родительским набором данных с типом связи "Внутренняя"».

             Здесь важно понимать, что:

  1. По умолчанию в 1С СКД есть главный набор (источник связи) и подчиненный (приемник связи или дочерний набор) и связаны они левым соединением
  2. Поле дочернего набора в этом случае (при установке отбора) не просто «некоторое», а отсутствующее в главном наборе. Только в этом случае связь из левого превращается во внутреннюю. Причем связываются наборы не на уровне запросов, а самой системой компоновки данных.

Посмотрим на примере такого отчета:

Набор главный (Заказы):

1С СКД

 

Дочерний наборы данных (Остатки):

1С СКД

 

Связь наборов:

 

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

 

1С СКД

 

Здесь мы получаем все позиции из заказов. Сами запросы нам не интересны там ничего необычного. Интересно как установлена связь наборов:

 

 

Теперь установим отбор по полю «КоличествоОстаток» набора «Остатки»:

СКД

 

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

 

СКД

 

В отчет попали только заказы, по которым есть соответствующий остаток. Посмотрим снова в консоли связь наборов:

 

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

 

Глобальный отбор и отбор на группировках

 

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

В платформе 1С до релиза 8.3.14 в запросе, который мы уже рассматривали, но с другой структурой отбора данный отбор не переносится в текст запроса для платформы (и соответственно выполняется СКД после получения результата запроса):

 

СКД

 

Важное отличие здесь в том, что отборы включены в группу.

 

СКД

 

Видно, что в итоговом запросе условия не включены:

 

СКД

 

При этом если условия находятся вне группы, то они включаются в текст запроса:

 

СКД

 

В релизе 1С 8.3.14 условия включаются в текст запроса платформы независимо от того расположены они в группе или нет.

 

 

Серия статей по СКД
Предыдущая статья .., Следующая статья ...
Автор курсов образовательного проекта Profession Store. Павел Шемякин

См. также

SALE! 15%

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

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

10000 руб.

02.09.2020    159393    872    399    

861

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

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

15.05.2024    8684    implecs_team    6    

47

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

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

3 стартмани

05.02.2024    6992    56    obmailok    21    

79

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

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

1 стартмани

31.01.2024    3147    5    Yashazz    1    

34

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

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

2 стартмани

11.12.2023    10802    23    John_d    25    

124

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

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

05.12.2023    8013    PROSTO-1C    15    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. emilliya 2 14.04.20 04:36 Сейчас в теме
К меня был такой СКД отчет.
Выводил среднее в разрезе одного реквизита,
но при постановке фильтра в пользовательском интерфейсе выдавал неверные данные.

Возможно в условие нужно предусмотреть в одном из запросов
2. aximo 2100 14.04.20 17:20 Сейчас в теме
{} - с вот этими условиями нужно быть крайне аккуратным
3. BelikovSA 41 20.04.20 11:06 Сейчас в теме
А почему в разделе "Отборы в наборах", для случая когда установлено отбор на дочерний набор и связь меняется с Левой на Внутреннюю не написали как сохранить Левую, если это очень надо?
Мне когда - то дали хороший совет: включить в первый набор простой запрос (совершенно отдельный) с таким полем (у меня был отбор остатков по складу, т.е. просто запрос из справочника склады). Тогда будет считаться что отбор накладывается и на первый набор, и связь останется Левой.
4. toypaul 63 20.04.20 11:42 Сейчас в теме
(3) Не ставил целью рассказывать решения. Они могут быть разные - зависит от ситуации. Может и стоило.
5. aaakhm 01.06.23 10:44 Сейчас в теме
Какая полезная статья. Очень помогли с одним отчетом, не знал, что левое соединения в связях иногда становится внутренним без явного на то указания.
Оставьте свое сообщение