0. ids79 3799 17.07.19 05:18 Сейчас в теме

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

Перейти к публикации

Комментарии
Избранное Подписка Сортировка: Древо
1. YPermitin 4031 17.07.19 07:53 Сейчас в теме
(0) спасибо за полезный материал!
jaroslav.h; ids79; jif; +3 Ответить
6. ids79 3799 17.07.19 21:12 Сейчас в теме
2. lmnlmn 53 17.07.19 10:18 Сейчас в теме
Отличные материалы!
7. ids79 3799 17.07.19 21:13 Сейчас в теме
4. AllexSoft 17.07.19 12:32 Сейчас в теме
Параметры..
Условие – используется для выбора полей, по которым можно будет указывать отбор в настройках компоновки (аналогично секции ГДЕ). Отличие в том, что указанные пользователем отборы, в итоговом запросе макета компоновки будут наложены в параметрах виртуальных таблиц, а не в секции ГДЕ на уровне всего запроса.

Тут есть один забавный нюанс, а именно если у вас указано больше чем 1 отбора на этой вкладке, то СКД их объединит в одну группу условий, то есть ввод сразу всех параметров станет обязательным.
Например
РегистрСведений.CR_СтатусыОбъектовАренды.СрезПоследних(, {(Контрагент = &Контрагент
			    И Договор = &Договор)})

При попытке задать только один параметр выдаст не задано значение для параметра..
Прикрепленные файлы:
5. dhurricane 17.07.19 20:53 Сейчас в теме
(4) В Вашем примере, полагаю, это запланированное поведение от разработчика. Либо решение "по незнанию". :) Для того, чтобы параметры не зависели друг от друга, необходимо их разделять запятыми:
РегистрСведений.CR_СтатусыОбъектовАренды.СрезПоследних(, {(Контрагент = &Контрагент), (Договор = &Договор)})

Однако и такое решение оставляет желать лучшего, т.к. в этом случае пользователь может указать для отбора лишь одно значение параметра. Но не может, например, ввести список исключаемых контрагентов, либо отобрать по некоторому реквизиту контрагента так, чтобы это условие попало именно в параметры виртуальной таблицы. Поэтому для параметров виртуальных таблиц используется несколько иной синтаксис:
РегистрСведений.CR_СтатусыОбъектовАренды.СрезПоследних(, {(Контрагент).* КАК Контрагент, (Договор).* КАК Договор})
В таком случае пользователь сможет настраивать любой отбор по данным полям, и этот отбор в том же самом виде попадет в параметры виртуальной таблицы.

Все описанное справедливо в первую очередь при снятом флажке Автозаполнения на закладке наборов данных СКД.

Ну и прошу прощения, если я проявил излишнюю прыть, описав то, что Вы и без меня хорошо знали. :)
jaroslav.h; MaZaHacKa_13; SirStefan; AllexSoft; jif; Поручик; +6 Ответить
9. ids79 3799 17.07.19 21:39 Сейчас в теме
(5) Спасибо за дополнение
11. triviumfan 10 18.07.19 09:07 Сейчас в теме
(5)
справедливо в первую очередь при снятом флаже Автозаполнение

