Виразити як число у запиті 1с. Перетворення складового типу до одиночного

Несумісні типи «ВИРАЗИТИ»— таке повідомлення з'являється, коли програміст 1С 8.2 або 8.3 намагається порівняти два різних типу.

Функція Виразити() дозволяє привести значення поля запиту 1С до певного типу. Це може знадобитися у двох випадках:

1. Отримати необхідну розрядність чи кількість потрібну кількість символів рядкового значення. Кількість символів полів необмеженого типу доводиться обмежити через певні особливості.

Отримайте 267 відеоуроків з 1С безкоштовно:

Наприклад:

ВИРАЗИТИ(Номенклатура.Коментар ЯК РЯДКУ(300))
ВИРАЗИТИ(Номенклатура.Ціна ЯК ЧИСЛО(15, 2)) ЯК Сума

2. Перетворити поле складеного типу на поле з одним типом. Це може знадобитися з метою. Якщо в типізоване поле потрапить значення іншого типу, система поверне NULL, тому завжди необхідно додатково встановлювати умову в секції «ДЕ», обмежуючи його оператором ПОСИЛАННЯ.

Наприклад:

ВИБРАТИ

ВИРАЗИТИ(Продажи.Реєстратор ЯК Документ.Реалізація)

З

ДЕ Продажі.Реєстратор ПОСИЛАННЯ Документ.Реалізація

Як уникнути помилок

Помилки типу «Несумісні типи ВИРАЗИТИ …» можуть виникати при неправильному використанні синтаксису.

Наприклад, конструкція «ВИРАЗИТИ(«123» ЯК ЧИСЛО(5, 2)) ЯК Сума» вважається помилковою, оскільки у запиті не можна штатними методами перетворювати з одного типу на інший.

