1с запрос где имеющие

Обновлено: 04.07.2024

Хорошо ли мы знаем синтаксис команд языка запросов 1С ?

Попробуйте расставить порядок выполнения операций в запросе:

Порядок выполнения операций очень важен для понимания оптимизации, влияет на результат запроса. Определим порядок выполнения операций с помощью одной только консоли запросов. Планы запросов, оптимизатор и прочее в этой статье не рассматриваются. Результаты в конце статьи. Дальше будут использоваться вспомогательные таблицы ТабПример1, ТабПример2. Обратите внимание на слово «Все» в ТабПример2. Чтобы проверить рассуждения, нужно копировать текст запроса временной таблицы и текст запроса выборки данных в консоль, выполнить запрос с полученным текстом. Результаты на файловых и серверных базах одинаковые.

Соединение таблиц VS. Проверка условия ГДЕ

Комментарий. Сначала выполняется Соединение таблиц. Об этом написано в учебниках SQL. Поэтому перед соединением необходимо тщательно подготовить таблицы: убрать «ненужные» записи, подключить индексы. Контрпример на сравнение очередности "Соединение таблиц" - "Проверка условия ГДЕ" пока не придумал.

Проверка условия ГДЕ VS. Расчет агрегатных функций без группировки

Результат: Поле1 = 1.5, Поле2 = 3.

Комментарий. Сначала выполняется Проверка "ГДЕ". Иначе был бы пустой результат.

Расчет агрегатных функций без группировки VS. Опции ПЕРВЫЕ <ХХ>– Упорядочить По.

Результат: Поле1 = 3.5, Поле2 = 7.

Комментарий. Сначала выполняется расчет агрегатных функций без группировки, затем команды ПЕРВЫЕ <ХХ>– Упорядочить По.

Группировка с расчетом агрегатных функций VS. опции ПЕРВЫЕ <ХХ>– Упорядочить По

Результат: Поле1 = 3.5, Поле2 = 7, Поле3 = 0.

Комментарий. Сначала выполняется группировка с расчетом агрегатных функции, затем команды ПЕРВЫЕ <ХХ>– Упорядочить По. Сразу после расчета агрегатных функций проверяется условие «Имеющие». Контрпример на сравнение очередности "Имеющие"-"Различные" пока не придумал.

Группировка с расчетом агрегатных функций VS. опция Различные

Результат: Поле1 = 2, Поле2 = 6.

Комментарий. Сначала выполняется Группировка с расчетом агрегатных функций. Конечно, применение в одном запросе этих операций бессмысленно.

опция Различные VS. опции ПЕРВЫЕ <ХХ>– Упорядочить По

Результат, строка 1: Поле1 = 1, Поле2 = 3, Поле3 = 0. Результат, строка 2: Поле1 = 1.5, Поле2 = 3, Поле3 = 0. Результат, строка 3: Поле1 = 2, Поле2 = 4, Поле3 = 0.

Комментарий. Сначала выполняется Опция "Различные", затем опции Первые <ХХ> -Упорядочить По. Если был бы другой порядок выполнения, то в результате получилось бы не три строки, а две.

Смотрите следующий запрос:

Результат, строка 1: Поле1 = 1, Поле2 = 3, Поле3 = 0. Результат, строка 2: Поле1 = 1, Поле2 = 3, Поле3 = 0. Результат, строка 3: Поле1 = 1.5, Поле2 = 3, Поле3 = 0.

Упорядочить По VS. ПЕРВЫЕ <ХХ>

Результат: Поле1 = 1,5, Поле2 = 3.

Комментарий. Сначала выполняется Упорядочить По. Смотрите следующий запрос.

Результат: Поле1 = 2, Поле2 = 4.

Вывод: операции SQL выполняются в последовательности

  1. Соединение
  2. Проверка условия "ГДЕ"
  3. Группировка с расчетом агрегатных функций
  4. Проверка условия «Имеющие»
  5. Опция Различные
  6. Опция Упорядочить по
  7. Опция Первые <ХХ>

Послесловие

Пока я писал статью, узнал, что упорядочивание может происходить по агрегатным функциям, что вычисление агрегатных функций без группировки существенно отличается от группировки с вычислением агрегатных функций. Спасибо всем, кто проявил интерес к теме, давал конструктивные комментарии. Мне подсказали, что аналогичная информация по SQL содержится

Порядок для SQL в общем, совпадает с 1С, хотя слова другие :-))

WITH CUBE или WITH ROLLUP

Специальные предложения

