Пакет запитів 1с 8.2 приклад. Прості запити. Історія з життя

Запитипризначені для отримання та обробки інформації з бази даних для надання користувачеві в необхідному вигляді. Під обробкою тут мається на увазі угруповання полів, сортування рядків, розрахунок підсумків тощо. Змінювати дані за допомогою запитів у 1С не можна!

Запит виконується відповідно до заданих інструкцій. текстом запиту. Текст запиту складається відповідно до синтаксису та правил мови запитів. Мова запитів 1С:Підприємство 8 засноване на базі стандартного SQL, але має деякі відмінності та розширення.

Схема роботи із запитом

Загальна схема роботи із запитом складається з кількох послідовних етапів:

  1. Створення об'єкта Запит та встановлення тексту запиту;
  2. встановлення параметрів запиту;
  3. Виконання запиту та отримання результату;
  4. Обхід результату запиту та обробка отриманих даних.

1. Об'єкт Запитмає властивість Текст, якому необхідно надати текст запиту.

// Варіант 1
Запит = Новий Запит;
Запит . Текст =
«ВИБРАТИ
| Курси Валют.
| Курси Валют.
| Курси Валют.Курс


|ДЕ
;

// Варіант 2
Запит = Новий Запит(«ВИБРАТИ
| Курси Валют.
| Курси Валют.
| Курси Валют.Курс

| РеєстрВідомостей.КурсиВалют ЯК КурсиВалют
|ДЕ
| КурсиВалют.Валюта = &Валюта»);

2. Встановлення значень параметрів здійснюється методом ВстановитиПараметр(< Имя>, < Значение>) . Параметри тексту запиту позначаються символом « & і зазвичай використовуються в умовах відбору (секція ДДЕ) і в параметрах віртуальних таблиць.

Запит);

3. Після надання тексту та встановлення параметрів запит необхідно виконати та отримати результат виконання. Виконання здійснюється методом Виконати () , який повертає об'єкт РезультатЗапиту. З результату запиту можна:

  • отримати вибірку за допомогою методу Вибрати (< ТипОбхода>, < Группировки>, < ГруппировкиДляЗначенийГруппировок>) ;
  • вивантажити значення у таблицю значень або дерево значень за допомогою методу Вивантажити (< ТипОбхода>) .

// Отримання вибірки

Вибірка = Результат Запиту. Вибрати();

// Отримання таблиці значень
Результат Запит = Запит. Виконати();
Таблиця = Результат Запиту. Вивантажити();

4. Обійти вибірку результату запиту можна за допомогою циклу:

Бувай Вибірка .Наступний () Цикл
Повідомити (Вибірка .Курс);
КінецьЦикл;

Повний приклад роботи із запитом може виглядати так:

// Етап 1. Створення запиту та встановлення тексту запиту
Запит = Новий Запит;
Запит . Текст =
«ВИБРАТИ
| Курси Валют.
| Курси Валют.
| Курси Валют.Курс

| РеєстрВідомостей.КурсиВалют ЯК КурсиВалют
|ДЕ
| КурсиВалют.Валюта = &Валюта»;

// Етап 2. Встановлення параметрів
Запит . ВстановитиПараметр(«Валюта» , ВибранаВалюта);

// Етап 3. Виконання запиту та отримання вибірки
Результат Запит = Запит. Виконати();
Вибірка = Результат Запиту. Вибрати();

// Обхід вибірки
Бувай Вибірка .Наступний () Цикл
Повідомити (Вибірка .Курс);
КінецьЦикл;

Склад тексту запиту

Текст запиту складається з кількох секцій:

  1. Опис запиту- Перелік полів і джерел даних, що вибираються;
  2. Об'єднання запитів- Вирази «ОБ'ЄДНАТИ» і «ОБ'ЄДНАТИ ВСЕ»;
  3. Упорядкування результатів- Вираз «Упорядкувати по …»;
  4. Автоупорядкування- Вираз «АВТОПОРЯДОЧУВАННЯ»;
  5. Опис підсумків- Вираз «ПІДСУМКИ … ПО …».

Обов'язковою є лише перша секція.

Тимчасові таблиці та пакетні запити

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

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

Менеджер ВТ = Новий Менеджер Тимчасових Таблиць;
Запит = Новий Запит;
Запит . Менеджер Тимчасових Таблиць = Менеджер ВТ;

