Приклади запитів до роботи з ієрархічними довідниками. Оператор "в ієрархії" у запиті 1с запит в ієрархії зі списку

Головна / Захист

У цій статті ми хочемо обговорити з Вами всі функції мови запитів 1с, а також конструкції мови запитів. Чим відрізняється функція від конструкції? Функція викликається з дужками та можливими параметрами у них, а конструкція пишеться без дужок. Безумовно всі конструкції та функції мови запитів 1сроблять процес отримання даних гнучким та багатофункціональним. Дані функції та конструкції застосовні до полів запиту, а деякі також застосовні за умов.

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

Оскільки зрозумілий опис функцій мови запитів 1страпляється набагато рідше, ніж опис конструкцій, ми вирішили почати розглядати саме функції. Тепер давайте розберемо кожну окремо, описавши її призначення, синтаксис та приклад використання, отже:

1. Функція ДАТА ЧАС- Ця функція створює константне поле з типом "Дата".

Синтаксис: ДАТА ЧАС(<Год>,<Месяц>,<День>,<Час>,<Минута>,<Секунда>)

Приклад використання:

2. Функція Різноманітність- Повертає різницю двох дат в одному з вимірювань (рік, місяць, день, година, хвилина, секунда). Вимірювання передається у параметрі.

Синтаксис: РІЗНІСТЬДАТ(<Дата1>, <Дата2>, <Тип>)

Приклад використання:

Запит.Текст = "ВИБРАТИ | РІЗНЕСТЬДАТ(ДАТАВРЕМЯ(2015, 4, 17), ДАТАВРЕМЯ(2015, 2, 1), ДЕНЬ) | ЯК Колводнів";

3. Функція ЗНАЧЕННЯ- задає константне поле з наперед визначеним записом з бази даних, також можна отримати порожнє посилання будь-якого типу.

Синтаксис: ЗНАЧЕННЯ(<Имя>)

Приклад використання:

Запит.Текст = "ВИБРАТИ //зумовлений елемент | ЗНАЧЕННЯ(Довідник.Валюти.Долар) ЯК Долар, //порожнє посилання | ФізОсоба) ЯК ФізОбличчя, / / ​​зумовлений рахунок |

4. Функція ВИБІР- Перед нами аналог конструкції ЯКЩО який використовується в коді, тільки ця використовується в запитах 1С.

Синтаксис: ВИБІР КОЛИ<Выражение>ТОДІ<Выражение>Інакше<Выражение>КІНЕЦЬ

Приклад використання:

Запрос.Текст = //якщо сума більше 7500, тоді має бути знижка 300 рублів, //тому якщо умова спрацьовує то функція //повертає Сума - 300 //інакше запит поверне просто Сума "ВИБРАТИ | ВИБІР | КОЛИ ТЧ Надходження.Сума > 7500 | ТОДІ ТЧНадходження.Сума - 300 | Інакше ТЧНадходження.Сума |

5. Функція ВИРАЗИТИ- дозволяє виразити константне поле певним типом.

Синтаксис: ВИРАЗИТИ(НазваПоля ЯК НазваТипу)

Приклад використання:

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

Є ще варіант використання функції ВИРАЗИТИ в полях змішаних типах, де такі зустрічаються? Найпростіший приклад це "Реєстратор" у будь-якого регістру. То навіщо нам може знадобитися уточнювати тип у реєстраторі? Давайте розглянемо ситуацію, коли ми з реєстратора вибираємо поле "Номер", з якої таблиці буде обраний номер? Правильна відповідь із усіх! Тому щоб наш запит працював швидко, слід вказувати явний тип за допомогою функції ВИРАЗИТИ

Приклад використання:

Запит.Текст = "ВИБРАТИ | ВИРАЗИТИ(Номенклатура.Коментар ЯК Рядок(300)) ЯК Коментар, | ВИРАЗИТИ(Номенклатура.Сума ЯК Число(15,2)) ЯК Сума |З | Довідник.Номенклатура ЯК

6. Функція ISNULL(альтернативне написання Є NULL) - якщо поле має тип NULL, воно замінюється на другий параметр функції.

Синтаксис: Є NULL (<Поле>, <ПодставляемоеЗначение>)

Приклад використання:

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

