Имя: Пароль:
1C
 
Изменилась логика отборов СКД при смене платформы
,
0 mzelensky
 
03.03.20
12:52
Доброго всем!

Имеется довольно сложный отчет написанный на СКД. Изначально писался на платформе 8.2.13 в режиме совместимости с 8.1. Запустил конфигурацию на платформе 8.3.15 без режима совместимости

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

Наборы данных:
НаборДанных_ОБЪЕДИНЕНИЕ. Поля: ОсновнойСклад, Склад, Остаток
   НаборДанных_Выборка1. БЕЗ АВТОЗАПОЛНЕНИЯ. Поля: ОсновнойСклад, Остаток
   НаборДанных_Выборка2. С АВТОЗАПОЛНЕНИЕМ. Поля: Склад, Остаток

ИЗНАЧАЛЬНО (на платформе 8.2.13 в режиме совместимости с 8.1) - если на уровне "Отчета" поставить отбор "Склад = КакойТоСклад", то система накладывала этот отбор на "НаборДанных_Выборка2" и в результате я получал все данные из набора "НаборДанных_Выборка1" и отобранные данные из "НаборДанных_Выборка2"

ПОСЛЕ ПЕРЕХОДА (на платформе 8.3.15 без режима совместимости) - если на уровне "Отчета" поставить отбор "Склад = КакойТоСклад", то система накладывала этот отбор на "НаборДанных_Выборка2" И этот же отбор наложит на набор "НаборДанных_ОБЪЕДИНЕНИЕ". В результате я сперва получу все данные из набора "НаборДанных_Выборка1" и отобранные данные из "НаборДанных_Выборка2", а потом они еще раз "обрежутся" по "Склад = КакойТоСклад" и в результате останутся только данные из "НаборДанных_Выборка2"

ВОПРОС - what the fuck!?!?!??!" Как заставить отрабатывать отборы по "первоначальному" варианту?
1 butterbean
 
03.03.20
12:58
сделай в НаборДанных_Выборка2 еще одно поле Склад2 -копию поля Склад и отбирай по нему. А объединение оставь по полю Склад
2 fisher
 
03.03.20
12:58
Ответ: Не стоит удивляться. Это 1С.
Совет: для начала я бы попробовал отключить автозаполнение настроек у второго набора и явно прописать в настройках требуемый отбор
3 fisher
 
03.03.20
13:01
Так, стоп. А в настройках полей объединения стоит разрешение отбора по полю "Склад"? Если стоит, тогда как раз новый вариант поведения более логичен.
4 mzelensky
 
03.03.20
13:02
(1) Не получится. Результат тот же. Я не могу " объединение оставь по полю Склад".
5 mzelensky
 
03.03.20
13:03
(2) А смысл, если на его уровне все отрабатывает корректною. По всем признакам косяк именно в отборе на уровне "НаборДанных_ОБЪЕДИНЕНИЕ" ?
6 mzelensky
 
03.03.20
13:05
(3) "А в настройках полей объединения стоит разрешение отбора по полю "Склад"" - конечно стоит. Я уже думал об этом. Если я его от туда убираю, то поле "Склад" вообще пропадает из отборов, а значит я не смогу его наложить на "НаборДанных_Выборка2"
7 fisher
 
03.03.20
13:08
(6) Этого-то я и боялся. Тогда остается надежда на вариант, что из отборов полностью оно теперь пропадает из-за особенностей автозаполнения настроек.
Я бы попробовал все-таки во втором наборе отключить автозаполнение настроек и в фигурных скобках прописать возможность отбора по полю "Склад". И попробовать после этого оба варианта - с включением и отключением возможности отбора по складу на уровне объединения. В идеале СКД должно понять, что раз мы явно прописали возможность отбора по складу на уровне вложенного набора, то его пользователю нужно оставить.
8 fisher
 
03.03.20
13:10
А так-то на уровне объединения сейчас работает логично. Раз мы указали возможность отбора на уровне объединения, то отбор и должен применяться к результатам объединения.
9 mzelensky
 
03.03.20
13:12
(7) Не помогло.
10 mzelensky
 
