Вкладені запити у конструкторі. Конструктори запитів 1с конструктор запитів умови

Отже, починаємо з простого: у конфігураторі створіть Нову обробку, назвіть Консоль Запитів або Конструктор Запитів, як Вам більше подобається.

Відразу можемо додати в “Даних” табличку для майбутніх Параметрів, які нам необхідні, щоб у своїй Консолі у нас виконувався не найпримітивніший запит, а з параметрами та посиланнями, наприклад, ми для своєї роботи створюватимемо запит до періодичних регістрів, а тут без вказівки Параметра=&Дата нікуди.

Щоб створити нашу табличку Параметрів, на вкладці "Дані" в її "Таблічній частині" додамо нову таблицю, назвемо її Параметри Запиту, тут же додамо колонки цієї таблиці: 1) Ім'я Параметра, тип рядок = 25 символів; ЗначенняПараметра, тут складовий тип даних див.

Тому як показано на картинці - вибираємо складовий тип для колонки ЗначенняПараметра:в меню типів ставимо галочку "Складовий тип", вибираємо число,рядок (20символів вкажіть),дата,булево, і найнижчу галочку ставимо - Будь-якаПосилання - вона означає що далі, Якщо вказати параметри нашого запиту, ми можемо посилатися на будь-який об'єкт нашої конфігурації, наприклад, довідники або документи.

Тепер необхідно створити форму нашої майбутньої Консолі запитів. В обробці перейдемо на вкладку "Форми" і додамо нову. Входимо в цю форму і тут вже необмежене поле для творчості - Ви можете розмістити створених щойно два реквізити та табличку з параметрами як Вам більше подобається! Для цього Ви можете використовувати стандартні елементи форми як Група або Сторінка зі сторінками (якщо Вам більше подобається сторінки, що перевертаються).

Головне тут одне: перетягнувши реквізит "ТекстЗначення" в ліве поле редагування форми - обов'язково в його властивостях встановіть "Вид" = Поле текстового документа.

У властивостях реквізиту "Таблиця Запиту" за бажанням можете вказати - "Відображати Сітку" та "Відображати Заголовки".

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

Відкриється МодульФорми з готовою порожньою процедурою “Процедура КонструкторЗапроса(Команда)”. Усередині цієї процедури ми й опишемо виклик стандартного конструктора запитів 1с8. Це дуже легко: Конструктор = Новий Конструктор Запиту;Але тут є підводні камені – вбудований у платформу Констуктор Запитів працює в режимі користувача ТІЛЬКИ під товстим клієнтом! Тому ми вставимо умову інструкції препроцесора # Якщо, а ось тут Ви самі вирішуйте, виходячи з Вашої платформи, або у Вас звичайні форми, тоді вибирайте “ ТовстийКлієнтЗвичайнийДодаток” або у Вас платформа на керованих формах, тоді “ ТовстийКлієнтКерованийДодатокдив. рис.

Тепер залишилося додати у цю процедуру умову запис тексту запиту, який сформує нам Конструктор запитів у наш реквізит форми “ТектЗапроса”:

Якщо Конструктор.ВідкритиМодально()=Істина Тоді Об'єкт.ТекстЗапиту=Конструктор.Текст; КінецьЯкщо;

Але ми можемо щось вручну змінити в тексті запиту (у режимі користувача – у вікні реквізиту “ТекстЗапиту”), щоб наші зміни потрапили в Конструктор Запитів за його нового виклику – додамо просту умову тут же:

Якщо не ПорожнійРядок(Об'єкт.ТекстЗапиту) Тоді Конструктор.Текст=Об'єкт.ТекстЗапиту; КінецьЯкщо;

Все, ми підключили вбудований у платформу 1с8 Конструктор Запитів, давайте подивимося на свою працю. Для цього запустіть 1С: Підприємство в режимі товстого клієнта одним із зазначених способів: 1) гл.меню Конфігуратора - Налагодження - Початок Налагодження - Товстий Клієнт; 2) або якщо у Вас винесені дані клавіші на панель управління в конфігураторі - просто натисніть кнопку з жовтим кружком з товстою точкою див.

