Створення та робота із запитами (для початківців). Створення та робота із запитами (для початківців) 1с запит підсумки з умовою

Мова запитів є одним із основних механізмів 1С 8.3 для розробників. За допомогою запитів можна швидко отримати будь-які дані, що зберігаються у базі. Його синтаксис дуже нагадує SQL, але є й відмінності.

Основні переваги мови запитів 1С 8.3 (8.2) перед SQL:

  • розіменування посилальних полів (звернення черга одну або кілька точок до реквізитів об'єктів);
  • робота з результатами дуже зручна;
  • можливість створювати віртуальні таблиці;
  • запит можна писати як англійською, так і російською мовами;
  • можливість блокувати дані для виключення взаємних блокувань.

Недоліки мови запитів у 1С:

  • на відміну від SQL, 1С запити не дозволяють змінювати дані;
  • відсутність процедур, що зберігаються;
  • неможливість перетворення рядка на число.

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

У зв'язку з тим, що запити 1С дозволяють лише отримувати дані, будь-який запит повинен починатися зі слова «ВИБРАТИ». Після цієї команди вказуються поля, дані з яких потрібно отримати. Якщо вказати «*», будуть вибрані всі доступні поля. Місце, звідки вибиратимуться дані (документи, регістри, довідники та інше) зазначається після слова «ІЗ».

У наведеному нижче прикладі вибираються найменування всієї номенклатури з довідника «Номенклатура». Після слова "ЯК" вказуються псевдоніми (імена) для таблиць та полів.

ВИБРАТИ
Номенклатура.Найменування ЯК НайменуванняНоменклатури
З
Довідник Номенклатура ЯК Номенклатура

Поруч із командою «ВИБРАТИ» ​​можна вказати ключові слова:

  • РІЗНІ. Запит буде відбирати тільки рядки, що відрізняються хоча б по одному полю (без дублів).
  • ПЕРШІ n, де n– кількість рядків із початку результату, які необхідно відібрати. Найчастіше така конструкція використовується спільно з сортуванням (ПОРЯДОЧИТИ ПО). Наприклад, коли потрібно відібрати певну кількість останніх за датою документів.
  • ДОЗВОЛЕНІ. Дана конструкція дозволяє вибирати з бази тільки записи, які доступні поточному користувачеві. Бази використання цього ключового слова користувачу буде виведено повідомлення про помилку при спробі звернення запиту до тих записів, доступу до яких у нього немає.

Ці ключові слова можуть використовуватися як усі разом, так і окремо.

ДЛЯ ЗМІНИ

Ця пропозиція блокує дані для виключення взаємних конфліктів. Заблоковані дані не будуть зчитуватись з іншого з'єднання до закінчення транзакції. У цій пропозиції можна вказувати конкретні таблиці, які потрібно заблокувати. В іншому випадку будуть заблоковані всі. Конструкція є актуальною лише для режиму автоматичних блокувань.

Найчастіше пропозиція «ДЛЯ ЗМІНИ» використовується при отриманні залишків. Адже при одночасної роботі кількох користувачів у програмі, доки один отримує залишки, інший може їх змінити. У такому разі отриманий залишок буде вже не вірним. Якщо ж заблокувати дані цією пропозицією, поки перший співробітник не отримає коректний залишок і не зробить з ним всі необхідні маніпуляції, другий співробітник буде змушений чекати.

ВИБРАТИ
Взаєморозрахунки. Співробітник,
Взаєморозрахунки.СумаВзаєморозрахунківЗалишок
З
РеєстрНакопичення.ВзаєморозрахункиСотрудниками.Залишки ЯК Взаєморозрахунки
ДЛЯ ЗМІНИ

ДЕ (WHERE)

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

Нижче наведено приклад запиту на отримання контактних осіб з певною посадою. Параметр відбору має формат: &Ім'яПараметра (назва довільне).

ВИБІР (CASE)

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

У наведеному нижче прикладі «Додаткове поле» міститиме текст залежно від того, чи проведено документ чи ні:

ВИБРАТИ
НадходженняТіУ.Посилання,
ВИБІР
КОЛИ Вступ ТіУ.
ТОДИ «Документ проведено!»
Інакше «Документ не проведено…»
КІНЕЦЬ ЯК ДодатковеПоле
З
Документ.Надходження ТоварівПослуг ЯК ВступТіУ

З'ЄДНАННЯ (JOIN)

З'єднання пов'язують дві таблиці за умовою зв'язку.

ЛІВОЕ/ПРАВЕ З'ЄДНАННЯ

Суть ЛІВОГО з'єднання полягає в тому, що повністю береться перша зазначена таблиця і до неї за умови зв'язку прив'язується друга. Якщо записів, відповідних першої таблиці у другій не знайшлося, то їх значеннями підставляється NULL. Простіше кажучи, головною є перша зазначена таблиця і до її даних вже підставляються дані другої таблиці (якщо вони є).

Наприклад, необхідно отримати номенклатурні позиції з документів «Надходження товарів та послуг» та ціни з регістру відомостей «Ціни номенклатури». В даному випадку, якщо ціна в будь-якій позиції не знайдена, замість неї підставитись NULL. З документа всі позиції будуть обрані незалежно від того, чи є на них ціна чи ні.

ВИБРАТИ
НадходженняТіУ.Номенклатура,
Ціни.
З
Документ.НадходженняТоварівПослуг.Товари ЯК ВступТіУ
ВНУТРІШНЯ З'ЄДНАННЯ РеєстрВідомостей.ЦіниНоменклатури.Зріз Останніх ЯК Ціни
ПО Вступ ТіУ.Номенклатура = Ціни.Номенклатура

У ПРАВОМУ все точно і навпаки.

ПОВНЕ З'ЄДНАННЯ

Даний вид з'єднання відрізняється від попередніх тим, що в результаті будуть повернуті всі записи першої таблиці, так і другої. Якщо за заданою умовою зв'язку у першій чи другій таблиці не знайдено записів, замість них буде повернено значення NULL.

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

ВНУТРІШНЯ З'ЄДНАННЯ

Відмінністю ВНУТРІШНЬОГО з'єднання від ПОВНОГО є те, що якщо хоча б в одній з таблиць не знайдено запис, запит не виведе її взагалі. У результаті буде обрано лише ті номенклатурні позиції з документа «Надходження товарів та послуг», для яких у регістрі відомостей «Ціни номенклатури» є записи, якщо в попередньому прикладі замінити «ПОВНЕ» на «ВНУТРІШНІЙ».

ЗГРУПУВАТИ ПО (GROUP BY)

Угруповання в запитах 1С дозволяє згортати рядки таблиці (групувальні поля) за певною загальною ознакою (полям, що групуються). Групувальні поля можуть виводитися тільки із застосуванням агрегатних функцій.

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

ВИБРАТИ
,
МАКСИМУМ(Ціни.Ціна) ЯК Ціна
З

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

ПІДСУМКИ

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

Підсумки можна підбивати по всій таблиці цілком (з використанням ключового слова «ЗАГАЛЬНІ»), по кількох полях, по полях з ієрархічною структурою (ключові слова «ІЄРАРХІЯ», «ТІЛЬКИ ІЄРАРХІЯ»). При підбитті підсумків не обов'язково використовувати агрегатні функції.

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

ВИБРАТИ
Ціни.Номенклатура.ВидНоменклатури ЯК ВидНоменклатури,
Ціни.Ціна ЯК Ціна
З
РеєстрВідомостей.ЦіниНоменклатури.Зріз Останніх ЯК Ціни
ПІДСУМКИ
МАКСИМУМ(Ціна)
ПЗ
ВидНоменклатури

МАЮЧІ (HAVING)

Цей оператор схожий на оператора «ДЕ», але використовується тільки для агрегатних функцій. Інші поля, крім використовуваних цим оператором, мають бути згруповані. Оператор «ДЕ» не застосовується для агрегатних функцій.

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

ВИБРАТИ

МАКСИМУМ(Ціни.Ціна) ЯК Ціна
З
РеєстрВідомостей.ЦіниНоменклатури.Зріз Останніх ЯК Ціни
ЗГРУПУВАТИ ПО
Ціни.Номенклатура.Вид Номенклатури
МАЮЧІ
МАКСИМУМ(Ціни.Ціна) > 1000

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

Оператор «Упорядкувати» сортує результат запиту. Для того, щоб гарантовано виводити записи в постійному порядку, використовується автоупорядкування. Примітивні типи сортуються за звичайними правилами. Типи посилань сортуються за GUID.

Приклад отримання списку співробітників, відсортованого за назвою:

ВИБРАТИ
Співробітники.Найменування ЯК Найменування
З
Довідник. Співробітники ЯК Співробітники
ВПОРЯДКУВАТИ ЗА
Найменування
Автоупорядкування

Інші конструкції мови запитів 1С

  • ОБ'ЄДНАТИ– результати двох запитів на один.
  • ОБ'ЄДНАТИ ВСЕ– аналог ОБ'ЄДНАТИ, але без угруповання однакових рядків.
  • ПОРОЖНЯ ТАБЛИЦЯ– іноді використовується для об'єднання запитів для вказівки порожньої вкладеної таблиці.
  • ПОМІСТИТИ- Створює тимчасову таблицю для оптимізації складних запитів 1С. Такі запити називають пакетними.

Функції мови запитів

  • ПІДСТРОКУобрізає рядок із певної позиції на вказану кількість символів.
  • РІК…СЕКУНДАдозволяють отримати обране значення числового типу. Вхідний параметр - дата.
  • ПОЧАТОК ПЕРІОДУ та КОНЕЦПЕРІОДУвикористовуються під час роботи з датами. Як додатковий параметр вказується тип періоду (ДЕНЬ, МІСЯЦЬ, РІК тощо).
  • ДОДАТИ КДАТИдозволяє додати або відібрати від дати вказаний час певного типу (СЕКУНДА, ХВИЛИНА, ДЕНЬ тощо).
  • РІЗНІСТЬДАТвизначає різницю між двома датами із зазначенням типу вихідного значення (ДЕНЬ, РІК, МІСЯЦЬ тощо).
  • Є NULLзамінює відсутнє значення на вказаний вираз.
  • ПОДАННЯ ТА ПРЕДСТАВКА ПОСИЛАННЯодержують строкове подання зазначеного поля. Застосовуються для будь-яких значень і лише посилальних відповідно.
  • ТИП, ТИЗНАЧЕННЯвикористовуються визначення типу вхідного параметра.
  • ПОСИЛАННЯє логічним оператором порівняння типу значення реквізиту.
  • ВИРАЗИТИвикористовується для перетворення значення потрібного типу.
  • ДАТА ЧАСотримує значення типу "Дата" з числових значень (Рік, Місяць, День, Година, Хвилина, Секунда).
  • ЗНАЧЕННЯу запиті 1С використовується для зазначення визначених значень - довідників, перерахувань, планів видів характеристик. Приклад використання: « Де ЮрФізОсоба = Значення (Перерахування.ЮрФізОсоба.ФізОсоба)«.

Конструктор запитів

Для створення запитів із 1С є дуже зручний вбудований механізм – конструктор запитів. Він містить такі основні вкладки:

  • "Таблиці та поля" - містить поля, які необхідно вибрати і їх джерела.
  • «Зв'язки» - визначає умови для конструкції З'ЄДНАННЯ.
  • «Угруповання» — містить опис конструкцій угруповань і полів, що підсумовуються по них.
  • "Умови" - відповідає за відбори даних у запиті.
  • «Додатково» — додаткові параметри запиту, такі як ключові слова команди «ВИБРАТИ» ​​та ін.
  • "Об'єднання/Псевдоніми" - вказуються можливості об'єднання таблиць і задаються псевдоніми (конструкція "ЯК").
  • "Порядок" - відповідає за сортування результату запитів.
  • "Підсумки" - аналогічна вкладці "Угруповання", але застосовується для конструкції "ПІДСУМКИ".

Текст самого запиту можна переглянути, натиснувши в нижньому лівому кутку на кнопку «Запит». У цій формі його можна скоригувати вручну або скопіювати.


Консоль запитів

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

Завантажити консоль запитів можна на диску ІТС, або .

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

1. Конструкція "ІЗ".

Для того, щоб отримати дані з бази, зовсім необов'язково використовувати конструкцію "З".
Приклад: Нам необхідно вибрати всю інформацію про банки з довідника.
Запит:

ВИБРАТИ Довідник.Банки.*

Вибирає всі поля із довідника Банки. І є аналогічним запиту:

ВИБРАТИ Банки. * З Довідник. Банки ЯК Банки

2. Упорядкування даних по посилальному полю

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

У цьому випадку для документів упорядкування відбуватиметься в порядку "Дата->Номер" для довідників за "Основним поданням". Якщо упорядкування відбувається не за посиланнями, то використовувати конструкцію "АВТОПОРЯДОЧУВАННЯ" не рекомендується.

У деяких випадках конструкція "АВТОПОРЯДОЧУВАННЯ" може уповільнювати процес вибірки. Аналогічно можна переписати без автоупорядкування для документів:

3. Отримання текстового подання типу посилання. Конструкція "ПРЕДСТАВЛЕННЯ".

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

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

4. Умова на вибірку даних за шаблоном.

Наприклад, вам необхідно отримати мобільні телефони працівників виду (8-123-456-78-912). Для цього необхідно поставити таку умову у запиті:

ВИБРАТИ Співробітник.Найменування, Співробітник.Телефон ЯК Телефон З Довідник.Співробітники ЯК Співробітники ДЕ Телефон ПОДІБНО "_-___-___-__-__"

Символ "_" є службовим та замінює будь-який символ.

5. Одночасне використання підсумків та угруповань.


Підсумки часто використовуються разом із угрупованнями, у разі агрегатні функції в підсумках можна не вказувати.

ВИБРАТИ ОказаниеПослуг.Організація ЯК Організація, НаданняПослуг.Номенклатура ЯК Номенклатура, СУМА(НаданняПослуг.СумаДокумента) ЯК СумаДокумента З Документ. Організація, Номенклатура

У цьому випадку запит поверне практично те саме, що і такий запит:

ВИБРАТИ Надання Послуг. Організація ЯК Організація, Надання Послуг. Номенклатура ЯК Номенклатура, Надання Послуг.

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

6. Розіменування полів.

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

Запит:

Можна уявити у вигляді:

ВИБРАТИ Оплата.Посилання, Оплата.Організація, Оплата.Організація, Організації. Адміністративна Одиниця З Документ. Оплата ЯК Оплата ЛІВОЕ З'ЄДНАННЯ Довідник. Організації ЯК Організації ПЗ Оплата.

При розіменуванні полів посилань складового типу платформа намагається створити неявні з'єднання з усіма таблицями, які входять в тип цього поля. У цьому випадку запит буде неоптимальним. Якщо чітко відомо, якого типу поле, необхідно обмежувати такі поля за типом конструкцією ВИРАЗИТИ().

Наприклад, є регістр накопичення "Нерозподілені оплати", де реєстратором можуть виступати кілька документів. У цьому випадку неправильно отримувати значення реквізитів реєстратора таким чином:

ВИБРАТИ НерозподіленіОплати.Реєстратор.Дата, ..... З РеєстрНакопичення.НерозподіленіОплати ЯК НерозподіленіОплати

слід обмежити тип складеного поля реєстратор:

ВИБРАТИ ВИРАЗИТИ(НерозподіленіОплати.Реєстратор ЯК Документ.Оплата).Дата, ..... З РеєстрНакопичення.НерозподіленіОплати ЯК НерозподіленіОплати

7. Конструкція "ДЕ"

При лівому з'єднанні двох таблиць, коли ви накладаєте умову "ДЕ" на праву таблицю, то ми отримаємо результат аналогічний результату при внутрішньому з'єднанні таблиць.

приклад. Необхідно вибрати всіх Клієнтів із Довідника клієнти і для тих клієнтів, у яких є документ оплата зі значенням реквізиту "Організація" = &Організація вивести документ "Оплата", для тих, хто не має, не виводити.

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

ВИБРАТИ Оплата.Посилання ЯК Оплата, Оплата.Пайщик ЯК Клієнт ПОМІСТИТИ оплати З Документ.Оплата ЯК Оплата ДЕ Оплата.Відділення = &Відділення; //////////////////////////////////////////////////// ////////////////////////////// ВИБРАТИ Клієнти.Посилання ЯК Клієнт, ЄNULL(тОплати.Оплата, "") ЯК Оплата З Довідник .Клієнти ЯК Клієнти ЛІВОЕ З'ЄДНАННЯ тОплати ЯК тОплати ПО Клієнти.Посилання = тОплати.Клієнт

Можна обійти цю умову іншим способом. необхідно накласти умову "ДЕ" у зв'язку двох таблиць. Приклад:

ВИБРАТИ Клієнти.Посилання, Оплата.Посилання З Довідник.УС_Абоненти ЯК УС_Абоненти ЛІВОЕ З'ЄДНАННЯ Документ. . Посилання

8. З'єднання з Вкладеними та Віртуальними таблицями

Вкладені запитинайчастіше необхідні вибірки даних за будь-якою умовою. Якщо ж потім використовувати їх у поєднанні з іншими таблицями це може критично уповільнити виконання запиту.

Для прикладу нам необхідно для деяких клієнтів отримати суму залишку на поточну дату.

ВИБРАТИ Нерозподілені Оплати Залишки. Клієнт, Нерозподілені Оплати Залишки. ЯК Нерозподілені Оплати ПЗ Вкладений Запит. Посилання = Нерозподілені Оплати Залишки.

При виконанні такого запиту можливі помилки оптимізатора СУБД при виборі плану, що призведе до неоптимального виконання запиту. При з'єднанні двох таблиць оптимізатор СУБД вибирає алгоритм з'єднання таблиць виходячи з кількості записів в обох таблицях. У разі наявності вкладеного запиту визначити кількість записів, яка поверне вкладений запит вкрай складно. Тому замість вкладених запитів завжди варто використовувати часові таблиці. Тому перепишемо запит.

ВИБРАТИ Клієнти.Посилання ЯК Посилання ПОМІСТИТИ тКлієнти З Довідник.Клієнти ЯК Клієнти ДЕ
Посилання В (&Клієнти) ; //////////////////////////////////////////////////// ////////////////////////////// ВИБРАТИ тКлієнти. Посилання, Нерозподілені Оплати Залишки. (, Клієнт В (ВИБРАТИ тКлієнти.Посилання З тКлієнти)) ЯК НерозподіленіОплатиЗалишки ПО тКлієнти.Посилання = НерозподіленіОплатиЗалишки.Клієнти

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

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

Тобто. при з'єднанні з віртуальною таблицею відбувається з'єднання з підзапит. У цьому випадку оптимізатор СУБД також може вибрати неоптимальний план з'єднання. Якщо запит формується недостатньо швидко і в запиті використовуються з'єднання у віртуальними таблицями, то рекомендується винести звернення до віртуальних таблиць у тимчасову таблицю, а потім зробити з'єднання між двома тимчасовими таблицями. Перепишемо попередній запит.

ВИБРАТИ Клієнти.Посилання ЯК Посилання ПОМІСТИТИ тКлієнти З Довідник.Клієнти ЯК Клієнти ІНДЕКСУВАТИ ПО Посилання ДЕ
Посилання В (&Клієнти) ; //////////////////////////////////////////////////// ////////////////////////////// ВИБРАТИ Нерозподілені Оплати. Сума Залишок, Нерозподілені Оплати. Клієнт В (ВИБРАТИ тКлієнти.Посилання З тКлієнти)) ЯК Нерозподілені Оплати Залишки; //////////////////////////////////////////////////// ////////////////////////////// ВИБРАТИ тКлієнти.Посилання, залишки.СумаЗалишок ЯК СумаЗалишок З тКлієнти ЯК тКлієнти тКлієнти.Посилання = тЗалишки.Клієнт

9.Перевірка результату виконання запиту.

Результат виконання запиту може бути порожнім, для перевірки порожні значення слід використовувати конструкцію:

РезЗапроса = Запрос.Выполнить(); Якщо резЗапроса.Пустой() Тоді Повернення; КінецьЯкщо;

Метод Порожній()слід використовувати до методів Вибрати()або Вивантажити(), тому що на отримання колекції витрачається час.

Ні для кого не є відкриттям те, що в циклі запити використовувати вкрай небажано. Це може критично позначитися на час роботи тієї чи іншої функції. Дуже бажано отримувати всі дані в запиті і потім обробляти дані в циклі. Але іноді трапляються випадки, коли винести запит за межі циклу стає неможливим. У цьому випадку для оптимізації можна винести створення запиту за межі циклу, а в циклі підставляти необхідні параметри та виконувати запит.

Запит = Новий Запит; Запит.Текст = "ВИБРАТИ | Клієнти.Посилання, | Клієнти.ДатаНародження |З | Довідник.Клієнти ЯК Клієнти |ДЕ | Клієнти.Посилання = &Клієнт"; Для кожного рядка з ТаблицяКлієнти Цикл Запит.ВстановитиПараметр("Клієнт", Клієнт); РезультатЗапиту = Запит.Виконати().Вибрати(); КінецьЦикл;

Це позбавить систему синтаксичної перевірки запиту в циклі.

11. Конструкція "МАЮЧІ".

Конструкція, що досить рідко зустрічається в запитах. Дозволяє накладати умови на значення агрегатних функцій (СУМА, МІНІМУМ, СЕРЕДНЕ і т.д.). Наприклад, вам необхідно вибрати тільки тих клієнтів, у яких сума оплат у вересні була більшою за 13 000 рублів. Якщо використовувати умову "ДЕ", то доведеться спочатку створювати тимчасову таблицю або вкладений запит, там групувати записи по сумі оплати та потім накладати умову. Конструкція "МАЮЧІ" допоможе цього уникнути.

ВИБРАТИ Оплата.Клієнт, СУМА(Оплата.Сума) ЯК Сума З Документ.Оплата ЯК Оплата ДЕ МІСЯЦЬ(Оплата.Дата) = 9 ЗГРУПУВАТИ ПО Оплата.

У конструкторі для цього достатньо перейти на вкладку "Умови", додати нову умову та поставити галочку на "Довільне". Далі просто написати Сума(Оплата.Сума) > 13000


12. Значення NULL

Я не описуватиму тут принципи тризначної логіки в БД, є безліч статей на цю тему. Просто коротко про те як NULLможе вплинути результат запиту. Значення NULL насправді не значення, а факт, що значення не визначено, невідомо. Тому будь-які операції з NULL повертають NULL, чи то додавання, віднімання, розподіл чи порівняння. Значення NULL не можна порівняти зі значенням NULL, оскільки ми знаємо, що саме порівнювати. Тобто. обидва ці порівняння: NULL = NULL, NULL<>NULL - це не Істина чи не Брехня, це невідомо.

Давайте розглянемо приклад.

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

ВИБРАТИ "Ні оплат" ЯК Ознака, NULL ЯК Документ ПОМІСТИТИ оплати; //////////////////////////////////////////////////// ////////////////////////////// ВИБРАТИ Клієнти.Посилання ЯК Клієнт, Оплата.Посилання ЯК Оплата ПОМІСТИТИ тКлієнтОплата З Довідник.Клієнти ЯК Клієнти ЛІВОЕ З'ЄДНАННЯ Документ.Оплата ЯК Оплата ПО Клієнти.Посилання = Оплата.Пайщик; //////////////////////////////////////////////////// ////////////////////////////// ВИБРАТИ тКлієнтОплата.Клієнт З тКлієнтОплата ЯК тКлієнтОплата ВНУТРІШнє З'ЄДНАННЯ тОплати ЯК тОплати ПО тКлієнтОплата. Документ

Зверніть увагу на другу тимчасову таблицю тКлієнтОплата. Лівим з'єднанням я вибираю всіх клієнтів та всі оплати за цими клієнтами. Для тих же клієнтів, які не мають оплат у полі "Оплата", буде NULL . Наслідуючи логіку, в першій тимчасовій таблиці "тОплати" я позначив 2 поля, одне з них NULL, друге рядок "Не має оплат". У третій таблиці я з'єдную внутрішнім з'єднанням таблиці "тКлієнтОплата" та "тОплати" по полях "Оплата" та "Документ". Ми знаємо, що в першій таблиці поле "Документ" це NULL, і в другій таблиці у тих, хто не має оплат у полі "Оплата" теж NULL. Що ж поверне нам таке з'єднання? А нічого не поверне. Тому що порівняння NULL = NULL не набуває значення Істина.

Щоб запит повернув нам очікуваний результат, перепишемо його:

ВИБРАТИ "Ні оплат" ЯК Ознака, ЗНАЧЕННЯ(Документ.Оплата.ПустаПосилання) ЯК Документ ПОМІСТИТИ оплати; //////////////////////////////////////////////////// ////////////////////////////// ВИБРАТИ Клієнти.Посилання ЯК Клієнт, ЄNULL(Оплата.Посилання, ЗНАЧЕННЯ(Документ.Оплата.ПустаПосилання) )) ЯК Оплата ПОМІСТИТИ тКлієнтОплата З Довідник.Клієнти ЯК Клієнти ЛІВОЕ З'ЄДНАННЯ Документ.Оплата ЯК Оплата ПО Клієнти.Посилання = Оплата.Пайщик; //////////////////////////////////////////////////// ////////////////////////////// ВИБРАТИ тКлієнтОплата.Клієнт З тКлієнтОплата ЯК тКлієнтОплата ВНУТРІШнє З'ЄДНАННЯ тОплати ЯК тОплати ПО тКлієнтОплата. Документ

Тепер у другій тимчасовій таблиці ми вказали, що у випадку, якщо поле "Оплата" є NULL, тоді це поле = порожнє посилання на документ оплата. У першій таблиці ми також замінили NULL на порожнє посилання. Тепер у поєднанні беруть участь не NULL поля і запит поверне нам очікуваний результат.

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

13. Недокументована особливість конструкції "ВИБІР КОЛИ...ТОДІ....КІНЕЦЬ".

У разі, коли необхідно описувати у запиті контрукцію "Умови", ми використовуємо стандартний синтаксис:

ВИБРАТИ ВИБІР КОЛИ Користувачі.Найменування = "Вася Пупкін" ТОДИ "Наш улюблений співробітник" Інакше "Не знаємо такого" КІНЕЦЬ ЯК Поле1 З Довідник.Користувачі ЯК

А що робити, якщо, наприклад, нам треба отримати назву місяця у запиті? Писати величезну конструкцію у запиті негарно і довго, тому нас може виручити така форма запису вище:

ВИБІР МІСЯЦЬ (УС_РозрахунокСпоживання_ГрафікОбороти.ПеріодРозрахунку) КОЛИ 1 ТОДІ "Січень" КОЛИ 2 ТОДІ "ЛЮТИЙ" КОЛИ 3 ТОДІ "КОДИ нь" КОЛИ 7 ТОДІ "Липень" КОЛИ 8 ТОДИ "Август" КОЛИ 9 ТОДИ "Вересень" КОЛИ 10 ТОДИ "Жовтень" КОЛИ 11 ТОДИ "Листопад" КОЛИ 12 ТОДИ "Грудень"

Тепер конструкція виглядає не такою громіздкою та легко сприймається.

14. Пакетне виконання запиту.


Щоб не плодити запити, можна створити один великий запит, розбити його на пакети і працювати вже з ним.
Наприклад, мені потрібно отримати з довідника "Користувачі" поля: "ДатаНародження" та доступні ролі для кожного користувача. вивантажити це в різні табличні частини на формі. Звичайно, можна зробити це в одному запиті, тоді доведеться перебирати записи або згортати, а можна так:

ВИБРАТИ Користувачі.Посилання ЯК ПІБ, Користувачі.ДатаНародження, Користувачі.Роль ПОМІСТИТИ в Користувачі З Довідник.Користувачі ЯК Користувачі; //////////////////////////////////////////////////// ////////////////////////////// ВИБРАТИ в Користувачі. ПІБ, ВТ Користувачі. Дата народження; //////////////////////////////////////////////////// ////////////////////////////// ВИБРАТИ втКористувачі.ПІБ, втКористувачі.Роль З втКористувачі ЯК втКористувачі ЗГРУПУВАТИ ПО вкористувачі.ПІБ, вт. Дата народження

тПакет = Запрос.ВыполнитьПакет();

ТП_ДатиНародження = тПакет.Выгрузить();
ТП_Ролі = тПакет.Вивантажити();

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

15. Умови пакетного запиту

Наприклад, у нас є пакетний запит, де спочатку ми отримуємо поля: "Найменування, ДатаНародження, Код" з довідника "Користувачі" і хочемо з довідника "ФізОсоба" отримати записи з умовою по цих полях.

ВИБРАТИ Користувачі.ФізОсоба.Найменування ЯК Найменування, Користувачі.ФізОсоба.ДатаНародження ЯК ДатаНародження, Користувачі.ФізОсоба.Код ЯК Код ПОМІСТИТИ в Користувачі З Довідник.Користувачі ЯК //////////////////////////////////////////////////// ////////////////////////////// ВИБРАТИ ФізичніОбличчя.Посилання ЯК ФізОбличчя З Довідник.

Можна накласти умови таким чином:

ДЕ ФізичніОбличчя.Код В (ВИБРАТИ втПользователи.Код З втКористувачі) І ФізичніОбличчя.Найменування В (ВИБРАТИ втКористувачі.Код З втКористувачі) І ФізичніОбличчя.

А можна й так:

ДЕ (Фізичні Особи. Код, Фізичні Особи. Найменування, Фізичні Особи.

Причому обов'язково дотримуватися порядку.

16. Виклик конструктора запитів для "умови" у пакетному запиті

Коли необхідно накласти умову, як у прикладі вище, можна забути те чи інше поле називається у віртуальній таблиці.
Наприклад треба накласти умову на полі "ДатаНародження", а у віртуальній таблиці це поле називається "ДатаНародженняДебітора", і якщо ви забули назву, то доведеться виходити з редагування умови без збереження та дивитися назву поля. Для того, щоб уникнути цього, можна скористатися наступним прийомом.

Необхідно після конструкції "В" поставити дужки і між дужками залишити порожнє місце (пробіл), виділити це місце і викликати контруктор запитів. Контруктору буде доступно всі таблиці пакетного запиту. Прийом працює як на віртуальних таблицях регістрів, так вкладки "Умови". В останньому випадку необхідно поставити галочку "П(вільна умова)" і увійти в режим редагування "F4".

Запитів часто вигадував на ходу і вони служать просто для відображення "прийомів", які я розглядав.

Хотів розглянути використання індексів у запитах, але дуже велика тема. Винесу до окремої статті, або пізніше додам тут.

upd1. Пункти 11,12
upd2. Пункти 13,14,15,16

Використовувана література:
Мова запитів "1С:Підприємства 8" - Е.Ю. Кришталева
Професійна розробка у системі 1С:Підприємство 8".

Мова запитів 1С — одна з основних відмінностей між версіями 7.7 та 8. Одним із найважливіших пунктів у вивченні 1С-програмування є мова запитів. У 1С 8.3 запити - найпотужніший і найефективніший інструмент отримання даних. Мова запитів дозволяє зручно отримувати інформацію з бази даних.

Сам синтаксис дуже сильно нагадує класичний T-SQL, крім того, що в 1С за допомогою мови запитів можна лише отримувати дані, використовуючи конструкцію Вибрати (select). Мова підтримує і складніші конструкції, наприклад, (запит у запиті). Запити в 1С8 можна становити як на кирилиці, так і на латиниці.

У статті я намагатимусь розповісти про основні ключові слова в мові запитів 1С:

  • вибрати
  • дозволені
  • різні
  • висловити
  • перші
  • для зміни
  • значення
  • тип значення (і оператор ПОСИЛАННЯ)
  • вибір
  • згрупувати за
  • мають
  • Є NULL
  • Є NULL
  • з'єднання - праві, ліві, внутрішні, повні.

А також невеликі хитрощі мови 1С, застосовуючи які ви зможете оптимально побудувати текст запиту.

Для налагодження запитів у системі 1С 8.2 передбачено спеціальний інструмент - консоль запитів. Побачити опис і завантажити його можна за посиланням -.

Розглянемо найважливіші та найцікавіші оператори мови запитів 1С.

ВИБРАТИ (SELECT)

У мові запитів 1С підприємства 8 будь-який запит починається з ключового слова ВИБРАТИ. У мові 1С немає конструкцій UPDATE, DELETE, CREATE TABLE, INSERT, ці маніпуляції провадяться в об'єктній техніці. Призначення його – лише читання даних.

Наприклад:

ВИБРАТИ
Поточний Довідник. Найменування
З
Довідник.Номенклатура ЯК Поточний Довідник

Запит поверне таблицю із найменуваннями номенклатури.

Поряд із конструкцією ВИБРАТИможна зустріти ключові слова ДЛЯ ЗМІНИ, ДОЗВОЛЕНІ, РІЗНІ, ПЕРШІ

ДОЗВОЛЕНІ— вибирає лише записи з таблиці, на які є права поточного користувача.

РІЗНІ— означає, що результат не потрапить дублюючих рядків.

ВИБІР (CASE)

Дуже часто ця конструкція недооцінюється програмістами. Приклад її використання:

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

КОЛИ Поточний Довідник.

«Послуга»

КІНЕЦЬ ЯК ВидНоменклатури

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

Приклад поверне текстове значення «Товар» або «Послуга» у полі «ВидНоменклатури».

ДЕ (WHERE)

Конструкція мови запитів 1C, що дозволяє накласти відбір на отримані дані. Врахуйте, що від сервера система отримує всі дані, а потім вони відбираються за даним параметром.

ВИБРАТИ
Довідник.Найменування
З
Поточний Довідник. Номенклатура ЯК Поточний Довідник
ДЕ Поточний Довідник. Послуга = ІСТИНА

У прикладі ми відбираємо записи, які мають значення реквізиту «Послуга» встановлено у положення «Істина». У цьому прикладі можна було б і такою умовою:

«ДЕ Послуга»

По суті ми відбираємо рядки, у яких вираз після ключового слова дорівнює «Істина».

У виразах можна використовувати прямі умови:

ДЕ Код = "005215"

За допомогою оператора «ЗНАЧЕННЯ()» в умовах використовувати звернення до визначених елементів та перерахувань у запиті 1С:

ДЕ ТипНоменклатури = Значення (Перерахування. Типи Номенклатури. Товар)

Значення часу можуть бути зазначені таким чином:

ДЕ ДатаНадходження > ДАТАВРЕМЯ(2012,01,01):

Найчастіше умови вказуються у вигляді параметрів, що передаються в запит:

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

ДЕ Номенклатурна група = & Номенклатурна група

Умову можна накласти на тип реквізиту, якщо він складового типу:

Якщо необхідно обмежувати відбір зі списку значень або масиву, можна зробити так:

ДЕ РеєстрНакопичення.Реєстратор В (&СписокДокументівДля Відбору)

Умова може бути складна, що складається з декількох умов:

ДЕ ДатаНадходження > ДАТАВРЕМЯ(2012,01,01) І НоменклатурнаГрупа=НоменклатурнаГрупа І НЕ Послуга

ЗГРУПУВАТИ ПО (GROUP BY)

Конструкція мови запитів 1С 8.2 використовується для групування результату.

Наприклад:

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

ЗГРУПУВАТИ ПО
НадходженняТоварівПослугТовари.Товар

Цей запит підсумує всі надходження за сумою та кількістю у розрізі номенклатури.

Крім ключового слова СУМАможна використовувати інші агрегатні функції: КІЛЬКІСТЬ, КІЛЬКІСТЬ РІЗНИХ, МАКСИМУМ, МІНІМУМ, СЕРЕДНЕ.

МАЮЧІ (HAVING)

Конструкція, про яку часто забувають, але вона дуже важлива та корисна. Вона дозволяє вказати відбір у вигляді агрегатної функції, цього не можна зробити у конструкції ДЕ.

Приклад використання МАЮЧІ у запиті 1С:

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

ЗГРУПУВАТИ ПО
Надходження ТоварівПослугТовари.товар

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

Так ми відберемо кількість товарів, яких надійшло понад 5 штук.

ЗНАЧЕННЯ()

Наприклад:

ДЕ Банк = Значення (Довідник. Банки. Порожнє Посилання)

ДЕ ВидНоменклатури = Значення(Довідник.ВидиНоменклатури.Товар)

ДЕ ТипНоменклатури= Значення(Перерахування.ТипиНоменклатури.Послуга)

ТИП у запиті

Тип даних можна перевірити так: за допомогою функцій ТИП() та ТИПЗНАЧЕННЯ() або за допомогою логічного оператора ПОСИЛАННЯ.

ВИРАЗИТИ()

Оператор Виразити у запитах 1С служить перетворення типів даних.

Синтаксис: ВИРАЗИТИ(<Выражение>ЯК<Тип значения>)

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

У практичному застосуванні оператор Виразити() дуже часто використовується для перетворення полів необмеженої довжини, тому що поля необмеженої довжини не можна відбирати, групувати тощо. Якщо такі поля не перетворювати, Ви отримаєте помилку Не можна порівнювати поля необмеженої довжини та поля несумісних типів.

ВИБРАТИ
Контактна інформація. Об'єкт,
ВИРАЗИТИ(КонтактнаяИнформация.Представление ЯК РЯДКУ(150)) ЯК Подання
З
РеєстрДовідок.КонтактнаІнформація ЯК КонтактнаІнформація

ЗГРУПУВАТИ ПО
ВИРАЗИТИ(КонтактнаяИнформация.Представление ЯК РЯДКУ(150)),
Контактна інформація. Об'єкт

Є NULL (ISNULL)

Досить корисна функція мови запитів 1С, яка перевіряє значення в записі, і якщо воно дорівнює NULL,то дозволяє замінити своє значення. Найчастіше використовується при отриманні віртуальних таблиць залишків та оборотів, щоб приховати NULLі поставити зрозумілий 0 (нуль).

Є NULL (Податки Перед Місяця. Застосована Льгота ФСС, 0)

Така функція мови запитів 1С Є NULL за відсутності значення поверне нуль, що дозволить уникнути помилки.

З'ЄДНАННЯ (JOIN)

З'єднання бувають 4 типи: ЛІВОЕ, ПРАВО, ПОВНЕ, ВНУТРІШНЄ.

ЛІВОЕ І ПРАВОЕ З'ЄДНАННЯ

З'єднання використовуються для зв'язку двох таблиць за певною умовою. Особливість при ЛІВОМУ З'ЄДНАННІу тому, що ми беремо першу вказану таблицю повністю та прив'язуємо за умовою другу таблицю. Поля другої таблиці, які вдалося прив'язати за умовою, заповнюються значенням NULL.

Приклад лівого з'єднання у запиті 1С:

Поверне всю таблицю і заповнить поле «Банк» лише в тих місцях, де буде дотримуватися умова «Контрагенти. Найменування = Банки. Найменування». Якщо умови не дотримуються, у полі Банк буде встановлено NULL.

ПРАВА З'ЄДНАННЯ у мові 1С 8.3абсолютно аналогічно ЛІВОМУ з'єднанню, за винятком однієї відмінності: ПРАВОМУ З'ЄДНАННІ"Головна" таблиця - друга, а не перша.

ПОВНЕ З'ЄДНАННЯ

ПОВНЕ З'ЄДНАННЯвідрізняється від лівого та правого тим, що виводить усі записи з двох таблиць, з'єднує лише ті, які може з'єднати за умовою.

Наприклад:

ПОВНЕ З'ЄДНАННЯ
Довідник. Банки ЯК Банки

ПЗ

Мова запитів поверне обидві таблиці лише за виконаною умовою З'єднати записи. На відміну від лівого/правого з'єднання можлива поява NULL у двох полях.

ВНУТРІШНЯ З'ЄДНАННЯ

ВНУТРІШНЯ З'ЄДНАННЯвідрізняється від повного тим, що виводить ті записи, які змогли з'єднати за заданою умовою.

Наприклад:

З
Довідник.Контрагенти ЯК Клієнти

ВНУТРІШНЯ З'ЄДНАННЯ
Довідник. Банки ЯК Банки

ПЗ
Клієнти. Найменування = Банки. Найменування

Цей запит поверне лише рядки, в яких банк і контрагент мають однакову назву.

Висновок

Це лише невелика частина синтаксису з мови запитів 1С 8, надалі я спробую розглянути докладніше деякі моменти, показати і багато іншого!

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

Мова запитів 1с підприємства 8 — Структура оператора ВИБРАТИ

Розглянемо структуру оператора ВИБРАТИ (у квадратних дужках вказані необов'язкові частини оператора). Мова запитів 1С надає широкий набір інструментів створення вибірок даних.

ВИБРАТИ [ДОЗВОЛЕНІ] [РІЗНІ] [ПЕРШІ A] [Поле1] [ЯК Псевдонім1], [Поле2] [ЯК Псевдонім2], ... [ПолеM] [Як ПсевдонімB] ЕННЕ З'ЄДНАННЯ ][ЛІВОЕ З'ЄДНАННЯ][ПОВНЕ З'ЄДНАННЯ] Таблиця2 ЯК ПсевдонімТаблиці2 [[ВНУТРІШНЕ З'ЄДНАННЯ][ЛІВОЕ З'ЄДНАННЯ][ПОВНЕ З'ЄДНАННЯ] ... ПЗ Вираз1 [І Вираз2]...[І ВиразE]] ... [ТаблицяF ЯК ПсевдонімТаблиціF] ... ] [ЗГРУПУВАТИ ПО ГрупувальнеПоле1[,] ... [УгрупованняПолеG]] [ДЕ Вираз1 [І Вираз2] ... [І Вираз H]] [ОБ'ЄДНАТИ ВСЕ...] [; ...] [ІНДЕКСУВАТИ ЗА ПСЕВДОНІМ1 ... ПСЕВДОНІМB] [ПІДСУМКИ [АгрегатнаФункція(Поле1)][,] [АгрегатнаФункція(Поле2)][,] ... [АгрегатнаФункція(ПолеI)] ПО [ЗАГАЛЬНІ][,] [ УгрупованняПоле1][,] ... [УгрупованняПолеj]]

Ключові слова та блоки роботи з полями

  • ВИБРАТИ— ключове слово, що означає початок оператора;
  • ДОЗВОЛЕНІвказує, що у вибірку повинні потрапляти записи таблиць, доступ до читання яких дозволено даного пользователя;
  • РІЗНІвказує, що у вибірку повинні потрапляти лише різні (з усіх полів) стоки. Іншими словами, з вибірки будуть виключені рядки, що повторюються;
  • ПЕРШІ Aякщо вказати це ключове слово, то вибірку потраплять лише перші A з обраних запитом рядків, де A — натуральне число;
  • Блок полів— у цьому блоці вказуються поля, які потрібно включити у вибірку. Ці поля трапитимуть стовпцями вибірки. У найпростішому випадку поле виглядає так: ПсевдонімТаблиці.Ім'яПоляТаблиці ЯК ПсевдонімПоля

    Таким чином ми вказуємо з якої таблиці ми беремо це поле. Мова запитів 1С дозволяє вказувати будь-які псевдоніми, але вони не повинні повторюватися в одному операторі ВИБРАТИ. Поле може бути і складнішим, воно може складатися з різних комбінацій полів таблиць, функцій мови запитів та агрегатних функцій, але в цьому уроці ми не стосуватимемося цих випадків;

Ключові слова та блоки роботи з таблицями

  • ПОМІСТИТИ Ім'яТимчасовоїТаблиці- ключове слово ПОМІСТИТИпризначено для створення тимчасової таблиці з певним ім'ям, яка буде зберігатися в оперативній пам'яті в даному сеансі 1С 8, доки він не завершиться або доки тимчасова таблиця не буде знищена. Слід зауважити, що імена тимчасових таблиць в одному сеансі 1С 8 не повинні повторюватися;
  • Блок таблиць та зв'язків— у блоці вказуються всі таблиці, що використовуються в даному запиті, а також зв'язки між ними. Починається блок із ключового слова З,за ним слідує ім'я та псевдонім першої таблиці. Якщо ця таблиця пов'язані з іншими таблицями, то вказуються зв'язку. Мова запитів 1С містить наступний набір типів зв'язків:
    • ВНУТРІШНЯ З'ЄДНАННЯ- Запис з лівої таблиці потрапить у вибірку тільки при виконанні умови зв'язку, запис з правої таблиці потрапить у вибірку тільки при виконанні умови зв'язку;
    • ЛІВОЕ З'ЄДНАННЯ- Запис з лівої таблиці потрапить у вибірку в будь-якому випадку, запис з правої таблиці потрапить у вибірку тільки при виконанні умови зв'язку;
    • ПОВНЕ З'ЄДНАННЯ- Запис з лівої таблиці потрапить у вибірку спочатку в будь-якому випадку, потім тільки при виконанні умови зв'язку, запис з правої таблиці потрапить у вибірку спочатку в будь-якому випадку, потім тільки при виконанні умови зв'язку. При цьому повторювані рядки, що вийшли в результаті зв'язку, виключаються з вибірки.

    Після типу зв'язку вказується ім'я та псевдонім другої таблиці. Далі слідує ключове слово ПЗ, після нього слідують умови зв'язку, пов'язані між собою логічними операторами І, АБО.Кожен вираз за умови має повертати значення логічного типу (Істина, Брехня). Якщо перша таблиця пов'язана ще з якимись таблицями, крім другої, то знову вказується тип з'єднання і так далі. Кожна з таблиць, що беруть участь у зв'язку у свою чергу, може бути пов'язана з іншими таблицями, це показано в схемі структури запиту. Якщо таблиця не пов'язана з першою, вона вказується без типу з'єднання, далі можуть слідувати її зв'язку і так далі;

Ключові слова та блоки перетворення даних

  • Блок угруповань- Цей блок служить для групування рядків таблиці. Рядки об'єднуються в одну, якщо значення полів, зазначених після ключового слова ЗГРУПУВАТИ ПОвиявляються однаковими. У цьому решта поля підсумовуються, усереднюються, максимізуються, чи мінімізуються з допомогою агрегатних функцій. Агрегатні функції використовують у блоці полів. Приклад: Максимум(ПсевдонімТаблиці.Ім'яПоляТаблиці) ЯК ПсевдонімПоля
  • Блок умов— у цьому блоці після ключового слова ДЕвказуються умовні вирази розділені логічними операторами І, АБОДля того, щоб будь-який з обраних рядків потрапив у вибірку, необхідно, щоб усі умови в сукупності мали значення Істина.
  • ОБ'ЄДНАТИ ВСЕ— це ключове слово використовується для об'єднання запитів (операторів ВИБРАТИ). Мова запитів 1С дозволяє об'єднувати кілька запитів на один. Для того, щоб запити можна було об'єднати, у них повинен бути однаковий набір полів;
  • «;» - точка з комою використовується для поділу незалежних один від одного операторів ВИБРАТИ;
  • ІНДЕКСУВАТИ ПО- ключове слово використовується для індексації полів, зазначених після нього;
  • Блок підсумків- використовується для побудови деревоподібних вибірок. По кожному з групувальних полів, вказаних після ключового слова ПЗ,буде створено окремий рядок у вибірці. У цьому рядку за допомогою агрегатних функцій буде пораховано підсумкові значення полів, зазначених після ключового слова ПІДСУМКИ.