03.03.20
13:13
(8) Первоначальный вариант меня больше устраивал. Он работал. А сейчас получается, что задачу, которую мне требуется решить, НЕЛЬЗЯ решить!!!

Мне нужно вывести все данные из "НаборДанных_Выборка1" и отобранные данные из "НаборДанных_Выборка2"
11 fisher
 
03.03.20
13:16
(9) То есть несмотря на описанный в настройках для вложенного набора отбор, его не дают пользователю если отбор отключен для объединения? Тогда печаль.
(10) А в первом варианте нельзя было решить другую задачу - применить отбор к результатам объединения. Оба варианта неполноценны.
12 fisher
 
03.03.20
13:22
Что-то меня в твоем объединении смущает.
Остаток у тебя значит объединяется, а склады - нет. Пытаюсь понять прикладной смысл и у меня это не очень получается.
13 catena
 
03.03.20
13:27
(10)Ну почему, можно, просто по-другому
14 mzelensky
 
03.03.20
13:36
"То есть несмотря на описанный в настройках для вложенного набора отбор, его не дают пользователю если отбор отключен для объединения? Тогда печаль." - ДА

"А в первом варианте нельзя было решить другую задачу - применить отбор к результатам объединения. Оба варианта неполноценны." - Нет
15 mzelensky
 
03.03.20
13:38
(12) Прикладной смысл - одно поле "Остаток" для всего отчета, соответственно одна выводимая колонка и все настройки для одного поля.
16 mzelensky
 
03.03.20
13:40
(12) Суть не в этом. А в том, чтобы ВСЕГДА выводились Остатки по Основному складу (они в  НаборДанных_Выборка1), даже если остатков нет (0), и далее выводились данные по складам из "Отбора".

Отчет крайне замороченный, долго все нюансы объяснять. Самое главное, что все это работало...
17 mzelensky
 
03.03.20
13:41
(13) Например как?
18 catena
 
03.03.20
13:43
(16)При смене платформы всегда вылазят неочевидные изменения в логике, которые часто нигде неописаны. Поэтому перевод самописок с платформы на платформу не всегда минутное дело и остается только грустно ржать над предложениями техподдержки на каждый пук установить последнюю версию платформы.

(17)Например через параметр.
19 mzelensky
 
03.03.20
13:46
(18) "(17)Например через параметр." не совсем понял предложения.

В смысле отказаться от отборов для "НаборДанных_Выборка2" и использовать параметры "склад" ? А что делать, если нужны все склады, без отбора? "Выбирать в параметре ВСЕ склады" ?
20 Franchiser
 
гуру
03.03.20
13:47
Нужно сделать отдельное поле для фильтрации склада на закладке "Компоновка" во втором наборе и обозвать его как нибудь, а отбор по складу отключить. Но при этом для пользователя новое поле отбора можно показывать как "Склад".
21 Franchiser
 
гуру
03.03.20
13:49
Назови новое поле поле компоновки СкладОтбор, Представление для пользователя "Склад", Галочка "использовать только для отбора".
Для поля Склад ставишь все галки кроме "использовать для отбора".
22 catena
 
03.03.20
13:52
(19)Не умеете писать запрос, чтоб работало с незаполненным параметром?
"ГДЕ склад=&склад или &склад=Значение(Справочник.Склады.ПустаяСсылка)"
23 Franchiser
 
гуру
03.03.20
13:53
(22) зачем если можно указывать пареметры/отборы на закладке "Компоновка"?
24 mzelensky
 
03.03.20
13:54
(19) Во-первых плохое условие для отбора в виртуальных таблицах

Во-вторых, что при таком подходе, вы будите делать, если нужно отобраться не на сам склад, а допустим на "Склад.ТипСклада" ?
25 catena
 
03.03.20
13:55
(23)Рабочий пример есть? Я попробовала с различными вариантами имен и ограничений отборов, решения, как и ТС, не нашла.
26 Провинциальный 1сник
 
03.03.20
13:55
Сталкивался с подобной фигнёй, 1с в СКД накладывала отбор не на результаты составного запроса, а на первый запрос в объединении. Решил проблему выводом во временную таблицу, с последующей выборкой уже из неё.
27 Franchiser
 
