Для чего используют конструкцию запроса "ГДЕ ЛОЖЬ" в СКД на примере конфигурации 1С:ERP

13.02.24

Разработка - Запросы

В типовых конфигурациях разработчики компании 1С иногда используют в отчетах, построенных на СКД, такую конструкцию, как "ГДЕ ЛОЖЬ". Такая конструкция говорит о том, что данные в запросе не будут получены совсем. Для чего же нужен тогда запрос?

Дорабатывал на днях типовой отчет "Остатки и доступность товаров" в конфигурации "1С:ERP Управление предприятием 2" и столкнулся с ситуацией, когда один из запросов, формирующих временные таблицу "ЗапасыИПотребности" в условии ГДЕ имеет значение ЛОЖЬ. То есть заранее обозначено, что данные получены не будут, и временная таблица будет в результате пуста. Подобная ситуация хорошо разобрана для RLS. 

Для того, чтобы понять, зачем так сделано в СКД, обратимся к процедуре "ПриКомпоновкеРезультата" модуля отчета.

С самого начала видно, что от стандартных (платформенных) действий разработчики отчета отказываются и планируют формировать отчет программным образом. Далее по тексту кода видно, что вызывается некая процедура по формированию текста запроса остатков.

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
    . . .

	ПодставитьТекстыЗапросаОстатков(СхемаКомпоновкиДанных);
	ТекстЗапроса = СхемаКомпоновкиДанных.НаборыДанных.Основной.Запрос;

	
    . . .

КонецПроцедуры

Разберём процедуру "ПодставитьТекстыЗапросаОстатков". Вначале из макета СКД, переданного в процедуру в качестве параметра, получается текст запроса набора данных. 

	ТекстЗапроса = Макет.НаборыДанных[0].Запрос;

Далее в данном тексте находят формирование временной таблицы "ЗапасыИПотребности" и раздел индексации этой временной таблицы.

	СтрокаДляПоиска = "ПОМЕСТИТЬ ЗапасыИПотребности"; 
	НачальнаяПозиция = СтрНайти(ТекстЗапроса, СтрокаДляПоиска);
	
	СтрокаДляПоиска = "ИНДЕКСИРОВАТЬ ПО"; 
	НачальнаяПозиция = СтрНайти(ТекстЗапроса, СтрокаДляПоиска, , НачальнаяПозиция);

Создаётся массив, в который помещается часть текста запроса до индексации временной таблицы.

	Тексты = Новый Массив();
	Тексты.Добавить(Лев(ТекстЗапроса, НачальнаяПозиция - 1));

В зависимости от настроек конфигурации в переменную помещают РЕАЛЬНЫЙ запрос - тот, который и должен вернуть необходимые данные. Это может быть и обращение к регистру сведений, и к регистру накопления, и к регистру бухгалтерии или к внешним источникам данных. А можно обратиться и ко всем вышеперечисленным хранилищам информации.

	Если ОбеспечениеВДокументахСервер.ЭтоПроизводительныйРежим() Тогда
		
		Текст =
			"ВЫБРАТЬ
			|	. . .
			|ИЗ
			|	РегистрНакопления.ЗапасыИПотребности.Остатки 
			|	. . .
			|";
		
	Иначе
		
		Текст =
			"ВЫБРАТЬ
			|	. . .
			|ИЗ
			|	РегистрСведений.РаспределениеЗапасов 
			|	. . .
			|";
		
	КонецЕсли;

Главное, чтобы колонки формируемого запроса, их порядок и тип значений совпадали с таблицей полученной в запросе с конструкцией "ГДЕ ЛОЖЬ". 

Следующим шагом в массив текстов добавляется "разделитель таблиц" - конструкция ОБЪЕДИНИТЬ или ОБЪЕДИНИТЬ ВСЕ с пробелами до и после конструкции

Тексты.Добавить(ОбщегоНазначенияУТ.РазделительЗапросовВОбъединении());

Функция общего модуля возвращает строковое значения "разделителя таблиц":