Electronic Software Distribution

Интеграция 1С с системой Меркурий

Алкогольная декларация

Готовые переносы данных

54-ФЗ

Управление проектом на Инфостарте

Траектория обучения 1С-разработчика

Да, спасибо, формирование виртуальных таблиц происходит еще раньше соединений. Есть мнение, что SQL делает так, как ему лучше будет (в соответствии со статистикой). Главное - чтобы результат был таким, какой требует пользователь. Не знаю, как сейчас, но раньше если во временную таблицу вытаскиваешь всю таблицу, а потом агрегируешь ее и берешь оттуда только количество значений, то запрос вообще не выполнялся (на мелкософт скуле по крайней мере). (5) starik-2005, ТормозИТ не зря в скобочках написал ЛОГИЧЕСКИ.
Не путайте логическое исполнение и физическое. В статье автор описывает логическое исполнение запросов.
  • составные типы (да, я до сих пор их люблю, хотя уже 2 года на 1С не пишу),
  • виртуальные таблицы
  • (expr1, exp2) В (ВЫБРАТЬ)
  • в иерархии
  • команды построителю и прочий наш сахер синтаксический
Статистикой пользуется анализатор запроса и на ее основе выбирает оптимальный план запроса, планы запроса надо читать для разных случаев Сначала выполняются команды ПЕРВЫЕ <ХХ>– Упорядочить По, затем агрегатные функции с группировкой
Ошибочно. Оператор TOP (ПЕРВЫЕ) выполняется последним (логически), а ORDER (УПОРЯДОЧИТЬ) предпоследним (логически). igo1; Chif13; igormiro; Dementor; JesteR; Yashazz; _also; awk; GorDAn; 1cWin; cool.vlad4; mrBart; Diversus; + 13 – Ответить (7) tormozit, ИМХО, автор имел ввиду, что топ и ордер выполняются сначала, а агрегирование - потом. Хотя. Понимать - вообще штука сложная. Может на форуме сделать кнопку "Вы уверены, что поняли текст, на который отвечаете. и хотите ответить именно так, как написали?" Какому-то школьнику за это дали вкусных плюшек. (8) В операторе УПОРЯДОЧИТЬ доступны псевдонимы (результаты) полей оператора ВЫБРАТЬ, в том числе выражений с агрегатными функциями, а также непосредственно в операторе УПОРЯДОЧИТЬ можно указывать выражения, содержащие агрегатные функции.
Результат будет 1, 37 . т.е. сначала произошло агрегирование и только потом TOP . понятно, что в целях оптимизации в реальности TOP может выполниться сначала. но говорить надо именно о логической последовательности выполнения. там же по ссылке
Note that the actual physical execution of the statement is determined by the query processor and the order may vary fr om this list.
автор был бы прав в случае если бы указал, что у меня на таком-то сервере, только в этом запросе, в данной таблице, сначала выполняется. и т.д. и то, как у него происходит сначала упорядочивание по агрегатному полю, а потом агрегация, непонятно. но мало ли. может оптимизировалось выполнение так запроса. (10) cool.vlad4, Скорее всего, Вы правы: топ на последнем месте. Проверю еще раз, изменю статью. Спасибо. (10) cool.vlad4, Вы не поверите, но об этом я говорил аж в (5). Но уметь читать - та еще наука. Некоторым проще писать ))) (16) starik-2005, ну да, ну да. человек , который пишет сначала
автор имел ввиду, что топ и ордер выполняются сначала, а агрегирование - потом.
но имеет ввиду противоположное, будет тут нас на форуме читать и писать учить. тебе на форум изучения букварей надо.
PS не надоело флудить? (18) starik-2005, по теме есть что возразить или будем все флудить и писать оффтопный бред? (16) starik-2005, это тот самый редкий случай , когда starik-2005 знает лучше , что имел в виду автор, нежели сам автор. см.
(10) cool.vlad4, Скорее всего, Вы правы: топ на последнем месте. Проверю еще раз, изменю статью. Спасибо.

Автор не ссылался на планы запросов, оптимизатор и прочее.
Значит в этой теме [возможно] глубоко не разбирался.
А то что он провел исследование и поделился результатами весьма неплохо.
К тому же в основном его выводы верны.

Порекомендуйте коллеге материал для изучения планов запросов, оптимизатора и прочее
и тогда он [возможно] перепишет статью более корректно.

