Работа с дизайнера на заявки с извеждане в документ с електронна таблица. Дизайнер на заявки за схема за съставяне на данни Дизайнер на заявки 1C 8.3 условия

Конструктор на заявкие един от инструментите за развитие. Тя ви позволява да съставите текст на заявка на език на заявка, като използвате изключително визуални средства.

Използване на бутони По-нататъкИ обратноможете да навигирате в разделите на дизайнера и да посочите какви данни трябва да присъстват в резултат на заявката, как са свързани, групирани, какви суми трябва да се изчислят, да работите с временни таблици, да редактирате пакет от заявки:

Резултатът от работата на конструктора ще бъде синтактично правилният текст на заявката. По този начин разработчикът може да създаде работеща заявка дори без да знае синтаксиса на езика на заявката - конструкторът автоматично ще генерира необходимите синтактични структури. Готовият текст на заявката може да бъде незабавно поставен в текста на модула или копиран в клипборда.

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

И така, нека започнем с нещо просто: създайте New Processing в конфигуратора, наименувайте го Query Console или Query Builder, както желаете.

Можем веднага да добавим таблица в „Данни“ за бъдещи параметри, от които се нуждаем, така че в нашата конзола да изпълняваме не най-примитивната заявка, а с параметри и връзки, например за нашата работа ще създадем заявка към периодични регистри , но тук без Параметър инструкции=&Дата никъде.

За да създадем нашата таблица с параметри, в раздела „Данни“ в нейната „Таблица“ ще добавим нова таблица, нека я наречем Параметри на заявката, тук ще добавим колоните на тази таблица: 1) Име на параметър, тип низ = 25 знака ; ParameterValue, тук е съставен тип данни, вижте фиг.

Следователно, както е показано на снимката, ние избираме съставен тип за колоната „Стойност на параметъра“: в менюто за тип, което се отваря, поставете отметка в квадратчето „Композитен тип“, изберете число, низ (посочете 20 знака), дата, булев и маркирайте долната отметка – AnyLink – това означава, че при посочване на параметрите на нашата заявка можем да се позоваваме на всеки обект от нашата конфигурация, например директории или документи.

Сега трябва да създадем формата на нашата бъдеща Query Console. В процеса на обработка нека отидем в раздела „Формуляри" и да добавим нов. Влизаме в тази форма и тук вече има неограничено поле за творчество - можете да подредите двата детайла, които току-що създадохте, и табела с параметри, както искате! За да направите това, можете да използвате стандартни елементи на формуляр като група или страница със страници (ако предпочитате да обръщате страници.

Основното нещо тук е едно: след като плъзнете атрибута "TextValues" в лявото поле за редактиране на формуляра, не забравяйте да зададете "View"=Поле за текстов документ в неговите свойства. Вижте Фигура:

В свойствата на атрибута „Таблица на заявка“ можете по избор да посочите „Показване на решетка“ и „Показване на заглавки“.

След това в десния прозорец за редактиране на формуляра отидете в раздела „Команди“ и добавете нов бутон, когато щракнете върху него, нашата конзола ще извърши определено действие. Нека създадем бутон „Дизайнер на заявки“, ако желаете, можете да добавите икона към бутона, основното е да поставите самия бутон в левия прозорец за редактиране на формата - така че да можем да го видим. След това в десен прозорец за редактиране на формата, щракнете с десния бутон върху нашия бутон и изберете свойства – в свойствата щракнете върху елемента „Действие“, ще се появи модален прозорец с въпрос къде точно ще се изпълнява програмният ни код, който ще зададем на бутон – изберете “На клиента”.

Модулът Form ще се отвори с готова празна процедура “Procedure Query Constructor (Command)”. В тази процедура ще опишем извикването на стандартния 1c8 Query Builder. Много е лесно: Конструктор = Конструктор на нова заявка;Но тук има клопки - вграденият в платформата Query Constructor работи в потребителски режим САМО под дебел клиент! Затова ще вмъкнем условието на инструкцията на препроцесора #If, но тук вие решавате сами, въз основа на вашата платформа, или имате обикновени форми, след което изберете „ FatClientRegularApp” или имате платформа, базирана на управлявани формуляри, тогава „ ThickClientManagedApplication“.виж фиг.

Сега остава да добавим към тази процедура условие за записване на текста на заявката, който Query Builder ще генерира за нас в детайлите на нашия формуляр „Текст на заявката“:

If Constructor.OpenModal()=True Then Object.RequestText=Constructor.Text; endIf;

Но можем ръчно да променим нещо в текста на заявката (в потребителски режим - в прозореца на атрибута „Текст на заявката“), така че нашите промени да влязат в конструктора на заявки, когато бъде извикан отново - ще добавим просто условие тук:

Ако не EmptyString(Object.QueryText) Тогава Constructor.Text = Object.QueryText; endIf;

Това е всичко, свързахме конструктора на заявки, вграден в платформата 1c8, нека да разгледаме нашата работа. За да направите това, стартирайте 1C:Enterprise в режим на дебел клиент, като използвате един от следните методи: 1) главно меню на конфигуратора – Отстраняване на грешки – Стартиране на отстраняване на грешки – Дебел клиент; 2) или ако имате тези клавиши на контролния панел в конфигуратора - просто натиснете бутона с жълт кръг с дебела точка, вижте фигурата:

Потребителският режим на 1cEnterprise8 стартира, намираме нашата обработка, стартираме я, щракваме върху бутона „Query Designer“ и вижте как се отваря вграденият в платформата дизайнер. виж фиг.

И така, конструкторът на заявки работи, можем да започнем да съставяме нашата бъдеща заявка в него, но ни е интересно да видим как ще работи заявката, която създадохме! И за да направим това, трябва да създадем друг бутон в конфигуратора, когато редактираме формата на нашата конзола, нека го наречем „Изпълни заявка“. В свойствата на бутона „Изпълни заявка“, щракнете върху „Действие“, отново се появява меню, в което ни питат къде ще бъде обработен нашият програмен код, в този случай избираме „Както на клиента, така и на сървъра“, отново се озоваваме в модула Forms.