Бажаєте продовжити вивчати мову запитів 1с 8? Тоді прочитайте наступну статтю.

Як задати відбір за типом документа?
Як вказати умову відбору не певного значення?
Як у мові запитів 1С відібрати незаповнене значення?
Яка умова вказати у запиті після ключового слова «ДЕ», коли потрібно зробити відбір по незаповненим полям?

Код 1C v 8.х Запит.
"ВИБРАТИ
| усЕдиниціЗберігання.Посилання

| Довідник.усединицізберігання ЯК усединицізберігання"

// Приклад 1. Порівняння з не заповненим булевим значенням:
|ДЕ
| усЕдиниціЗберігання.ДозволитиВідбірЗРезервноїЗони = Брехня

// Приклад 2. але якщо це булево визначено, краще так: // умова на негативне булево:
|ДЕ
| НЕ усединиціЗберігання.ДозволитиВідбірЗРезервноїЗони

// Приклад 3. вибірка за умовою незаповненого поля, що має тип "довідник конкретного типу"
|ДЕ
| усЕдиниціЗберігання.АктивнаОбластьВідбору = ЗНАЧЕННЯ(Довідник.усОбластіВідбору.ПустаПосилання)

// Приклад 3а. вибірка за умовами не заповненого поля, що має тип "документ конкретного типу"
|ДЕ
| НашРегістрВідомостей.Документ = ЗНАЧЕННЯ(Документ.НашДокумент.ПустаПосилання)

