Робота з конструктором запиту із виведенням у табличний документ. Конструктор запитів схеми компонування даних Конструктор запитів 1с 8.3 умови

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

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

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

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

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

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

Щоб створити нашу табличку Параметрів, на вкладці "Дані" в її "Таблічній частині" додамо нову таблицю, назвемо її Параметри Запиту, тут же додамо колонки цієї таблиці: 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С складається з написання програми. 1С це злиток дій користувача та даних з якими він працює.

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

Основна частина звіту – це запит 1С. Що стосується звіту СКД – це більшість звіту.

Сядьте. Зітхніть. Заспокойтесь. Зараз я скажу вам новину.

Щоб програмувати в 1С недостатньо знати мову програмування 1С. Потрібно знати мову запитів 1С.

Мова запитів 1С – це окрема мова, яка дозволяє вказати які дані нам потрібно дістати з бази даних.

Він теж двомовний – тобто можна писати російською чи англійською. Він виключно схожий на мову запитів SQL і тим, хто знає таку – можна розслабитись.

Як використовуються Запити 1С

Коли користувач запускає 1С у режимі Підприємство – у запущеному клієнті немає жодної грами даних. Тому коли потрібно відкрити довідник – 1С запитує дані із бази даних, тобто робить запит 1С.

Запити 1С бувають:

  • Автоматичні запити 1С
    Формуються автоматично системою. Ви створили форму списку документів. Додали колонку. Це означає, що при відкритті цієї форми в режимі Підприємство буде запит і будуть запитані дані щодо цієї колонки.
  • Напівавтоматичні запити 1С
    Існує безліч методів (функцій) у мові 1С, при зверненні до яких відбувається запит до бази даних. Наприклад.ОтриматиОб'єкт()
  • Ручні запити 1С (написані програмістом спеціально як запит)
    Ви можете написати запит 1С самостійно у коді та виконати його.

Створення та виконання запитів 1С

Запит 1С – це текст запиту мовою запитів 1С.
Текст можна написати ручками. Тобто взяти та написати (якщо знаєш цю мову).

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

Після того, як готовий текст запиту 1С, його потрібно виконати. Для цього є об'єкт у коді 1С Запит(). Ось приклад:

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

| Довідник Номенклатура ЯК Номенклатура
|ДЕ
| Номенклатура.Послуга";
Вибірка = Запит.Виконати().Вибрати();

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

Як Ви бачите у прикладі – після виконання запиту 1С до нас приходить результат і ми маємо його обробити. Результат - це один або кілька рядків таблиці (у спеціальному вигляді).

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

Або просто обійти по рядках.
Вибірка = Запит.Виконати().Вибрати();
Поки Вибірка.Наступний() Цикл
//Щось робимо з результатами запиту
КінецьЦикл;

Робота із запитами 1С

Основні принципи запитів 1С

Основні засади побудови запиту 1С –
ВИБРАТИ СписокПолів З НазваТаблиці ДЕ Умови

Приклад побудови такого запиту 1С:

ВИБРАТИ
//Список полів, які треба вибрати
Посилання,
Найменування,
Код
З
//Найменування таблиці, звідки вибираємо дані
//Список таблиць - це список об'єктів у вікні конфігуратора
Довідник.Номенклатура
ДЕ
//Вказуємо відбір
ВидТовара = &Послуга //відбір за зовнішнім значенням
Або Послуга // «Послуга» – реквізит типу Бульово, відбір за значенням Істина
ВПОРЯДКУВАТИ ЗА
//Сортування
Найменування

Список таблиць 1С

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

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

Регістр Відомостей. Ім'я Реєстру.

РегістрНакопичення.Ім'яРегістра.Залишки(&Дата) – запит 1С з регістру залишків на певну дату

РегістрНакопичення.Ім'яРегістра.Обороти(&ДатаПочатку, &ДатаЗакінчення) – запит 1С з регістру оборотів за період з дати початку по дату закінчення.

Додаткові принципи

Коли ми запитуємо список якихось даних – працюють основні засади. Але ми можемо запитати також цифри і запит може їх порахувати (скласти наприклад).