В процедурата Execute Query(), която имаме на клиента, ще напишем условие, ако потребителят не е въвел текста на заявката, но иска да я изпълни:

If EmptyString(Object.QueryText) Then report("Въведете текста на заявката!"); endIf;

Системата вече автоматично е генерирала връзка към процедурата Execute RequestOnServer(); – това е добре, нека да отидем на тази процедура, която се изпълнява на сървъра, и да напишем тук кода за изпълнение на въведената от нас заявка.

Тук има опции: Можете сами да напишете всички изрази, свързани с изграждането на заявки, т.е. ръчно, но има още по-проста опция - вътре в процедурата щракнете с десния бутон и в падащото меню изберете „Конструктор на заявки с обработка на резултати, вижте фигурата“:

Ако щракнете върху елемента "Конструктор на заявки с обработка на резултата", ще се появи модален прозорец "Текстът на заявката не е намерен. Създайте нов? "Щракнете върху да. Ще се отвори вграденият дизайнер на заявки, в който на първия му раздел „Обработка на резултата“ - изберете първия елемент „ Заобикаляне на резултата. Това е всичко, не се нуждаем от нищо друго от този конструктор, щракнете върху бутона „Ok“ - ще се появи модален прозорец „В заявката не са избрани полета, щракнете върху „Ok“.

След това в нашата процедура ExecuteRequestOnServer() ще се появи следният готов шаблон:

Нека да преминем към израза, конструиран от конструктора:

Request.Text = "";

Request.Text = Object.RequestText;

Ето колко е просто, нашият бутон „Изпълнение на заявка“ във формуляра за обработка вече е практически работещ, засега може да обработва само прости заявки без параметри, но най-важното е, че работи! Всичко, което остава, е визуално да покажем резултатите от нашата заявка в атрибута „Таблица със стойности“ на формуляра за обработка. Нека ви напомня, че нашият атрибут „Таблица със стойности“ е от типа „Табличен документ“, защото в противен случай няма да видим резултатите си в потребителски режим. Показването на таблични данни на потребителя винаги се извършва или от табличен документ, или от оформление. Наистина бих искал да е възможно да се показват данни чрез таблица със стойности - тъй като е много лесна за използване и позната, но , за съжаление, таблицата със стойности е само инструмент, от който се нуждае разработчикът, не можете да показвате данни на екрана, като я използвате...

Нека да разгледаме по-подробно какво е документ с електронна таблица - това е като лист в Excel - можете да стигнете до запис в конкретна клетка само с помощта на клетки от таблица, тук ги наричаме област, но ние сами можем да изберем диапазона на тази област в една конкретна клетка:

И така, разбрахме какво е документ с електронна таблица и решихме за себе си, че ще трябва да дефинираме данните от нашата заявка в конкретна клетка на този документ с електронна таблица. Но нека помислим: какъв е „Резултатът от заявката“, който дизайнерът толкова бързо генерира за нас? Отворете помощта - Резултатът от заявката е таблица, която има съответните свойства! виж фиг.

И ако сега напишем след израза Query Result = Query.Execute(); (създаден от конструктора), ето такъв прост цикъл за колекции:

За всяко ColumnName From Query Result.Columns Loop report(ColumnName.Name); EndCycle;

След този цикъл запишете засега всички изрази, създадени автоматично от конструктора. И стартирайте 1C:Enterprise8 под дебелия клиент Създайте произволна проста заявка (Можете да използвате Query Builder - той вече работи за нас) и кликнете върху бутона „Изпълни заявка“:

Ще видите в долната част на прозореца на съобщението, че таблицата с резултати от заявката съхранява имената на полетата, които току-що сме избрали чрез създаване на проста заявка.

Сега нека покажем тези имена на полетата на нашето страдание в документ на електронна таблица:

За всяко име на колона от Query Result.Columns Loop Cell=Object.QueryTable.Area(1,QueryResult.Columns.Index(ColumnName)+1); Cell.Text=Име на колона.Име; EndCycle;

За да покажем детайлите на данните от заявката, нека анализираме изразите, създадени автоматично от дизайнера, и да вмъкнем в цикъла за сортиране „SelectionDetailedRecords“ на самата заявка точно същия цикъл, който използвахме за показване на имената на колоните, само че сега трябва да прехвърлим не данните от таблицата „Резултат от заявката“ в текста на клетката и данните от самата селекция, нека видим в помощта как можете да получите достъп до полето за подробна селекция на заявката:

SelectionDetailRecords = QueryResult.Select(); Докато SelectionDetailedRecords.Next() Loop //в първия ред вече имаме записани имената на колоните на таблицата, така че зареждаме данните под първия редDocRowNumber=Object.QueryTable.TableHeight+1; За всяко ColumnName From Query Result.Columns Cycle Cell=Object.QueryTable.Area(DocRowNumber,QueryResult.Columns.Index(ColumnName)+1); Cell.Text = SelectionDetailedRecords[ColumnName.Name]; EndCycle; EndCycle;

Това е всичко, можем да проверим, да заредим предприятието под дебел клиент, да въведете проста заявка без параметри, да щракнете върху бутона „Изпълни заявка“, вижте фигурата:

Ура, всичко работи!!!

Много е удобно, когато при отваряне/затваряне на нашата Query Console текстът на нашата заявка, с който сме работили преди затваряне на конзолата, отново се записва в полето „Query Text“. За да направите това, просто трябва да активирате свойството на формуляра = Autosave, вижте фиг.

