Как сделать отбор в объединении запросов

  • В этой статье по СКД мы с вами подробно разберем, как обойти особенности наложения отборов на несуществующие поля запросов в наборе данных объединение 1С версий 8.3.13 – 8.3.17.

Сложности в наложении запроса объединения в СКД

Проблема наложения отбора существовала во всех частях запроса объединения 8.3.13 – 8.3.17,  когда СКД добавляет в секции «ГДЕ» NULL=&П. Данная проблема была исправлена в релизе платформы 8.3.18. (рис.1)

 

проблема наложения данных в СКД 1С

рис.1

Текущий релиз конфигурации «Комплексная автоматизация 2» версии 2.5.8.287 работает в режиме совместимости с версией 8.3.17, поэтому проблема там ещё проявляется. Хотя в версии 8.3.18 данная проблема решена, но в режиме совместимости 8.3.17 поведение не изменилось.

Итак.

Особенности наложения отборов в зависимости от версии системы компоновки данных

Отбор в объединении запросов 8.3.18 с отключенным режимом совместимости

Начнем с рассмотрения особенностей отбора в объединении запросов 8.3.18 с отключенным режимом совместимости.

В базе «Демонстрационное приложение» в консоли «Конструктор схема компоновки данных» используется набор данных «Запрос» (рис.2).

 

Конструктор схемы компоновки данных в СКД 1С

рис.2

Выбираются данные виртуальной таблицы «Продажи – Обороты» все поля измерений: «Покупатель», «Товар», «Сумма – Оборот». Эти данные объединяются с регистром накопления «Товарные запасы» и «Остатки». Здесь есть поля «Товар» и «Склад», а поле «Покупатель» отсутствует.

Пожалуйста, обратите внимание на то, что остатки нужно получить на определенную дату: на период остатков, а не на конец периода (рис.3).

 

запрос демонстрационное приложение 1С

рис.3

 

Результат объединения помещается во временную таблицу «Все вместе» и просто выбираются данные.

Оба поля «Остаток» и «Сумма – Продажи» сделаны ресурсом, и в настройке в виде группировки по полю «Товар» выбираются оба ресурса: «Сумма – Продажи» и «Сумма – Остаток». Здесь отбор установлен по полю «Покупатель».

Поле «Покупатель» присутствует только в одном запросе «Объединение», то есть там, где есть «Продажи» (рис.4).

 

отбор данных в системе компоновки данных 1С

рис.4

 

Если посмотреть на результат, то отбор по «Покупателю» нам показывает продажи только по одному из покупателей, а остатки показываются все (рис.5).

 

отбор по покупателю в СКД 1С

рис.5

В макете для табличного документа, который сгенерировал компоновщик макетов, в запросе «Объединение» наложен отбор по полю «Покупатель». В выборке по  товарным запасам отбора по полю «Покупатель» нет. В результирующем запросе нет никаких условий секции «ГДЕ» (рис.6).

 

пример генерации компоновщика макетов СКД 1С

рис.6

 

Обратим внимание на параметры. Параметр П2 – это параметр «Период остатков». Он вычисляется как параметр «Конец периода + 1 секунда».

В настройках схемы накладки параметра это выглядит следующим образом: параметр «Период остатков» (в нём включено ограничение доступности) и используется функция выражение СКД:  ДобавитьКДате(&КонецПериода, «Секунда», 1), то есть добавить к дате одну секунду (рис.7).

 

настройка схемы накладки параметра СКД 1С

рис.7

 

Итак, на платформе версии 8.3.18 с отключенным режимом совместимости все работает четко (рис.8).

 

отключенный режим совместимости в СКД 1С

рис.8

 

Далее следует сохранить получившиеся отчёты и можно сменить режим совместимости.

 

Введение в отбор в объединении запросов 8.3.17

 

Для установки режима совместимости версии 8.3.17, следует еще раз открыть консоль «Системы компоновки данных» по той же схеме. При ее формировании получается уже другой результат (рис.9).

 

объединение запросов в версии СКД 1С

рис.9

 

Проверив запрос, который сгенерировал компоновщик макета, можно увидеть, что в объединении запросов также наложен отбор по полю «Покупатель». Во втором запросе объединение в секции «ГДЕ» появилось условие: NULL=П3. Благодаря этому условию часть данных об остатках не выводится. Чтобы решить эту проблему, нужно в настройках набора данных «Запрос» отключить флаг «Автозаполнение». Для этого следует доработать текст запроса.

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

 

объединение запросов компоновщика СКД 1С

рис.10

 

И в последнем запросе пакета следует указать, что все поля попадают в выбранные поля и то, что можно накладывать отбор на поля «Остаток» и «Сумму продажи» (рис.11).

 