гуру
03.03.20
13:56
(25) есть
28 catena
 
03.03.20
13:56
(24)У вас тоже есть другое решение? Параметр и значение параметра можно и программно обработать. Я к тому, что нет такой задачи, которую решить прям нельзя))
29 catena
 
03.03.20
13:57
(27)Выложите, я с удовольствием посмотрю
30 mzelensky
 
03.03.20
13:58
(21) Это где такая Галочка "использовать только для отбора" ?
31 Franchiser
 
гуру
03.03.20
13:58
(29) у меня есть отчет, но он очень специфичен по собственному регистру
32 Franchiser
 
гуру
03.03.20
13:59
(30) в наборе данных галочка "условие"
33 mzelensky
 
03.03.20
14:02
(21) НА удивление работает, только как-то долго очень. Прям зависание на 75 ОЧЕНЬ ощутимое.
34 Franchiser
 
гуру
03.03.20
14:03
Вот такие конструкции в отчете при получении оборотов:
{ГДЕ
    МойРегистр.Покупатель,
    МойРегистр.НомерНакХ КАК НомерНакОтбор,
    МойРегистр.ДатаХ КАК ДатаХОтбор,
    МойРегистр.ТипОплатыХ КАК ВидОплатыОтбор,
    МойРегистр.ОперацияПрочие КАК ОперацияПрочиеОтбор,
    МойРегистр.КодКонтрагентаХ = &КодХ}
35 mzelensky
 
03.03.20
14:03
(33) Такое ощущение, что как-то оно через жопноеное место этот отбор накладывает. Там запрос огромный, попробую покапаться в этом направлении, может не совсем корректно условие сделал
36 Franchiser
 
гуру
03.03.20
14:04
(33) смотря куда ты добавил. Можно же фильтровать в разделе "ГДЕ", а можно в параметрах вирт. таблицы. Понятно что через "Где" будет работать дольше
37 mzelensky
 
03.03.20
14:05
(34) И что будет?

Типа условие "МойРегистр.КодКонтрагентаХ = &КодХ" отработает только при заполненном параметре "&КодХ" ?
38 Franchiser
 
гуру
03.03.20
14:05
(35) сравни запросы в макете компоновки до и после и оптимизируй до нужного результата
39 Franchiser
 
гуру
03.03.20
14:05
(37) да, именно так
40 mzelensky
 
03.03.20
14:05
(36) Это я уже разберусь. Просто запрос перебрать нужно. Раньше то в нем "Автозаполнение" отрабатывало.
41 Franchiser
 
гуру
03.03.20
14:07
(40) Автозаполнение никак не влияет на то, что ты пропишешь данные на закладке "Компоновка"
42 Franchiser
 
гуру
03.03.20
14:08
(40) единственно нужно запретить использовать в условиях поля которые приведут к некорректной фильтрации наборов
43 mzelensky
 
03.03.20
14:09
(41) Почему? Установленная галочка "Автозаполнение" ведь отключает ручные настройки "{}". Т.е. если галочка "Автозаполнение" стоит, то все настройки в "{}" игнорируются. Или я не прав?
44 Franchiser
 
гуру
03.03.20
14:15
(43) нет ты не прав. Автозаполнение помогает заполнить только закладку "Набор данных". При этом ты не можешь полученные поля как-то удалить, можно только включать/отключать галочками использование в групиировка, отборах, полях и т.д.
45 Franchiser
 
гуру
03.03.20
14:18
Вообще на курсах по СКД в фирме 1С (Белоусов) говорил для источника данных запрос никогда не нужно отключать автозаполнение, это только усложняет работу забивания полей в наборы.
46 mzelensky
 
03.03.20
14:24
(45) Да вроде ничего сложного в забивании полей. Зато уже точно уверен, что отрабатывать условия и выборка полей будут именно так, как ты задал ,а не так, как система сочла для себя лучше

Но, как показывает даже опыт этой ветки....это не точно!
47 Franchiser
 
гуру
03.03.20
14:25
(37) + не при заполненном параметре, а в том случае если параметр используется
48 Franchiser
 
гуру
03.03.20
14:26
(46) на самом деле давно известно откуда система подбирает все эти поля: берутся параметры виртуальных таблицы + поля выборки последнего запроса.
49 Franchiser
 