Запускається режим користувача 1сПідприємство8, знаходимо нашу обробку, запускаємо її, тиснемо на нашу кнопку "Конструктор Запитів" і бачимо, як відкривається вбудований в платформу конструктор. див рис.

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

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

Якщо ПустийРядок(Об'єкт.ТекстЗапиту) Тоді повідомити("Введіть текст запиту!"); КінецьЯкщо;

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

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

Якщо Ви натиснули на пункт Конструктор запитів з обробкою результатів”, то випаде модальне вікно “Не знайдено текст запиту. Створити новий?”, натискайте так. Обхід результату”. Все, більше нам від цього конструктора нічого не потрібно, натискаємо на кнопку Ок - випаде модальне вікно У запиті не вибрано жодного поля, тиснемо Ок.

Після цього всередині нашої процедури Виконати Запит На Сервере() з'явиться така готова заготовочка:

Перейдемо до побудованого конструктором виразу:

Запит. Текст = "";

Запит.Текст = Об'єкт.ТекстЗапиту;

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

Розглянемо докладніше, що таке є Табличний Документ-це як лист Exel - дістатися запису в конкретну комірку можна тільки за допомогою Комірок таблиці, тут вони у нас називаються область, але ми самі можемо вибрати діапазон цієї області в одну конкретну Комірку:

Отже, розібралися, що таке табличний документ, визначили собі, що нам знадобиться у конкретну осередок даного табличного документа визначити дані з нашого запиту. Але подумаємо: а що таке “Результат Запиту”, котрий конструктор нам так швидко сформував? Відкриваємо довідку – Результат запиту – це таблиця, яка має відповідні властивості! див. рис.

І якщо ми зараз напишемо після виразу Результат Запиту = Запит. Виконати (); (створеного конструктором) ось такий простий цикл для Колекцій:

Для кожного Ім'яКолонки З РезультатЗапиту.Колонки Цикл повідомити(Ім'яКолонки.Ім'я); КінецьЦикл;

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

То Ви побачите внизу вікна у повідомлення – що у таблиці Результат Запиту зберігаються найменування полів, які ми щойно вибрали, створивши простенький запит.

Тепер виведемо ці імена полів наших страждань у Табличний документ:

Для кожного Ім'яКолонки З РезультатЗапиту.Колонки Цикл Осередок=Объект.ТаблицаЗапроса.Область(1,РезультатЗапроса.Колонки.Індекс(Ім'яКолонки)+1); Осередок.Текст=Ім'яКолонки.Ім'я; КінецьЦикл;

Щоб вивести деталування за даними запиту - розремаримо створені автоматично конструктором висловлювання і всередину циклу перебору "ВибіркаДетальніЗаписи" самого запиту вставимо такий самий цикл, який ми використовували для виведення найменувань колонок, тільки тепер в текст Осередка нам потрібно передати не дані таблиці "Результат Запиту", а дані самої Вибірки, подивимося у довідці, як можна звернутися до поля Детальної вибірки запиту:

ВибіркаДетальніЗаписи = РезультатЗапроса.Вибрати(); Поки ВибіркаДетальніЗаписи.Наступний() Цикл //у першому рядку у нас вже записані імена колонок таблиці,тому дані завантажуємо нижче першого рядка НомерСтрокиДок=Объект.ТаблицаЗапроса.ВисотаТаблицы+1; Для кожного Ім'яКолонки З РезультатЗапиту.Колонки Цикл Осередок=Об'єкт.ТаблицяЗапиту.Область(НомерРядкиДок,РезультатЗапиту.Колонки.Індекс(Ім'яКолонки)+1); Осередок.Текст=ВибіркаДетальніЗаписи[Ім'яКолонки.Ім'я]; КінецьЦикл; КінецьЦикл;

Все, можемо перевіряти, завантажуємо підприємство під товстим клієнтом, вводимо простий запит без параметрів, натискаємо кнопку “Виконати Запит” див.

Ура, все працює!

Дуже зручно, коли при відкритті/закритті нашої Консолі запитів – знову в полі “Текст Запиту” записується текст запиту, з яким ми перед закриттям консолі працювали. Для цього просто потрібно включити властивість форми = Автозбереження див.

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

Можна ще до нашої Консолі додати пару кнопок, які будуть очищати в режимі користувача вікно Параметрів і вікно Тексту запиту.