отбор полей "Сумма" и "Остаток" в СКД 1С

рис.11

 

После этого отключается флаг «Автозаполнение» (рис.12).

 

автозаполнение в отборе запросов СКД 1С

рис.12

 

Если проверить, то ресурсы никуда не делись, все параметры остались. Результат получился такой же, как в режиме совместимости 8.3.18. (рис.13).

 

режим совместимости 8.3.18 в СКД 1С

рис.13

 

Проверив макет табличного документа, который сгенерировал компоновщик макета, можно увидеть, что отбор в запросе, где выбираются «Продажи», присутствует в параметрах виртуальной таблицы. Отбора в секции «ГДЕ» в запросе «Товарные запасы — Остатки» – нет (рис.14).

 

макет табличного документа в СКД 1С

рис.14

 

Значит, отключив флаг «Автозаполнение» в наборе данных «Запрос», и  прописав точечно где можно устанавливать отборы, а где нет, эту проблему можно решить.

Далее, сохранив отчёты, можно установить режим совместимости в 8.3.13.

 

Возможности отбора в объединении запросов 8.3.13

 

В версии платформы 8.3.13 сформируем отчет, убедившись, что флаг «Автозаполнение» отключен. Определено, что отбор можно накладывать только в параметрах виртуальной таблицы. Во втором запросе объединение в секции «ГДЕ»  никакие параметры не подразумеваются. Отчет формируется с некорректным результатом (рис.15).

 

отбор в объединении запросов 8.3.13 в СКД 1С

рис.15

 

Если проверить макет для табличного документа, то можно увидеть, что в параметрах виртуальной таблицы «Продажи — Обороты» отбор установлен. В запросе, где выбираются «Товарные запасы – Остатки», появляется отбор в секции «ГДЕ» (рис.16).

 

отбор "Продажи-Обороты" в виртуальной таблице СКД 1С

рис.16

 

Рассмотрим, как обойти отбор в секции «ГДЕ», если конфигурация работает в режиме совместимости 8.3.13, а режим совместимости менять нельзя.

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

 

обход отбора в секции "ГДЕ" в СКД 1С

рис.17

 

Поэтому в конструкторе схемы компоновки данных нужно модифицировать текст запроса. Сначала следует выбрать данные из виртуальной таблицы «Продажи – Обороты» в отдельном запросе: «Продажи – Обороты», «Покупатель», «Товар», «Сумма – Оборот» (рис.18).

 

модификация текста запроса в конструкторе СКД 1С

рис.18

 

Скомпоновать их во временную таблицу «Продажи» (рис.19).

 

временная таблица "Продажи" в СКД 1С

рис.19

 

Эту задачу можно решить с использованием флага «Автозаполнение».

Итак, получили продажи. В запросе «Объединение» следует заменить виртуальную таблицу «Продажи» на временную таблицу «Продажи». Также нужно взять данные «Сумма – Оборот». Объединение можно назвать «Сумма – Продажи».

В итоге формируется временная таблица «Всё вместе» (рис.20).

 

временная таблица "Все вместе" СКД 1С

рис.20

 

Далее устанавливается флаг «Автозаполнение» (рис.21).

 

установка флага "Автозаполнение" в таблице СКД 1С

рис.21

 

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

 

выбор данных в отборе по полю "Покупатель" СКД 1С

рис.22

 

Далее выбираются данные из этой временной таблицы, которые объединяются с запросом «Товарные запасы – Остатки». Здесь уже не устанавливается отбор по полю «Покупатель». И в финальном запросе тоже нет отбора в секции «ГДЕ» (рис.23).

 

объединение содержимого временной таблицы и запроса в СКД 1С

рис.23

 

В итоге получился правильный результат (рис.24).

итоговый отчет в СКД 1С при объединении запросов

рис.24

 

Краткие итоги по различиям наложения отбора на несуществующие поля в разных версиях платформы

Подводя итог, есть смысл отметить, что при использовании платформы в режиме совместимости с 8.3.13 по 8.3.17, можно обойти особенности наложения отборов на несуществующие поля запросов.

При этом, если в запросах присутствует объединение выборок из нескольких таблиц и возникает ситуация, в которой компоновщик макета накладывает отбор на поле, отсутствующее в одном из запросов на объединение, оптимально поступить следующим образом: 

— предварительно выбрать данные из той таблицы, где предполагается накладывать отбор по полю, которого не будет в запросе «Объединение»;

— затем сложить данные во временную таблицу;

— а дальше производить выборку объединения запросов, объединяя данные временной таблицы, в которой  будет наложен отбор, с остальными данными.

Поделиться:

Telegram
VK
WhatsApp

Оцените статью

0

5

Читайте также:

Некогда разбираться самостоятельно?
Напишите нам и наши эксперты ответят вам