Якщо Ви починаєте вивчати програмування 1С, рекомендуємо наш безкоштовний курс(не забудьте

Тож почнемо. Запит - це спеціальний об'єкт у 1С 8.2, який використовується для формування та виконання запитів до таблиць бази даних у системі. Для виконання запиту необхідно скласти текст запиту, в якому описується які таблиці будуть використовуватися як джерела даних запиту, які потрібно вибрати поля, які застосувати сортування і групування і т.д. Докладніше про запити можна прочитати у книзі "1С 8.2 Посібнику розробника". Мова запитів 1С 8.2 дуже схожа синтаксисом на інші SQL мови запитів баз даних, але є й відмінності. З основних переваг вбудованої мови запитів варто відзначити розіменування полів, наявність віртуальних таблиць, зручна роботаз підсумками та нетипізовані поля у запитах. З недоліків - як вихідного поля не можна використовувати запит, не можна використовувати процедури, що зберігаються, не можна перетворити рядок в число.

1.Для підвищення читабельності запиту та зменшення кількості параметрів запиту можна у запиті застосовувати звернення до зумовлених даних конфігурації за допомогою літералу ЗНАЧЕННЯ (ПОДАННЯ ЗНАЧЕННЯ).Як подання значень можуть використовуватися значення перерахувань, зумовлені дані довідників, планів видів розрахунку, планів видів характеристик, планів рахунків, порожні посилання, значення точок маршруту, значення системних перерахувань (наприклад, ВидРуху Накопичення, ВидРахунку).

ДЕ Місто = ЗНАЧЕННЯ(Довідник.Міста.Москва)

ДЕ Місто = ЗНАЧЕННЯ(Довідник.Міста.ПустаПосилання)

ДЕ ТипТовара = ЗНАЧЕННЯ(Перерахування.ВидиТоварів.Послуга)

ДЕ ВІДРУХУ = ЗНАЧЕННЯ

ДЕ ТочкаМаршруту =

ЗНАЧЕННЯ(БізнесПроцес.Узгодження.ТочкаМаршруту.Згода)

Вираз у дужках завжди починається зі слова в однині(Довідник, Перерахування і т.д.), що відповідає типу зумовленого значення.

2.Автоупорядкування у запиті може сильно гальмувати процес. Якщо сортування не потрібне, краще взагалі його не використовувати. У багатьох випадках ефективніше записати сортування через ключове слово ВПОРЯДКУВАТИ ЗА.

3.Потрібно стежити, щоб під час використання псевдонімів не з'явилося неоднозначне поле. Інакше система не зрозуміє якого об'єкта треба звертатися.

Приклад запиту з неоднозначним полем:

ВИБРАТИ

ЗалишкиТоварівЗалишки.КількістьЗалишок

Довідник Номенклатура ЯК Номенклатура

ЛІВОЕ З'ЄДНАННЯ РегістрНакопичення. Залишки Товарів.

ПО ЗалишкиТоварівЗалишки.Номенклатура = Номенклатура.Посилання

Потрібно виправити псевдонім таблиці, наприклад, так: "Довідник.Номенклатура ЯК Номенклатура1", а "Номенклатура.Посилання" відповідно виправити на "Номенклатура1.Посилання".

4. Іноді корисно отримувати подання посилальних полів за допомогою ключового слова ПРЕДСТАВЛЕННЯпоряд із посиланням для того, щоб не було повторного звернення до бази даних. Це корисно при виведенні результату запиту до таблиці.

ВИБРАТИ

ПОДАННЯ(Документ.Контрагент) ЯК Одержувач,

ПОДАННЯ(Документ.Підстава)

Документ.ВидатковаНакладна ЯК Документ

5.Використання у запиті ВИРАЗИТИ(Поле ЯК Тип)дозволяє забрати зайві таблиці зі з'єднання з полем складеного типу даних. Тим самим прискорити виконання запиту.

Приклад (реєстратор - поле зі складовим типом для фізичної таблиці реєстранакопіювання ЗалишкиТоварів, у запиті вибираються Дата та Номер документів НадходженняТоварів, при цьому при зверненні до реквізитів документа Дата і Номер через Реєстратор не відбувається множинного з'єднання таблиці регістра з таблицями документів, які є реєстраторами для регістра ):

ВИБРАТИ РІЗНІ
ВИРАЗИТИ(ЗалишкиТоварів.Реєстратор ЯК Документ.НадходженняТоварів).Номер ЯК НОМЕРУДАННЯ,

ВИРАЗИТИ(ЗалишкиТоваров.Реєстратор ЯК Документ.НадходженняТоварів).Дата ЯК ДАТАПОСТУПЛЕННЯ

З
РегістрНакопичення. Залишки Товарів ЯК Залишки Товарів
ДЕ
(ВИРАЗИТИ(ЗалишкиТоварів.Реєстратор ЯК Документ.НадходженняТоварів) Є НЕ NULL)

6.Коли у конфігурації 1С є користувачі, у яких права обмежені певні об'єкти конфігурації, у запиті до таких об'єктів необхідно використовувати ключове слово ДОЗВОЛЕНІ, щоб запит виконався без помилки (Вибрати Дозволені...)

7.При об'єднанні таблиць, що містять вкладені таблиці (наприклад, Документ з табличною частиною) буває корисне ключове слово ПОРОЖНЯколи, наприклад, в одному з документів немає табличної частини.

ОБ'ЄДНАТИ ВСЕ

З Документ.ВидатковаНакладна

8.При роботі зі з'єднаннями таблиць, що містять по одному рядку, потрібно склеїти рядки таблиць (при цьому в обох таблицях немає такого поля, по якому їх можна було з'єднати). Цього можна досягти, застосувавши конструкцію « ПОВНЕ З'ЄДНАННЯ Таблиця ПО ІСТИНА». Якщо в таблицях більше одного рядка, то в результаті буде кількість рядків, що дорівнює добутку кількості рядків обох таблиць. Якщо в одній таблиці Про рядків, то в результуючій таблиці кількість рядків дорівнюватиме кількості рядків другої таблиці. Також для з'єднання таких таблиць можна застосовувати декартово добуток таблиць, при якому в результуючій таблиці будуть зустрічатися всі комбінації рядків з обох таблиць. Треба пам'ятати, що якщо в одній із таблиць 0 рядків, тоді і декартове твір буде 0, тому повне з'єднання буде кращим. Взагалі замість повного з'єднання ПО ІСТИНАможна використовувати і будь-який інший тип з'єднання, але в такому випадку також можлива ситуація, коли в результуючій таблиці буде 0 рядків, навіть якщо в одній з таблиць буде ненульова кількість рядків. У разі повного з'єднання така ситуація буде тільки в одному випадку, якщо кількість рядків в обох таблицях дорівнює 0. Якщо знати, що в таблиці є хоча б один рядок, тоді можна використовувати і ЛІВОЕ З'ЄДНАННЯз іншою таблицею з умовою ПО ІСТИНА.

Приклад (щоправда надуманий, для Повного з'єднання):

ВИБРАТИ

К.Контрагент

Перелік.Пол ЯК Підлога

ПОВНЕ З'ЄДНАННЯ (Вибрати Перші 1 Д.Контрагент З Документ.РеалізаціяТоварів ЯК Д Упорядкувати За Д.МоментЧасом) ЯК К

ПО (ІСТИНА)

9. Для того щоб отримати унікальні записи по якомусь полю, правильніше замість групування користуватися ключовим словом РІЗНІу запиті, тому що така конструкція набагато наочніша і ключове слово ЗГРУПУВАТИ ПОмає ширше застосування і часто використовується, якщо додатково треба розрахувати агрегатні функції угруповань. У деяких випадках необхідно вивести обмежену кількість рядків. Для цього в описі запиту слід вказати ключове слово в описі запиту ПЕРШІі після нього – необхідна кількість рядків.

Приклад для ПЕРШІ:

Вибрати Перші 5

Довідник.Номенклатура.Найменування,

Довідник.Номенклатура.ЗакупівельнаЦіна

Впорядкувати за

Довідник.Номенклатура.ЗакупівельнаЦіна

Приклад для РІЗНІ:

Вибрати Різні

Документ.Видаткова.Контрагент

10. Агрегатні функції у запиті можна використовувати без ключового слова ЗГРУПУВАТИ. У такому разі всі результати будуть згруповані в один рядок.

Вибрати

Сума(Накладна.Сума) Як Сума

Документ.ВитратнаНакладна.Склад Як Накладна

11.У запитах у полях вибірки можна вільно звертатися до реквізитів полів вибірки. Ця можливість називається розіменуванням полів вибірки. Якщо джерело даних - вкладена таблиця (таблична частина документа), то в полях вибірки можна звертатися також до полів основної таблиці (наприклад, через поле Посилання звернутися до поля основної таблиці Контрагент)

ВИБРАТИ


НадходженняТоварівІПослугТовари.Кількість ЯК Кількість,
НадходженняТоварівІПослугТовари.Посилання.Контрагент
З

ДЕ
НадходженняТоварівІПослугТовари.Посилання = Посилання

Є одна особливість використання розіменування полів, якщо у запиті є угруповання. У будь-яких запитах із групуваннями у списках полів запиту можна вільно звертатися до реквізитів групувальних полів.

ВИБРАТИ

НадходженняТоварівІПослугТовари.Номенклатура,

НадходженняТоварівІПослугТовари.Номенклатура.Код,

СУМА(НадходженняТоварівІПослугТовари.Кількість) ЯК Кількість,

Документ.Надходження ТоварівІПослуг.Товари ЯК НадходженняТоварівІПослугТовари

ЗГРУПУВАТИ ПО

НадходженняТоварівІПослугТовари.Номенклатура,

У довідці 1С написано, що за наявності угруповання, у полях вибірки запиту можуть брати участь лише групувальні поля та агрегатні функції поля вибірки. Є винятковий випадок, коли агрегатні функції застосовані до полів вкладеної таблиці. У цьому випадку у списку полів вибірки можливі звернення до полів таблиці верхнього рівня без групування результатів по цих полях.

ВИБРАТИ

НадходженняТоварівІПослуг.Товари.(СУМА(Кількість),Номенклатура),

Надходження ТоварівІПослуг.Контрагент

Документ.Надходження ТоварівІПослуг ЯК ВступТоварівІПослуг

ЗГРУПУВАТИ ПО

НадходженняТоварівІПослуг.Товари.(Номенклатура)

12. Іноді замість вказівки будь-якого поля в групуванні корисно в поля вибірки запиту увімкнути параметр:

ВИБРАТИ
ДокТовари.Номенклатура,
&Контрагент,
&Період,
СУМА(ДокТовари.Кількість * ДокТовари.К) ЯК Кількість,
СУМА(ДокТовари.Сума) ЯК Сума
З
Документ.Приходная.Товари ЯК ДокТовари
ДЕ
ДокТовари.Посилання = &Посилання

ЗГРУПУВАТИ ПО
ДокТовари.Номенклатура

А потім встановити параметр у тексті запиту:

Запит.ВстановитиПараметр(«&Контрагент», ВибКонтрагент);

Запит.ВстановитиПараметр(«&Період», Дата);

13. В універсальних запитах параметри можна використовувати в описі джерел даних запиту, в умовах ДЕ,в умовах з'єднання таблиць та параметрах віртуальних таблиць. Існує два прийоми для створення універсальних запитів:

А) за допомогою механізму конкатенації рядків, додаючи до тексту запиту змінні;

ТипУпорядкування = ?(НЕЯКА ЗМІННА,"","УБУВ");

Запит.Текст = "Вибрати... Упорядкувати ПЗ Поле1" + ТипУпорядкування + "...";

Запит.Текст = "Вибрати Поле1...";

Якщо НЕЯКА ЗМІННА = 1 Тоді

Запит.Текст = Запит.Текст + "Поле2 ...";

КінецьЯкщо;

Б)використовувати параметри різних частинахзапиту (наприклад, у секції джерел даних запиту), а потім метод вбудованої мови - СТРЗАМІНИТЬ().При проектуванні універсальних запитів корисним є звернення до властивості об'єктів. МЕТАДАНІ(), за допомогою якого можна визначити назву таблиці для якогось посилання (наприклад, для документа буде приблизно так - Посилання . МЕТАДАНІ().ІМ'Я), переданої через параметр в якусь універсальну процедуру.