Наша Консоль запитів готова до використання, бажаю успішних творчих рішень за допомогою такого простого та потужного інструменту, як Консоль запитів!

Ця обробка написана на платформі 1с8.3 (керовані форми), що запускається під товстим клієнтом. Також її можна написати і на платформі 1с8.2 як під звичайними формами, так і під керованими.

У завантаженні знаходиться зразок щойно створеної нами Консолі запитів.

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

Апгрейд Консолі Запитів:

1)Тепер наша саморобна Консоль запитів із вбудованим Конструктором запитів буде запускатися під будь-яким клієнтом: під товстим клієнтом звичайних та керованих форм і під тонким та веб клієнтом.

п.с.Форма і вид вбудованого Конструктора запиту відрізняється - в залежності від того під яким клієнтом ми запустили нашу Консоль.

&На Клієнті Процедура Конструктор Запиту(Команда) //виклик стандартного Конструктора запиту можливий тільки під товстим клієнтом #Якщо ТовстийКлієнтКерований Додаток або ТовстийКлієнтЗвичайнийДодаток Тоді Конструктор=Новий КонструкторЗапиту; Якщо не ПорожнійРядок(Об'єкт.ТекстЗапиту) Тоді Конструктор.Текст=Об'єкт.ТекстЗапиту; КінецьЯкщо; Якщо Конструктор.ВідкритиМодально()=Істина Тоді Об'єкт.ТекстЗапиту=Конструктор.Текст; КінецьЯкщо; // # Інакше // Повідомити ("Виклик Конструктора запитів можливий тільки під товстим клієнтом"); // Повернення; //# КінецьЯкщо #Інакше Повідомити("Ви запускаєте Конструктор запитів під тонким клієнтом - він відрізняється трохи за своєю формою та швидкості продуктивності!"); Конструктор = Новий Конструктор Запиту (); Якщо не ПорожнійРядок(Об'єкт.ТекстЗапиту) Тоді Конструктор.Текст=Об'єкт.ТекстЗапиту; КінецьЯкщо; ОповіщенняКонструктора = Новий ОписОповіщення("ВиконатиПісляЗакриттяКонструктора", ЦяФорма); Конструктор.Показати (Оповідання Конструктора); # КінецьЯкщо КінецьПроцедури &НаКлієнті Процедура ВиконатиПісляЗакриттяКонструктора(Результат, ПараметриКонструктора) Експорт //Результат=текст,якщо Конс-р закрили по кнопці ок Об'єкт.ТекстЗапиту = СокрЛП(Результат); // працює!!! КінецьПроцедури

2) Додала можливість в нашу просту Консоль запитів вводити складні запити з Тимчасовою таблицею, що передається в параметри! Механізм вийшов дуже простий та елегантний – без використання XML-коду, як роблять у професійних консолях.

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

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

ВИБРАТИ ЗовнішніДані.Товар, ЗовнішніДані.Кількість ПОМІСТИТИ ЗовнішніДані З &ЗовнішніДані ЯК ЗовнішніДані; //////////////////////////////////////////////////// /////////////////////////////// ВИБРАТИ ЗовнішніДані.Товар, ЗовнішніДані.Кількість, ЄNULL(ЗалишкиТоварівЗалишки.КількістьЗалишок, 0) ЯК Поле1, Є NULL (Залишки Товарів Залишки. Кількість Залишок, 0) - Зовнішні Дані. ЗовнішніДані)) ЯК ЗалишкиТоварівЗалишки ПО ЗовнішніДані.Товар = ЗалишкиТоварівЗалишки. Товар

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

Отже, у конструкторі запитів ми створили вище наведений запит, закривши Конструктор – текст запиту потрапить у поле консолі “ТекстЗапроса”,натискаємо на кнопку “ЗнайтиПараметри”, бачимо, що у таблиці Параметрів з'явився рядок = “ЗовнішніДані”,типЗначення=”ТаблицяЗначення” ,Див.рис.