ВИБРАТИ
//Кількість(Ім'яПоля) – вважає кількість
//Поле ЯК ІншеІм'я - перейменовує поле
Кількість(Посилання) ЯК КількістьПроведенихДокументів
З

ДЕ
Проведено

Цей запит 1С поверне нам загальну кількість документів. Однак у кожному документі є поле Організація. Допустимо ми хочемо порахувати за допомогою запиту 1С кількість документів щодо кожної організації.

ВИБРАТИ
//просто поле документа
Організація,
//Вважаємо кількість
Кількість(Посилання) ЯК КількістьПо Організаціям
З
Документ.РеалізаціяТоварівПослуг
ДЕ
Проведено
ЗГРУПУВАТИ ПО

Організація

Цей запит 1С поверне нам кількість документів щодо кожної організації (також говорять «у розрізі організацій»).

Порахуємо додатково за допомогою запиту 1С суму цих документів:

ВИБРАТИ
//просто поле документа
Організація,
//Вважаємо кількість

//вважаємо суму

З
Документ.РеалізаціяТоварівПослуг
ДЕ
Проведено
ЗГРУПУВАТИ ПО
//необхідно використовувати, якщо у списку полів є функція підрахунку() і одночасно одне або кілька полів - тоді потрібно групувати по цих полях
Організація

Цей запит 1С поверне нам суму документів.

ВИБРАТИ
//просто поле документа
Організація,
//Вважаємо кількість
Кількість(Посилання) ЯК КількістьПо Організаціям,
//вважаємо суму
Сума(СумаДокументу) ЯК Сума
З
Документ.РеалізаціяТоварівПослуг
ДЕ
Проведено
ЗГРУПУВАТИ ПО
//необхідно використовувати, якщо у списку полів є функція підрахунку() і одночасно одне або кілька полів - тоді потрібно групувати по цих полях
Організація
ПІДСУМКИ ЗА Загальні

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

Коротко про додаткові можливості мови запитів 1С:

  • З'єднання даних із кількох таблиць
  • Вкладені запити
  • Пакетний запит
  • Створення власних віртуальних таблиць
  • Запит із таблиці значень
  • Використання вбудованих функцій отримання значення та маніпулювання значеннями.

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

Щоб не писати текст запиту руками існує конструктор запитів 1С. Просто натисніть правою кнопкою миші в будь-якому місці модуля та виберіть Конструктор запиту 1С.

Виберіть у конструкторі запитів 1С потрібну таблицю зліва і перетягніть правіше.

Виберіть у конструкторі запитів 1С з таблиці потрібні поля та перетягніть правіше. Якщо Ви хотіли б не просто вибрати поле, а застосувати до нього якусь функцію підсумовування – після перетягування клацніть по полю двічі мишкою. На закладці Угруповання після цього потрібно буде вибрати (перетягнути) потрібні поля для угруповання.

На закладці Умови в конструкторі запитів 1С Ви можете вибрати потрібні відбори таким же способом (перетягнувши поля, якими Ви будете робити відбір). Не забудьте вибрати правильну умову.

На закладці Порядок – вказується сортування. Підсумки – підсумовування підсумків.

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

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

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

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

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

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

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

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

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

Відкриється МодульФорми з готовою порожньою процедурою "Процедура КонструкторЗапроса(Команда)". Усередині цієї процедури ми й опишемо виклик стандартного конструктора запитів 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-коду, як роблять у професійних консолях.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Отже, менеджер Тимчасових таблиць у запиті не завжди розуміє, що з ним працюють)) Тому потрібно явно задати цей самий менеджер Тимчасових таблиць:

&НаСервері Процедура ВиконатиЗапитНаСервере() //апгрейд2-явне визначення менеджера Тимчасових Таблиць! Менеджер ВТ = Новий Менеджер Тимчасових Таблиць; Запит = Новий Запит; //апгрейд2-явне визначення менеджера Тимчасових Таблиць! Запрос.МенеджерТимчасовихТаблиць = МенеджерВТ; Запит.Текст = Об'єкт.ТекстЗапиту;

Даний варіант консолі лежить у третьому завантаженні.



Подібні публікації