Вибрати

ДокТЧ.Номенклатура,

&ДокТЧ ЯК ДокТЧ

А потім встановити параметр у тексті запиту

Запит.Текст = СтрЗаменить(Запрос.Текст, "&ДекТЧ", "Документ."+Посилання.Метадані().Ім'я+".Товари");

Параметри можна використовувати в умовах запиту, щоб увімкнути опціональну умову &Параметр АБО НЕ Яка Властивість:

Запит.ВстановитиПараметр("&Параметр", "Контрагент.Найменування=""Іванов""));

За допомогою літералу ІСТИНАможна прибирати певні фільтри у запиті

Запит.ВстановитиПараметр(«&Параметр»,Істина);

14.Дуже корисними у конструкторі запитів є команда контекстного меню таблиці - " Перейменувати таблицю...", за допомогою якого можна вигадати деяке узагальнене ім'я для джерела даних. Для створення запитів до однотипних таблиць, схожих по структурі, буває корисним для другої таблиці скопіювати текст запиту першої таблиці, зайти у вікно конструктора запитів і в контекстному меню таблиці вибрати пункт - Замінити таблицю...та вибрати другу таліцю.

15.Під час роботи зі створенням вкладених запитів у секціях умов чи параметрів віртуальних таблиць конструктора запитів використовується прийом виділення пробілу в дужках, тоді з'являється у контекстному меню пункт «Конструктор запиту», а за редагування вкладеного запиту умови виділяють весь запит у дужках.

Приклад вкладеного запиту:

Товар (Вибрати Номенклатура...)

16. При проектуванні звітів СКД у запитах до регістрів залишків - як параметр Період зручніше і правильніше використовувати вираз ДодатиКДате(КінецьПеріоду(Період,ДЕНЬ),СЕКУДИ,1), так як залишки у віртуальних виходять на початок періоду, не включаючи останню секунду. Прийом +1 секунда не може бути застосований з документами: за новою методикою проведення документів залишки по регістру треба отримувати на Період, заданий об'єктом. на час документа (а чи не на дату документа!). При аналізі оборотів чи даних у період зручно додавати параметр із типом Стандартний період(У цьому випадку не треба наводити останню дату інтервалу на кінець дня). У стандартного поля "ПочатокПеріоду" в полі "Вираз" треба прописати «&Період.ДатаПочатку». А біля стандартного поля «Кінець Періоду» у полі «Вираз» прописати « &Період.ДатаЗакінчення».Дуже багато корисної інформації мови запитів можна знайти не в синтакс-помічнику, а в повній довідці конфігуратора 1С 8.2 (кнопка F1)

17. Функція запиту ЄNull(Зручніше писати англомовний варіант IsNull) зазвичай використовується для позбавлення значень типу Null для числових полів запиту. У ряді випадків, наприклад, повного з'єднання двох таблиць функція IsNull (Параметр1,Параметр2)може з успіхом замінити конструкцію ВИБІР КОЛИ... ТОДИ..ІНАЧЕ ….КІНЕЦЬколи для будь-якого поля значення NULL можуть бути як в першій таблиці, так і в другій (така конструкція дозволяє отримувати не Null значення для поля). Але слід пам'ятати, що на відміну від умовного оператора ВИБІРфункція ЄNullнаводить тип другого аргументу типу першого аргументу, що треба враховувати, якщо типи аргументів відрізняються!

IsNull(Рег.Залишок,0)

IsNull(Док.Товар,Док1.Номенклатура)

18. У умовної конструкції ВИБІРє альтернативний синтаксис для простого випадку перевірки рівності певного значення, але, щоправда, він недокументований:

Коли 1 Тоді «Вищий» Коли 2 Тоді «Середній» Інакше «Нижчий» Кінець

19. Оператор перевірки значення на NULL Є Null(Можна рекомендувати використовувати англомовний варіант Is Null). Така конструкція з'явилася тому, що будь-яка операція порівняння двох величин, хоча б одне з яких є Null, завжди брехня. Написати Де Найменування = Nullнеправильно. Цікава також форма заперечення даного оператора Немає Null- неправильно, а правильно Є Не Nullабо форма Чи не (Поле1 Є Null)- це істотна відмінність від усіх операторів, що використовуються спільно з оператором Не.

20. Іноді корисна форма оператора Удля перевірки збігу з одним із перерахованих значень.

...Де Товар.Найменування В ("Побутова техніка","Комп'ютери")

Для довідників може бути корисною форма оператора Уперевірки приналежності з ієрархії.

...Де Номенклатура В ІЄРАРХІЇ (&Група)

Оператор Участо використовується для перевірки входження значення результат вкладеного запиту.

У вкладеному запиті можна звертатись до полів зовнішнього запиту за умови.

// Вибрати назви товарів, які були присутні

// у видаткових накладних

ВИБРАТИ

Товари.Найменування

Довідник.Номенклатура ЯК

(ВИБРАТИ

ВитратнаНакладнаСклад.Номенклатура

Документ.ВитратнаНакладна.Склад ЯК ВитратнаНакладнаСклад

ВитратнаНакладнаСклад.Номенклатура = Товари.Посилання)

Операція Уможе використовуватись із масивами, списками значень, таблицями значень, вкладеними запитами. При цьому можливе скорочення умов

Синтаксис для вкладеного запиту

(вираз 1, вираз 2, ..., вираз N) В (Вибрати вираз 1, вираз 2, ..., вираз N ...)

Синтаксис для таблиці значень

(вираз1, вираз2,...,вираз N) У (&ТЗ), де в таблиці значень ТЗ використовуються N перших колонок

20. В інтернеті є жарт щодо того, як конструктор запиту постійно робить ЛІВОЕз'єднання таблиць (і змінює їх місцями), як би ми не вказували ПРАВО:

1С: Підприємство любить «ліворуч».

21. Складні запити зручно налагоджувати у консолі запитів. Існує їх в інтернеті багато. Після налагодження запиту його можна скопіювати і в конструкторі запиту є чудова кнопка Запит», куди можна вставити його в тому ж вигляді та зберегти (раніше була тільки можливість скопіювати в конфігураторі та зробити форматування запиту за допомогою символу перенесення рядка). У вікні, яке відкривається під час натискання кнопки «Запит», можна редагувати запит і дивитися результат виконання, що досить зручно.

22.При проектуванні звітів СКД потрібно пам'ятати, що якщо потрібно забезпечити фільтрацію деяким полем, необов'язково додавати параметр до тексту запиту. Конструктор запитів має вкладку « Компонування даних», де можна додавати параметри до умов. Крім того, на рівні звіту СКД є закладка умови, де можна додавати довільні умови та зберігати у швидких налаштуваннях. У разі умови будуть універсальними (рівність, нерівність, належність, входження до списку тощо.).

23. При роботі з документами потрібно додати сортування за віртуальним полем таблиці МОМЕНТ ЧАСУАле ось невдача - у вкладених запитах сортування по цьому полю правильно не працює. Допомагають танці з бубнами: сортування за віртуальним полем МОМЕНТ ЧАСУзамінюється на два сортування: за датою та за посиланням. Також вирішити проблему можна через тимчасову таблицю перенесенням вкладеного запиту окремий запит. Протягом багатьох релізів дана фіча чи баг не виправлена.

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

ВИБРАТИ

ВитратнаТовари.НомерРядки,

ВитратнаТовари.Товар,

ВитратнаТовари.Кількість,

ВитратнаТовари.Ціна,

ВитратнаТовари.Сума

Документ.Видаткова ЯК Д

Можливі рішення:

A) Замінити на ВПОРЯДКУВАТИ ЗАна

ВПОРЯДОЧИТИ ЗА Д.ДАТОМ УБУВ

Б) Можна перенести вкладений запит до тимчасової таблиці:

Документ.Видаткова ЯК Д

І Д.Контрагент = &Контрагент

////////////////////////////////////////////////////////////////////////////////

ВИБРАТИ

ВитратнаТовари.НомерРядки,

ВитратнаТовари.Товар,

ВитратнаТовари.Кількість,

ВитратнаТовари.Ціна,

ВитратнаТовари.Сума

Документ.Видаткова.Товари ЯК ВитратнаТовари

В) Можна звернутися до основної таблиці документа, а вже потім до табличної частини

ВИБРАТИ ПЕРШІ 1

Номер рядка,

Товар,

Кількість,

Ціна,

Сума

Документ.Видаткова ЯК Витратна

Витратна.Контрагент = &Контрагент

І Витратна.

ВПОРЯДКУВАТИ ЗА

Витратна.МоментЧасу УБУВ

24. При зверненні до головної таблиці документа (довідника) можна за умови звернутися до даних підпорядкованої таблиці (табличної частини). Така можливість називається розіменування полів табличної частини. Як приклад завдання можна навести завдання пошуку документів, що містять у табличній частині певний товар.

Перевага цього запиту перед запитом до вкладеної таблиці Прихідна. Товари в тому, що якщо є дублі в документах, результат запиту поверне лише унікальні документи без використання ключового слова РІЗНІ.