(11) Makushimo, ты не поверишь, но есть БД у которых нет ни оптимизаторов, ни планов (12) Fox-trot, которые из тех,что использует 1С?
я не ерничаю, а правда кроме SQL ничего и не знаю. (13) Makushimo, пусть так, но это все равно не имеет никакого отношения к синтаксису (12) Fox-trot, оптимизатор запросов есть даже внутри платформы. А еще есть оптимизатор СКД, со своими блекджеками и ш***))) (22) qwinter, пусть так, но это все равно не имеет никакого отношения к синтаксису ) (23) Fox-trot, этот аргумент ничем не перекрыть :-)) ну просто уложил на обе лопатки.
красава.

Вот тут майкрософт дает хорошее пояснение:
FROM
ON
JOIN
WHERE
GROUP BY
WITH CUBE or WITH ROLLUP // этого в 1с нет
HAVING
SELECT
DISTINCT
ORDER BY
TOP

остается вопрос с "итоги . по . ", которые делаются 1сом программно, вероятно это происходит уже с результатом всех операций с БД

Статья не имеет никакого отношения к оптимизации и хайлоаду. Это теория программирования в чистом виде.

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

Иначе при выполнении

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

Фактически SQL первым делом стремится применить имеющиеся условия к исходным таблицам.

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

Войдите как ученик, чтобы получить доступ к материалам школы

Язык запросов 1С 8.3 для начинающих программистов: условия

Автор уроков и преподаватель школы: Владимир Милькин

Условия в запросах

Давайте напишем запрос, который запрашивает из таблицы Справочник.Еда наименование еды, её цвет, вкус и калорийность:

02

Секция ГДЕ

А теперь давайте сделаем, чтобы вернулась еда только жёлтого цвета. Делается это при помощи секции ГДЕ в которой необходимо задать условие отбора:

03

В нашем случае таким условием будет равенство реквизита Цвет (а вернее его свойства Наименование) строковому значению "Жёлтый" ( через ё ):

В результате запрос вернёт нам только строки с едой, у которой реквизит Цвет установлен в Жёлтый:

01

Таким образом, секция ГДЕ позволяет задать условия отбора данных из таблиц. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Если задана секция ГДЕ , то в запросе обрабатываются только те строки таблиц, для которых условие секции оказывается истинным.

Обратите внимание, что поля, которые участвуют в условии (в нашем случае поле Цвет) не обязаны входить в список выбираемых полей:

В данном случае реквизит Цвет участвует в условии (секция ГДЕ ), но не участвует в списке выбираемых полей (секция ВЫБРАТЬ ):

04

Условие отбора может определяться и как простое логическое выражение , и как более сложное , в котором простые логические выражения соединяются между собой логическими операторами И, ИЛИ, НЕ.

Для примера, давайте выберем еду, у которой цвет белый или калорийность больше 100:

05

Секция ИМЕЮЩИЕ

Если в запросе используется группировка (см. предыдущий урок) и мы хотим наложить условие на результаты группировки, секция ГДЕ не подойдёт. Вместо неё нужно использовать секцию ИМЕЮЩИЕ .

Давайте подсчитаем суммарную калорийность еды по цветам. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Для этого используем группировку по цвету и агрегатную функцию СУММА по калорийности:

А теперь наложим условие на результат группировки так, чтобы остались только цвета с суммарной калорийностью больше 100:

06

Таким образом, секция ИМЕЮЩИЕ позволяет накладывать условия на значения агрегатных функций при группировке.

Обратите внимание, что агрегатные функции, которые участвуют в условии (в нашем случае поле СУММА(Калорийность)) не обязаны входить в список выборки:

В данном случае агрегатная функция СУММА(Калорийность) участвует в условии (секция ИМЕЮЩИЕ), но не участвует в списке выборки (секция ВЫБРАТЬ):

Условие отбора секции ИМЕЮЩИЕ может также определяться и как простое логическое выражение , и как более сложное , в котором простые логические выражения соединяются между собой логическими операторами И, ИЛИ, НЕ.

Для примера, давайте выберем цвета, имеющие суммарную калорийность больше 200 И меньше 300:

Войдите как ученик, чтобы получить доступ к материалам школы

Язык запросов 1С 8.3 для начинающих программистов: соединения

Автор уроков и преподаватель школы: Владимир Милькин

Соединения в запросах

Соединение - одна из самых важных и нужных операций, выполняемых реляционными системами управления базами данных.

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

Для того, чтобы осознать необходимость соединений давайте решим следующую задачу.

У нас в базе есть справочник Клиенты:

01

И справочник Ассоциации:

03