Запит . Текст =
«ВИБРАТИ
| Валюти.
| Валюти.
|ПОМІСТИТИ ТВАлюти

| Довідник. Валюти ЯК Валюти »;

Результат Запит = Запит. Виконати();

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

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

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

// Приклад роботи з пакетним запитом
Запит = Новий Запит;
Запит . Текст =
«ВИБРАТИ
| Валюти.

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

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

РезультатПакет = Запит. Виконати Пакет();

ТЗВалюти = Результат Пакету [0]. Вивантажити();
ТЗНоменклатура = Результат Пакету [1]. Вивантажити();

// Приклад використання тимчасових таблиць у пакетному запиті
Запит = Новий Запит;
Запит . Текст =
«ВИБРАТИ
| Товари.Посилання ЯК Товар
|ПОМІСТИТИ ВТтовари

| Довідник.Номенклатура ЯК
|ДЕ
| Товари.Виробник = &Виробник
|;
| ВИБРАТИ
| ВТТовари.Товар,
| ПТУ.Кількість,
| ПТУ.Ціна,
| ПТУ.Посилання ЯК ДокументНадходження

| ВТТовари ЯК ВТТовари
| ЛІВОЕ З'ЄДНАННЯ Документ.НадходженняТоварівПослуг.Товари ЯК ПТУ
| ПО ВТТовари.Товар = ПТУ.Номенклатура»
;

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

Результат Запит = Запит. Виконати();
Вибірка = Результат Запиту. Вибрати();

Бувай Вибірка .Наступний () Цикл

КінецьЦикл;

Віртуальні таблиці

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

Існують такі віртуальні таблиці (у дужках вказано можливі параметри):

  • Для регістрів відомостей:
    • Зріз Перших (<Период>, <Условие>) - Найбільш ранні записи на зазначену дату;
    • Зріз Останніх(<Период>, <Условие>) - Найбільш пізні записи на зазначену дату;
  • Для регістрів накопичення:
    • Залишки(<Период>, <Условие>) - залишки на зазначену дату;
    • Обороти(<НачалоПериода>, <КонецПериода>, <Периодичность>, <Условие>) - Обороти за період;
    • ЗалишкиІОобороти(<НачалоПериода>, <КонецПериода>, <Периодичность>, <МетодДополненияПериодов>, <Условие>) - залишки та обороти за період;
  • Для регістрів бухгалтерії:
    • Залишки(<Период>, <УсловиеСчета>, <Субконто>, <Условие>) - залишки на зазначену дату в розрізі рахунку, вимірювань та субконто;
    • Обороти(<НачалоПериода>, <КонецПериода>, <Периодичность>, <УсловиеСчета>, <Субконто>, <Условие>, <УсловиеКорСчета>, <КорСубконто>) - обороти за період у розрізі рахунку, вимірювань, кор. рахунки, субконто, кор. субконто;
    • ЗалишківІОоборотів(<НачалоПериода>, <КонецПериода>, <Периодичность>, <МетодДополненияПериодов>, <УсловиеСчета>, <Субконто>, <Условие>) - залишки та оборотів у розрізі рахунку, вимірювань та субконто;
    • ОборотиДтКт(<НачалоПериода>, <КонецПериода>, <Периодичность>, <УсловиеСчетаДт>, <СубконтоДт>, <УсловиеСчетаКт>, <СубконтоКт>, <Условие>) - обороти за період у розрізі рахунки Дт, рахунки Кт, Субконто Дт, Субконто Кт;
    • РухиСубконто(<НачалоПериода>, <КонецПериода>, <Условие>, <Порядок>, <Первые>) - Рухи разом зі значеннями субконто;
  • Для регістрів розрахунку:
    • База (<ИзмеренияОсновногоРегистра>, <ИзмеренияБазовогоРегистра>, <Разрезы>, <Условие>) - базові дані регістру розрахунку;
    • ДаніГрафіка(<Условие>) - Дані графіка;
    • ФактичнийПеріодДії(<Условие>) - Фактичний період дії.

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

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

Для прискорення введення текстів запитів платформа має спеціальні інструменти: Конструктор запитуі Конструктор запиту з обробкою результату. Для виклику конструкторів необхідно клацнути правою кнопкою миші та вибрати потрібний пункт:

Також конструктори можна викликати із головного меню Текст.

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

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