Това е всичко, конзолата ни работи. За да можем да пишем по-сложни заявки с параметри, зададени в тях, трябва да създадем още един бутон „Намиране на параметри“, както и кода на бутона „Изпълни заявка“ - кодът на бутона „Намиране на параметри“ ще бъде изпълнен на клиента и на сървъра. След това в сървърната процедура стартираме заявката по същия начин с текста, предаден в нея от прозореца „Текст на заявката“, като използваме израза „Request.FindParameters()“ намираме предадените параметри и просто ги въвеждаме в влезте в табличната част на формуляра „Параметри на заявката“. Не забравяйте след това да ги прехвърлите от попълнената таблица с параметри към процедурата „Изпълнение на заявка“.

Можете също така да добавите няколко бутона към нашата конзола, които ще изчистят прозореца с параметри и прозореца с текст на заявката в потребителски режим.

Нашата конзола за заявки е готова за използване, желая ви успешни творчески решения с помощта на такъв прост и мощен инструмент като конзолата за заявки!

Тази обработка е написана на платформата 1c8.3 (управлявани формуляри) и се изпълнява под дебел клиент. Може да се пише и на платформата 1c8.2, както под редовни форми, така и под управлявани.

Изтеглянето съдържа извадка от конзолата за заявки, която току-що създадохме.

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

Надграждане на Query Console:

1) Сега нашата домашна конзола за заявки с вграден Query Builder ще работи под всеки клиент: под дебел клиент на обикновени и управлявани формуляри и под тънък и уеб клиент.

p.s. Формата и външният вид на вградения Query Builder е различен - в зависимост от това под кой клиент сме стартирали нашата конзола (аз лично съм по-запознат и удобен с формата на Query Builder под дебел клиент)

&На клиентската процедура Конструктор на заявки (команда) //извикването на стандартния конструктор на заявки е възможно само при дебел клиент #If ThickClientManagedApplication или ThickClientNormalApplication Then Constructor=Нов конструктор на заявки; Ако не EmptyString(Object.QueryText) Тогава Constructor.Text = Object.QueryText; endIf; If Constructor.OpenModal()=True Then Object.RequestText=Constructor.Text; endIf; // #Else // Report("Извикването на Query Builder е възможно само при дебел клиент"); // Връщане; //# EndIf #Else Report("Вие изпълнявате Query Builder под тънък клиент - той се различава леко във формата и скоростта на изпълнение!"); Конструктор = Нов QueryConstructor(); Ако не EmptyString(Object.QueryText) Тогава Constructor.Text = Object.QueryText; endIf; Constructor Alert = New AlertDescription("RunAfterClosingConstructor", ThisForm); Constructor.Show(Constructor Alert); # EndIf Край на процедурата &В процедурата на клиента ExecuteAfterClosingConstructor(Result, ConstructorParameters) Export //Result=текст, ако конструкторът е затворен чрез бутона ok Object.RequestText = AbbreviatedLP(Result); //върши работа!!! Край на процедурата

2) Добавена е възможност към нашата проста конзола за заявки за въвеждане на сложни заявки с временна таблица, предадена на параметрите!!! Механизмът се оказа много прост и елегантен - без използване на XML код, както се прави в професионалните конзоли.

Можете да видите самия код и процедурите за механизма за прехвърляне към параметрите на Временни таблици във втория прикачен файл. Как започнах да разработвам своя собствена версия на временни таблици в параметрите може да се намери на тази връзка https://forum.infostart.ru/forum9/topic183700/

Сега как да използвате конзолата за сложна заявка, когато временна таблица се предава на нейните параметри. Например можете да вземете кода на тази заявка;

ИЗБЕРЕТЕ ExternalData.Product, ExternalData.Quantity PLACE ExternalData FROM &ExternalData AS ExternalData; /////////////////////////////////////////////// // /////////////////////////// ИЗБЕРЕТЕ ExternalData.Product, ExternalData.Quantity, ISNULL(RemainingProductRemaining.QuantityRemaining, 0) AS Field1, ISNULL(Remaining ProductsRemainings.QuantityRemaining, 0) - ExternalData.Quantity AS Remaining FROM ExternalData AS ExternalData LEFT JOIN Register Accumulations.Remaining Products.Remainings(&Дата, Product IN (SELECT ExternalData.Product FROM ExternalData AS ExternalData)) AS Remaining ProductsRemainings Software ExternalData.Product = Remaining ProductRemaining Продукт

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

И така, в дизайнера на заявки създадохме горната заявка, затваряйки конструктора - текстът на заявката ще отиде в полето на нашата конзола „Текст на заявката“, щракнете върху бутона „Намиране на параметри“, виждаме, че в таблицата с параметри се е появил ред = „Външни данни“, Тип стойност = „Таблица със стойности“, вижте фиг.

В тази таблица с параметри - въведете параметъра Date, например днешната дата, след което щракнете, за да опитате да редактирате параметъра на нашата временна таблица „Външни данни“, щракнете в полето с „Таблица със стойности“ върху три точки - избор на типове ще се появи, щракнете върху Ред, нашият механизъм ни обръща страницата на формуляра, където трябва ръчно да въведем тази много временна таблица.

Имайте предвид, че в този случай на страницата „Разписания“ в долната част в полето „Име на временна таблица в параметри“ ще се появи името на нашата временна таблица (то е копирано от таблицата с параметри).

Досега на страницата „Времеви таблици" виждаме само една празна таблица - това е таблицата с типове на бъдещата ни временна таблица. Чрез бутона „Добавяне" ще добавим името на детайлите и типа на бъдещата таблица . Бъдете внимателни - името и типът трябва да съответстват на това, което сме посочили в заявката за &ExternalData:

Сега натискаме бутона „Актуализиране на временна таблица“ - и тук ще имаме втора таблица - директно ще я попълним с данни за временна таблица чрез бутона „Добавяне“.