Вы хотите сказать, что с включенным поведение отличается?
13. dhurricane 18.07.19 09:39 Сейчас в теме
(11) Немного отличается, да. Например, я указал, что при использовании параметров не получится указать список исключений контрагенту, либо договору так, чтобы это условие попало в параметры виртуальной таблицы. Только строгое равенство одному значению. Это справедливо, если снят флаг автозаполнения и нет дополнительных инструкций для СКД.
Но при включенном автозаполнении произвольный отбор по данным полям установить можно. И если в отборе на уровне отчета дополнительно установить фильтр по одному из полей на неравенство, то такое условие все равно попадет в параметры виртуальной таблицы. Хоть мы его явное об этом и не просили.
16. ids79 3799 18.07.19 10:46 Сейчас в теме
(13)Да правильно.
Как раз об этом я пишу в статье:
"Еще несколько моментов при использовании флага «Автозаполнение»:
....
Если в запросе источника данных используется виртуальная таблица, и в настройках компоновки добавлен отбор по какому-либо измерению, в итоговом запросе макета, СКД будет накладывать отбор на параметры виртуальных таблиц"
15. AllexSoft 18.07.19 10:23 Сейчас в теме
(5) я кстати не знал что так можно, в то время когда я учился либо такого не было, либо на курсах в УЦ1 по СКД не показывали.. спасибо в общем, век живи век учись. Автору в статье неплохо бы дополнить этим моментом, уверен что многие не знают
17. ids79 3799 18.07.19 10:47 Сейчас в теме
(15)Вы правы, стоит указать об этом в статье. Добавлю, когда будет время
8. ids79 3799 17.07.19 21:38 Сейчас в теме
(4)Спасибо за дополнение.
Я имел в виду не параметры, а отбор:
{(Контрагент).* КАК Контрагент, (Договор).* КАК Договор},
о чем пишет Денис.
Вы правы, параметры тоже можно размещать здесь и в секции "ГДЕ".
И, если они объединены логическим оператором, то их использовать возможно только совместно.
В секции "ГДЕ", такие параметры будут находиться в одной строке:
Прикрепленные файлы:
10. triviumfan 10 18.07.19 09:06 Сейчас в теме
Множество ссылок на "справедливо для отключенного флага 'Автозаполнение'", - но ведь он почти всегда включен и поведение с ним такое же.
Да кто этот флаг вообще отключает?! Может вы просто "не умеете его готовить"?(с)
14. dhurricane 18.07.19 09:46 Сейчас в теме
(10)
Да кто этот флаг вообще отключает?! Может вы просто "не умеете его готовить"?(с)

Полегче с выводами. Я отключаю иногда именно потому, что неплохо представляю, как он работает.

В самом простом случае я его порой отключаю при выборке данных из регистра бухгалтерии, чтобы не было среди доступных полей таких как "Субконто1" и "Субконто2", а были мои, например "Контрагент" и "Договор".

Бывает отключаю для большого пакетного запроса, когда мне хочется лучше контролировать влияние пользовательских отборов на отбор данных в различных запросах пакета, а также на расстановку параметров виртуальных таблиц.
20. triviumfan 10 18.07.19 10:58 Сейчас в теме
(14)
В самом простом случае я его порой отключаю при выборке данных из регистра бухгалтерии, чтобы не было среди доступных полей таких как "Субконто1" и "Субконто2", а были мои, например "Контрагент" и "Договор".

Можно подробней? А то можно подумать...

(14)
Бывает отключаю для большого пакетного запроса, когда мне хочется лучше контролировать влияние пользовательских отборов на отбор данных в различных запросах пакета, а также на расстановку параметров виртуальных таблиц.

Мне пока фигурных скобок хватает и ограничения поля в параметрах набора данных.
23. dhurricane 19.07.19 09:37 Сейчас в теме
(20) Реальных примеров, к сожалению, привести не могу, т.к. действительно редко использую отключение автозаполнения. Поэтому приведу небольшой синтетический пример для ERP 2.4. Запрос следующий:
ВЫБРАТЬ
	ХозрасчетныйОстатки.Субконто1 КАК Номенклатура,
	ХозрасчетныйОстатки.Субконто2 КАК Склад,
	ХозрасчетныйОстатки.КоличествоОстаток КАК КоличествоБУ,
	0 КАК КоличествоОУ
ПОМЕСТИТЬ СверкаБУиОУ
ИЗ
	РегистрБухгалтерии.Хозрасчетный.Остатки(, Счет В ИЕРАРХИИ (&СчетУчета), &ВидыСубконто, {(Субконто1).* КАК Номенклатура, (Субконто2).* КАК Склад}) КАК ХозрасчетныйОстатки

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	ТоварыНаСкладахОстатки.Номенклатура,
	ТоварыНаСкладахОстатки.Склад,
	0,
	ТоварыНаСкладахОстатки.ВНаличииОстаток
ИЗ
	РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	СверкаБУиОУ.Номенклатура КАК Номенклатура,
	СверкаБУиОУ.Склад КАК Склад,
	СУММА(СверкаБУиОУ.КоличествоБУ) КАК КоличествоБУ,
	СУММА(СверкаБУиОУ.КоличествоОУ) КАК КоличествоОУ,
	СУММА(СверкаБУиОУ.КоличествоБУ - СверкаБУиОУ.КоличествоОУ) КАК Отклонение
