1с тип регистратора в запросе 1с

Обновлено: 04.07.2024

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

Приведет к неявному соединению с таблицей справочника Номенклатура, а реальный запрос, который будет выполняться к базе будет аналогичен этому:

ВЫБРАТЬ
СпрНоменклатура.Артикул ,
ЗаказыКлиентовОстатки.ЗаказаноОстаток
ИЗ
РегистрНакопления.ЗаказыКлиентов.Остатки КАК ЗаказыКлиентовОстатки
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура
ПО ЗаказыКлиентовОстатки.Номенклатура = СпрНоменклатура.Ссылка

На первый взгляд все корректно и правильно, но как система поведет себя, когда разыменовывается поле составного типа? Система будет соединяться СО ВСЕМИ таблицами, входящими в составной тип! Т.е. запрос

ВЫБРАТЬ
ЦеныНоменклатурыПоставщиков.Регистратор.Номер ,
ЦеныНоменклатурыПоставщиков.Цена
ИЗ
РегистрСведений.ЦеныНоменклатурыПоставщиков КАК ЦеныНоменклатурыПоставщиков

будет преобразован во что-то вроде:

И ко всей этой конструкции будут добавлены ограничения на уровне записей (RLS), если они используются. Все это может существенно замедлить выполнение запроса.

Иногда при написании запроса известно какая ссылка будет находиться в поле составного типа. В этом случае правильно привести составной тип к одному необходимому и избежать соединения со всеми таблицами составного типа. Для приведения составного типа к какому-то одному используется оператор

Параметр <Выражение> можно привести к ссылочному типу или к одному из примитивных типов.

Если <Выражение> содержит в составном типе требуемый <Тип значения> , то приведение типа считается осуществимым, и для каждого значения указанного типа результатом будет это самое значение. Для значений других типов результатом приведения типа будет значение NULL.

Если <Выражение> не содержит в составном типе требуемый <Тип значения> , то выполнение данного запроса завершится ошибкой.

Пример использования оператора Выразить, когда известно какая ссылка будет находиться в поле составного типа:

ВЫБРАТЬ
ВЫРАЗИТЬ (ЦеныНоменклатурыПоставщиков.Регистратор КАК Документ.ЗаказПоставщику).Номер КАК Номер,
ЦеныНоменклатурыПоставщиков.Цена
ИЗ
РегистрСведений.ЦеныНоменклатурыПоставщиков КАК ЦеныНоменклатурыПоставщиков
ГДЕ
ЦеныНоменклатурыПоставщиков.Регистратор ССЫЛКА Документ.ЗаказПоставщику

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

Остались вопросы?
Спросите в комментариях к статье.


Отбор записей в запросе по определенному значению (реквизиту) в 1С 8.3:

&НаСервере
Процедура ОтборЗаписейВЗапросеПоОпределенномуЗначениюРеквизиту ()

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

РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;

Отбор записей в запросе по определенному значению (бух.счету) в 1С 8.3:

&НаСервере
Процедура ОтборЗаписейВЗапросеПоОпределенномуЗначениюБухСчету ()

// Выборка проводок с суммами и количеством по дебету бухгалтерского счёта 01.01,
// через обращение по предопределенному имени "ОсновныеСредстваВОрганизации"
Запрос = Новый Запрос ( "ВЫБРАТЬ
| СчетДт,
| СчетКт,
| Количество,
| Сумма
|ИЗ
| РегистрБухгалтерии.Хозрасчетный
|ГДЕ
| СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ОсновныеСредстваВОрганизации)" );

РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;

&НаСервере
Процедура ОпределениеПеременойТипаДатаВЗапросе ()