Запит.Текст = //Вибираємо всю номенклатуру і залишки по ній //якщо залишокв але якоїсь номенклатури немає то буде поле //NULL яке заміниться значенням 0 "ВИБРАТИ | Ном.Посилання, | Залишок |З |Довідник.Номенклатура ЯК Ном |Ліве З'єднання РеєстрНакопичення.ТовариНаСкладах.Залишки ЯК ТовариНаСкладахЗалишки |ПЗ (ТовариНаСкладахЗалишки.Номенклатура = Ном.Посилання)";

7. Функція ПРЕДСТАВЛЕННЯ- дозволяє одержати подання поля запиту.

Синтаксис: ПРЕДСТАВЛЕННЯ(<НаименованиеПоля>)

Приклад використання:

Запит.Текст = "ВИБРАТИ | ПРЕДСТАВЛЕННЯ(ВільніЗалишкиЗалишки.Номенклатура) ЯК Номенклатура, | ПРЕДСТАВЛЕННЯ(ВільніЗалишкиЗалишки.Склад) ЯК Склад, |

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

Вище ми розглянули з Вами функції мови запитів 1с, тепер настав час розглянути конструкції у мові запитів 1с, вони не менш важливі та корисні, приступаємо.

1. Конструкція ПОСИЛАННЯ- являє собою логічний оператор перевірки типу посилання. Найчастіше зустрічається під час перевірки поля складеного типу на конкретний тип. Синтаксис: ПОСИЛАННЯ<Имя таблицы>

Приклад використання:

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

2. Конструкція МІЖ- Цей оператор перевіряє чи входить значення у вказаний діапазон.

Синтаксис: МІЖ<Выражение>І<Выражение>

Приклад використання:

Запрос.Текст = //отримаємо всю номенклатуру код якої лежить в діапазоні від 1 до 100 "ВИБРАТИ | Номенклатура. Посилання | З | Довідник. Номенклатура ЯК Номенклатура | ДЕ | Номенклатура.

3. Конструкція В та В ІЄРАРХІЇ- перевіряють чи знаходиться значення в списку, що передається (як списку можуть передаватися масиви, таблиці значень і т.д.). Оператор В ІЄРАРХІЇ дозволяє переглядати ієрархію (приклад використання План Рахунків).

Синтаксис: В(<СписокЗначений>), В ІЄРАРХІЇ(<СписокЗначений>)

Приклад використання:

Запрос.Текст = // вибираємо всі субрахунки рахунку "ВИБРАТИ | Госпрозрахунковий. Посилання ЯК Рахунок | З | План Рахунок.Госпрозрахунковий ЯК Хозрозрахунковий | ДЕ | Госпрозрахунковий.

4. Конструкція ПОДІБНО- Ця функція дозволяє нам порівнювати рядок із шаблоном рядка.

Синтаксис: ПОДІБНО "<ТекстШаблона>"

Варіанти шаблону рядка:

% - Послідовність, що містить будь-яку кількість довільних символів.

Один символ довільний.

[...] - будь-який одиночний символ, або послідовність символів із перелічених усередині квадратних дужок. У перерахуванні можуть задаватися діапазони, наприклад a-z, що означають довільний символ, що входить до діапазону, включаючи кінці діапазону.

[^...] - будь-який одиночний символ, або послідовність символів з перелічених усередині квадратних дужок крім тих, які перелічені за значком заперечення.

Приклад використання:

Запрос.Текст = //знайдемо всю номенклатуру яка містить корінь ТАБУР і починається //або з маленької або з великої літери т "ВИБРАТИ | Номенклатура.Посилання |З | Довідник.Номенклатура ЯК Номенклатура |ДЕ | Товари.Найменування ПОДІБНО ""[Тт ]абур%""";

5. Конструкція ДОЗВОЛЕНІ- цей оператор дозволяє вибрати лише записи з БД, куди викликає має право читання. Ці права налаштовуються лише на рівні записів (RLS).

Синтаксис: ДОЗВОЛЕНІ пишеться після ключового слова ВИБРАТИ

Приклад використання:

Запит.Текст = "ВИБРАТИ ДОЗВОЛЕНІ | Контрагенти.Посилання |З | Довідник.Контрагенти ЯК Контрагенти";

6. Конструкція РІЗНІ- дозволяє вибрати записи, у яких відсутні повторні записи.