У цій таблиці Параметрів – вводимо параметр Дата, н-р, сьогоднішня дата, потім натискаємо для спроби редагування на наш параметр тимчасової таблиці “ЗовнішніДані”, натискаємо в полі з “ТаблицяЗначень” на три точки – з'явиться вибір типів, тиснемо рядок, наш механізм перевертає нам сторінку на формі, де нам необхідно вручну ввести цю саму тимчасову таблицю.

Тут зауважте, що при цьому на сторінці “Час Таблиці” внизу в полі “Ім'я тимчасової таблиці у параметрах” – з'явиться ім'я нашої тимчасової таблиці (воно копіюється з таблиці Параметрів).

Поки що на сторінці “Брем Таблиці” ми бачимо лише одну порожню таблицю – це таблиця Типів нашої майбутньої тимчасової таблиці. За допомогою кнопки “Додати” – додамо найменування реквізиту та типу майбутньої таблиці. Будьте уважні – найменування та тип повинен відповідати тому, що ми задали у запиті для ЗовнішніДані:

Тепер натискаємо кнопку "Оновити Тимчасову Таблицю" - і в нас тут же з'явиться друга таблиця - в неї ми вже безпосередньо набиватимемо через кнопку "Додати" дані тимчасової таблиці.

Все, можемо ще раз перевірити ще раз ми ввели ми примітивні дані параметрів запиту в таблиці параметрів на 1-й сторінці обробки, і тиснемо кнопку “Виконати Запит” – все вважає, вибирає відповідно з обмеженням за даними, переданими в параметрі нашої тимчасової таблиці

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

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

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

Розглянемо як можна поєднати ці дві таблиці по полю Код товаруз використанням
конструктора запитів (код формування часових таблиць для прикладу наводити
Не буду. Його можна взяти за вищезгаданим посиланням).

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

Переходимо на закладку «Зв'язки». Додаємо новий рядок. В полі Таблиця 1
з списку вибираємо таблицю з товарами, а в полі Таблиця 2Таблицю
із країнами.

Для Таблиці1встановлюємо прапорець Усе. Для
Таблиці2цей прапорець не ставимо. Це означає, що з Таблиці1
будуть обрані всі записи, а з Таблиці2тільки ті для яких виконується
умова з'єднання, тобто за такої комбінації прапорців ми отримуємо
ЛІВОЕ З'ЄДНАННЯ. Далі потрібно заповнити Умова зв'язку.
Тут ми вибираємо поля таблиць зі списків, що випадають, і знак порівняння також з випадаючого
список.

В результаті такого з'єднання отримаємо наступний текст запиту:

ВИБРАТИ ВТ_Товар.КодТовара, ВТ_Товар.Найменування, ВТ_Країна.Країна З ВТ_Товар ЯК ВТ_Товар ЛІВО СПОЛУЧЕННЯ ВТ_Країна ЯК ВТ_Країна ПО ВТ_Товар.КодТовара = ВТ_Країна.

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


Здавалося б у результаті має вийти ПРАВА З'ЄДНАННЯ, але якщо ми
подивимося текст запиту, сформований конструктором, то побачимо, що таблиці
помінялися місцями, а з'єднання все одно залишилося лівим:

ВИБРАТИ ВТ_Товар.КодТовара, ВТ_Товар.Найменування, ВТ_Країна.Країна З ВТ_Країна ЯК ВТ_Країна ЛІВО СПОЛУЧЕННЯ ВТ_Товар ЯК ВТ_Товар ПО ВТ_Товар.КодТовара = ВТ_Країна.

Подивимося, що буде, якщо знімемо обидва прапорці

У результаті отримуємо внутрішнє з'єднання.

ВИБРАТИ ВТ_Товар.КодТовара, ВТ_Товар.Найменування, ВТ_Країна.Країна З ВТ_Товар ЯК ВТ_Товар ВНУТРІШНЯ СПОЛУЧЕННЯ ВТ_Країна ЯК ВТ_Країна ПО ВТ_Товар.КодТовара = ВТ_Товар.

І нарешті, якщо встановлені обидва прапорці


отримуємо повне з'єднання

ВИБРАТИ ВТ_Товар.КодТовара, ВТ_Товар.Найменування, ВТ_Країна.Країна З ВТ_Товар ЯК ВТ_Товар ПОВНЕ СПОЛУЧЕННЯ ВТ_Країна ЯК ВТ_Країна ПО ВТ_Товар.КодТовара = ВТ_Країна = ВТ_Країна = ВТ_Товар.