Наша задача вывести любимые ассоциации клиентов, основываясь на цвете.

Таким образом для Наташи любимой ассоциацией будет трава, так как её любимый цвет зелёный. А для Петра - солнце. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.

Для Андрея вообще нет подходящей ассоциации, так его любимый цвет красный, а ассоциаций красного цвета в базе нет.

Будем решать задачу постепенно.

Сначала запросим всех клиентов и их любимые цвета :

04

Затем запросим все ассоциации и их цвета :

Теперь нам каким-то образом следует совместить первую и вторую таблицу. Чтобы это сделать запросим информацию сразу из двух таблиц. Для этого перечислим обе таблицы в секции ИЗ через запятую. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. А в секции ВЫБРАТЬ укажем поля из обеих таблиц:

Если мы попробуем выполнить этот запрос, то получим ошибку:

06

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

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

Таким образом полное название поля Наименование из таблицы Клиенты будет Справочник.Клиенты.Наименование.

А полное названия поля Наименование из таблицы Ассоциации будет Справочник.Ассоциации.Наименование.

Перекрёстное соединение

Перепишем предыдущий запрос с полными именами полей:

07

Только что мы произвели перекрёстное соединение двух таблиц. Обратите внимание на то, каким образом сформировался результат:

04

Внутреннее соединение

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

07

Чтобы получить эти записи добавим к предыдущему запросу секцию ГДЕ:

08

19

Это то, что нужно - мы решили, поставленную задачу!

В последнем запросе мы использовали перекрёстное соединение с дополнительным условием (в секции ГДЕ). Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Такое соединение называется внутренним .

Есть ещё один вариант написания того же самого внутреннего соединения :

08

Сравните этот и предыдущий запрос. Они совершенно одинаковы с точки зрения платформы, просто имеют разный синтаксис. И этот и предыдущий запросы содержат внутреннее соединение таблицы Клиенты с таблицей Ассоциации по полям ЛюбимыйЦвет и Цвет соответственно.

Левое внешнее соединение

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

Получается, что для Андрея с его красным цветом просто не нашлось пары из таблицы ассоциаций.

Перепишем запрос так, чтобы в результат попадали в том числе те записи из первой таблицы, для которых не нашлось ни одной пары из второй таблицы (в данном случае Андрей):

09

Такое соединение называется левым внешним соединением (слово внешнее можно опускать для простоты).

Р езультат левого внешнего соединения представляет из себя: все записи из внутреннего соединения ПЛЮС все записи из первой таблицы , не попавшие во внутреннее соединение (для которых не нашлось пары).

10

20

Правое внешнее соединение

Но давайте снова вернёмся к внутреннему соединению:

08

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

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

11

Такое соединение называется правым внешним соединением (слово внешнее можно опускать для простоты).

Результат правого внешнего соединения представляет из себя: все записи из внутреннего соединения ПЛЮС все записи из второй таблицы , не попавшие во внутреннее соединение (для которых не нашлось пары).

10

Image 7

Полное соединение

А что если нам нужно, чтобы в результат запроса попадали помимо внутреннего соединения Андрей и Снег одновременно?

Для этого потребуется совместить результаты левого и правого соединений. Такой вид соединения уже придуман и называется полным соединением:

12

Результат полного соединения представляет из себя: все записи из внутреннего соединения ПЛЮС все записи из первой таблицы, не попавшие во внутреннее соединение (для которых не нашлось пары) ПЛЮС все записи из второй таблицы, не попавшие во внутреннее соединение (для которых не нашлось пары).

10

21

Псевдонимы таблиц

Согласитесь, что все запросы, которые мы писали в этом уроке выглядят довольно громоздко. Это связано с тем, что мы вынуждены указывать полные имена полей, чтобы избежать возникновение неоднозначности.

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

Давайте перепишем последний запрос так, чтобы при формировании полных имён полей вместо Справочник.Клиенты можно было использовать псевдоним К, а вместо Справочник.Ассоциации - псевдоним А:

А чтобы результат запроса был ещё нагляднее добавим псевдонимы полей, которые мы уже рассматривали на одном из прошлых уроков:

13

Обработка NULL

Присмотритесь к результатам последнего запроса (как впрочем и многих предыдущих на этом уроке).

Чему равны значения полей Ассоциация и ЕёЦвет для первой строчки? А что вы скажете насчет полей Клиент и ЕгоЦвет для последней строки?

Они равны NULL, которое как мы уже знаем означает отсутствие какого либо значения:

13

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