ИЗ
	СверкаБУиОУ КАК СверкаБУиОУ
{ГДЕ
	СУММА(СверкаБУиОУ.КоличествоБУ) КАК КоличествоБУ,
	СУММА(СверкаБУиОУ.КоличествоОУ) КАК КоличествоОУ,
	СУММА(СверкаБУиОУ.КоличествоБУ - СверкаБУиОУ.КоличествоОУ) КАК Отклонение}

СГРУППИРОВАТЬ ПО
	СверкаБУиОУ.Склад,
	СверкаБУиОУ.Номенклатура
Показать

При включенном автозаполнении на закладке наборов данных мы увидим множество полей, которые доступны для отбора. Все они - измерения используемых виртуальных таблиц: Организация, Субконто3, Характеристика, Серия и т.д. При этом действительно давать возможность пользователю устанавливать отбор по этим полям ни в коем случае нельзя, т.к. это приведет к искажению данных отчета: по Счету мы уже и так отобрали, в регистре оперативного учета нет Организации, а отбор по Субконто3 и вовсе приведет к ошибке формирования отчета. Приходится отключать доступность всех лишних полей для отбора, однако они так и остаются "висеть" на закладке наборов данных. При том лишних может быть действительно очень много, в случае, если запрос содержит множество разнообразных виртуальных таблиц - абсолютно все их измерения попадут в поля набора данных.

Пусть проблема с лишними полями отбора решена, но что если пользователю потребуется установить отбор по ресурсам? Скажем, вывести все строки отчета, где количество БУ отрицательно, либо КоличествоОУ выше некоего порога. Да, мы добавили подсказку для СКД, как нужно устанавливать отбор по полям количества в последний запрос пакета, однако это совсем не помагает: СКД все равно добавит условия по полю количества в первый запрос пакета, при том в каждый элемент объединения. В результате такой отбор опять таки исказит результат. И решить эту проблему простой установкой флажков не получится.
24. triviumfan 10 19.07.19 11:03 Сейчас в теме
(23) Может задать разные превдонимы полей?
25. dhurricane 19.07.19 21:24 Сейчас в теме
(24) Да, можно дать другие псевдонимы, это поможет. Также, например, как помогает в параметрах виртуальных таблиц регистров, где не нужен отбор за период, указание инструкции {&ПустаяДата}. Можно также в приведенном примере попробовать уйти от использования виртуальной таблицы, заменив ее на вложенный запрос. В целом всегда можно применить тот или иной прием, дабы "отвлечь" СКД от некоторых оптимизаций при составлении запроса.

Только я решительно не понимаю: зачем? Зачем применять различные приемы "обмана" СКД, зачем перестраивать исходный текст запроса, переименовывать поля и проводить прочие эксперименты с запросом? Ведь порой проще и красивее самому явно непосредственно в запросе указать СКД, как себя следует вести, что выбирать.

Из Ваших комментариев я сделал вывод, что если есть хоть какой-либо способ изменить запрос и настроить поля так, чтобы сохранить работоспособность отчета, и при этом не снимать флаг "Автозаполнение", то всегда следует сохранять автозаполнение. Так к чему же такая однозначность? За что Вы так не любите этот флаг, или вернее его отсутствие?
18. ids79 3799 18.07.19 10:52 Сейчас в теме
(10)Согласен с Денисом.
Отключать Автозаполнение нужно только в том случае, если Вы ХОРОШО, знаете как это работает, для более гибкой настройки.
Иначе можно получить очень неожиданный результат.
21. triviumfan 10 18.07.19 11:01 Сейчас в теме
(18) Отключить автозаполнение, программное выполнение...
Тогда уже можно вернуться к "построителю отчета" :)
12. DoctorRoza 18.07.19 09:20 Сейчас в теме
19. ids79 3799 18.07.19 10:53 Сейчас в теме
22. sam441 38 18.07.19 15:16 Сейчас в теме
Если флаг установлен, поля компоновки данных заполняются автоматически для всех полей, указанных на верхнем уровне запроса
может все-таки на нижнем т.е. последнем?
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Екатеринбург
зарплата от 120 000 руб. до 120 000 руб.
Полный день

Бизнес-аналитик 1С
Москва
зарплата от 140 000 руб. до 200 000 руб.
Полный день

Руководитель проектов 1С
Санкт-Петербург
Полный день


Бизнес-архитектор 1С, ведущий консультант
Санкт-Петербург
Полный день