Можна задавати кілька рядків на закладці Зв'язки. У цьому випадку кілька
рядків з'єднуються за умовою І. Причому рядки не обов'язково
щоразу вбивати заново. Їх можна копіювати за допомогою клавіші F9.
А в новому рядку міняти лише умову з'єднання. Це суттєво прискорює розробку.
Також за умови зв'язку необов'язково використовувати лише зумовлені поля з
випадаючих списків. Можна використовувати довільний вираз, що задовольняє
мови запитів 1С. Для цього необхідно встановити прапорець Довільне
і вписати умову безпосередньо в поле, або відкрити допоміжне вікно,
Яким можна скористатися шаблонами з функціями мови запитів.


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

Конструктор запиту складається з наступних закладок:

1. «Таблиці та поля» - на закладці три ієрархічні списки:
a. "База даних" - перераховані всі доступні об'єкти, до яких можна зробити запит. Також кнопка «Відображати таблиці змін», за допомогою якої можна отримати доступ до таблиць змін об'єктів ІБ, якщо вони реєструються для будь-якого плану обміну.
b. "Таблиці" - список вибраних таблиць, до яких буде виконано запит. Також у цьому вікні можна видалити таблицю, перейменувати або замінити таблицю, а також додати внутрішній запит.

Для віртуальних таблиць можна призначати параметри, натиснувши кнопку «Параметри віртуальних таблиць»:

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

Зліва вікно з доступними у виразі полями. Праворуч підказку функцій, що використовуються. Внизу довільний вираз, що конструюється. У виразах можна використовувати зовнішні параметри, для їх позначення використовується знак "&", наприклад: &Період, &ДатаНач
Потрібно бути уважним, якщо у вікні буде набрано довге і складне вираження, в якому буде невелика синтаксична помилка, то після натискання кнопки «ОК» система видасть попередження і закриє вікно. Весь набраний код буде втрачено, тому рекомендую, якщо ні впевнені в правильності виразу, то перед закриттям конструктора завжди зберігайте вміст у буфер обміну (Ctrl-C).

2. "Зв'язки" - на закладці вказуються зв'язки між таблицями.

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

3. "Угруповання" - на закладці вказуються, які поля групуються, а які агрегуються (підсумовуються).

4. Закладка «Умови» - перераховуються умови, які накладаються на запит.
В умовах теж можна писати складні вирази за допомогою конструктора простих виразів і використанням зовнішніх змінних:

5. "Додатково"
Додаткові параметри, що накладаються на запит

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

7. «Порядок»
В якому порядку виводитимуться результати запиту

Увага! Внизу закладки можна побачити галочку «Автоупорядкування»- У поточній версії 1С 8.1 в СКД вона марна, навіть при встановленій галочці при записі СКД видає помилку, так що нею користуватися не варто.

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

A. На закладці «Таблиці» - перераховані таблиці, які використовуються у запиті, можна вказати на обов'язковість включення таблиці в запит, галочкою «Обов'язкова». Тобто. якщо ніякі поля вибірку не потрапляють, то дана таблиця у запиті взагалі бере участь. Можна також вказати параметри для таблиць.

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

9. «Характеристики»
Закладка, що не має аналога у звичайному конструкторі вихідної форми.

Ця закладка забезпечує розширення роботи запитів із характеристиками. Таблиця на закладці складається з кількох полів:
a. Тип значення - тип для якого будуть вибиратися характеристики. Наприклад, якщо вказати «Довідник Посилання.Номенклатура», то в запиті будуть вибиратися всі характеристики для номенклатури.
b. «Джерело» - джерело властивостей видів показників, може бути запит чи таблиця. У цьому полі ми можемо написати запит вибірки лише тих властивостей, які нам потрібні.
c. "Список характеристик" - поле в якому вказується джерело для властивостей характеристик. Найчастіше це план видів характеристик чи запит. Також потрібно вказати поля, які відповідають за "Ідентифікатор", "Ім'я" та "Тип" властивості.
d. «Джерело» - наступне поле, в якому вказуємо джерело значень показників, також може бути або таблиця або запит.
e. «Значення характеристик» - таблиця чи запит, які набуває значення характеристика. Наприклад, таблицею значень характеристик може бути регістр відомостей «Значення ВластивостейОб'єктів». Ми також повинні вказати ті поля з таблиці (або запиту), що відповідають за «Об'єкт», «Властивість» та «Значення» характеристики.
Після редагування запиту текст запиту можна бачити у вікні під список полів. Нижче за галочкою «Автозаповнення» ми можемо регулювати заповнення додаткових параметрів для полів, визначених у запиті. Слід звернути увагу, що склад полів визначається лише самому запиті.