Функция РазделительЗапросовВОбъединении(ТолькоУникальные = Ложь) Экспорт
	
	Если ТолькоУникальные Тогда
		Возврат "
		|
		|ОБЪЕДИНИТЬ
		|
		|";
	Иначе
		Возврат "
		|
		|ОБЪЕДИНИТЬ ВСЕ
		|
		|";
	КонецЕсли;
	
КонецФункции

Далее в массив добавляется текст нового запроса, часть текста запроса полученного из набора данных СКД, следующего с момента индексации временной таблицы "ЗапасыИПотребности" и всё это соединяется в единый текст запроса, передаваемый в набор данных СКД.

	Тексты.Добавить(Текст);
	Тексты.Добавить(Сред(ТекстЗапроса, НачальнаяПозиция));
	ТекстЗапроса = СтрСоединить(Тексты);
	Макет.НаборыДанных[0].Запрос = ТекстЗапроса;

Окончательный вариант процедуры, подставляющий текст запроса, который позволит получить необходимые данные и передать их дальше в последующие запросы, представлен ниже.

Процедура ПодставитьТекстыЗапросаОстатков(Макет)
	
	ТекстЗапроса = Макет.НаборыДанных[0].Запрос;
	
	СтрокаДляПоиска = "ПОМЕСТИТЬ ЗапасыИПотребности"; 
	НачальнаяПозиция = СтрНайти(ТекстЗапроса, СтрокаДляПоиска);
	
	СтрокаДляПоиска = "ИНДЕКСИРОВАТЬ ПО"; 
	НачальнаяПозиция = СтрНайти(ТекстЗапроса, СтрокаДляПоиска, , НачальнаяПозиция);
	
	Тексты = Новый Массив();
	Тексты.Добавить(Лев(ТекстЗапроса, НачальнаяПозиция - 1));
	
	Если ОбеспечениеВДокументахСервер.ЭтоПроизводительныйРежим() Тогда
		
		Текст =
			"ВЫБРАТЬ
			|	ИнформацияОДоступности.Номенклатура КАК Номенклатура,
			|	ИнформацияОДоступности.Характеристика КАК Характеристика,
			|	ИнформацияОДоступности.Склад КАК Склад,
			|	ИнформацияОДоступности.Назначение КАК Назначение,
			|	ИнформацияОДоступности.Заказ КАК Заказ,
			|	ИнформацияОДоступности.ДатаСобытия КАК ДатаСобытия,
			|	ИнформацияОДоступности.ВНаличииОстаток КАК ВНаличииОстаток,
			|	ИнформацияОДоступности.ПоступитОстаток КАК ПоступитОстаток
			|ИЗ
			|	РегистрНакопления.ЗапасыИПотребности.Остатки(,
			|		Склад ССЫЛКА Справочник.Склады
			|			И ВЫБОР
			|				КОГДА &ПоказатьОбособленныеТовары
			|					ТОГДА
			|						ИСТИНА
			|				ИНАЧЕ Назначение = ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
			|			КОНЕЦ
			|			{(Номенклатура, Характеристика) В(
			|				ВЫБРАТЬ
			|					ТаблицаОтбора.Номенклатура КАК Номенклатура,
			|					ТаблицаОтбора.Характеристика КАК Характеристика
			|				ИЗ
			|					ОтборПоСегментуНоменклатуры КАК ТаблицаОтбора
			|				ГДЕ
			|					ТаблицаОтбора.ИспользуетсяОтборПоСегментуНоменклатуры = &ИспользуетсяОтборПоСегментуНоменклатуры)}
			|			{Номенклатура.* КАК Номенклатура,
			|			Характеристика.* КАК Характеристика,
			|			Склад.* КАК Склад}) КАК ИнформацияОДоступности
			|";
		
	Иначе
		
		Текст =
			"ВЫБРАТЬ
			|	ИнформацияОДоступности.Номенклатура КАК Номенклатура,
			|	ИнформацияОДоступности.Характеристика КАК Характеристика,
			|	ИнформацияОДоступности.Склад КАК Склад,
			|	ИнформацияОДоступности.Назначение КАК Назначение,
			|	ИнформацияОДоступности.ЗаказНаПоступление КАК Заказ,
			|	ИнформацияОДоступности.ДатаПоступления КАК ДатаСобытия,
			|	ВЫБОР
			|		КОГДА ИнформацияОДоступности.Состояние = ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОстатокНаСкладе)
			|			ТОГДА ИнформацияОДоступности.Запас
			|		ИНАЧЕ 0
			|	КОНЕЦ КАК ВНаличииОстаток,
			|	ВЫБОР
			|		КОГДА ИнформацияОДоступности.Состояние = ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОжидаемоеПоступление)
			|			ТОГДА ИнформацияОДоступности.Запас
			|		ИНАЧЕ 0
			|	КОНЕЦ КАК ПоступитОстаток
			|ИЗ
			|	РегистрСведений.РаспределениеЗапасов КАК ИнформацияОДоступности
			|		{ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОтборПоСегментуНоменклатуры КАК ТаблицаОтбора
			|		ПО ТаблицаОтбора.Номенклатура = ИнформацияОДоступности.Номенклатура
			|			И ТаблицаОтбора.Характеристика = ИнформацияОДоступности.Характеристика}
			|ГДЕ
			|	ИнформацияОДоступности.Состояние В (
			|		ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОстатокНаСкладе),
			|		ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОжидаемоеПоступление))
			|	И ИнформацияОДоступности.Запас <> 0
			|	И ИнформацияОДоступности.Склад ССЫЛКА Справочник.Склады
			|	И ВЫБОР
			|			КОГДА &ПоказатьОбособленныеТовары ТОГДА
			|				ИСТИНА
			|			ИНАЧЕ
			|				ИнформацияОДоступности.Назначение = ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
			|		КОНЕЦ
			|{ГДЕ
			|	ТаблицаОтбора.ИспользуетсяОтборПоСегментуНоменклатуры = &ИспользуетсяОтборПоСегментуНоменклатуры
			|}
			|{ГДЕ
			|	ИнформацияОДоступности.Склад.* КАК Склад,
			|	ИнформацияОДоступности.Номенклатура.* КАК Номенклатура,
			|	ИнформацияОДоступности.Характеристика.* КАК Характеристика}
			|";
		
	КонецЕсли;
	Тексты.Добавить(ОбщегоНазначенияУТ.РазделительЗапросовВОбъединении());
	Тексты.Добавить(Текст);
	Тексты.Добавить(Сред(ТекстЗапроса, НачальнаяПозиция));
	ТекстЗапроса = СтрСоединить(Тексты);
	Макет.НаборыДанных[0].Запрос = ТекстЗапроса;
	