// Приклад 3б. вибірка за умовами не заповненого поля, що має тип "документи різних типів" (складове поле)
|ДЕ
| (НашРегістрВідомостей.Документ = ЗНАЧЕННЯ(Документ.НашДокумент1.ПустаПосилання)
| АБО НашРегістрДовідок.Документ = ЗНАЧЕННЯ(Документ.НашДокумент2.ПустаПосилання)
| АБО ... (І т.д. - послідовно перераховуємо умови для всіх можливих типів цього складового поля))

// Приклад 4. або навпаки, якщо потрібно вибрати заповнене значення типу "рядок", то допоможе умова:
|ДЕ
| усЕдиниціЗберігання. Найменування > """"

// Приклад 5. якщо потрібно вибрати документи конкретного типу, при складеному типі даних, наприклад у регістрі "Завдання, що виконуються" ресурс "Завдання" має складовий тип, серед значень якого можливий документ "Відбір"
|ДЕ
| ВИРАЗИТИ(РеєстрВідомостейВиконуваніЗавдання.Завдання ЯК Документ.Отбор) ПОСИЛАННЯ Документ.Отбор

// Приклад 5а. Ще аналогічний приклад, коли потрібно вибрати документи конкретного типу
| ВИБІР
| КОЛИ ВИРАЗИТИ(агВідповідністьДокументів.ДокументБУ ЯК Документ.НадходженняТоваровПослуг) ПОСИЛАННЯ Документ.НадходженняТоварівПослуг
| ТОДИ "Надходження Товарів Послуг"
| КОЛИ ВИРАЗИТИ(агВідповідністьДокументів.ДокументБУ ЯК Документ.РеалізаціяТоварівПослуг) ПОСИЛАННЯ Документ.РеалізаціяТоваровПослуг
| ТОДИ "Реалізація Товарів Послуг"
| Інакше """"
| КІНЕЦЬ ЯК ВидДокумента

