Имя: Пароль:
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) можно использовать как необязательные  отборы, так и необязательные параметры в разных частях запросов.