КонецПроцедуры

Подводя общий итог, можно сказать, что использование конструкции "ГДЕ ЛОЖЬ" в тексте запроса набора данных СКД подразумевает резервирование (или бронирование) места для вставки текста запроса в зависимости от настроек или алгоритма, при этом использование результата временной таблицы уже заранее описано далее по тексту запроса.

ГДЕ ЛОЖЬ СКД

См. также

SALE! 15%

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    159392    872    399    

861

Запросы Программист Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    5164    XilDen    36    

80

СКД WEB-интеграция Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Долгое время поддерживаю web-портал, в котором появилась необходимость создавать отчеты. Просмотрев различные фреймворки на js, я решил сделать свое решение, которое позволяло бы быстро разрабатывать и добавлять новые отчеты на web-портал.

2 стартмани

11.12.2023    10802    23    John_d    25    

124

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    19317    skovpin_sa    15    

105

СКД Программист Платформа 1С v8.3 Система компоновки данных Бесплатно (free)

Когда отчет надо разделить по страницам, это всегда проблема для разработчика. Поскольку в СКД нет стандартных вариантов, как это сделать. Нашел (на свой взгляд) самое простое и оптимальное решение.

01.09.2023    6613    KVIKS    15    

82

Запросы HighLoad оптимизация Программист Запросы Бесплатно (free)