Порівняйте:

На цьому місці, мабуть, все. Зрозуміло, що у мові запитів ще багато невисвітлених мною питань. Для написання статті була використана інформація, отримана мною після проходження базового курсу 1С 8.2, а також з книги «1С 8.2 Керівництво розробника» та просторів інтернету.

Увага! Перед вами ознайомлювальна версія уроку, матеріали якого можуть бути неповними.

Увійдіть на сайт як учень

Увійдіть як учень, щоб отримати доступ до матеріалів школи

Мова запитів 1С 8.3 для програмістів-початківців: функції та оператори для роботи з типами (ТИПЗНАЧЕННЯ, ТИП, ПОСИЛАННЯ, Є NULL, ВИРАЗИТИ)

Згадаймо, що кожен реквізит (властивість, поле) довідника, документа або іншого прикладного об'єкта має свій тип . І цей тип ми можемо подивитися у конфігураторі:

У мові запитів існує цілий клас функцій та операторів до роботи з типами реквізитів. Давайте розглянемо їх.

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

Ця функція приймає один параметр (значення) та повертає його тип. Для описаного на зображенні (вище) реквізиту Смакдовідника Їжаповернеться таке:

А тепер давайте розглянемо реквізит Відмінна ознакау довідника Міста:

Ви бачите, що цей реквізит може мати один із кількох типів: Рядок, Довідник.Смаки, Довідник.. Такий тип реквізитів називається СКЛАДНИМ.