Синтаксис: РІЗНІ пишеться після ключового слова ВИБРАТИ

Приклад використання:

Запрос.Текст = // вибирає записи на які є права у читача "ВИБРАТИ РІЗНІ | Контрагенти. Найменування | З | Довідник. Контрагенти ЯК Контрагенти";

Також Конструкція РІЗНІ може використовуватися з оператором ДОЗВОЛЕНІ та іншими операторами.

Приклад використання:

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

7. Конструкція ПЕРШІ- вибирає вказану в параметрі кількість записів із результату запиту.

Синтаксис: ПЕРШІ<число>

Приклад використання:

Запит. Текст = // Вибирають перші 4 номери ВМД з довідника "ВИБРАТИ ПЕРШІ 4 | Номери ВМД. Посилання | З | Довідник.

8. Конструкція ДЛЯ ЗМІНИ- дозволяє заблокувати таблицю, працює лише у транзакціях (актуально лише автоматичних блокувань).

Синтаксис: ДЛЯ ЗМІНИ<НаименованиеТаблицы>

Приклад використання:

Запит.Текст = "ОБРАТИ |

9. Конструкція ПОРЯДОЧИТИ ПО- впорядковує дані щодо певного поля. Якщо полем є посилання, то при установці прапора Автоупорядкуваннябуде відбуватися сортування за поданням посилання, якщо прапор вимкнено, то посилання сортуються за старшинством адреси посилання в пам'яті.

Синтаксис: ВПОРЯДКУВАТИ ЗА<НаименованиеПоля>Автоупорядкування

Приклад використання:

Запит.Текст = "ВИБРАТИ | Вільні Залишки Залишки. Номенклатура ЯК Номенклатура, | Вільні Залишки Залишки. ЧИВАННЯ";

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

Синтаксис: ЗГРУПУВАТИ ПО<НаименованиеПоля1>, .... , <НаименованиеПоляN>

Приклад використання:

Запит.Текст = "ВИБРАТИ | ТовариНа Складах.Номенклатура ЯК Номенклатура, | ТовариНаСкладах.Склад, | кладах.Склад";

11. Конструкція МАЮЧІ- дозволяє застосувати агрегатну функцію умови вибірки даних, схожа на конструкцію ДДЕ.

Синтаксис: МАЮЧІ<агрегатная функция с условием>

Приклад використання:

Запит.Текст = // вибирає згруповані записи де поле У наявності більше 3 " ВИБРАТИ | Товари на складах. Номенклатура ЯК Номенклатура, | Товари на складах. склад, | СУМА (Товари на складах. | ТовариНаСкладах.Номенклатура, | ТовариНаСкладах.Склад | |МІЮЧІ | СУМА(ТовариНаСкладах.ВНаявності) > 3" ;

12. Конструкція ІНДЕКСУВАТИ ПО- Використовується для індексації поле запиту. Запит з індексацією довше виконується, але прискорює пошук індексованих полів. Можна використовувати лише у віртуальних таблицях.

Синтаксис: ІНДЕКСУВАТИ ПО<Поле1, ... , ПолеN>

Приклад використання:

Запрос.Текст = " ВИБРАТИ | Тз. Найменування ОС, | Тз. Номер Папки, | Тз. КодОС, | Тз. Термін, | Тз. Тип | ПОМІСТИТИ Дані Тз | .КодОС";

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

Синтаксис: ДЕ<Условие1 ОператорЛогСоединения УсловиеN>

Приклад використання:

Запит.Текст = //вибираються всі записи у яких КомпенсаціяЗалишок<>0 і //СуммаДляРозчКомпОстаток > 100 " ВИБРАТИ | КомпенсаціяРПостатки.Контрагент, | КомпенсаціяРПостатки.Дитина, | КомпенсаціяРпостатки.КомпенсаціяЗалишок, | КомпенсаціяРпостач. Статті ЯК КомпенсаціяРПОстатки |ДЕ |КомпенсаціяРПОстатки.КомпенсаціяЗалишок<>0 | І КомпенсаціяРПОстатки.СуммаДляРозчКомпОстаток > 100" ;