Інформація взята із сайту

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

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

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

ВИБРАТИ КількістьПостачальників.Товар ЯК Товар ІЗ (ВИБРАТИ Ціна.Товар ЯК Товар, КІЛЬКІСТЬ(РІЗНІ Ціна.Постачальник) ЯК Постачальники З РеєстрВідомостей.Ціна ЯК Ціна ЗГРУПЮВАТИ ПО Ціна.Товар) ЯК КількістьПоставників

Формуємо вкладений запит у конструкторі

Сформуємо наведений вище запит за допомогою конструктора.

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


Після чого у нас відкриється вікно з ще одним екземпляром конструктора запитів:


І в цьому новому вікні конструюємо вкладений запит:




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


Після натискання на кнопку ОК у допоміжному конструкторі отримуємо в основному вікні наступну картину:


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




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

Як із звичайного запиту зробити вкладений у конструкторі

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

Вміння писати текст запиту вручну ніколи не було зайвим, але зручніше використовувати конструктор запитів.

Зауваження.

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

Створимо обробку «КонструкторЗапиту» та визначаємо її у підсистему «ЗвітиІОбробки».

Створимо форму обробки і додаємо реквізит форми «ТабДок» типу «Таблічний документ», а також команду «Виконати Запит» з дією «Виконати Запит». Далі перетягуємо їх на форму.

У модулі форми, для роботи команди, пишемо процедуру:

&На Клієнті

Процедура Виконати Запит(Команда)

Виконати Запит Сервер();

КінецьПроцедури

&На сервері

КінецьПроцедури

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

Малюнок 2.65 Конструктор запиту на обробку результату

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

На закладці «Таблиці та поля» конструктора можна переглянути існуючі на даний момент таблиці в системі (ліва частина під назвою «База даних») (Малюнок 2.66).

Малюнок 2.67 Конструктор запиту

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

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

Тут ми прибрали, створюване за замовчуванням, поле вистави - «ПРЕДСТАВЛЕННЯ (Надходження Товарів Товари. Номенклатура)»

У будь-який момент роботи з конструктором можна дивитися одержуваний текст запиту. Для виконання цього завдання необхідно натиснути кнопку «Запит», розташовану в нижньому лівому куті форми конструктора (рисунок 2.69).

Можна відредагувати текст запиту вручну, натиснувши кнопку «Редагувати» .

практика. Натискаємо кнопку «ОК» і перевіряємо нашу обробку в режимі користувача. Якщо проаналізувати дані, отримані при виконанні запиту, то можна зустріти «повтори» номенклатурних позицій (якщо це не вийшло, то можна скопіювати і провести будь-який документ «Надходження Товарів»).

Повертаємося в процедуру Виконати Запит Сервер() в обробці «Конструктор Запиту» та з контекстного меню знову викликаємо «Конструктор запиту з обробкою результату».

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

При визначенні угруповань необхідно дотримуватися наступного правила: усі поля вибірки запиту діляться на поля, якими проводиться угруповання (згортка), поля вкладених таблиць (сумовані поля щодо тих, якими ведеться угруповання) і агрегатні функції. Визначимо угруповання (Малюнок 2.70).

Малюнок 2.70 Конструктор запиту

Якщо дані, отримані запитом, повинні вибиратися за якоюсь умовою, то в цьому випадку може знадобитися задіяти закладку «Умови». Виберемо Надходження Товарів Товари. Кількість = 10 (Малюнок 2.71).

Малюнок 2.71. Умова конструктора запиту.

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