Якщо ми спробуємо заповнити значення такого реквізиту в режимі 1С:Підприємство, то система запитає нас, якого типу буде значення, що вводиться:

І лише після нашого вибору дозволить ввести значення вибраного типу.

Таким чином, елементи довідника одного виду ( Довідник.) зможуть зберігати в тому самому реквізиті ( Відмінна ознака) значення різних типів(Рядок, Кольори або Смаки).

Ви можете переконатися в цьому самі клацнувши по елементах довідника Містав режимі 1С: Підприємство. Ви читаєте ознайомлювальну версію уроку, повноцінні уроки .

Тут значення відмітної ознакиє елементом довідника Смаки:

Тут рядком:

А тут взагалі є елементом довідника кольори:

Ось які можливості відкриває перед нами складовий тип даних!

Цікаво, як поведеться функція ТИЗНАЧЕННЯна реквізиті ВідмітнийЕлемент, що має складовий тип даних:

Це дуже цікаво. Давайте розбиратися з кожним рядком окремо.

Тип значення відмітної ознаки для елемента Росія дорівнює NULL. Ми вперше стикаємося із цим типом. Значення цього типу використовуються виключно для визначення відсутнього значення при роботі з базою даних.

Так і є, адже елемент Росія є групою, а не звичайним елементом довідника Містатому у нього немає поля Відмінна ознака. А тип у відсутнього значення, як ми прочитали вище, завжди дорівнює NULL.

Тип значення відмітної ознаки для Пермі дорівнює Смаки. Так і є, адже значення відмітної ознаки забите у базі для міста Перм є посиланням на елемент довідника Смаки.

Для Красноярська тип ознаки дорівнює кольори, тому що значення обране в базі є посиланням на елемент довідника кольори.

Для Воронежа тип ознаки дорівнює Рядок, тому що значення введене в базі є звичайним рядком.

Індія знову група, тому значення немає. А тип у відсутнього значення, як ми пам'ятаємо, дорівнює NULL.

А справа ось у чому. Якщо ви зайдете до елемента довідника Містаз найменуванням Сан-Паулу, то побачите, що поле Відмінна ознаказовсім не заповнено. Воно порожнє. А усі незаповнені поля складового типу мають спеціальне значенняНЕ ВИЗНАЧЕНЕ .