// Приклад 6. Вибір за умовою не певного значення:
|ДЕ
| ЗбереженіНалаштування.Користувач = НЕВИЗНАЧЕНО

// Приклад 7. Вибір за видом руху "Прихід" регістру накопичення, "Витрата" - аналогічно):
|ДЕ
| РегТовариВРоздробі.ВидиРуху = ЗНАЧЕННЯ(ВідРухуНакопичення.Прихід)

// Приклад 8. Як у запиті вказати, що виконувати запит не потрібно (наприклад, потрібно програмно, залежно від якогось)
// Повернути порожній результат запиту -
// Запит.Текст = СтрЗаменить(Запрос.Текст, "ДЕ Док.Посилання = &ДокументПосилання", "ДЕ БРЕХНЯ");).
// Для цього достатньо додати умову "Де Брехня".
// До речі, незалежно від обсягу даних, що запитуються у вибірці, такий запит буде виконаний миттєво.
|ДЕ БРЕХНЯ

// Приклад 9. Перевірка те що, що результат виконання запиту містить дані:
Якщо НЕ Запит.Виконати().Порожній() Тоді

// Приклад 10. Вибір за умовою незаповненої дати:
|ДЕ
| тбРядки.ДатаСкасування = ДАТАВРЕМЯ(1, 1, 1)