14. Конструкція ПІДСУМКИ... ЗА ЗАГАЛЬНІ- застосовується для підрахунку результатів, у конструкції вказуються поля якими вважатимуться підсумки і агрегатні функції які застосовуються до підсумковим полям. При використанні підсумків на кожне поле наступне після конструкції ПІДСУМКИ проводиться групування даних. Є необов'язкова конструкція ЗАГАЛЬНІ, її використання також забезпечує додаткове угруповання. Приклад результату запиту ви побачите нижче.

Синтаксис: ПІДСУМКИ<АгрегатнаяФункция1, ... , АгрегатнаяФункцияN>ПЗ<ОБЩИЕ> <Поле1, ... , ПолеN>

Приклад використання:

Запит.Текст = "ВИБРАТИ | Розрахунки.ДоговірКонтрагенту.ВидДоговіру ЯК ВидДоговіру, | Розрахунки.ДоговірКонтрагенту ЯК Договір, | Розрахунки.Контрагент, | | СУМА (Залишок) |ПО | ЗАГАЛЬНІ, | ВидДоговору ";

На малюнку обведені угруповання які утворилися в ході виконання запиту, найвище відноситься до секції ЗАГАЛЬНІ, а друге до поля ДоговірКонтрагентуВідДоговіру.

Що таке довідник 1с і для чого він потрібний? Довідник зберігає умовно-постійну інформацію, тобто. інформація, яка на тривалому проміжку часу майже не змінюється. Наприклад, довідник "Номенклатура" містить перелік товарів, що продаються або випускаються. Також довідник може містити безліч властивостей, що описують елемент довідника.

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

Створивши новий довідник, ми побачимо наступну картину.

Розглянемо усі його закладки.

Основні

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

Ієрархія

На цій закладці можна налаштувати глибину вкладення елементів довідника. За допомогою цієї настройки зручно розмежовувати та деталізувати елементи за якимись критеріями. Наприклад, товари "Шафи" в одній групі, а товари "Столи" в іншій. За умовчанням під час створення довідник представляє список елементів. Якщо поставити прапорець Ієрархічний довідник, кожен елемент може бути підпорядкований іншому елементу (групі). Нижче наведено варіанти налаштування цієї закладки та зміна відображення в режимі користувача.

Вид ієрархії:

Ієрархія груп та елементів

При цьому параметрі вкладення елементів може бути тільки в групи (папки).

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

Розміщувати групи зверху

При установці цього прапорця групи завжди будуть вгорі, інакше будуть розташовані в порядку сортування, наприклад:

Обмеження кількості рівнів ієрархії

Якщо тут прапорець не встановлений, то вкладеність необмежена.

Якщо прапорець встановлено, нижче можна вказати кількість рівнів.

Власники

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

У полі "Список власників довідника" вказується список довідників, до яких належать елементи даного довідника.

Нижче в полі «Використання підпорядкування» вказується, чому підпорядковуватимуться елементи даного довідника.

Як дізнатися програмно довідник ієрархічний чи ні

Для цього потрібно звернутися до метаданих

ЦеІєрархічнийДовідник = Метадані.Довідники.Контрагенти.Ієрархічний;

Продовження слідують…

Довідники 1С - спеціалізований об'єкт дерева метаданих, який слугує для зберігання статичної інформації довідкового характеру. Наприклад, у типових конфігураціях можна побачити такі види: , номенклатура, співробітники, основні засоби і т.д. Інформація у довідниках зазвичай не змінюється. Довідники надалі використовуються практично у всіх об'єктах обліку як розріз обліку чи довідкова інформація.

Нижче розглянемо налаштування та проектування довідника з конфігуратора на прикладі довідника «Номенклатура».

Вкладка «Основні»

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

Вкладка «Ієрархія довідника»

Тут встановлюється ієрархічність довідника.

Ієрархія в 1С 8.3 буває двох типів - груп та елементів» та « елементів«. Відрізняється тим, що у першому випадку батьком (папкою) може лише папка (група), тоді як у другому випадку батьком може бути елемент.

"Розміщувати групи зверху" - прапор відповідає за відображення груп у формі списку.

Також у налаштуваннях можна обмежити кількість груп ієрархії довідника відповідним налаштуванням.

Вкладка «Власники»

Довідник може бути підпорядкований іншому довіднику. З погляду конфігурування 1С 8.3 це, що з підлеглого елемента стає обов'язковим реквізит «Власник». Приклад такого зв'язку довідників у типових конфігураціях "Номенклатура - Одиниці Вимірювання", "Контрагенти-Договори Контрагентів".