Това е всичко, можем да се проверим още веднъж дали сме въвели примитивните данни на параметрите на заявката в таблицата с параметри на 1-ва страница на обработка и щракнете върху бутона „Изпълни заявка“ - всичко се изчислява и селектира съответно с ограничение на данните, предавани в параметъра на нашата временна таблица

p.s. Ако сте направили грешка при въвеждането на името на детайлите и техните типове (в първата таблица) - просто затворете конзолата и я отворете отново - временната таблица с данни ще бъде изтрита - и таблицата с типове може отново да се редактира и нова таблица с данни може да бъде създадена отново.

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

Това е всичко, можем да създадем много мощен работен инструмент със собствените си ръце, освен това нашата конзола все още е много бърза в сравнение с професионалните - и това е много голям плюс за разработчиците! И, разбира се, сега нашата конзола работи под всеки клиент! Успех в творческото развитие!!!

Днес ще говорим за това как да направим вложени заявкиизползвайки конструктор на заявки. Нека преминем направо към пример.

Да кажем, че имаме този прост регистър с информация, където цените се съхраняват по стоки и доставчици:

Искаме да поискаме да получим всички продукти, които имат повече от един доставчик. Това може да се реализира с помощта на следната заявка:

ИЗБЕРЕТЕ Брой доставчици.Продукт КАТО Продукт ОТ (ИЗБЕРЕТЕ Цена.Продукт КАТО Продукт, КОЛИЧЕСТВО(РАЗЛИЧЕН Цена.Доставчик) КАТО Доставчици ОТ RegisterInformation.Цена КАТО ГРУПИРАНЕ ПО Цена.Продукт КАТО Брой доставчици WHERE Брой доставчици.Доставчици > 1

Формиране на вложена заявка в конструктора

Нека създадем горната заявка с помощта на конструктора.

За да направите това, в командния панел над полето МасиНатисни бутона Създайте подзаявка:


След което ще се отвори прозорец с друго копие на конструктора на заявка:


И в този нов прозорец създаваме вложена заявка:




Щракване върху бутона ЗаявкаВ долния ляв ъгъл виждаме текста на подзаявката:


След натискане на бутона OK в помощния конструктор, получаваме следната картина в главния прозорец:


Тъй като фразата NestedQueryне е много удобно за възприемане, нека използваме десния бутон на мишката, за да преименуваме таблицата на Брой доставчици, изберете поле от него Продукти на отметката УсловияНека запишем необходимото условие:




И след всички тези манипулации получаваме желаната заявка. Ако е необходимо, можете да създавате заявки с няколко нива на влагане.

Как да направите вложена заявка от обикновена заявка в конструктора

Много често възниква ситуация, когато започнете да правите заявка в конструктора и в един момент осъзнавате, че тя трябва да бъде вложена. Разбира се, в нашия пример няма проблем - можете просто да изтриете всичко и да подадете отново заявката. Но на практика има много по-сложни примери, например с няколко нива на влагане, когато няколко часа са били изразходвани за заявка. И в този случай има доста прост изход. Можете да използвате текстовия редактор на заявки, вграден в дизайнера. Трябва да използвате бутон Заявкавземете текста на заявката (вижте снимката по-горе) и го копирайте в клипборда. След това създайте нова вложена заявка и натиснете отново бутона Заявка, поставете текста от буфера, щракнете върху OK. Съответно изчистваме старата заявка на най-високо ниво. По този начин, ако е необходимо, можем лесно да създаваме многостепенни вложени заявки в движение.

1C програмирането се състои в нещо повече от писане на програма. 1C е слитък от потребителски действия и данни, с които работи.

Данните се съхраняват в база данни. 1C заявките са начин за извличане на данни от база данни, за да се покажат на потребителя във форма или да се обработят.

Основната част от отчета е заявката за 1C. В случай на отчет, ACS е най-голямата част от доклада.

Седни. Поеми си дъх. Успокой се. Сега ще ви кажа новината.

За да програмирате в 1C, не е достатъчно да знаете езика за програмиране 1C. Също така трябва да знаете езика за заявки 1C.

Езикът за заявки 1C е напълно отделен език, който ни позволява да посочим какви данни трябва да получим от базата данни.

Освен това е двуезичен - тоест можете да пишете на руски или английски. Той е изключително подобен на езика за заявки SQL и тези, които го познават, могат да си отдъхнат.

Как се използват 1C заявки

Когато потребителят стартира 1C в режим Enterprise, в работещия клиент няма нито един грам данни. Следователно, когато трябва да отворите директория, 1C изисква данни от базата данни, тоест прави 1C заявка.

1C заявките са:

  • Автоматични заявки 1C
    Генерира се автоматично от системата. Създадохте формуляр за списък с документи. Добавена е колона. Това означава, че когато отворите този формуляр в режим Enterprise, ще има заявка и данните за тази колона ще бъдат поискани.
  • Полуавтоматични заявки 1C
    Има много методи (функции) на езика 1C, при достъп до които се прави заявка към базата данни. Например.GetObject()
  • Ръчни 1C заявки (написани от програмиста специално като заявка)
    Можете сами да напишете 1C заявка в код и да я изпълните.

Създаване и изпълнение на 1C заявки

Заявка 1C е действителният текст на заявката на езика на заявката 1C.
Текстът може да бъде написан с химикалки. Тоест вземи и го напиши (ако знаеш този език).

Тъй като 1C насърчава концепцията за визуално програмиране, където много или почти всичко може да се направи без писане на код на ръка, има специален обект на конструктор на заявки, който ви позволява да начертаете текста на заявка, без да знаете езика на заявката. Чудеса обаче не се случват - за това трябва да знаете как да работите с конструктора.

След като текстът на заявката 1C е готов, тя трябва да бъде изпълнена. За тази цел в 1C кода Request() има обект. Ето един пример:

Заявка = Нова заявка();
Query.Text = "ИЗБЕРЕТЕ
| Номенклатура.Връзка
| ОТ
| Справочник.Номенклатура AS Номенклатура
|КЪДЕ
| Номенклатура.Обслужване“;
Изберете = Query.Run().Select();

Доклад(Избор.Връзка);
EndCycle;

Както можете да видите в примера, след изпълнение на заявката 1C, резултатът идва при нас и ние трябва да го обработим. Резултатът е един или няколко реда от таблицата (в специална форма).

Резултатът може да бъде качен в обикновена таблица:
Fetch = Query.Run().Unload(); //Резултат – таблица със стойности

Или просто обикаляйте ред по ред.
Изберете = Query.Run().Select();
Докато Select.Next() цикъл
//Направете нещо с резултатите от заявката
EndCycle;

Работа с 1C заявки

Основни принципи на 1C заявки

Основни принципи за изграждане на 1C заявка -
ИЗБЕРЕТЕ Списък с полета ОТ Заглавие на таблица WHERE Условия

Пример за конструиране на такава 1C заявка:

ИЗБИРАМ
//списък с полета за избор
връзка,
Име,
Код
ОТ
//име на таблицата, от която избираме данни
//списък с таблици е списък с обекти в прозореца на конфигуратора
Справочник.Номенклатура
КЪДЕТО
//показва избор
Тип продукт = &Услуга //избор по външна стойност
Или услуга // Атрибут „Услуга“ от тип Boolean, избор по стойност True
СОРТИРАНЕ ПО
//Сортиране
Име

Списък на 1C таблици

Можете да видите имената на таблиците в прозореца на конфигуратора. Просто трябва да напишете “Указател” вместо “Указатели”, например “Указател.Номенклатура” или “Документ.Продажби на стоки и услуги” или “Регистър на натрупване.Продажби”.

Има допълнителни таблици (виртуални) за регистрите, които ви позволяват да получите окончателните числа.

Information Register.RegisterName.Last Slice(&Date) – 1C заявка от информационния регистър, ако е периодична, за определена дата

Accumulation Register.Register Name.Balances(&Date) – 1C заявка от регистъра на балансите за определена дата

Регистър за натрупване.Име на регистър.Оборот (&Начална дата, &Крайна дата) – 1C заявка от оборотния регистър за периода от началната дата до крайната дата.

Допълнителни принципи

Когато поискаме списък с някои данни, основните принципи работят. Но ние също можем да поискаме числа и заявката може да ги преброи вместо нас (да ги добави например).

ИЗБИРАМ
//Quantity(FieldName) – брои количеството
//Field AS OtherName – преименува полето
Количество (връзка) AS Количество публикувани документи
ОТ

КЪДЕТО
Проведено

Тази заявка от 1C ще ни върне общия брой документи. Всеки документ обаче има поле Организация. Да приемем, че искаме да преброим броя на документите за всяка организация, използвайки 1C заявка.

ИЗБИРАМ
//просто поле за документ
организация,
//преброяване на количеството
Количество (връзка) AS QuantityBy Organisations
ОТ
Документ Продажби на стоки и услуги
КЪДЕТО
Проведено
ГРУПИРАЙ ПО

Организация

Тази заявка 1C ще ни върне броя документи за всяка организация (наричана още „по организация“).

Нека допълнително изчислим количеството на тези документи с помощта на 1C заявка:

ИЗБИРАМ
//просто поле за документ
организация,
//преброяване на количеството

//пребройте сумата

ОТ
Документ Продажби на стоки и услуги
КЪДЕТО
Проведено
ГРУПИРАЙ ПО
//трябва да се използва, ако списъкът с полета има функция count() и едно или повече полета едновременно - тогава трябва да групирате по тези полета
Организация

Тази заявка от 1C също ще ни върне количеството документи.

ИЗБИРАМ
//просто поле за документ
организация,
//преброяване на количеството
Количество (връзка) AS QuantityBy организации,
//пребройте сумата
Сума (DocumentAmount) КАТО сума
ОТ
Документ Продажби на стоки и услуги
КЪДЕТО
Проведено
ГРУПИРАЙ ПО
//трябва да се използва, ако списъкът с полета има функция count() и едно или повече полета едновременно - тогава трябва да групирате по тези полета
Организация
ПО РЕЗУЛТАТИ Общи

Езикът за заявки 1C е обширен и сложен и ние няма да разгледаме всичките му възможности в един урок - прочетете следващите ни уроци.

Накратко за допълнителните функции на езика за заявки 1C:

  • Обединяване на данни от множество таблици
  • Вложени заявки
  • Пакетна заявка
  • Създаване на собствени виртуални маси
  • Заявка от таблица със стойности
  • Използване на вградени функции за получаване и манипулиране на стойности.

1C Query Builder

За да не пишете текста на заявката на ръка, има дизайнер на заявки 1C. Просто щракнете с десния бутон навсякъде в модула и изберете 1C Query Designer.

Изберете желаната таблица отляво в дизайнера на заявки 1C и я плъзнете надясно.

Изберете необходимите полета от таблицата в дизайнера на заявки 1C и плъзнете надясно. Ако желаете не само да изберете поле, но и да приложите към него някаква функция за сумиране, след като плъзнете, кликнете върху полето два пъти с мишката. След това в раздела Групиране ще трябва да изберете (плъзнете) необходимите полета за групиране.

В раздела Условия в дизайнера на заявки 1C можете да изберете необходимите селекции по същия начин (чрез плъзгане на полетата, чрез които ще направите избора). Не забравяйте да изберете правилното състояние.

В раздела Поръчка е посочено сортирането. В раздела Резултати – обобщаване на резултатите.

С помощта на дизайнера на заявки 1C можете да изучавате всяка съществуваща заявка. За да направите това, щракнете с десния бутон върху текста на съществуваща заявка и изберете 1C дизайнер на заявки - и заявката ще бъде отворена в 1C дизайнера на заявки.

И така, нека започнем с нещо просто: създайте New Processing в конфигуратора, наименувайте го Query Console или Query Builder, както желаете.

Можем веднага да добавим таблица в „Данни“ за бъдещи параметри, от които се нуждаем, така че в нашата конзола да изпълняваме не най-примитивната заявка, а с параметри и връзки, например за нашата работа ще създадем заявка към периодични регистрира, но тук без Параметр инструкции=&Дата никъде.

За да създадем нашата таблица с параметри, в раздела „Данни“ в нейната „Таблица“ ще добавим нова таблица, нека я наречем Параметри на заявката, тук ще добавим колоните на тази таблица: 1) Име на параметър, тип низ = 25 знака ; ParameterValue, тук е съставен тип данни, вижте фиг.