Поэтому обязательной считается обработка значений NULL всегда, когда они могут возникнуть.

Под обработкой подразумевается то, что мы должны сказать в нашем запросе, что если одно из полей будет равно NULL, то в это поле следует подставить какое-то другое значение.

В данном случае для полей Клиент и Ассоциация в случае обнаружения NULL мы будем подставлять пустую строку "".

А вот поля ЕгоЦвет и ЕёЦвет являются ссылками на элементы справочника Цвета, поэтому в них можно подставлять только значения являющиеся ссылками указанных типов. Каждый ссылочный тип (например, Справочник или Документ) имеет предопределенный элемент ПустаяСсылка. Чтобы указать его значение в запросе воспользуемся функцией ЗНАЧЕНИЕ.

Для определения того, что в поле попало NULL будем использовать уже знакомую нам по прошлым урокам функцию ЕСТЬNULL:

14

С виду (из консоли запросов) результат не изменился. Мы по-прежнему видим пустые поля. Но это только потому, что строковые представления у NULL и у пустых полей всех типов совпадают и равны пустой строке.

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

Запомните пустое значение и отсутствие значение - это две большие разницы.

Соединение более двух таблиц

Можно последовательно соединять сколько угодно таблиц.

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

Для этого последовательно соединим по цвету таблицу Клиенты с таблицей Ассоциации, а затем (получившийся результат) с таблицей Еда:

Войдите как ученик, чтобы получить доступ к материалам школы

Язык запросов 1С 8.3 для начинающих программистов: функции и операторы для работы с типами (ТИПЗНАЧЕНИЯ, ТИП, ССЫЛКА, ЕСТЬNULL, ВЫРАЗИТЬ)

Автор уроков и преподаватель школы: Владимир Милькин

Давайте вспомним, что каждый реквизит (свойство, поле) справочника, документа или любого другого прикладного объекта имеет свой тип . И этот тип мы можем посмотреть в конфигураторе:

01

В языке запросов существует целый класс функций и операторов для работы с типами реквизитов. Давайте рассмотрим их.

Функция ТИПЗНАЧЕНИЯ

Эта функция принимает один параметр (значение) и возвращает его тип. Для описанного на картинке (выше) реквизита Вкус справочника Еда вернётся следующее:

02

Если мы запросим тип поля Наименование, то, как и ожидается, получим Строка:

А теперь давайте рассмотрим реквизит ОтличительныйПризнак у справочника Города:

04

Вы видите, что этот реквизит может иметь один из нескольких типов: Строка, Справочник.Вкусы, Справочник.Цвета. Такой тип реквизитов называется СОСТАВНЫМ .

Если мы попытаемся заполнить значение такого реквизита в режиме 1С:Предприятие, то система спросит нас, какого типа будет вводимое значение:

05

И только после нашего выбора позволит ввести значение выбранного типа.

Таким образом, элементы справочника одного вида (Справочник.Города) смогут хранить в одном и том же реквизите (ОтличительныйПризнак) значения разных типов (Строка, Цвета или Вкусы).

Вы можете убедиться в этом сами пощёлкав по элементам справочника Города в режиме 1С:Предприятие. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.

Здесь значение отличительного признака является элементом справочника Вкусы:

06

07

А здесь вообще элементом справочника Цвета:

09

Вот какие возможности открывает перед нами составной тип данных!

Интересно, как поведёт себя функция ТИПЗНАЧЕНИЯ на реквизите ОтличительныйПризнак, имеющий составной тип данных:

Это уже очень интересно. Давайте разбираться с каждой строкой в отдельности.

Тип значения отличительного признака для элемента Россия равен NULL. Мы впервые сталкиваемся с этим типом. Значения данного типа используются исключительно для определения отсутствующего значения при работе с базой данных.

Так и есть, ведь элемент Россия является группой, а не обычным элементом справочника Города, поэтому у него отсутствует поле ОтличительныйПризнак. А тип у отсутствующего значения, как мы прочитали выше, всегда равен NULL.

Тип значения отличительного признака для Перми равен Вкусы. Так и есть, ведь значение отличительного признака забитое в базе для города Пермь является ссылкой на элемент справочника Вкусы.

Для Красноярска тип признака равен Цвета, потому что значение выбранное в базе является ссылкой на элемент справочника Цвета.

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

Индия снова группа, поэтому значение отсутствует. А тип у отсутствующего значения, как мы помним, равен NULL.