// Указывать дату можно прямо в запросе или передавать через параметр
Запрос = Новый Запрос ( "ВЫБРАТЬ
| ДАТАВРЕМЯ(2020, 05, 30, 23, 00, 00) КАК ДоНачалаЛетаОсталсяОдинЧас" );

РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;

&НаСервере
Процедура ФункцииДляРаботыСДатамиВЗапросе ()

Запрос . УстановитьПараметр ( "ВыбраннаяДата" , '20200607' );

РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;

&НаСервере
Процедура ИспользованиеОператораВЫБОРвЗапросе ()

// Выборка материалов с добавлением поля "ОписаниеПлотности" для новой градации
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование,
| Плотность,
| ВЫБОР
| КОГДА Плотность 2 ТОГДА
| ""Средняя плотность""
| ИНАЧЕ
| ""Очень плотный материал""
|
| КОНЕЦ КАК ОписаниеПлотности
| ИЗ
| Справочник.Материалы" );

РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;

Использование значения Неопределено в запросе в 1С 8.3:

&НаСервере
Процедура ИспользованиеЗначенияНеопределеноВЗапросе ()

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

РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;

Проверка значения на соответствие ссылочному типу в запросе в 1С 8.3:

&НаСервере
Процедура ПроверкаЗначенияНаСоответствиеСсылочномуТипуВЗапросе ()

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

РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;

Проверка значения на вхождение в диапазон (включительно) в 1С 8.3:

&НаСервере
Процедура ПроверкаЗначенияНаВхождениеВДиапазон ()

// Выборка материалов с весом от 3500 до 7500
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование,
| Вес
|ИЗ
| Справочник.Материалы
|ГДЕ
| Вес МЕЖДУ 3500 И 7500" );

РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;

&НаСервере
Процедура ПроверкаЗначенияНаВхождениеВСписок ()

// Выборка материалов произведенных на Гомелькабель и Гомельстекло
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование,
| Производитель
|ИЗ
| Справочник.Материалы
|ГДЕ
| Производитель В (&Гомелькабель, &Гомельстекло)" ); // у оператора "В" есть вариант "В ИЕРАРХИИ" (в списке групп)

Запрос . УстановитьПараметр ( "Гомелькабель" , Справочники . Контрагенты . НайтиПоНаименованию ( "Гомелькабель" ));
Запрос . УстановитьПараметр ( "Гомельстекло" , Справочники . Контрагенты . НайтиПоНаименованию ( "Гомельстекло" ));

РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;

Проверка в запросе на отсутствие реквизита (значение NULL) в 1С 8.3:

&НаСервере
Процедура ПроверкаВЗапросеНаОтсутствиеРеквизита ()

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

РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;

Проверка в запросе и замена NULL на другое значение в 1С 8.3:

&НаСервере
Процедура ПроверкаВЗапросеИЗамена NULL НаДрЗначение ()

// Выборка контрагентов у которых нет реквизита "Резидентство"
// и вывод фразы "NULL", если "Резидентство" ЕСТЬ NULL
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование,
| ЕСТЬNULL(Резидентство, ""NULL"")
|ИЗ
| Справочник.Контрагенты" );

РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;

// Функция запроса ЕстьNull обычно используется для избавления от значений типа Null
// для числовых полей запроса. В ряде случаев, например полного соединения
// двух таблиц функция ЕстьNull (ПараметрN1,ПараметрN2) может с успехом заменить
// конструкцию ВЫБОР КОГДА . ТОГДА ..ИНАЧЕ ….КОНЕЦ, когда для какого-либо поля
// значения NULL могут быть как в первой таблице, так и во второй
// такая конструкция позволяет получать не Null значение для поля.

//
// Но надо помнить, что в отличие от условного оператора ВЫБОР функция ЕстьNull
// приводит тип второго аргумента к типу первого аргумента, что нужно учитывать,
// если типы аргументов отличаются!

&НаСервере
Процедура ПолучениеПустойСсылкиВЗапросе ()

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

// Так же пишутся:
// ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
// ЗНАЧЕНИЕ(Документ.ПоступлениеМатериалов.ПустаяСсылка).

РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;

&НаСервере
Процедура СравнениеВЗапросеСтрокиСШаблоном ()

// Выборка контрагентов которые содержат слова, начинающиеся на " Гомель"
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование
|ИЗ
| Справочник.Контрагенты
|ГДЕ
| Наименование ПОДОБНО ""%[ ][Г][о][м][е][л][ь]_%""" );

// Параметры строки шаблона:
// % - любое количество произвольных символов
// _ - один произвольный символ
// [] - любой одиночный символ, перечисленный внутри скобок
// [^] - любой одиночный символ, кроме тех, что внутри скобок после ^

РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;

Читайте также: