Работа с запросами в 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. Павел Шемякин

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С:Предприятие 8 Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

16500 руб.

02.09.2020    248021    1373    421    

1134

Инструментарий разработчика СКД Программист 1С 8.3 Бесплатно (free)

В этой статье представлен СКДБилдер — общий модуль-обёртка над объектной моделью СКД, который сокращает код в 3-4 раза и делает его читаемым.

29.01.2026    5394    296    shapa_pro    25    

66

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Статья написана по результатам проведенного внутреннего обучающего вебинара для разработчиков ГК «СофтБаланс». Если осилить 25 000 знаков - задача для вас непосильная, где-то на бескрайних просторах интернета видео есть (или будет). Но здесь информация точнее. Разберем, чем запрос для СКД принципиально отличается от обычного запроса и как модифицируется в зависимости от настроек. Изучим «базовый рецепт» написания запроса для СКД, сформируем чек-лист. Полезно будет всем – от стажеров до тех. лидов. Всем, кто не снимает галку «автозаполнение» и пишет запросы для отчетов в консоли запросов – читать (вдумчиво) обязательно.

29.10.2025    16465    ovetgana    112    

106

СКД Программист 1С:Предприятие 8 Бесплатно (free)

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

01.07.2025    9509    krasnoshchekovpavel    5    

67

СКД Программист Стажер 1С:Предприятие 8 Россия Бесплатно (free)

Несколько способов управления формами выбора параметров и отборов СКД.

10.04.2025    8720    Neti    0    

41

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Хорошая отчетная форма - сродни искусству. Есть какое-то невероятное эстетическое удовольствие в том, чтобы разобраться в логике учета и анализируемых показателях, спроектировать архитектуру хранения данных так, чтобы оптимально собрать эти показатели вместе с аналитическими разрезами в запросе, а затем настроить отображение так, чтобы, глядя на результат, сразу было понятно, что это за отчет и какие задачи он призван решать. Система компоновки данных - это моя первая, главная и, наверное, единственная "рабочая" любовь. Ее я использую везде, где только можно и где нельзя тоже. Хочу поделиться с вами некоторыми практическими приемами в работе с отчетами на СКД, которые, надеюсь, будут полезны.

27.02.2025    15749    ovetgana    50    

93

СКД Программист 1С:Предприятие 8 Бесплатно (free)

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

24.12.2024    13329    Akcium    17    

46

СКД Механизмы типовых конфигураций Запросы Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    9849    AlexeyPROSTO_1C    1    

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

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