З НЕ ВИЗНАЧЕНЕми також зустрічаємося вперше. Значення НЕ ВИЗНАЧЕНЕзастосовується, коли необхідно використовувати порожнє значення, що не належить до жодного іншого типу. Це якраз наша ситуація. А тип значення НЕ ВИЗНАЧЕНЕЯк ви вже напевно здогадалися дорівнює NULL.

Функція ТИП

Вона приймає лише один параметр - ім'я примітивного типу ( РЯДОК, ЧИСЛО, ДАТА, Бульова), або ім'я таблиці, тип посилання якої необхідно одержати.

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

Звучить туманно, чи не так?

Давайте розглянемо застосування цієї конструкції і все відразу стане на свої місця.

Нехай нам потрібно відібрати всі записи довідника Міста, у яких складовий реквізит Відмінна ознакамає значення типу РЯДОК:

Тепер давайте відберемо всі записи, які мають значення реквізиту Відмінна ознакає посиланнями на елементи довідника кольори(Таблиця Довідник.):

Відступ

Як ви пам'ятаєте, деякі елементи довідника Містане мають реквізиту Відмінна ознака. Функція ТИЗНАЧЕННЯдля таких елементів видає NULL.

Як можна зробити вибір таких елементів у запиті? Для цього передбачено спеціальний логічний оператор Є NULL(Не плутати з функцією Є NULL, що ми розглянемо нижче). Ви читаєте ознайомлювальну версію уроку, повноцінні уроки .

Ось приклад його використання:

Чудово. Але ви помітили, що тут немає елемента Сан-Паулу, тип значення реквізиту Відмінна ознакаякого також видавав NULL. Чому так сталося?

А справа в тому, що ситуація для груп (Росія, Індія, Бразилія), для яких заповнення реквізиту Відмінна ознаканеможливо в принципі, оскільки його у них немає зовсім, відрізняється від ситуації для елемента Сан-Паулу, для якого заповнення реквізиту можливе, але воно просто не заповнене і одно, як ми пам'ятаємо, спеціального значення НЕ ВИЗНАЧЕНЕ.

Щоб відібрати всі записи, які мають реквізит Відмінна ознакаприсутній, але не заповнений слід використовувати іншу конструкцію:

Але порівняння з НЕВИЗНАЧЕНО визначення порожніх (не заповнених) реквізитів працюватиме лише складових типів.

До речі, у логічного оператора Є NULL форма заперечення виглядає так:

Логічний оператор ПОСИЛАННЯ

Наприклад, давайте виберемо з довідника Місталише ті записи, у яких значення складеного реквізиту Відмінна ознакає посиланням на елемент довідника Смаки:

Як ви пам'ятаєте, це завдання ми могли б вирішити використовуючи ТИЗНАЧЕННЯі ТИП:

Функція ЄNULL

Функція призначена для заміни значення NULLінше значення.

Ми пам'ятаємо, що значення NULLповертається у тому випадку, якщо запитуваний реквізит (поле, властивість) немає.

Як, наприклад, реквізит Відмінна ознакадля груп довідника Міста:

Функція Є NULLдопоможе нам вивести інше значення у тому випадку, якщо це значення дорівнює NULL. Ви читаєте ознайомлювальну версію уроку, повноцінні уроки . Нехай у цьому випадку це буде рядок "Такого реквізиту немає!":

Виходить, що якщо перший параметр функції Є NULLне дорівнює NULL, то він повертається. Якщо він дорівнює NULL, то повертається другий параметр.

Функція ВИРАЗИТИ

Ця функція призначена лише для полів, що мають складовий тип. Відмінним прикладом такого поля є властивість Відмінна ознакау елементів довідника Міста.

Як ми пам'ятаємо, складові поля можуть бути одним із кількох типів, зазначених у конфігураторі.

Для поля Відмінна ознакатакими допустимими типами є РЯДОК, Довідник.і Довідник.Смаки.

Іноді виникає необхідність привести значення складеного поля до певного типу.

Давайте наведемо всі значення поля Відмінна ознакадо типу Довідник.

У результаті всі значення елементів, які мали тип Довідник.залишилися заповненими та виявилися наведеними до зазначеного типу. Усі значення інших типів ( РЯДОК, Довідник.Смаки) тепер стали рівні NULL. У цьому полягає особливість наведення типу за допомогою функції ВИРАЗИТИ.

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

Пройдіть тест

Розпочати тест

1. Виберіть правильне твердження

2. Реквізити, здатні приймати значення одного з кількох типів, називаються

3. Для визначення типу значення реквізиту підійде функція