Виправити ситуацію можна двома способами:

    Перевизначивши умову, наголосивши на прапорі «П...»;

    Скориставшись можливістю зміни самого тексту запиту (при натисканні на кнопку «Редагувати Запит»).

Сама зміна вручну полягатиме в тому, що перед числом «10» необхідно прибрати символ «&». Цим символом у тексті запиту визначаються параметри запиту, які надалі (але перед виконанням запиту) мають бути записані будь-які значення. Натисніть на кнопку «Редагувати Запит» і керуємо (Малюнок 2.72).

Малюнок 2.73 Редагування запиту

На закладці «Додатково» можна відзначити ряд прапорів (що стосуються ключового слова «Вибрати» мови запитів) та визначити склад таблиць, призначених для зміни запиту (Малюнок 2.74).

Рисунок 2.74 Додаткові функції запиту

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

На закладці "Порядок" можна визначити порядок сортування записів у результаті запиту (Малюнок 2.75).

Малюнок 2.75 Порядок сортування записів

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

При визначенні розділу "Підсумки" слід бути готовим до того, що в результаті запиту з'явиться "додаткові" підсумкові записи. Разом із цими записами результат запиту стає ієрархічним (Малюнок 2.76).

Рисунок 2.76.Підсумки конструктора запиту.

Допустимо вказівку кількох типів результатів:

    Елементи (у вибірці результату запиту присутні підсумки угруповань і детальні записи);

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

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

Після натискання на кнопку «Ок» конструктора, буде сформовано «Макет» і в модулі форми пропишеться код процедури Виконати Запит Сервер():

&На сервері

Процедура Виконати Запит Сервер()

//((КОНСТРУКТОР_ЗАПРОСА_З_ОБРОБКОЮ_РЕЗУЛЬТАТА

// Цей фрагмент побудований конструктором.

// При повторному використанні конструктора, внесені вручну зміни будуть втрачені!

Макет = Обробки. Конструктор Запитів. Отримати Макет ("Макет");

Запит = Новий Запит;

Запит.Текст =

| НадходженняТоварівТовари.Номенклатура ЯК Номенклатура,

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

| СУМА(НадходженняТоварівТовари.Сума) ЯК Сума

| Документ.НадходженняТоварів.Товари

| ЯК НадходженняТоварівТовари

| Надходження Товарів Товари. Кількість > 1

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

| НадходженняТоварівТовари.Номенклатура

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

| Кількість,

| Сума ЗБІВ

| СУМА(Кількість),

| СУМА(Сума)

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

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

ОбластьЗаголовок = Макет.ОтриматиОбласть("Заголовок");

ОбластьПодвал = Макет.ОтриматиОбласть("Подвал");

ОбластьШапкаТаблиці = Макет.ОтриматиОбласть("ШапкаТаблиці");

ОбластьПідвалТаблиці = Макет.ОтриматиОбласть("ПодвалТаблиці");

ОбластьНоменклатураІєрархія = Макет.Отримати Область("НоменклатураІєрархія");

ОбластьНоменклатура = Макет.ОтриматиОбласть("Номенклатура");

ТабДок.Очистити();

ТабДок.Вивести(ОбластьЗаголовок);

ТабДок.Вивести(ОбластьШапкаТаблиці);

ТабДок.ПочатиАвтоугрупованняРядок();

ВибіркаНоменклатура = Результат.Вибрати(ОбхідРезультатуЗапроса.Угрупуванням);

Поки ВибіркаНоменклатура.Наступний() Цикл

Якщо ВибіркаНоменклатура.ТипЗаписи() = ТипЗаписуЗапиту.РезультатПоІєрархії Тоді

Область = ОбластьНоменклатураІєрархія;

Область = ОбластьНоменклатура;

КінецьЯкщо;

Область.Параметри.Заповнити(ВибіркаНоменклатура);

Вивести(Область, ВибіркаНоменклатура.Рівень());

КінецьЦикл;

ТабДок.ЗакінчитиАвтоугрупованняСторок();

ТабДок.Вивести(ОбластьПодвалТаблиці);

ТабДок.Вивести(ОбластьПодвал);

//)) КОНСТРУКТОР_ЗАПИТ_З_ОБРОБКОЮ_РЕЗУЛЬТАТУ