1с тип регистратора в запросе 1с
ВЫБРАТЬ
ЗаказыКлиентовОстатки.Номенклатура.Артикул ,
ЗаказыКлиентовОстатки.ЗаказаноОстаток
ИЗ
РегистрНакопления.ЗаказыКлиентов.Остатки КАК ЗаказыКлиентовОстатки
Приведет к неявному соединению с таблицей справочника Номенклатура, а реальный запрос, который будет выполняться к базе будет аналогичен этому:
ВЫБРАТЬ
СпрНоменклатура.Артикул ,
ЗаказыКлиентовОстатки.ЗаказаноОстаток
ИЗ
РегистрНакопления.ЗаказыКлиентов.Остатки КАК ЗаказыКлиентовОстатки
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура
ПО ЗаказыКлиентовОстатки.Номенклатура = СпрНоменклатура.Ссылка
На первый взгляд все корректно и правильно, но как система поведет себя, когда разыменовывается поле составного типа? Система будет соединяться СО ВСЕМИ таблицами, входящими в составной тип! Т.е. запрос
ВЫБРАТЬ
ЦеныНоменклатурыПоставщиков.Регистратор.Номер ,
ЦеныНоменклатурыПоставщиков.Цена
ИЗ
РегистрСведений.ЦеныНоменклатурыПоставщиков КАК ЦеныНоменклатурыПоставщиков
будет преобразован во что-то вроде:
И ко всей этой конструкции будут добавлены ограничения на уровне записей (RLS), если они используются. Все это может существенно замедлить выполнение запроса.
Иногда при написании запроса известно какая ссылка будет находиться в поле составного типа. В этом случае правильно привести составной тип к одному необходимому и избежать соединения со всеми таблицами составного типа. Для приведения составного типа к какому-то одному используется оператор
Параметр <Выражение> можно привести к ссылочному типу или к одному из примитивных типов.
Если <Выражение> содержит в составном типе требуемый <Тип значения> , то приведение типа считается осуществимым, и для каждого значения указанного типа результатом будет это самое значение. Для значений других типов результатом приведения типа будет значение NULL.
Если <Выражение> не содержит в составном типе требуемый <Тип значения> , то выполнение данного запроса завершится ошибкой.
Пример использования оператора Выразить, когда известно какая ссылка будет находиться в поле составного типа:
ВЫБРАТЬ
ВЫРАЗИТЬ (ЦеныНоменклатурыПоставщиков.Регистратор КАК Документ.ЗаказПоставщику).Номер КАК Номер,
ЦеныНоменклатурыПоставщиков.Цена
ИЗ
РегистрСведений.ЦеныНоменклатурыПоставщиков КАК ЦеныНоменклатурыПоставщиков
ГДЕ
ЦеныНоменклатурыПоставщиков.Регистратор ССЫЛКА Документ.ЗаказПоставщику
В запросе выше пожертвовали компактностью получения поля Номер ради производительности. В результате текст запроса получился более громоздким, но запрос выполнится быстрее за счет того, что не будет лишних ненужных соединений со всеми таблицами составного поля Регистратор.
Остались вопросы?
Спросите в комментариях к статье.
&НаСервере
Процедура ОтборЗаписейВЗапросеПоОпределенномуЗначениюРеквизиту ()
// Выборка котрагентов, у которых значение реквизита Резидентство = НеРезидент
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование,
| СтранаРегистрации,
| ЮрАдрес,
| Резидентство
|ИЗ
| Справочник.Контрагенты
|ГДЕ
| Резидентство = ЗНАЧЕНИЕ(Перечисление.Резидентство.НеРезидент)
|" );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ОтборЗаписейВЗапросеПоОпределенномуЗначениюБухСчету ()
// Выборка проводок с суммами и количеством по дебету бухгалтерского счёта 01.01,
// через обращение по предопределенному имени "ОсновныеСредстваВОрганизации"
Запрос = Новый Запрос ( "ВЫБРАТЬ
| СчетДт,
| СчетКт,
| Количество,
| Сумма
|ИЗ
| РегистрБухгалтерии.Хозрасчетный
|ГДЕ
| СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ОсновныеСредстваВОрганизации)" );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ОпределениеПеременойТипаДатаВЗапросе ()
// Указывать дату можно прямо в запросе или передавать через параметр
Запрос = Новый Запрос ( "ВЫБРАТЬ
| ДАТАВРЕМЯ(2020, 05, 30, 23, 00, 00) КАК ДоНачалаЛетаОсталсяОдинЧас" );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ФункцииДляРаботыСДатамиВЗапросе ()
Запрос . УстановитьПараметр ( "ВыбраннаяДата" , '20200607' );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ИспользованиеОператораВЫБОРвЗапросе ()
// Выборка материалов с добавлением поля "ОписаниеПлотности" для новой градации
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование,
| Плотность,
| ВЫБОР
| КОГДА Плотность 2 ТОГДА
| ""Средняя плотность""
| ИНАЧЕ
| ""Очень плотный материал""
|
| КОНЕЦ КАК ОписаниеПлотности
| ИЗ
| Справочник.Материалы" );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ИспользованиеЗначенияНеопределеноВЗапросе ()
// Выборка контрагентов у которых есть реквизит составного типа "ДокументыДвижения" и он не заполнен
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование,
| ДокументыДвижения
|ИЗ
| Справочник.Контрагенты
|ГДЕ
| ДокументыДвижения = Неопределено" );
// Неопределено - применяется когда нужно использовать пустое значение
// не принадлежащее ни к одному другому типу
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ПроверкаЗначенияНаСоответствиеСсылочномуТипуВЗапросе ()
// Выборка бухг.проводок, у которых регистратором является документ типа "ПоступлениеМатериалов"
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Регистратор,
| СчетДт,
| СчетКт,
| Сумма
|ИЗ
| РегистрБухгалтерии.Хозрасчетный
|ГДЕ
| Регистратор ССЫЛКА Документ.ПоступлениеМатериалов" );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ПроверкаЗначенияНаВхождениеВДиапазон ()
// Выборка материалов с весом от 3500 до 7500
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование,
| Вес
|ИЗ
| Справочник.Материалы
|ГДЕ
| Вес МЕЖДУ 3500 И 7500" );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ПроверкаЗначенияНаВхождениеВСписок ()
// Выборка материалов произведенных на Гомелькабель и Гомельстекло
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование,
| Производитель
|ИЗ
| Справочник.Материалы
|ГДЕ
| Производитель В (&Гомелькабель, &Гомельстекло)" ); // у оператора "В" есть вариант "В ИЕРАРХИИ" (в списке групп)
Запрос . УстановитьПараметр ( "Гомелькабель" , Справочники . Контрагенты . НайтиПоНаименованию ( "Гомелькабель" ));
Запрос . УстановитьПараметр ( "Гомельстекло" , Справочники . Контрагенты . НайтиПоНаименованию ( "Гомельстекло" ));
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ПроверкаВЗапросеНаОтсутствиеРеквизита ()
// Выборка контрагентов у которых нет реквизита "Резидентство"
// (понятно, что этими элементами будут только группы)
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование,
| Резидентство
|ИЗ
| Справочник.Контрагенты
|ГДЕ
| Резидентство ЕСТЬ NULL" );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ПроверкаВЗапросеИЗамена NULL НаДрЗначение ()
// Выборка контрагентов у которых нет реквизита "Резидентство"
// и вывод фразы "NULL", если "Резидентство" ЕСТЬ NULL
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование,
| ЕСТЬNULL(Резидентство, ""NULL"")
|ИЗ
| Справочник.Контрагенты" );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
// Функция запроса ЕстьNull обычно используется для избавления от значений типа Null
// для числовых полей запроса. В ряде случаев, например полного соединения
// двух таблиц функция ЕстьNull (ПараметрN1,ПараметрN2) может с успехом заменить
// конструкцию ВЫБОР КОГДА . ТОГДА ..ИНАЧЕ ….КОНЕЦ, когда для какого-либо поля
// значения NULL могут быть как в первой таблице, так и во второй
// такая конструкция позволяет получать не Null значение для поля.
//
// Но надо помнить, что в отличие от условного оператора ВЫБОР функция ЕстьNull
// приводит тип второго аргумента к типу первого аргумента, что нужно учитывать,
// если типы аргументов отличаются!
&НаСервере
Процедура ПолучениеПустойСсылкиВЗапросе ()
// Выборка контрагентов у которых есть реквизит "Резидентство" и он не заполнен
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование,
| Резидентство
|ИЗ
| Справочник.Контрагенты
|ГДЕ
| Резидентство = ЗНАЧЕНИЕ(Перечисление.Резидентство.ПустаяСсылка)" );
// Так же пишутся:
// ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
// ЗНАЧЕНИЕ(Документ.ПоступлениеМатериалов.ПустаяСсылка).
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура СравнениеВЗапросеСтрокиСШаблоном ()
// Выборка контрагентов которые содержат слова, начинающиеся на " Гомель"
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование
|ИЗ
| Справочник.Контрагенты
|ГДЕ
| Наименование ПОДОБНО ""%[ ][Г][о][м][е][л][ь]_%""" );
// Параметры строки шаблона:
// % - любое количество произвольных символов
// _ - один произвольный символ
// [] - любой одиночный символ, перечисленный внутри скобок
// [^] - любой одиночный символ, кроме тех, что внутри скобок после ^
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
Читайте также: