СКД неверно ставит отборы?
Столкнулся с тем, что при определенных условиях СКД формирует не совсем ожидаемый результат.
Вот для примера отчет (схема компоновки).
Схема отчета
<dataCompositionSchema xmlns="http://v8.1c.ru/8.1/data-composition-system/schema" xmlns:dcscom="http://v8.1c.ru/8.1/data-composition-system/common" xmlns:dcscor="http://v8.1c.ru/8.1/data-composition-system/core" xmlns:dcsset="http://v8.1c.ru/8.1/data-composition-system/settings" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<dataSource>
<name>ИсточникДанных1</name>
<dataSourceType>Local</dataSourceType>
</dataSource>
<dataSet xsi:type="DataSetQuery">
<name>НаборДанных1</name>
<field xsi:type="DataSetFieldField">
<dataPath>ДатаРождения</dataPath>
<field>ДатаРождения</field>
<title xsi:type="v8:LocalStringType">
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Дата рождения</v8:content>
</v8:item>
</title>
</field>
<field xsi:type="DataSetFieldField">
<dataPath>Имя</dataPath>
<field>Имя</field>
<title xsi:type="v8:LocalStringType">
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Имя</v8:content>
</v8:item>
</title>
</field>
<dataSource>ИсточникДанных1</dataSource>
<query>ВЫБРАТЬ
"Вася" КАК Имя,
ДАТАВРЕМЯ(2024, 1, 1) КАК ДатаРождения
ПОМЕСТИТЬ ВТ_1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Петя",
ДАТАВРЕМЯ(2024, 2, 1)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Коля",
ДАТАВРЕМЯ(2024, 3, 1)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
"Маша" КАК Имя,
ДАТАВРЕМЯ(2024, 1, 1) КАК ДатаРожденияТаб2
ПОМЕСТИТЬ ВТ_2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Даша",
ДАТАВРЕМЯ(2024, 2, 1)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Катя",
ДАТАВРЕМЯ(2024, 3, 1)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_1.Имя КАК Имя
ПОМЕСТИТЬ ВТ_Имен
ИЗ
ВТ_1 КАК ВТ_1
ОБЪЕДИНИТЬ
ВЫБРАТЬ РАЗЛИЧНЫЕ
ВТ_2.Имя
ИЗ
ВТ_2 КАК ВТ_2
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_Имен.Имя КАК Имя,
ЕСТЬNULL(ВТ_1.ДатаРождения, ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)) КАК ДатаРождения
ПОМЕСТИТЬ ВТ_Итог
ИЗ
ВТ_Имен КАК ВТ_Имен
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_1 КАК ВТ_1
ПО ВТ_Имен.Имя = ВТ_1.Имя
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ВТ_Имен.Имя,
ЕСТЬNULL(ВТ_2.ДатаРожденияТаб2, ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0))
ИЗ
ВТ_Имен КАК ВТ_Имен
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_2 КАК ВТ_2
ПО ВТ_Имен.Имя = ВТ_2.Имя
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_Итог.Имя КАК Имя,
ВТ_Итог.ДатаРождения КАК ДатаРождения
ИЗ
ВТ_Итог КАК ВТ_Итог</query>
</dataSet>
<settingsVariant>
<dcsset:name>Основной</dcsset:name>
<dcsset:presentation xsi:type="xs:string">Основной</dcsset:presentation>
<dcsset:settings xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows">
<dcsset:selection>
<dcsset:item xsi:type="dcsset:SelectedItemField">
<dcsset:field>СистемныеПоля.НомерПоПорядку</dcsset:field>
</dcsset:item>
<dcsset:item xsi:type="dcsset:SelectedItemField">
<dcsset:field>Имя</dcsset:field>
</dcsset:item>
<dcsset:item xsi:type="dcsset:SelectedItemField">
<dcsset:field>ДатаРождения</dcsset:field>
</dcsset:item>
</dcsset:selection>
<dcsset:filter>
<dcsset:item xsi:type="dcsset:FilterItemComparison">
<dcsset:left xsi:type="dcscor:Field">ДатаРождения</dcsset:left>
<dcsset:comparisonType>GreaterOrEqual</dcsset:comparisonType>
<dcsset:right xsi:type="v8:StandardBeginningDate">
<v8:variant xsi:type="v8:StandardBeginningDateVariant">Custom</v8:variant>
<v8:date>2024-02-01T00:00:00</v8:date>
</dcsset:right>
</dcsset:item>
</dcsset:filter>
<dcsset:order>
<dcsset:item xsi:type="dcsset:OrderItemField">
<dcsset:field>ДатаРождения</dcsset:field>
<dcsset:orderType>Asc</dcsset:orderType>
</dcsset:item>
</dcsset:order>
<dcsset:conditionalAppearance>
<dcsset:item>
<dcsset:selection>
<dcsset:item>
<dcsset:field>ДатаРождения</dcsset:field>
</dcsset:item>
</dcsset:selection>
<dcsset:filter/>
<dcsset:appearance>
<dcscor:item xsi:type="dcsset:SettingsParameterValue">
<dcscor:parameter>Формат</dcscor:parameter>
<dcscor:value xsi:type="v8:LocalStringType">
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>ДФ='dd.MM.yyyy'</v8:content>
</v8:item>
</dcscor:value>
</dcscor:item>
</dcsset:appearance>
</dcsset:item>
</dcsset:conditionalAppearance>
<dcsset:outputParameters/>
<dcsset:item xsi:type="dcsset:StructureItemGroup">
<dcsset:order>
<dcsset:item xsi:type="dcsset:OrderItemAuto"/>
</dcsset:order>
<dcsset:selection>
<dcsset:item xsi:type="dcsset:SelectedItemAuto"/>
</dcsset:selection>
<dcsset:outputParameters/>
</dcsset:item>
</dcsset:settings>
</settingsVariant>
</dataCompositionSchema>
Установлен отбор на дату рождения.
При формировании отчета получаем результат (Скриншот: Неверный результат)
Но вот 5 строк объясняется тем, что отбор накладывается на первую таблицу, где встречается поле с этим именем
Т.е. отбор накладывается только на таблицу ВТ_1, а не на результат запроса
Чтобы отбор накладывался на результат, надо у результата запроса на вкладке "Компоновка данных" на вкладке условия добавить это поле (Скриншот: Необходимая настройка для отбора)
Проверялось на релизах 8.3.13.1513, 8.3.14.1640.
Related Posts
- Получение логина и пароля техподдержки 1С из базы
- Класс для вывода отчета в Excel
- Счет-фактура для УПП
- Библиотека классов для создания внешней компоненты 1С на C#
- Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86
- Прайс-лист с артикулом в отдельной колонке
Да, всё правильно, для получения предсказуемых результатов желательно отборы настраивать для всех участвующих таблиц в явном виде.
При знакомстве с СКД эту «ошибку», которая называется оптимизатор запроса, рано или поздно встречаешь.
Далее уже на автомате ставишь всегда нужные условия на компоновке, да и автозаполнение полей не используешь
СКД «ловит» отбор по имени поля которое попадает в набор данных, а именно «ДатаРождения»
замените синоним «ДатаРожденияТаб2» на «ДатаРождения» и все станет чики-пуки.
(3)Да как решить эту проблему я знаю. Дело в том, что во второй таблице вообще может не быть даты рождения. Пример показывает лишь то, что возможны случаи, что отбор накладывается не на результат. И как сделать так, чтобы отчет выводил предсказуемые результаты.
(4)
Чтобы ответить на этот вопрос, необходимо сперва понять, а что Вы подразумеваете под предсказуемостью? Как видите, для некоторых участников сообщества результат вполне предсказуем. Почему СКД накладывает отбор не на результат, а на промежуточные таблицы? Потому что разработчики СКД решили, что такой сценарий более распространен и более оправдан. И тут мне трудно спорить с ними. Ну а что с этим делать, если такой подход не устраивает? «Объяснять» СКД, где действительно нужно устанавливать отборы с помощью выражений в фигурных скобках, иногда отключать автозаполнение наборов данных.
(4) Забудьте о флажке «Автозаполнение полей» или будете подобные артефакты ловить постоянно. Контролируйте доступные для отбора поля через {}, тогда всё будет прозрачно для вас и для СКД