Следователно, както е показано на снимката, ние избираме съставен тип за колоната „Стойност на параметъра“: в менюто за тип, което се отваря, поставете отметка в квадратчето „Композитен тип“, изберете число, низ (посочете 20 знака), дата, булев и маркирайте долната отметка - AnyLink - това означава, че при посочване на параметрите на нашата заявка можем да се позоваваме на всеки обект от нашата конфигурация, например директории или документи.

Сега трябва да създадем формата на нашата бъдеща Query Console. В процеса на обработка нека отидем в раздела "Формуляри" и да добавим нов. Влизаме в този формуляр и вече има неограничено поле за творчество - можете да подредите двата детайла, които току-що създадохте, и табела с параметри, както искате! За да направите това, можете да използвате стандартни елементи на формуляр като група или страница със страници (ако предпочитате да обръщате страници.

Основното нещо тук е едно: след като плъзнете атрибута "TextValues" в лявото поле за редактиране на формуляра, не забравяйте да зададете "View"=Поле за текстов документ в неговите свойства. Вижте Фигура:

В свойствата на атрибута „Таблица на заявка“ можете по избор да посочите „Показване на решетка“ и „Показване на заглавки“.

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

Модулът Form ще се отвори с готова празна процедура “Procedure Query Constructor (Command)”. В тази процедура ще опишем извикването на стандартния 1c8 Query Builder. Много е лесно: Конструктор = Конструктор на нова заявка;Но тук има клопки - вграденият в платформата Query Constructor работи в потребителски режим САМО под дебел клиент! Затова ще вмъкнем условието на инструкцията на препроцесора #If, но тук вие решавате сами, въз основа на вашата платформа, или имате обикновени форми, след което изберете " FatClientRegularApp"или имате платформа, базирана на управлявани формуляри, тогава" ThickClientManagedApplication".виж фиг.

Сега остава да добавим към тази процедура условие за записване на текста на заявката, който Query Builder ще генерира за нас в детайлите на нашия формуляр „Текст на заявката“:

If Constructor.OpenModal()=True Then Object.RequestText=Constructor.Text; endIf;

Но можем ръчно да променим нещо в текста на заявката (в потребителски режим - в прозореца на атрибута "Текст на заявката"), така че нашите промени да влязат в конструктора на заявки, когато бъде извикан отново - ще добавим просто условие тук:

Ако не EmptyString(Object.QueryText) Тогава Constructor.Text = Object.QueryText; endIf;

Това е всичко, свързахме конструктора на заявки, вграден в платформата 1c8, нека да разгледаме нашата работа. За да направите това, стартирайте 1C:Enterprise в режим на дебел клиент, като използвате един от следните методи: 1) главно меню на Конфигуратора - Отстраняване на грешки - Стартиране на отстраняване на грешки - Дебел клиент; 2) или ако имате тези клавиши на контролния панел в конфигуратора - просто натиснете бутона с жълт кръг с дебела точка, вижте фигурата:

Потребителският режим на 1cEnterprise8 стартира, намираме нашата обработка, стартираме я, щракваме върху бутона „Query Designer“ и вижте как се отваря вграденият в платформата дизайнер. виж фиг.

И така, конструкторът на заявки работи, можем да започнем да съставяме нашата бъдеща заявка в него, но ни е интересно да видим как ще работи заявката, която създадохме! И за да направим това, трябва да създадем друг бутон в конфигуратора, когато редактираме нашата конзолна форма, нека го наречем „Изпълни заявка“. В свойствата на бутона „Изпълни заявка“, щракнете върху „Действие“, отново се появява меню, в което ни питат къде ще бъде обработен нашият програмен код, в този случай избираме „Както на клиента, така и на сървъра“, отново се озоваваме в ModuleForms.

В процедурата Execute Query(), която имаме на клиента, ще напишем условие, ако потребителят не е въвел текста на заявката, но иска да я изпълни:

If EmptyString(Object.QueryText) Then report("Въведете текста на заявката!"); endIf;

Системата вече автоматично е генерирала връзка към процедурата Execute RequestOnServer(); - това е добре, нека да отидем на тази процедура, която се изпълнява на сървъра, и да напишем тук кода за изпълнение на въведената от нас заявка.

Тук има опции: Можете сами да напишете всички изрази, свързани с изграждането на заявки, т.е. ръчно, но има още по-проста опция - вътре в процедурата щракнете с десния бутон и в падащото меню изберете „Конструктор на заявки с обработка на резултати, вижте фигурата.“:

Ако щракнете върху елемента "Дизайнер на заявки с обработка на резултати", ще се появи модален прозорец "Текстът на заявката не е намерен. Създайте нов? "Щракнете върху да. Ще се отвори вграденият дизайнер на заявки, в който в първия му раздел „Обработка на резултата“ - изберете първия елемент „ Заобикаляне на резултата.“ Това е всичко, не се нуждаем от нищо друго от този конструктор, щракнете върху бутона „Ok“ - ще се появи модален прозорец: „Не полетата са избрани в заявката, щракнете върху "OK".

След това в нашата процедура ExecuteRequestOnServer() ще се появи следният готов шаблон:

Нека да преминем към израза, конструиран от конструктора:

Request.Text = "";

Request.Text = Object.RequestText;

Толкова е просто, нашият бутон „Изпълнение на заявка“ във формуляра за обработка вече е практически работещ, засега може да обработва само прости заявки без параметри, но най-важното е, че работи! Всичко, което остава, е визуално да покажем резултатите от нашата заявка в атрибута „Таблица със стойности“ на формуляра за обработка. Позволете ми да ви напомня, че нашият атрибут „Таблица със стойности“ е от типа „Табличен документ“, защото в противен случай няма да видим резултатите си в потребителски режим. Показването на таблични данни на потребителя винаги се извършва или от табличен документ, или от оформление. Наистина бих искал да е възможно да се показват данни чрез таблица със стойности - тъй като е много лесна за използване и позната, но , за съжаление, таблицата със стойности е само инструмент, от който се нуждае разработчикът, не можете да показвате данни на екрана, като я използвате...

Нека да разгледаме по-подробно какво е документ с електронна таблица - това е като лист в Excel - можете да стигнете до запис в конкретна клетка само с помощта на клетки от таблица, тук ги наричаме област, но ние сами можем да изберем диапазона на тази област в една конкретна клетка:

И така, разбрахме какво е документ с електронна таблица и решихме за себе си, че ще трябва да дефинираме данните от нашата заявка в конкретна клетка на този документ с електронна таблица. Но нека помислим: какъв е „Резултатът от заявката“, който дизайнерът толкова бързо генерира за нас? Отворете помощта - Резултатът от заявката е таблица, която има съответните свойства! виж фиг.

И ако сега напишем след израза Query Result = Query.Execute(); (създаден от конструктора), ето такъв прост цикъл за колекции:

За всяко ColumnName From Query Result.Columns Loop report(ColumnName.Name); EndCycle;

След този цикъл запишете засега всички изрази, създадени автоматично от конструктора. И стартирайте 1C:Enterprise8 под дебелия клиент.Създайте всяка проста заявка (Можете да използвате Query Builder - той вече работи за нас) и кликнете върху бутона "Изпълни заявка":

След това ще видите в долната част на прозореца за съобщение - че таблицата с резултати от заявката съхранява имената на полетата, които току-що сме избрали чрез създаване на проста заявка.

Сега нека покажем тези имена на полетата на нашето страдание в документ на електронна таблица:

За всяко име на колона от Query Result.Columns Loop Cell=Object.QueryTable.Area(1,QueryResult.Columns.Index(ColumnName)+1); Cell.Text=Име на колона.Име; EndCycle;

За да покажем детайлите на данните от заявката, нека анализираме изразите, създадени автоматично от дизайнера, и да вмъкнем в цикъла за сортиране „SelectionDetailedRecords“ на самата заявка точно същия цикъл, който използвахме за показване на имената на колоните, само че сега трябва да прехвърлим не данните от таблицата „Резултат от заявката“ в текста на клетката и данните от самата селекция, нека видим в помощта как можете да получите достъп до полето за подробна селекция на заявката:

SelectionDetailRecords = QueryResult.Select(); Докато SelectionDetailedRecords.Next() Loop //в първия ред вече имаме записани имената на колоните на таблицата, така че зареждаме данните под първия редDocRowNumber=Object.QueryTable.TableHeight+1; За всяко ColumnName From Query Result.Columns Cycle Cell=Object.QueryTable.Area(DocRowNumber,QueryResult.Columns.Index(ColumnName)+1); Cell.Text = SelectionDetailedRecords[ColumnName.Name]; EndCycle; EndCycle;

Това е всичко, можем да проверим, да заредим предприятието под дебел клиент, да въведете проста заявка без параметри, да щракнете върху бутона „Изпълни заявка“, вижте фигурата:

Ура, всичко работи!!!

Много е удобно, когато при отваряне/затваряне на нашата Query Console текстът на нашата заявка, с който сме работили преди затваряне на конзолата, отново се записва в полето „Query Text“. За да направите това, просто трябва да активирате свойството на формуляра = Autosave, вижте фиг.

Това е всичко, конзолата ни работи. За да можем да пишем по-сложни заявки с параметри, зададени в тях, трябва да създадем още един бутон „Намиране на параметри“, както и кода на бутона „Изпълни заявка“ - кодът на бутона „Намиране на параметри“ ще бъде изпълнен на клиента и на сървъра. След това в сървърната процедура стартираме заявката по абсолютно същия начин с текста, предаден в нея от прозореца „Текст на заявката“, като използваме израза „Request.FindParameters()“ намираме предадените параметри и просто ги въвеждаме в цикъл в табличната част на формуляра „Параметри на заявката“. Не забравяйте след това да ги прехвърлите от попълнената таблица с параметри към процедурата „Изпълнение на заявка“.

Можете също така да добавите няколко бутона към нашата конзола, които ще изчистят прозореца с параметри и прозореца с текст на заявката в потребителски режим.

Нашата конзола за заявки е готова за използване, желая ви успешни творчески решения с помощта на такъв прост и мощен инструмент като конзолата за заявки!

Тази обработка е написана на платформата 1c8.3 (управлявани формуляри) и се изпълнява под дебел клиент. Може да се пише и на платформата 1c8.2, както под редовни форми, така и под управлявани.

Изтеглянето съдържа извадка от конзолата за заявки, която току-що създадохме.

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

Надграждане на Query Console:

1) Сега нашата домашна конзола за заявки с вграден Query Builder ще работи под всеки клиент: под дебел клиент на обикновени и управлявани формуляри и под тънък и уеб клиент.

p.s. Формата и външният вид на вградения Query Builder е различен - в зависимост от това под кой клиент сме стартирали нашата конзола (аз лично съм по-запознат и по-удобен с формата на Query Builder под дебел клиент)