Об'єкт Схема Запиту

Платформа дозволяє програмно створювати та редагувати текст запиту за допомогою об'єкта Схема Запиту. Об'єкт має єдину властивість ПакетЗапитів, в якому об'єкт зберігається властивості всіх запитів, що редагуються в даний момент. Об'єкт Схема Запиту підтримує такі методи:

  • ВстановитиТекстЗапиту(< Текст>) - Заповнює властивість ПакетЗапитів на підставі переданого тексту запиту;
  • ОтриматиТекстЗапиту() – повертає сформований на підставі властивості ПакетЗапитів текст запиту;
  • ЗнайтиПараметри () — Повертає параметри запиту.

Розглянемо приклад роботи з об'єктом Схема Запиту. Для програмного формування тексту запиту

ВПОРЯДКУВАТИ ЗА
Валюти.

Код вбудованою мовою може виглядати так:

Схема Запиту = Новий Схема Запиту;
Пакет1 = Схема Запиту. Пакет Запитів [0];
Оператор1 = Пакет1. Оператори [0];
// додавання джерела
ТаблицяРегістра = Оператор1. Джерела. Додати( «Довідник.Валюти», "Валюти");
// додавання полів
ПолеПосилання = Оператор1. Обираються Поля. Додати («Валюти.Посилання», 0);
ПолеКод = Оператор1. Обираються Поля. Додати («Валюти.Код», 1);
// Вказівка ​​псевдонімів полів
Пакет1 . Колонки [0]. Псевдонім = "Валюта";
Пакет1 . Колонки [1]. Псевдонім = «Код»;
// додавання умови
Оператор1 . Відбір. Додати( «НЕ Помітка Видалення»);
// додавання впорядкування
Пакет1 . Порядок. Додати(ПолеКод);
Текст Запиту = Схема Запиту. ОтриматиТекстЗапиту();

Конструктор запитів у 1С 8.3 та 8.2 – найпотужніший інструмент розробки. Він дозволяє скласти текст запиту за допомогою спеціального візуального середовища. Таким чином, щоб створити запит 1с не обов'язково знати вбудовану мову запитів, достатньо орієнтуватися у нескладному та інтуїтивно зрозумілому інтерфейсі конструктора.

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

Опис конструктора запитів на офіційному сайті 1С 8: v8.1c.ru

Таблиці та поля; ; ; ; ; ; Вкладені запити (у розробці).

Для того, щоб викликати конструктор запитів 1с 8 у програмному коді необхідно:

  • Створити новий запит
Запит = Новий Запит;
  • Задати порожній рядок тексту запиту
Запит. Текст = "";
  • Поставити курсор мишки між лапками, натиснути праву кнопку миші. У контекстному меню, що відкрилося, вибрати пункт Конструктор запитута відповісти Такна питання щодо створення нового запиту. Якщо текст запиту вже записаний, необхідно клацнути на будь-якому місці всередині і викликати конструктор ;

Розглянемо на невеликих прикладах із зростаючою складністю усі основні вкладки конструктора запитів. Такий підхід дозволить програмісту-початківцю 1с більш ефективно вивчити конструктор і всі його можливості. Для прикладів будемо використовувати конфігурацію Бухгалтерія 3.0.

Урок №1. Конструктор запитів – найпростіший приклад використання.

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

Нові вкладки: Таблиці та поля.

Нові механізми: перегляд та редагування тексту запиту за допомогою кнопки «Запит».

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

Теоретична частина уроку №1

Вкладка Таблиці та поляскладається з трьох розділів:

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

Таблиці. У цьому розділі вибираються таблиці, необхідні для даного запиту. Для того щоб перемістити їх з розділу база данихпотрібно:

  • Або двічі клацнути по таблиці;
  • Або скористатися кнопками ">" або ">>".

Над розділом Таблиціє ряд кнопок. Більшість із них буде докладніше розказано в наступних уроках. А поки що дам тільки короткі пояснення.

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

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

  • Або двічі клацнути по полю;
  • Або скористатися кнопками ">" або ">>";
  • Також можна додати нове поле самостійно, використовуючи довільний вираз із полів вибраних таблиць та функцій мови запитів.

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

  • Додати(Зелена лінія). Призначена для додавання нового поля за допомогою редактора довільних виразів;
  • Змінити поточний елемент(Червона лінія). Дозволяє змінити виділене поле за допомогою редактора;
  • Видалити поточний(Синя лінія). Видаляє виділене поле зі списку.

