Как сделать отбор в объединении запросов
-
В этой статье по СКД мы с вами подробно разберем, как обойти особенности наложения отборов на несуществующие поля запросов в наборе данных объединение 1С версий 8.3.13 – 8.3.17.
Сложности в наложении запроса объединения в СКД
Проблема наложения отбора существовала во всех частях запроса объединения 8.3.13 – 8.3.17, когда СКД добавляет в секции «ГДЕ» NULL=&П. Данная проблема была исправлена в релизе платформы 8.3.18. (рис.1)
![проблема наложения данных в СКД 1С](https://erpdev.i-neti.ru/wp-content/uploads/2023/10/01.png)
рис.1
Текущий релиз конфигурации «Комплексная автоматизация 2» версии 2.5.8.287 работает в режиме совместимости с версией 8.3.17, поэтому проблема там ещё проявляется. Хотя в версии 8.3.18 данная проблема решена, но в режиме совместимости 8.3.17 поведение не изменилось.
Итак.
Особенности наложения отборов в зависимости от версии системы компоновки данных
Отбор в объединении запросов 8.3.18 с отключенным режимом совместимости
Начнем с рассмотрения особенностей отбора в объединении запросов 8.3.18 с отключенным режимом совместимости.
В базе «Демонстрационное приложение» в консоли «Конструктор схема компоновки данных» используется набор данных «Запрос» (рис.2).
![Конструктор схемы компоновки данных в СКД 1С](https://erpdev.i-neti.ru/wp-content/uploads/2023/10/02.png)
рис.2
Выбираются данные виртуальной таблицы «Продажи – Обороты» все поля измерений: «Покупатель», «Товар», «Сумма – Оборот». Эти данные объединяются с регистром накопления «Товарные запасы» и «Остатки». Здесь есть поля «Товар» и «Склад», а поле «Покупатель» отсутствует.
Пожалуйста, обратите внимание на то, что остатки нужно получить на определенную дату: на период остатков, а не на конец периода (рис.3).
![запрос демонстрационное приложение 1С](https://erpdev.i-neti.ru/wp-content/uploads/2023/10/03.png)
рис.3
Результат объединения помещается во временную таблицу «Все вместе» и просто выбираются данные.
Оба поля «Остаток» и «Сумма – Продажи» сделаны ресурсом, и в настройке в виде группировки по полю «Товар» выбираются оба ресурса: «Сумма – Продажи» и «Сумма – Остаток». Здесь отбор установлен по полю «Покупатель».
Поле «Покупатель» присутствует только в одном запросе «Объединение», то есть там, где есть «Продажи» (рис.4).
![отбор данных в системе компоновки данных 1С](https://erpdev.i-neti.ru/wp-content/uploads/2023/10/04.png)
рис.4
Если посмотреть на результат, то отбор по «Покупателю» нам показывает продажи только по одному из покупателей, а остатки показываются все (рис.5).
![отбор по покупателю в СКД 1С](https://erpdev.i-neti.ru/wp-content/uploads/2023/10/05.png)
рис.5
В макете для табличного документа, который сгенерировал компоновщик макетов, в запросе «Объединение» наложен отбор по полю «Покупатель». В выборке по товарным запасам отбора по полю «Покупатель» нет. В результирующем запросе нет никаких условий секции «ГДЕ» (рис.6).
![пример генерации компоновщика макетов СКД 1С](https://erpdev.i-neti.ru/wp-content/uploads/2023/10/06.png)
рис.6
Обратим внимание на параметры. Параметр П2 – это параметр «Период остатков». Он вычисляется как параметр «Конец периода + 1 секунда».
В настройках схемы накладки параметра это выглядит следующим образом: параметр «Период остатков» (в нём включено ограничение доступности) и используется функция выражение СКД: ДобавитьКДате(&КонецПериода, «Секунда», 1), то есть добавить к дате одну секунду (рис.7).
![настройка схемы накладки параметра СКД 1С](https://erpdev.i-neti.ru/wp-content/uploads/2023/10/07.png)
рис.7
Итак, на платформе версии 8.3.18 с отключенным режимом совместимости все работает четко (рис.8).
![отключенный режим совместимости в СКД 1С](https://erpdev.i-neti.ru/wp-content/uploads/2023/10/08.png)
рис.8
Далее следует сохранить получившиеся отчёты и можно сменить режим совместимости.
Введение в отбор в объединении запросов 8.3.17
Для установки режима совместимости версии 8.3.17, следует еще раз открыть консоль «Системы компоновки данных» по той же схеме. При ее формировании получается уже другой результат (рис.9).
![объединение запросов в версии СКД 1С](https://erpdev.i-neti.ru/wp-content/uploads/2023/10/09.png)
рис.9
Проверив запрос, который сгенерировал компоновщик макета, можно увидеть, что в объединении запросов также наложен отбор по полю «Покупатель». Во втором запросе объединение в секции «ГДЕ» появилось условие: NULL=П3. Благодаря этому условию часть данных об остатках не выводится. Чтобы решить эту проблему, нужно в настройках набора данных «Запрос» отключить флаг «Автозаполнение». Для этого следует доработать текст запроса.
Потребуется указать все параметры и указать СКД, что доступен отбор по полю «Покупатель» в параметрах виртуальной таблицы (рис.10).
![объединение запросов компоновщика СКД 1С](https://erpdev.i-neti.ru/wp-content/uploads/2023/10/10.png)
рис.10
И в последнем запросе пакета следует указать, что все поля попадают в выбранные поля и то, что можно накладывать отбор на поля «Остаток» и «Сумму продажи» (рис.11).
![отбор полей "Сумма" и "Остаток" в СКД 1С](https://erpdev.i-neti.ru/wp-content/uploads/2023/10/11.png)
рис.11
После этого отключается флаг «Автозаполнение» (рис.12).
![автозаполнение в отборе запросов СКД 1С](https://erpdev.i-neti.ru/wp-content/uploads/2023/10/12.png)
рис.12
Если проверить, то ресурсы никуда не делись, все параметры остались. Результат получился такой же, как в режиме совместимости 8.3.18. (рис.13).
![режим совместимости 8.3.18 в СКД 1С](https://erpdev.i-neti.ru/wp-content/uploads/2023/10/13.png)
рис.13
Проверив макет табличного документа, который сгенерировал компоновщик макета, можно увидеть, что отбор в запросе, где выбираются «Продажи», присутствует в параметрах виртуальной таблицы. Отбора в секции «ГДЕ» в запросе «Товарные запасы — Остатки» – нет (рис.14).
![макет табличного документа в СКД 1С](https://erpdev.i-neti.ru/wp-content/uploads/2023/10/14.png)
рис.14
Значит, отключив флаг «Автозаполнение» в наборе данных «Запрос», и прописав точечно где можно устанавливать отборы, а где нет, эту проблему можно решить.
Далее, сохранив отчёты, можно установить режим совместимости в 8.3.13.
Возможности отбора в объединении запросов 8.3.13
В версии платформы 8.3.13 сформируем отчет, убедившись, что флаг «Автозаполнение» отключен. Определено, что отбор можно накладывать только в параметрах виртуальной таблицы. Во втором запросе объединение в секции «ГДЕ» никакие параметры не подразумеваются. Отчет формируется с некорректным результатом (рис.15).
![отбор в объединении запросов 8.3.13 в СКД 1С](https://erpdev.i-neti.ru/wp-content/uploads/2023/10/15.png)
рис.15
Если проверить макет для табличного документа, то можно увидеть, что в параметрах виртуальной таблицы «Продажи — Обороты» отбор установлен. В запросе, где выбираются «Товарные запасы – Остатки», появляется отбор в секции «ГДЕ» (рис.16).
![отбор "Продажи-Обороты" в виртуальной таблице СКД 1С](https://erpdev.i-neti.ru/wp-content/uploads/2023/10/16.png)
рис.16
Рассмотрим, как обойти отбор в секции «ГДЕ», если конфигурация работает в режиме совместимости 8.3.13, а режим совместимости менять нельзя.
Требуемый отбор устанавливается в тексте запроса, когда выбираются данные из виртуальной таблицы «Продажи» (рис.17).
![обход отбора в секции "ГДЕ" в СКД 1С](https://erpdev.i-neti.ru/wp-content/uploads/2023/10/17.png)
рис.17
Поэтому в конструкторе схемы компоновки данных нужно модифицировать текст запроса. Сначала следует выбрать данные из виртуальной таблицы «Продажи – Обороты» в отдельном запросе: «Продажи – Обороты», «Покупатель», «Товар», «Сумма – Оборот» (рис.18).
![модификация текста запроса в конструкторе СКД 1С](https://erpdev.i-neti.ru/wp-content/uploads/2023/10/18.png)
рис.18
Скомпоновать их во временную таблицу «Продажи» (рис.19).
![временная таблица "Продажи" в СКД 1С](https://erpdev.i-neti.ru/wp-content/uploads/2023/10/19.png)
рис.19
Эту задачу можно решить с использованием флага «Автозаполнение».
Итак, получили продажи. В запросе «Объединение» следует заменить виртуальную таблицу «Продажи» на временную таблицу «Продажи». Также нужно взять данные «Сумма – Оборот». Объединение можно назвать «Сумма – Продажи».
В итоге формируется временная таблица «Всё вместе» (рис.20).
![временная таблица "Все вместе" СКД 1С](https://erpdev.i-neti.ru/wp-content/uploads/2023/10/20.png)
рис.20
Далее устанавливается флаг «Автозаполнение» (рис.21).
![установка флага "Автозаполнение" в таблице СКД 1С](https://erpdev.i-neti.ru/wp-content/uploads/2023/10/21.png)
рис.21
В запросе, который сгенерировал компоновщик макета: в первой временной таблице «Продажи» выбираются данные по полю с отбором «Покупатель» (рис.22).
![выбор данных в отборе по полю "Покупатель" СКД 1С](https://erpdev.i-neti.ru/wp-content/uploads/2023/10/22.png)
рис.22
Далее выбираются данные из этой временной таблицы, которые объединяются с запросом «Товарные запасы – Остатки». Здесь уже не устанавливается отбор по полю «Покупатель». И в финальном запросе тоже нет отбора в секции «ГДЕ» (рис.23).
![объединение содержимого временной таблицы и запроса в СКД 1С](https://erpdev.i-neti.ru/wp-content/uploads/2023/10/23.png)
рис.23
В итоге получился правильный результат (рис.24).
![итоговый отчет в СКД 1С при объединении запросов](https://erpdev.i-neti.ru/wp-content/uploads/2023/10/24.png)
рис.24
Краткие итоги по различиям наложения отбора на несуществующие поля в разных версиях платформы
Подводя итог, есть смысл отметить, что при использовании платформы в режиме совместимости с 8.3.13 по 8.3.17, можно обойти особенности наложения отборов на несуществующие поля запросов.
При этом, если в запросах присутствует объединение выборок из нескольких таблиц и возникает ситуация, в которой компоновщик макета накладывает отбор на поле, отсутствующее в одном из запросов на объединение, оптимально поступить следующим образом:
— предварительно выбрать данные из той таблицы, где предполагается накладывать отбор по полю, которого не будет в запросе «Объединение»;
— затем сложить данные во временную таблицу;
— а дальше производить выборку объединения запросов, объединяя данные временной таблицы, в которой будет наложен отбор, с остальными данными.
Оцените статью
Читайте также:
![](https://erpdev.i-neti.ru/wp-content/themes/neti/img/feedback_bg.png)