Власником довідника можуть бути такі об'єкти метаданих: , .

Вкладка «Дані»

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

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

Довідник має набір стандартних реквізитів, які не редагуються програмістом 1С 8.2, список їх можна побачити, натиснувши кнопку «Стандартні реквізити»:

Зупинюся на кожному детальніше:

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

На вкладці «Дані» також вказується подання довідника в системі, до версії 8.2.16 подання могло бути лише Кодом або Найменуванням. У нових версіях платформи (починаючи з 8.3) подання можна описати самостійно в модулі менеджера за допомогою обробника «Обробка ОтриманняПодання».

Вкладка «Нумерація»

Тут вказуються налаштування довідника щодо нумерації. Рекомендується використовувати саме автонумерацію. Контроль унікальності — прапор, який допомагає, якщо потрібно зробити код унікальним. Якщо зі встановленим прапором Ви спробуєте записати елемент довідника з неунікальним кодом, у 1С Ви отримаєте повідомлення «Код довідника став неунікальним».

Серія кодів визначає, як нумерувати довідник, можна ввести нумерацію довідника в розрізі власника. Наприклад, контрагент «Роги і копита» матиме свою нумерацію договорів — «1, 2, 3» тощо.

Вкладка «Форми»

Тут описуються форми довідника. Якщо конфігурація запускається як у звичайному, так і керованому режимі, тоді вкладок із формами за замовчуванням буде дві: «основні» та «додаткові» — для звичайного та керованого програми різні.

На цій сторінці є важлива властивість довідника - ««. Це дуже зручна функція 1С 8, що дозволяє при заповненні даних у полі введення не заходити до довідника, а набрати його найменування, код або т.п. і вибрати зі списку потрібний елемент. Виглядає це так:

Вкладка «Інше»

На вкладці можна отримати швидкий доступ до основних модулів довідника – модуля об'єкта та модуля менеджера.

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

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

Конструкція "В ІЄРАРХІЇ" у запитах 1С:Підприємства 8.x дозволяє отримати підпорядковані елементи ієрархічного об'єкта конфігурації по заданому відбору. Сьогодні у статті розглянемо приклад її використання, а також дії платформи на боці СУБД та її вплив на продуктивність.

Використання

Розглянемо простий приклад використання конструкції "В ІЄРАРХІЇ". Під час виконання наступного запиту будуть отримані підпорядковані елементи ієрархічного довідника "Товари" для переданого значення змінної "Посилання".

Текст Запиту = " ВИБРАТИ | Товари . Посилання,| Товари . Артикул |З| Довідник . Товари ЯК|ДЕ | Товари . Посилання В ІЄРАРХІЇ(& Посилання)"

У тестовій базі довідник "Товари" має такі тестові дані:

Звичайно, на зображенні показані не всі записи довідника. Скріншот показує лише структуру зберігання даних у ієрархічному довіднику. У таблиці довідника зберігаються 10 груп верхнього рівня, у кожній з них міститься 5 вкладених груп із 200 елементами у кожній.

Повернемось до тестового запиту. Передаємо у параметр "&Посилання" посилання на групу "Група - 1" (див. скріншот вище). Тоді результат виконання запиту буде виглядати так:

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

Синтаксис мови запитів 1C:Підприємства та класичного SQLдуже схожі у деяких моментах. Але для виразу "В ІЄРАРХІЇ" немає аналога в мові запитів SQL, як, наприклад, для вираження мови запитів платформи "В" є аналогічний SQL-оператор "IN". Тому цікавою є робота платформи із СУБД при використанні даного оператора.

За лаштунками

Отже, почнемо. Для прикладу використовуватимемо раніше написаний запит до довідника "Товари". Аналізувати дії платформи будемо для двох ситуація:

  1. Як параметр "&Посилання" передамо групу верхнього рівня "Група 1" (як це ми зробили раніше).
  2. У параметр передамо посилання на групу "Група 1 - 1", вкладену в групу верхнього рівня "Група 1".

Тепер по порядку. У першому випадку платформа виконає такі дії на SQL-сервері:

1. Спочатку виконується SQL-запит отримання посилання на групу довідника, передану як параметр, і всіх підлеглих їй груп. Результат міститься в часовій таблиці "#tt1".

2. На другому етапі двічі виконується однаковий запит:

На скріншоті детально прокоментовано текст SQL-запиту. Якщо коротко, запит дозволяє вибрати підпорядковані елементи для груп, посилання на які знаходяться в тимчасовій таблиці. Залишається питання: "Навіщо запит виконується двічі?" Тут відповідь проста: спочатку запит отримує підлеглі елементи для груп першого рівня, які вже містяться у тимчасовій таблиці (див. пункт 1). Потім другий запит отримує підлеглі елементи для підлеглих груп другого рівня. Оскільки на третьому рівні ієрархії не присутня жодна група довідника, цей запит більше не виконується.

У нашому випадку, другий запит поверне порожній результат, оскільки для записів, що знаходяться на 3-му рівні ієрархії, немає підлеглих елементів (там немає жодної групи).

3. Для отримання кінцевого результату запиту платформа формує наступний SQL-запит:

Результат саме цього запиту надалі може оброблятися алгоритмами вбудованою мовою платформи. Таким чином, записи у часовій таблиці "#tt1" використовуються для встановлення умови вибірки з таблиці довідника "_Reference41".

4. На останньому кроці платформа 1С:Підприємство 8.x видаляє тимчасову таблицю "#tt1", оскільки надалі вона вже не використовуватиметься.

На цьому процес виконання оператора "В ІЄРАРХІЇ" завершено.Нагадаю, що розглянута послідовність дій на SQL-сервері була виконана, коли ми запит на стороні платформи передавали посилання на групу верхнього рівня "Група - 1". Але як поведеться платформа, якщо ми як параметр "&Посилання" передамо посилання на групу другого рівня "Група - 1 - 1"? Все відбудеться аналогічним чином, крім наступного моменту: вище, у другому етапі виконання SQL-запитів платформою, було написано, що запит для отримання підлеглих елементів виконувався двічі - у разі отримання підлеглих елементів для групи "Група - 1 - 1" це не так . Запит буде виконано лише один раз.

Справа в тому, що кількість запитів на одержання підлеглих елементів залежить від кількості груп ієрархії. Іншими словами, якщо на рівні ієрархії елементів міститься хоча б одна група, то буде виконано запит із пункту 2.

Вплив на продуктивність

Неправильне використання будь-якого оператора в запиті може призвести до неоптимальної роботи системи. Розглядається оператор "В ІЄРАРХІЇ" не виняток. Його потрібно застосовувати з обережністю, оскільки він набагато ускладнює алгоритм виконання SQL-запитів до бази і цим збільшує навантаження на сервер СУБД.

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

ВИБРАТИ Товари. Посилання З Довідник. Товари ЯК Товари ДЕ (Товари. Посилання В ІЄРАРХІЇ (& Посилання) АБО Товари. Посилання В ІЄРАРХІЇ (& Посилання1) АБО Товари. Посилання В ІЄРАРХІЇ (& Посилання2) )

Як можна здогадатися, запит призведе до формування безлічі SQL-запитів, що спричинить зниження продуктивності інформаційної системи.

Робіть висновки!

Висновки робити вам. Скажу лише, що оператор "В ІЄРАРХІЇ" використовується платформою для системи компонування даних, коли в умовах відбору присутні "У ГРУПІ", "У ГРУПІ З СПИСКУ" та інші. Думаю не варто пояснювати, що при неправильних маніпуляціях користувачі можуть поставити дуже складний відбір і підвищити навантаження на сервер 1С і СУБД в кілька разів. Давайте змінювати установки лише досвідченим користувачам.

Та й зрозуміло, при написанні власних механізмів звертайте увагу на оператор "В ІЄРАРХІЇ". Дуже зручний з одного боку і небезпечний з іншого.

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

Отримання елементів ієрархічного довідника, що у підпорядкуванні заданої групи

Для отримання підлеглих елементів ієрархічного довідника у мові запитів передбачено конструкцію В ІЄРАРХІЇ. Приклад використання У ІЄРАРХІЇ:


ВИБРАТИ
Номенклатура.
Номенклатура.ЗакупівельнаЦіна
З

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

Якщо ж нас цікавлять лише елементи та групи, що знаходяться безпосередньо у заданій групі, то такі елементи ми можемо отримати, встановивши умову на полі Батько. Приклад:


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

ДЕ
Номенклатура.Батько = Група

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

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

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