гуру
03.03.20
14:28
(46) забивая поля вручную, ты можешь получить на выходе не оптимальный запрос, но это твое дело. я предпочитаю оставлять автозаполнение, и при необходимости корректировать поведение компоновки.
50 toypaul
 
гуру
03.03.20
14:33
нашли решение? а то я 3 недели статью на эту тему писал, но ее публиковать не хотят :)
51 palsergeich
 
03.03.20
14:36
(46) Не, для оптимизатора СКД добавили Вы поля руками или автозаполнили - однофигственно.
фигурные скобки - и там и там работают.
Есть особенности оптимизатора, которые надо на себе прочуствовать и больше на это не попадаться. В идеале глазами увидеть итоговый результат и исполняемый текст запроса и как правило все станет ясно
52 mzelensky
 
03.03.20
14:39
(50) Подсказка в (20) и (21) вроде помогла
53 toypaul
 
гуру
03.03.20
14:39
хочу картинки настроек наборов :) и запросы
54 toypaul
 
гуру
03.03.20
14:40
(52) а. ну ок. значит стандартные грабли. а я думал что-то новенькое
55 Franchiser
 
гуру
03.03.20
14:41
(54) это не грабли а фича. иногда действительно так удобнее.
56 toypaul
 
гуру
03.03.20
14:46
кто-то говорил что Автозаполнение не влияет на логику работы если расставлены. не совсем так. иногда очень даже влияет.

кто-то спрашивал не понятно каким образом накладывается отбор. вот таким образом накладывается на объединение http://prntscr.com/raunj6
57 mzelensky
 
03.03.20
14:48
(50) Опубликуй в другом месте
58 Franchiser
 
гуру
03.03.20
14:49
(56) что мешает программно убрать фильтр на объединение из макета компоновки, тогда будет работать по-старому
59 Провинциальный 1сник
 
03.03.20
14:49
(55) Это именно грабли, но они не просто так, а в целях оптимизации. Недокументированное поведение. Но к сожалению в некоторых случаях получается на эти грабли наступить.
Самое логичное было бы, если бы СКД не пыталась лезть вглубь запросов, а все отборы накладывала на "конечный" источник данных. Но тогда могут быть потери в производительности.
60 toypaul
 
гуру
03.03.20
14:50
(20) и (21) похоже что единственно правильное решение. потому что даже если отключить автозполнение в наборе 2, такая же шняга происходит. была надежда что сработает. потому что иногда именно отключение автозаполнения отключает применение отбора в ненужном месте
61 Franchiser
 
гуру
03.03.20
14:53
(59) ну смотри пример.
Есть два набора данных:
1. Запрос по остаткам
2. Запрос по оборотам.
По оборотам есть поле которого нет по остаткам.
Если поставить фильтр на это поле, то что лучше вывести все остатки и данные с фильтром по оборотам или же остатки не показывать а вывести только отфильтрованные обороты.
По-моему лучше не показывать остатки вообще, так отчет будет меньше.
62 Franchiser
 
гуру
03.03.20
14:54
(59) а как сделать в старом варианте такую же фильтрация как в новом я не представляю.
63 toypaul
 
гуру
03.03.20
14:54
Нашел это изменение (вроде оно)

http://prntscr.com/rauu3r
64 toypaul
 
гуру
03.03.20
14:57
хотя нет. не совсем оно
65 fisher
 
03.03.20
16:41
(33) Вероятно, у тебя теперь при отключенном автозаполнении настроек не срабатывают какие-то оптимизации, которые раньше автозаполнение делало.
Попробуй, как советовали, включить автозаполнение но оставить фигурные скобки в отборе. Автозаполнение их не отключает. Фигурные скобки имеют приоритет.
66 catena
 
04.03.20
05:28
(34)Все, теперь я вас поняла. Я думала, вы про настройки использования отборов :) Ваш вариант практически то же самое, что я предлагала, только с обработкой пустого параметра на стороне СКД.
67 Franchiser
 
гуру
04.03.20
11:19
(66) можно использовать как необязательные  отборы, так и необязательные параметры в разных частях запросов.