4. Незаповнені реквізити складеного типу мають значення

Функцію ВИРАЗИТИ в мові запитів 1С 8 багато хто інтерпретує як перетворювач типів, але вона призначена зовсім не для цих цілей. Подробиці під катом...

Отже, багато хто помилково вважає, що зможуть перетворити поле з типом Рядоку полі з типом Числоабо посилання у рядок. Насправді оператор ВИРАЗИТИ може перетворити:

  • налаштування примітивного типу;
  • поле складеного типу в полі одиночного типу;

Розглянемо ці ситуації докладніше...

Перетворення налаштувань примітивного типу

Розглянемо ситуацію, коли ми хочемо згрупувати дані по рядку необмеженого типу, наприклад, таким рядком часто є коментар у документах. У такому разі згрупувати за коментарем у нас не вийде, отримаємо помилку. Тому нам необхідно рядок необмеженої довжини перетворити на рядок з обмеженою довжиною, а потім уже групувати. Наприклад, підрахуємо кількість документів з однаковими коментарями:

ВИБРАТИ
ВИРАЗИТИ(Приходная.Коментар ЯК РЯДКУ(300)) ЯК Коментар,
КІЛЬКІСТЬ(Прибуткова.Посилання) ЯК Посилання
З
Документ.Приходная ЯК Приходная

ЗГРУПУВАТИ ПО
ВИРАЗИТИ(Приходная.Коментар ЯК РЯДКУ(300))

Ще ситуація коли у запиті використовуються розрахунки, на виході ми можемо отримати число з великою кількістюзнаків після коми (1100,001568794). Щоб не обробляти це число після виконання запиту його відразу можна обрізати до потрібної довжини, але важливо розуміти що число саме обрізається, а не округляється. Приклад:

ВИБРАТИ
Продаж.Товар,
ВИРАЗИТИ(Продажи.Кількість * Продажу.Ціна ЯК ЧИСЛО(15, 2)) ЯК Сума
З

Перетворення складового типу до одиночного

Реєстратор у регістрів часто має складовий тип, щоб перетворити його на одиночний тип використовуйте конструкцію ВИРАЗИТИправда якщо на етапі вибірки ви спробуєте перетворити документ на реалізацію в документ надходження, то запит обов'язково вилетить з помилкою, тому перед перетворенням слід перевірити тип посилання. Ось така ось біліберда))) Навіщо все це потрібно спитайте ви. Відповідаю, це один із моментів неявної оптимізації запиту на шкоду стислості написання. Розглянемо застосування цього моменту з прикладу.

Припустимо, ви поставили за мету отримати номер кожного реєстратора у РН Продажі. пишемо запит:

ВИБРАТИ РІЗНІ
Продажі.Реєстратор.Номер
З
РеєстрНакопичення. Продаж ЯК Продажу

Власне, нічого не може бути простіше. Ось тільки 1С на етапі виконання перетворює цей запит без будь-яких з'єднань у запит з такою кількістю лівих з'єднань, скільки у нас можливих реєстраторів. Тобто. якщо пишуть до цього регістру 20 документів, то отримаємо SQL запит із 20 лівими сполуками. Чому так відбувається? Тому що вбудований 1С оптимізатор не зовсім добре обробляє поля, що отримуються через точку, в даному випадку це реквізит Номер. Ось такі пироги, якщо ми часто захочемо отримувати номер документа, то найрозумніше включити його в реквізити регістру або використовувати оператор ВИРАЗИТИ, але на шкоду стислості:

ВИБРАТИ РІЗНІ
Продаж.Реєстратор.Номер,
ВИБІР
КОЛИ Продажі.Реєстратор ПОСИЛАННЯ Документ.Видаткова
ТОДИ ВИРАЗИТИ(Продажи.Реєстратор ЯК Документ.Видаткова)
Інакше ВИБІР
КОЛИ Продажі.Реєстратор ПОСИЛАННЯ Документ.Реалізація
ТОДИ ВИРАЗИТИ(Продажи.Реєстратор ЯК Документ.Реалізація)
КІНЕЦЬ
...
КІНЕЦЬ ЯК Номер
З
РеєстрНакопичення. Продаж ЯК Продажу

Тепер у лівому з'єднанні братиме участь одна конкретна таблиця.

У випадку, варто уважно звертатися до даних через точку, т.к. 1С у цьому випадку використовує ліве з'єднанняу запиті SQL, що може суттєво позначитися на продуктивності. Це один із моментів оптимізації.

Поділіться з друзями або збережіть для себе:

Завантаження...