&На клиентската процедура Конструктор на заявки (команда) //извикването на стандартния конструктор на заявки е възможно само при дебел клиент #If ThickClientManagedApplication или ThickClientNormalApplication Then Constructor=Нов конструктор на заявки; Ако не EmptyString(Object.QueryText) Тогава Constructor.Text = Object.QueryText; endIf; If Constructor.OpenModal()=True Then Object.RequestText=Constructor.Text; endIf; // #Else // Report("Извикването на Query Builder е възможно само при дебел клиент"); // Връщане; //# EndIf #Else Report("Вие изпълнявате Query Builder под тънък клиент - той се различава леко във формата и скоростта на изпълнение!"); Конструктор = Нов QueryConstructor(); Ако не EmptyString(Object.QueryText) Тогава Constructor.Text = Object.QueryText; endIf; Constructor Alert = New AlertDescription("RunAfterClosingConstructor", ThisForm); Constructor.Show(Constructor Alert); # EndIf Край на процедурата &В процедурата на клиента ExecuteAfterClosingConstructor(Result, ConstructorParameters) Export //Result=текст, ако конструкторът е затворен чрез бутона ok Object.RequestText = AbbreviatedLP(Result); //върши работа!!! Край на процедурата

2) Добавена е възможност към нашата проста конзола за заявки за въвеждане на сложни заявки с временна таблица, предадена на параметрите!!! Механизмът се оказа много прост и елегантен - без използване на XML код, както се прави в професионалните конзоли.

Можете да видите самия код и процедурите за механизма за прехвърляне към параметрите на Временни таблици във втория прикачен файл. Как започнахте да разработвате своя собствена версия на временни таблици в параметрите можете да намерите на тази връзка https://forum.site/forum9/topic183700/

Сега как да използвате конзолата за сложна заявка, когато временна таблица се предава на нейните параметри. Например можете да вземете кода на тази заявка;

ИЗБЕРЕТЕ ExternalData.Product, ExternalData.Quantity PLACE ExternalData FROM &ExternalData AS ExternalData; /////////////////////////////////////////////// // /////////////////////////// ИЗБЕРЕТЕ ExternalData.Product, ExternalData.Quantity, ISNULL(RemainingProductRemaining.QuantityRemaining, 0) AS Field1, ISNULL(Remaining ProductsRemainings.QuantityRemaining, 0) - ExternalData.Quantity AS Remaining FROM ExternalData AS ExternalData LEFT JOIN Register Accumulations.Remaining Products.Remainings(&Дата, Product IN (SELECT ExternalData.Product FROM ExternalData AS ExternalData)) AS Remaining ProductsRemainings Software ExternalData.Product = Remaining ProductRemaining Продукт

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

И така, в дизайнера на заявки създадохме горната заявка, затваряйки конструктора - текстът на заявката ще влезе в полето на нашата конзола „Текст на заявката“, щракнете върху бутона „Намиране на параметри“, виждаме, че в таблицата с параметри има ред появи се = "Външни данни", Тип стойност = "Таблица със стойности", вижте фиг.

В тази таблица с параметри – въведете параметъра Date, например днешната дата, след това щракнете, за да опитате да редактирате параметъра на нашата временна таблица „Външни данни“, щракнете в полето с „Таблица със стойности“ върху три точки – избор на типове ще се появи, щракнете върху Ред, нашият механизъм ни обръща страницата на формуляра, където трябва ръчно да въведем тази много временна таблица.

Имайте предвид, че в този случай на страницата „Разписания“ в долната част в полето „Име на временна таблица в параметри“ ще се появи името на нашата временна таблица (то е копирано от таблицата с параметри).

Досега на страницата „Времеви таблици" виждаме само една празна таблица - това е таблицата с типове на бъдещата ни временна таблица. Чрез бутона „Добавяне" ще добавим името на атрибута и типа на бъдещата таблица . Бъдете внимателни - името и типът трябва да съответстват на това, което сме посочили в заявката за &ExternalData:

Сега натискаме бутона „Актуализиране на временна таблица“ - и тук ще имаме втора таблица - директно ще я попълним с данни за временна таблица чрез бутона „Добавяне“.

Това е всичко, можем да се проверим още веднъж дали сме въвели примитивните данни на параметрите на заявката в таблицата с параметри на 1-ва страница на обработка и да натиснем бутона "Изпълни заявка" - всичко се изчислява и селектира съответно с ограничение на данните, предавани в параметъра на нашата временна таблица

p.s. Ако сте направили грешка при въвеждането на името на детайлите и техните типове (в първата таблица) - просто затворете конзолата и я отворете отново - временната таблица с данни ще бъде изтрита - и таблицата с типове може отново да се редактира и нова таблица с данни може да бъде създадена отново.

Това е всичко, можем да създадем много мощен работен инструмент със собствените си ръце, освен това нашата конзола все още е много бърза в сравнение с професионалните - и това е много голям плюс за разработчиците! И, разбира се, сега нашата конзола работи под всеки клиент! Успех в творческото развитие!!!

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

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

Постоянно работя с моята конзола за заявки и наскоро попаднах на много интересна заявка, в която временните таблици не бяха в първия пакет на заявката, а в следващите - и тук конзолата ми се потисна малко... трябваше да направя друг ъпгрейд.

Така че мениджърът на временни таблици в заявка не винаги разбира, че работят с него)) Следователно трябва изрично да зададете този много мениджър на временни таблици:

&На сървъра Процедура Изпълнение на заявка на сървъра () //upgrade2 - изрична дефиниция на мениджъра на временни таблици! ManagerVT=Нов TemporaryTablesManager; Заявка = Нова заявка; //upgrade2 - изрична дефиниция на мениджъра на временни таблици! Query.TemporaryTableManager = VTManager; Request.Text = Object.RequestText;

Тази версия на конзолата е в третото изтегляне.



Свързани публикации