Практична частина уроку №1

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

Приступимо до створення запиту за номенклатурою:

  • Створимо новий запит і відкриємо конструктор методом, зазначеним на початку уроку;
  • В розділі База данихвідкриємо гілку Довідникиі знайдемо там довідник Номенклатура;
  • Виділимо його і за допомогою кнопки «>» перенесемо до розділу Таблиці;
  • В розділі Таблицірозкриємо довідник номенклатура за допомогою значка "+";
  • У списку полів, що розкрився, знайдемо поле Посиланняі перенесемо його в розділ Поляза допомогою кнопки «>»
  • Запит по номенклатурі готовий, натискаємо кнопку «ОК» у нижній частині вікна конструктора.

Коли мій запит став таким складним, що перевищив межі мого розуміння, я вирішив використати пакетні запити.

Але зіткнувся з фактом, що про них нічого не знаю. Виявилося, що все дуже просто. Через 5 хвилин ви вмітимете користуватися пакетними запитами. Починайте читати.

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

Пакетні запити з'явилися лише у версії 8.1.11.67.4.

Ось текст запиту:

ВИБРАТИ Т1.Зн ПОМІСТИТИ ВТБукви З (ВИБРАТИ "А" ЯК ЗН ОБ'ЄДНАТИ ВСЕ ВИБРАТИ "Б") ЯК Т1;

ВИБРАТИ Т1.Зн ПОМІСТИТИ ВТЦИФРИ З (ВИБРАТИ "1" ЯК ЗН ОБ'ЄДНАТИ ВСЕ ВИБРАТИ "2") ЯК Т1;

ВИБРАТИ ТБ.Зн, ТЦ.Зн, ТБ.Зн+ТЦ.Зн З ВТБукви ЯК ТБ, ВТЦифри ЯК ТЦ

Пакетні запити підтримуються у будь-якій звичайній консолі запитів.

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

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

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

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

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

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

Якщо запити мали метод Запит.Виконати()то тепер з'явився метод Запит.Виконати Пакет(), який повертає всі таблиці з пакета у вигляді масиву.

Анонс пакетних запитів на сайті 1с знаходиться тут: http://v8.1c.ru/overview/release_8_1_11/#Functional

Історія з життя

Поясню, що мене спонукало на пакетні запити.

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

Так ось, ми заносимо список усіх помилок до таблиці КодиПомилок- там міститься код помилки та підрядок пошуку.

Отримуємо для кожного рядка одну, дві чи більше помилок. Т.к. В одному рядку може бути кілька помилок.

Але помилка то, можливо і розпізнана, тобто. прапор « Помилка» стоїть, а текст помилки не дав нам код помилки.

Робимо ліве з'єднання, там, де код помилки є NULL, даємо код помилки. Інші помилки» .

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

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

Я просто ще раз поєднав усі рядки з помилками з усіма рядками, для яких було знайдено помилки, і додав все-таки вид помилки «Інші помилки».

Прості запити

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

На малюнку показано структуру конфігурації.

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

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


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

Тимчасові таблиці

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

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

Змінимо запит з урахуванням використання тимчасових таблиць. Тимчасові таблиці будуть містити табличну частину документа в згрупованому вигляді та список продукції для фільтрації віртуальних таблиць:

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

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

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

Пакетні запити

Пакетні запити значно розширюють функціонал тимчасових таблиць та надають нові можливості під час роботи із запитами.

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

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

Змінимо процедуру з урахуванням пакетних запитів:

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

Після виконання запиту, змінна МасивРезультатів міститиме 3 елементи. Два перших - це кількість поміщених у тимчасові таблиці записів ДокТЧ і СписокТоварів, у третьому буде перебувати вибірка з полями Док_Кількість, Номенклатура та Рег_Кількість.

Змінна РезультатЗапит містить тільки вибірку.

Таким чином, пакетні запити – дуже зручний інструмент як для написання, так і для читання складних запитів.

Думаю всі ви погодитеся з тим, що тема запитів у системі 1С:Підприємство 8 сьогодні може похвалитися своєю актуальністю. Саме тому нашу сьогоднішню статтю ми вирішили присвятити темі, пов'язаній з об'єднанням запитів, отриманням останніх за датою документів у 1С запиті та з'єднанням запитів. Давайте все-таки почнемо.

Отже, щоб створити в системі 1С:Підприємство пакетний запит слід використовувати пропозицію ПОМІСТИТИ. Пакетний запит мають на увазі під собою відразу кілька запитів, описаних як один великий запит. Усі вони виконуються послідовно один за одним. В результаті використання будь-якого з цих запитів, їх можна помістити в тимчасову таблицю і потім звернеться до неї використовуючи для цього вже якийсь інший запит. Напевно, більшість із вас запитають: у чому ж плюси цього методу?

Ми маємо відповідь на це запитання. Особисто я вважаю, що найбільшою перевагою цього методу є можливість поміщати його результати усередину так званої часової таблиці. Вони можуть використовуватися кілька разів. Більш того, вам при цьому не потрібно буде кілька разів поспіль виконувати один і той же вкладений запит, все що вам потрібно це просто вибирати дані з вже готової таблиці. Деякі з вас запитають: чи є в цій методиці якісь мінуси. Безумовно, як і в усьому світі в цій методиці є деякі, певні недоліки.

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

Ось наприклад:
ВИБРАТИ
Номенклатура,

Сума(Сума) ЯК Сума,
ПОМІСТИТИ ДокПрихід
З


В результаті, після того, як ви виконаєте цей запит, виведеться лише та кількість записів, яка була поміщена в таблицю. Результати при цьому будуть перебувати в тій самій таблиці. Давайте зробимо такий запит для витратного документа. Для цього нам потрібно буде розділити ці два запити за допомогою символу ";". Саме він здатний розповісти користувачеві про те, що закінчився пакетний запит і починається інший.

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

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

;
ВИБРАТИ
*
З
ДокПрихід ЯК ДокПрихід
ПОВНЕ З'ЄДНАННЯ
ДокВитрата ЯК ДокВитрата
ПЗ

З цього можна побачити, що третій запит з'єднує дані цих двох запитів.

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

ВИБРАТИ
Номенклатура,
ДокВитрата.Номенклатура,




З
ДокПрихід ЯК ДокПрихід
ПОВНЕ З'ЄДНАННЯ
ДокВитрата ЯК ДокВитрата
ПЗ
ДокПриход.Номенклатура = ДокВитрата.Номенклатура

В результаті ми отримаємо дані щодо приходу та витрати. Але, у нас все ж таки залишилася проблема, пов'язана з тим, яким чином можна було б об'єднати два стовпці, «Номенклатура» та «Номенклатура1»? У тому випадку, якщо брати значення зі стовпця «Номенклатура», то ми в результаті так і не отримаємо значення з останнього рядка, а якщо ж брати значення зі стовпця «Номенклатура1», то не отримаємо в результаті значення з третього рядка. Для цього слід скористатися функцією «ЄСТЬ NULL».
У результаті запит матиме такий вигляд:

ВИБРАТИ
ЯК Номенклатура,
ДокПриход.Кількість ЯК КолПриход,
ДокПриход.Сума ЯК СумПриход,
ДокВитрата.Кількість ЯК Кількістьвитрат,
ДокВитрата.Сума ЯК СумВитрата
З
ДокПрихід ЯК ДокПрихід
ПОВНЕ З'ЄДНАННЯ
ДокВитрата ЯК ДокВитрата
ПЗ
ДокПриход.Номенклатура = ДокВитрата.Номенклатура

При цьому може виникнути ще одна проблема, пов'язана з тим, яким чином можна замінити значення на числове нуль? Для цього вам знову доведеться скористатися функцією «ЄСТЬNULL» і написати запит:

ВИБРАТИ
ЄNULL(ДокПрихід.Номенклатура,ДокВитрата.Номенклатура)
ЯК Номенклатура,
ЄNULL(ДокПриход.Кількість,0) ЯК КільПрихід,
ЄNULL(ДокПрихід.Сума,0) ЯК СумПрихід,
ЄNULL(ДокВитрата.Кількість,0) ЯК КількаВитрата,
Є NULL (Док Витрата. Сума, 0) ЯК Сум Витрата
З
ДокПрихід ЯК ДокПрихід
ПОВНЕ З'ЄДНАННЯ
ДокВитрата ЯК ДокВитрата
ПЗ
ДокПриход.Номенклатура = ДокВитрата.Номенклатура