Многие знают, что для ускорения работы запроса нужно «изучить план». При этом сам план обычно обескураживает: куча разноцветных иконок и стрелочек; ничего не понятно, но очень интересно! Аналитик производительности Александр Денисов на конференции Infostart Event 2021 Moscow Premiere рассказал, как выполняется план запроса и что нужно сделать, чтобы с его помощью находить проблемы производительности.

20.06.2023    28167    Филин    37    

118

СКД Программист Платформа 1С v8.3 Абонемент ($m)

Как получить родителя первого уровня иерархического справочника с помощью СКД.

1 стартмани

06.06.2023    9676    echo77    6    

81
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. RustIG 1747 13.02.24 14:27 Сейчас в теме
и зачем вы полезли в этот отчет?
7. KawaNoNeko 115 13.02.24 16:12 Сейчас в теме
(1) Мне заплатили
ubnkfl; Innuil; siamagic; Mi4man; mikeA; mrChOP93; kamisov; JohnyDeath; TimkoNzt; kser87; DoctorRoza; olexi2012; madonov; MaximStav; SP2000; ixijixi; Teplotrassamen; kaaasteeen; TMV; serg-lom89; SuhoffGV; +21 Ответить
14. Hexed 2 15.02.24 08:32 Сейчас в теме
(7) эти программисты совсем озверели, без денег даже в отчет ерпишный не полезут )))
2. RustIG 1747 13.02.24 14:28 Сейчас в теме
в конфигураторе глобальным поиском найдите "Где Ложь" - может быть есть еще отчеты, где используется такая конструкция?
4. KawaNoNeko 115 13.02.24 15:09 Сейчас в теме
(2)
Где Ложь

Готов запустить поиск - сколько вы мне за это заплатите?
mrChOP93; KoC_one; kamisov; NikusXXZ; Serg_bl; npesterev; dimaster; MRAK; serg-lom89; +9 2 Ответить
5. RustIG 1747 13.02.24 16:02 Сейчас в теме
(4) за исследовательские работы здесь на ИС никто не платит...
хотите расширить кругозор и усилить статью данными - проведите исслед. работы самостоятельно...
3. user1950534 13.02.24 14:50 Сейчас в теме
Извращенцы)) А еще у них запрос в цикле - на каждом шагу, и выгрузки в ТЗ тоже))
6. RustIG 1747 13.02.24 16:03 Сейчас в теме
(3)
А еще у них запрос в цикле - на каждом шагу

покажите пример
(3)
выгрузки в ТЗ

это полезный лайфхак
8. v8_088 13.02.24 16:28 Сейчас в теме
В типовых еще встречал " ВЫБРАТЬ ПЕРВЫЕ 0 ..... "
10. evvakra 311 13.02.24 19:20 Сейчас в теме
(8) выбрать первые 0 используют когда необходимо получить заданную структуру таблицы с уже типизированными колонками, без данных
ubnkfl; mainspec_vibor; Sam13; KawaNoNeko; SP2000; A1WEB; kaaasteeen; SuhoffGV; +8 Ответить
9. Ferth 13.02.24 17:25 Сейчас в теме
Даа, тоже сталкивалась с этим в типовом отчете. Но там прямо в модуле объекта заменялся текст запроса по условию
11. shard 281 14.02.24 01:01 Сейчас в теме
и почему же не используют схему запроса... (сарказм)
JohnyDeath; +1 Ответить
12. IvanPoh 25 14.02.24 09:27 Сейчас в теме
(11)а почему сарказм? Она тут вроде бы напрашивается. Выглядеть это конечно будк еще более вырвиглазно и не читаемо, но это ж типовое, оно такое и должно быть)
22. JohnyDeath 302 16.02.24 23:27 Сейчас в теме
(11) я тоже об этом сразу же подумал как только увидел поиск позиций "ИНДЕКСИРОВАТЬ " и "ПОМЕСТИТЬ ".
Это прям очень топорно. Понимаю, когда выхода другого нет, но тут прям мимо. Следующий разработчик просто уберет индексирование (ну а зачем оно в пустой таблице?) и тогда всему отчету хана.
Или, например, поменяют на "Поместить" ЗапасыИПотребности" или "ПОМЕСТИТЬ ЗАПАсыИпотребности"
user884633; +1 Ответить
13. booksfill 14.02.24 09:50 Сейчас в теме
Спасибо за напоминание, что не следует сразу рефакторить "явную глупость".
Кстати, много раз сталкивался с подобным кодом, когда разработчик решил так временно отключить функциональность и забыл убрать ставший лишним код.