Далее всё аналогично, кроме Сан-Паулу. Это не группа, а обычный элемент справочника (город), но тип его значения пустой. Как так?

А дело вот в чём. Если вы зайдёте в элемент справочника Города с наименованием Сан-Паулу, то увидите, что поле ОтличительныйПризнак совершенно никак не заполнено. Оно пустое. А все незаполненные поля составного типа имеют специальное значение НЕОПРЕДЕЛЕНО .

С НЕОПРЕДЕЛЕНО мы также сталкиваемся впервые.

Значение НЕОПРЕДЕЛЕНО применяется, когда необходимо использовать пустое значение, не принадлежащее ни к одному другому типу. Это как раз наша ситуация.

А тип для значения, которое не принадлежит ни к одному из типов, как вы уже наверное догадались отсутствует.

Функция ТИП

Она принимает всего один параметр - имя примитивного типа (СТРОКА, ЧИСЛО, ДАТА, БУЛЕВО), либо имя таблицы, тип ссылки которой нужно получить.

Результатом данной конструкции будет значение типа Тип для указанного типа.

Звучит туманно, не правда ли?

Давайте рассмотрим применение данной конструкции и всё сразу станет на свои места.

Пусть нам требуется отобрать все записи справочника Города, у которых составной реквизит ОтличительныйПризнак имеет значение типа СТРОКА:

01

Теперь давайте отберём все записи, у которых значения реквизита ОтличительныйПризнак являются ссылками на элементы справочника Цвета (таблица Справочник.Цвета):

02

Отступление

Как вы помните, некоторые элементы справочника Города не имеют реквизита ОтличительныйПризнак. Функция ТИПЗНАЧЕНИЯ для таких элементов выдаёт NULL.

Как можно сделать отбор таких элементов в запросе? Для этого предусмотрен специальный логический оператор ЕСТЬ NULL (не путать с функцией ЕСТЬNULL, которую мы рассмотрим ниже). Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.

Вот пример его использования:

03

Но есть и такие элементы (Сан-Паулу), у которых реквизит ОтличительныйПризнак (составного типа) просто не заполнен и равен специальному значению НЕОПРЕДЕЛЕНО.

Чтобы отобрать такие записи следует использовать другую конструкцию:

Но сравнение с НЕОПРЕДЕЛЕНО для определения пустых (не заполненных) реквизитов будет работать только для составных типов.

Кстати, у логического оператора ЕСТЬ NULL форма отрицания выглядит следующим образом:

Логический оператор ССЫЛКА

Оператор ССЫЛКА позволяет проверить, является ли значение выражения, указанного слева от него, ссылкой на таблицу , указанную справа.

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

05

Как вы помните, эту же задачу мы могли бы решить используя ТИПЗНАЧЕНИЯ и ТИП:

Функция ЕСТЬNULL

Функция предназначена для замены значения NULL на другое значение.

Мы помним, что значение NULL возвращается в том случае, если запрашиваемый реквизит (поле, свойство) не существует.

Как например, реквизит ОтличительныйПризнак для групп справочника Города:

06

Функция ЕСТЬNULL поможет нам вывести другое значение в том случае, если это значение равно NULL. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Пусть в данном случае это будет строка "Такого реквизита нет!":

08

Получается, что если первый параметр функции ЕСТЬNULL не равен NULL, то возвращается он. Если же он равен NULL, то возвращается второй параметр.

Функция ВЫРАЗИТЬ

Эта функция предназначена только для полей , имеющих составной тип . Отличным примером такого поля является свойство ОтличительныйПризнак у элементов справочника Города.

Как мы помним, составные поля могут быть одного из нескольких типов, указанных в конфигураторе.

Для поля ОтличительныйПризнак такими допустимыми типами являются СТРОКА, Справочник.Цвета и Справочник.Вкусы.

Иногда возникает необходимость привести значения составного поля к какому-либо определенному типу.

Давайте приведём все значения поля ОтличительныйПризнак к типу Справочник.Цвета:

09

В результате, все значения элементов, которые имели тип Справочник.Цвета, остались заполненными и оказались приведенными к указанному типу. Все значения других типов (СТРОКА, Справочник.Вкусы) теперь стали равны NULL. В этом состоит особенность приведения типа при помощи функции ВЫРАЗИТЬ.

Приводить тип можно или к примитивному типу (БУЛЕВО, ЧИСЛО, СТРОКА, ДАТА) или к ссылочному типу. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Но тип, к которому делается приведение, обязательно должен входить в список типов для данного составного поля, иначе система выдаст ошибку.

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