У цьому прикладі посилання елемента, для якого необхідно перевірити наявність дочірніх елементів, записується у параметр запиту "Батько". Після цього запиту необхідно перевірити результат на порожнечу. Якщо результат не порожній, підпорядковані записи є. Інакше – ні. Приклад:


Якщо Запит.Виконати().Порожній() Тоді
Повідомити("Зписів немає");
Інакше
Повідомити("Записи є");
КінецьЯкщо;

Отримання всіх батьків елемента

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


ПоточнийЕлементноменклатури = Елементноменклатура;

Запит = Новий Запит("ВИБРАТИ
| Номенклатура.Батько,
| Номенклатура.Батько.Батько,
| Номенклатура.Батько.Батько.
| Номенклатура. Батько. Батько. Батько. Батько,
| Номенклатура.Батьки.Батьки.Батьки.Батьки.Батьки.

| Довідник Номенклатура ЯК Номенклатура
|ДЕ
| Номенклатура.Посилання = &ПоточнийЕлементНоменклатури";

Поки що Істина Цикл
Запит.ВстановитиПараметр("Поточний Елемент Номенклатури", Поточний Елемент Номенклатури);
Результат = Запит.Виконати();
Якщо Результат.Порожній() Тоді
Перервати;
КінецьЯкщо;
Вибірка = Результат.Вибрати();
Вибірка.Наступний();
Для НомерКолонки = 0 За Результат.Колонки.Кількість() - 1 Цикл
ПоточнийЕлементНоменклатури = Вибірка[НомерКолонки];
Перервати;
Інакше
Повідомити(ПоточнийЕлементНоменклатури);
КінецьЯкщо;
КінецьЦикл;

Якщо ПоточнийЕлементНоменклатури = Довідники.Номенклатура.ПустаПосилання() Тоді
Перервати;
КінецьЯкщо;
КінецьЦикл;

У цьому прикладі у вікно службових повідомлень виводяться всі батьки для посилання, записаного у змінну Елемент Номенклатура. У циклі вибирається по 5 батьків заслання.

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

Виведення ієрархічного довідника у звіт

Для виведення ієрархічного довідника у звіт із збереженням ієрархії необхідно користуватися запитом аналогічним до наступного:


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

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

Для того, щоб групи довідника розміщувалися вище елементів, необхідно в даному запиті замінити пропозицію ПОРЯДОЧИТИ ПО на наступне:


ВПОРЯДКУВАТИ ЗА
Номенклатура.ЦеГрупа ІЄРАРХІЯ,
Найменування

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

Можлива також заміна пропозиції ПОРЯДОЧИТИ ПО на пропозицію автоупорядкування. І тут результат буде упорядкований відповідно до налаштуваннями довідника, тобто. якщо в довіднику зазначено, що групи повинні розташовуватися вище за елементи, то вони будуть розташовані вище.

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


ВИБРАТИ
Номенклатура.
Номенклатура.Найменування ЯК Найменування,
Номенклатура.ЗакупівельнаЦіна

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

ДЕ
(Номенклатура.ЦеГрупа = БРЕХНЯ)

ВПОРЯДОЧИТИ ПО Найменування

Отримання підсумків з ієрархії

Для отримання підсумків з ієрархії у запиті необхідно в пропозиції ПІДСУМКИ ПО вказати ключове слово ІЄРАРХІЯ після вказівки поля, за яким розраховуватимуться підсумки. Приклад звіту "Обороти номенклатури" з одержанням підсумків з ієрархії:


ВИБРАТИ

З

Номенклатура ІЄРАРХІЯ

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

У разі, коли не потрібні підсумки за елементами, а потрібні підсумки лише за групами, нам необхідно використовувати у підсумках конструкцію ТІЛЬКИ ІЄРАРХІЯ. Приклад:


ВИБРАТИ
Облік НоменклатуриОбороти.Номенклатура ЯК Номенклатура,
Облік Номенклатури Обороти. Номенклатура.
ОблікНоменклатуриОбороти.КількістьОборот ЯК КількістьОборот
З
Реєстр Накопичення. Облік Номенклатури.
ПІДСУМКИ СУМА(КількістьОбіг)
Номенклатура ТІЛЬКИ ІЄРАРХІЯ

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

© 2024 androidas.ru - Все про Android