Сам же прием не нравится своей не очевидностью.
Даже не изобретая "более светлый путь", а просто не поленившись набрать несколько символов, можно на пару порядков снизить вероятность ошибки и проявить уважение к тем, кто будет читать код:

ВЫБРАТЬ Первые 10 * Поместить ВТ ИЗ Справочник.Номенклатура
ГДЕ "Эта таблица БУДЕТ ДОПОЛНЕНА В КОДЕ, НИЧЕГО ТУТ НЕ ТРОГАТЬ" = ""


Согласитесь, что столкнись вы с таким вариантом, статью писать было бы уже не надо.
ubnkfl; user884633; mRconik; JohnyDeath; olexi2012; Hexed; shard; KawaNoNeko; +8 Ответить
17. webester 26 15.02.24 13:26 Сейчас в теме
(13)
Согласитесь, что столкнись вы с таким вариантом, статью писать было бы уже не надо.
Этот вариант не откроется в конструкторе А с "ГДЕ ЛОЖЬ" откроется. Если задать условие "ГДЕ &ЗдесьИмяПараметраКотороеПрояснитСитуацию" создаст автоматически параметр в СКД и в случае если параметры устанавливаются автоматически может потребовать обработки исключения. А "ГДЕ ЛОЖЬ" ничего не ломает, ничего не добавляет, не делает ничего и при этом является хорошим маркером для секции отборов, так как не может существовать в реальном запросе
20. booksfill 15.02.24 18:35 Сейчас в теме
(17)
Откроется.
Только что проверил, только вместо * пришлось выбрать что-то конкретное, это не связано с сутью, просто у нас своеобразный справочник он так просто целиком в ВТ не лезет (хот ьс условием, хоть без оного)
Прикрепленные файлы:
15. rozer 311 15.02.24 12:28 Сейчас в теме
+ (10) еще применяют такой финт к временной таблице в основном запросе СКД когда уже далее в коде используют эту временную таблицу. Если так не сделать то СКД уничтожает временные таблицы как не используемые при компоновке.
16. webester 26 15.02.24 13:21 Сейчас в теме
Статья должна выглядеть приблизительно так:
Добрый день. Если вас мучал вопрос для чего используют конструкцию запроса "ГДЕ ЛОЖЬ" в СКД, отвечаю: чтобы потом в тексте заменить это условие на другое. Хотя если отчет формируется то это очевидно и так. Спасибо за внимание.
ЗЫ Это вы еще представления в ЗУП не видели, если задаетесь вопросом "зачем" глядя на такие вещи
triviumfan; mikeA; KoC_one; JohnyDeath; JOJ73; asupsam; KawaNoNeko; +7 Ответить
18. KawaNoNeko 115 15.02.24 15:44 Сейчас в теме
(16) Безусловно Вы правы. Плюсанул. Только всё таки не "заменяет", а дополняет. Чутка разные вещи. Но в целом согласен. Статья же больше для новичков или для тех кто мало сталкивается с подобными конструкциями.
19. KawaNoNeko 115 15.02.24 15:55 Сейчас в теме
(17) здесь тоже соглашусь. Согласно стандартам и методикам разработки 1С запрос ДОЛЖЕН открывать конструктором.
21. kser87 2470 16.02.24 09:54 Сейчас в теме
Сделано так, чтобы разработчики побольше времени на анализ тратили и заказчики раскошеливались.
23. user2054291 18.02.24 10:22 Сейчас в теме
Одно из худших проявлений языка конструировать выражения одного языка из другого. Это превращает код в помойку
Оставьте свое сообщение