Всичко за тунинг на автомобили

Създаване и работа със заявки (за начинаещи). Създаване и работа със заявки (за начинаещи) 1c тип документ в заявка

Клюев В.В.

http://prof1c.kklab.ru

Създаване иработа със заявки. Най-простите операцииза начинаещи(Редовно приложение)

Добър ден

Днес искам да ви разкажа как да започнете да работите със заявки и да научите (постепенно, разбира се) как да работите със заявки в 1C. За запознатите с MS заявките
SQL разбира се ще бъде много по-опростен.

Така че нека отворим конфигуратора и създадем нова външна обработка.

След което ще получим прозорец с нашата обработка. Нека да продължим директно към експерименти върху заявки, за това ще създадем нов формуляр в нашата обработка - и за това в списъка (бяло поле) изберете Формуляри - и щракнете върху (+) Добавяне, съгласете се с всички предложени параметри на формуляра по подразбиране и щракнете върху готово.

Затова създадохме празна форма за вас с бутони и. В прозореца с формуляра изберете разделите и преминете директно към писане на кода, който ще бъде изпълнен, когато щракнете върху бутона за изпълнение. За да направите това, намерете процедурата ButtonExecutePress(Button)

и напишете следния код:

Процедура ButtonExecutePress(Button) Заявка = Нова заявка() ; Заявка. Текст = "ИЗБЕРЕТЕ | * | ОТ| Документ . Фактура за плащане към купувача" ; Резултат = Заявка. Изпълнение (). Разтоварване (); Край на процедурата

Нека коментираме написаното тук. Избрахме всички документи „Фактура за плащане към купувача“ със заявката. Бих искал веднага да отбележа, че в зависимост от конфигурацията, в която експериментирате, погледнете състава на документите във вашата конфигурация и вместо „Фактура за плащане към купувача“, която посочих, заменете който и да е обект на Документ от списък с документи във вашата конфигурация, за предпочитане документите от този тип да се създават в информационната база, за да се избегне получаването на празен резултат от заявката. Искам също да отбележа важен момент - ако има твърде много такива документи, тогава изпълнението на заявката може да отнеме известно време - поради факта, че не ограничаваме заявката до условия и избираме всички полета - които звездичката ( *) кажи ни.

С ключовата дума “Избор” нареждаме заявката ни да избере всички полета (*) (данни за документа) от документа “Фактура за плащане към купувача”.

Важно:
Бих искал също да отбележа, че когато пишете език за заявки, конфигурационните обекти трябва да бъдат адресирани в единствено, а не в множествено число. В това
случай, обектът Документи в конфигурацията (клон Документи) - заявката съдържа Документ. Също така към състава на документите - получаваме чрез точката (.) - и името на документа.

Получаваме резултата от заявката под формата на таблица със стойности, както се вижда от използвания от нас метод (параметър) - Качване, тоест първо изпълнихме
заявка (Изпълнение) и едва след това качи резултата от заявката в таблицата със стойности и таблицата със стойности се намира в променливата Резултат.

След това запазваме нашата обработка във файл, за да направите това, щракнете върху Файл-> Запиши като и напишете името на файла, за моята обработка задавам името „ExternalProcessing1Demo“, за да не търся обработката дълго време, можете да го запазите на работния плот, след което ще трябва да го отворим)).

Сега нека научим малко основите на отстраняването на грешки. За да направите това, сега в полето до текста Резултат = ... щракнете двукратно с левия бутон на мишката, така че да се появи червен кръг, трябва да получите нещо като следното:

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

Сега, в режима 1C:Enterprise, който стартирахме, нека отворим нашата запазена обработка File->Open и намерете мястото, където сте запазили файла за обработка, изберете го и щракнете върху отваряне. Щракнете върху бутона „Изпълни“ в нашата обработка. Ако сте направили всичко правилно, автоматично ще превключите в режим на конфигуратор и ще видите следното на мястото, където е инсталирана нашата точка на прекъсване:

В нашия кръг се появи стрелка - преминахме към поетапно изпълнение на нашия код и тогава ще видим най-интересното. Ако сте направили всичко правилно, сега можете да получите резултата от заявката.

За да визуализирате заявката, направете следното: В горното меню на конфигуратора намерете менюто Debugging и изберете командата Tableau.

В долната част на прозореца на конфигуратора ще се отвори празен прозорец -> Tableau. В този прозорец има празни редове. Щракнете двукратно върху празния маркиран ред и напишете думата Резултат. Трябва да получите следното:

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

Нека направим стъпка - да изпълним указания ред код. За да направите това, натиснете клавиша или в менюто Debug->Step through... (F 10).

И какво виждаме в нашата таблица:

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

Получаваме прозорец с избраните от нас документи, които се намират в променливата Result

Да обобщим:

Научихте как да създадете проста заявка, а също така участвахте в отстраняването на грешки във вашия код и дори разгледахте резултата от нашата заявка в конфигуратора.

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

1. “IZ” дизайн.

За да получите данни от базата данни, изобщо не е необходимо да използвате конструкцията „ОТ“.
Пример: Трябва да изберем цялата информация за банките от указателя на банките.
Заявка:

ИЗБЕРЕТЕ Директория.Банки.*

Избира всички полета от директорията Банки. И е подобно на искането:

ИЗБЕРЕТЕ Банки.* ОТ Директория.Банки КАТО Банки

2. Подреждане на данни по референтно поле

Когато трябва да организираме данните на заявката по примитивни типове: "Низ", "Число", "Дата" и т.н., тогава всичко се решава с помощта на конструкцията "ORDER BY", ако трябва да подредите данните по референтно поле? Референтното поле е връзка, уникален идентификатор, т.е. Грубо казано, някакъв произволен набор от знаци и обикновено подреждане може да доведе до резултат, който не е напълно очакван. За подреждане на референтни полета се използва конструкцията "AUTO ORDER". За да направите това, първо трябва да подредите данните директно по референтния тип, като използвате конструкцията "ORDER BY", а след това конструкцията "AUTO ORDER".

В този случай за документи подреждането ще се извърши в реда "Дата->Номер", за справочници в "Основен изглед". Ако подреждането не се извършва чрез референтни полета, тогава използването на конструкцията "AUTO ORDER" не се препоръчва.

В някои случаи конструкцията "AUTO ORDER" може да забави процеса на избор. По същия начин можете да пренапишете без автоматично подреждане на документи:

3.Получаване на текстово представяне от референтен тип. Дизайн "ПРЕЗЕНТАЦИЯ".

Когато трябва да покажете поле от референтен тип, например полето "Банка", което е връзка към елемент от директорията "Банки", трябва да разберете, че при показване на това поле, подзаявка към " Банки" ще се изпълни автоматично, за да се получи изглед на директорията. Това ще забави извеждането на данни. За да избегнете това, трябва да използвате конструкцията „PRESENTATION“ в заявката, за да получите незабавно представяне на обекта и след това да го покажете за преглед.

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

4. Условие за извадка на данните по образец.

Например, трябва да получите мобилни телефони на служители от формата (8 -123- 456-78-912). За да направите това, трябва да зададете следното условие в заявката:

ИЗБЕРЕТЕ Employee.Name, Employee.Phone AS Phone FROM Directory.Employees AS Employees WHERE Телефон LIKE "_-___-___-__-__"

Знакът "_" е служебен знак и замества всеки знак.

5. Едновременно използване на суми и групи.


Общите суми често се използват във връзка с групирането; в този случай агрегатните функции може да не са посочени в общите суми.

ИЗБЕРЕТЕ Предоставяне на услуги. Организация КАТО Организация, Предоставяне на услуги. Номенклатура КАТО Номенклатура, SUM(Предоставяне на услуги. Сума на документа) КАТО Сума на документа ОТ Документ. Предоставяне на услуги КАТО Предоставяне на услуги ГРУПИРАНЕ ПО Предоставяне на услуги. Организация, Предоставяне на услугите. Номенклатура РЕЗУЛТАТИ ПО ОБЩИ, Организация, Nomen klatura

В този случай заявката ще върне почти същото като следната заявка:

ИЗБЕРЕТЕ Предоставяне на услуги. Организация КАТО Организация, Предоставяне на услуги. Номенклатура КАТО Номенклатура, Предоставяне на услуги. Сума на документа КАТО Сума на документа ОТ Документ. Предоставяне на услуги КАТО Предоставяне на услуги РЕЗУЛТАТИ СУМА (Сума на документа) ПО ОБЩО, Организация, Номенклатура

Само първата заявка ще свие записи със същата номенклатура.

6. Дерефериране на полета.

Обръщането към полета чрез точка се нарича операция за дерефериране на референтно поле. Например Разплащане.Организация.Административна единица. В този случай в справочното поле "Организация" на документ "Плащане" препраща към друга таблица "Организации", в която ще се получи стойността на атрибута "Административна единица". Важно е да се разбере, че при достъп до полета чрез точка платформата имплицитно създава подзаявка и обединява тези таблици.

Заявка:

Може да се представи като:

ИЗБЕРЕТЕ Плащане.Връзка, Плащане.Организация, Плащане.Организация, Организации. AdministrativeUnit FROM Document.Payment AS Payment LEFT JOIN Directory.Organizations AS Организации Софтуер Payment.Organization = Organisations.Link

При дерефериране на референтни полета от съставен тип, рамката се опитва да създаде имплицитни съединения към всички таблици, които са част от типа на това поле. В този случай заявката няма да бъде оптимална.Ако се знае ясно какъв тип поле е, е необходимо да се ограничат такива полета по тип с конструкция ЕКСПРЕС().

Например има регистър за натрупване „Неразпределени плащания“, където няколко документа могат да действат като регистратор. В този случай е неправилно да се получат стойностите на данните на регистратора по този начин:

ИЗБЕРЕТЕ UnallocatedPayments.Register.Date, ..... ОТ RegisterAccumulation.UnallocatedPayments AS UnallocatedPayments

трябва да ограничите типа на съставното поле до logger:

SELECT EXPRESS(UnallocatedPayments.Register AS Document.Payment).Date, ..... FROM RegisterAccumulation.UnallocatedPayments AS UnallocatedPayments

7. Конструкция "КЪДЕ"

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

Пример. Необходимо е да се изберат всички Клиенти от Указател Клиенти и за тези клиенти, които имат платежен документ със стойност на атрибута "Организация" = &Организация, да се покаже документът "Плащане", за тези, които нямат, да не се показва.

Резултатът от заявката ще върне записи само за онези клиенти, които са имали плащане от организация в параметъра, и ще филтрира други клиенти. Следователно първо трябва да получите всички плащания за „такава и такава“ организация във временна таблица и след това да я свържете към директорията „Клиенти“, като използвате ляво съединение.

ИЗБЕРЕТЕ Payment.Link AS Payment, Payment.Shareholder AS Client PLACE toPayments FROM Document.Payment AS Payment WHERE Payment.Branch = &Branch; /////////////////////////////////////////////// // //////////////////////////// ИЗБЕРЕТЕ Clients.Link AS Client, ISNULL(tPayment.Payment, "") AS Плащане ОТ Директория .Clients AS Клиенти ЛЯВА ВРЪЗКА topayments AS topayments СОФТУЕР Clients.Link = topayments.Client

Можете да заобиколите това състояние по друг начин. Необходимо е да се наложи условие "WHERE" директно върху връзката между двете таблици. Пример:

ИЗБЕРЕТЕ Clients.Link, Payment.Link FROM Directory.US_Subscribers AS US_Subscribers ЛЯВА ВРЪЗКА Document.Payment AS софтуер за плащане (Clients.Link = Payment.Client И Payment.Client.Name КАТО "Sugar Packet") ГРУПИРАНЕ ПО Clients.Link, Payment. Връзка

8. Съединения с вложени и виртуални таблици

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

Например трябва да получим сумата на баланса към текущата дата за някои клиенти.

SELECT UnallocatedPaymentsRemains.Customer, UnallocatedPaymentsRemains.AmountRemaining FROM (SELECT Clients.Link AS Link FROM Directory.Clients AS Clients WHERE Clients.Link IN(&Clients)) AS NestedQuery LEFT JOIN RegisterAccumulations.UnallocatedPayments.Balances AS UnallocatedPayments BY Nested Request. Връзка = UnallocatedPaymentsBalances. Клиент

При изпълнение на такава заявка оптимизаторът на СУБД може да направи грешки при избора на план, което ще доведе до неоптимално изпълнение на заявката. При свързване на две таблици оптимизаторът на СУБД избира алгоритъм за свързване на таблици въз основа на броя на записите в двете таблици. Ако има вложена заявка, е изключително трудно да се определи броят на записите, които вложената заявка ще върне. Следователно винаги трябва да използвате временни таблици вместо вложени заявки. Така че нека пренапишем заявката.

SELECT Clients.Link AS Link PLACE tClients FROM Directory.Clients AS Clients WHERE
Clients.Link B (&Клиенти) ; /////////////////////////////////////////////// // /////////////////////////// ИЗБЕРЕТЕ tClients.Link, UnallocatedPaymentsRemains.AmountRemaining, FROM tClients AS tClients LEFT JOIN RegisterAccumulations.UnallocatedPayments.Balances (, Client IN (SELECT tClients.Link FROM tClients)) AS UnallocatedPaymentsBalances tClients.Link = UnallocatedPaymentsBalances.Clients

В този случай оптимизаторът ще може да определи колко записа използва временната таблица tClients и ще може да избере оптималния алгоритъм за свързване на таблици.

Виртуални маси , ви позволяват да получите практически готови данни за повечето приложни задачи.(Част от първия, Срез от последния, Остатъци, Обороти, Остатъци и Обороти) Ключовата дума тук е виртуална. Тези таблици не са физически, а се съставят от системата в движение, т.е. При получаване на данни от виртуални таблици, системата събира данни от крайните регистърни таблици, събира, групира и ги издава на потребителя.

Тези. При свързване към виртуална таблица се осъществява връзка към подзаявка. В този случай оптимизаторът на СУБД може също да избере неоптимален план за свързване. Ако заявката не се генерира достатъчно бързо и заявката използва съединения във виртуални таблици, тогава се препоръчва да преместите достъпа до виртуалните таблици към временна таблица и след това да направите съединение между две временни таблици. Нека пренапишем предишната заявка.

ИЗБЕРЕТЕ Clients.Link AS Link PLACE tClients FROM Directory.Clients AS Clients INDEX BY Link WHERE
Clients.Link B (&Клиенти) ; /////////////////////////////////////////////// // /////////////////////////// ИЗБЕРЕТЕ UnallocatedPayments.AmountBalance, UnallocatedPayments.Client AS Client PLACE баланси ОТ RegisterAccumulations.UnallocatedPayments.Balances(, Client B ( ИЗБЕРЕТЕ tClients. Връзка ОТ tClients)) AS UnallocatedPaymentsBalances; /////////////////////////////////////////////// // /////////////////////////// ИЗБЕРЕТЕ tClients.Link, toRemainders.AmountRemaining AS AmountRemaining FROM tClients AS tClients LEFT JOIN toRemainders AS Remainders BY tClients.Link = tRemainings.Client

9. Проверка на резултата от заявката.

Резултатът от заявката може да е празен; за да проверите за празни стойности, използвайте следната конструкция:

ResRequest = Request.Execute(); If resQuery.Empty() Then Return; endIf;

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

За никого не е откровение, че е изключително нежелателно да се използват заявки в цикъл. Това може критично да повлияе на времето за работа на определена функция. Много е желателно да получите всички данни в заявката и след това да ги обработите в цикъл. Но понякога има случаи, когато става невъзможно преместването на заявката извън цикъла. В този случай за оптимизация можете да преместите създаването на заявката извън цикъла и в цикъла да замените необходимите параметри и да изпълните заявката.

Заявка = Нова заявка; Query.Text = "SELECT | Clients.Link, | Clients.Birthdate |FROM | Directory.Clients AS Clients |WHERE | Clients.Link = &Client"; За всеки ред FROM TableClients Loop Query.SetParameter("Клиент", Клиент); QueryResult = Query.Execute().Select(); EndCycle;

Това ще спаси системата от проверка на синтаксиса на заявката в цикъл.

11. Конструкция "ИМАНЕ".

Дизайн, който е доста рядък в заявките. Позволява ви да налагате условия върху стойностите на агрегатните функции (СУМА, МИНИМУМ, СРЕДНО и т.н.). Например, трябва да изберете само онези клиенти, чиято сума на плащането през септември е над 13 000 рубли. Ако използвате условието „WHERE“, първо ще трябва да създадете временна таблица или вложена заявка, да групирате записите там по сума на плащането и след това да приложите условието. Конструкцията “HAVING” ще помогне да се избегне това.

ИЗБЕРЕТЕ Payment.Customer, AMOUNT(Payment.Amount) AS Amount FROM Document.Payment AS Payment WHERE MONTH(Payment.Date) = 9 GROUP BY Payment.Customer HAVING AMOUNT(Payment.Amount) > 13000

В конструктора, за да направите това, просто отидете в раздела „Условия“, добавете ново условие и поставете отметка в квадратчето „По избор“. Тогава просто пишете Сума(Плащане.Сума) > 13000


12. NULL стойност

Тук няма да описвам принципите на тризначната логика в базата данни; има много статии по тази тема. Само накратко как НУЛАможе да повлияе на резултата от заявката. Стойността NULL всъщност не е стойност и фактът, че стойността е недефинирана, е неизвестен. Следователно всяка операция с NULL връща NULL, било то събиране, изваждане, деление или сравнение. NULL стойност не може да бъде сравнена с NULL стойност, защото не знаем какво да сравним. Тези. и двете сравнения са: NULL = NULL, NULL<>NULL не е True или False, не е известно.

Нека разгледаме един пример.

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

ИЗБЕРЕТЕ „Без плащания“ AS Attribute, NULL AS Document PLACE topayments; /////////////////////////////////////////////// // /////////////////////////// ИЗБЕРЕТЕ Clients.Link AS Client, Payment.Link HOW Payment PUT tClientPayment FROM Directory.Clients AS Clients LEFT CONNECTION Документ. Payment AS Payment Software Clients.Link = Payment.Shareholder; /////////////////////////////////////////////// // /////////////////////////// ИЗБЕРЕТЕ tClientPayment.Client ОТ tClientPayment КАТО tClientPayment ВЪТРЕШНО ПРИСЪЕДИНЯВАНЕ към tPayment AS tTopay ОТ tClientPayment.Payment = tPayment. Документ

Обърнете внимание на втората временна таблица tClientPayment. С лявото присъединяване избирам всички клиенти и всички плащания за тези клиенти. За тези клиенти, които нямат плащания, полето „Плащане“ ще бъде NULL. Следвайки логиката, в първата временна таблица “tPayments” обозначих 2 полета, едното от тях NULL, вторият ред “Няма плащания”. В третата таблица свързвам таблиците „tClientPayment“ и „tPayment“, като използвам полетата „Payment“ и „Document“ с вътрешно съединение. Знаем, че в първата таблица полето „Документ“ е NULL, а във втората таблица тези, които нямат плащания в полето „Плащане“ също са NULL. Какво ще ни върне подобна връзка? Но няма да върне нищо. Тъй като сравнението NULL = NULL не се оценява на True.

За да може заявката да върне очаквания резултат, нека я пренапишем:

ИЗБЕРЕТЕ „Без плащания“ AS Attribute, VALUE(Document.Payment.EmptyLink) AS Document PLACE toPayments; /////////////////////////////////////////////// // //////////////////////////// ИЗБЕРЕТЕ Clients.Link AS Client, ISNULL(Payment.Link, VALUE(Document.Payment.EmptyLink )) КАК Плащане PUT tClientPayment FROM Directory.Clients AS Clients LEFT CONNECTION Document.Payment AS Payment BY Clients.Link = Payment.Shareholder; /////////////////////////////////////////////// // /////////////////////////// ИЗБЕРЕТЕ tClientPayment.Client ОТ tClientPayment КАТО tClientPayment ВЪТРЕШНО ПРИСЪЕДИНЯВАНЕ към tPayment AS tTopay ОТ tClientPayment.Payment = tPayment. Документ

Сега във втората временна таблица сме посочили, че ако полето „Плащане“ е NULL, тогава това поле = празна връзка към платежния документ. В първата таблица също заменихме NULL с празна препратка. Сега връзката включва не-NULL полета и заявката ще върне очаквания резултат.

Всички искания, съдържащи се в статията, отразяват ситуациите, които бих искал да разгледам и нищо повече. ОТНОСНО Те може да не са заблуди или неоптимални, основното е, че отразяват същността на примера.

13. Недокументирана характеристика на дизайна "ИЗБОР КОГАТО...ТОГДА...КРАЙ".

В случай, че е необходимо да опишем конструкцията „Условия“ в заявката, използваме стандартния синтаксис:

ИЗБЕРЕТЕ ИЗБОР WHEN Users.Name = "Vasya Pupkin" THEN "Нашият любим служител" ELSE "Ние не знаем това" END AS Field1 FROM Directory.Users AS Users

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

ИЗБЕРЕТЕ МЕСЕЦ(US_CalculationConsumption_ScheduleTurnover.CalculationPeriod) WHEN 1 THEN "Януари" WHEN 2 THEN "February" WHEN 3 THEN "March" WHEN 4 THEN "April" WHEN 5 THEN "May" WHEN 6 THEN "June" WHEN 7 THEN "July" K WHEN 8 THEM "August" WHEN 9 THEM "September" WHEN 10 THEM "October" WHEN 11 THEM "November" WHEN 12 THEM "December" КРАЙ КАТО месец

Сега дизайнът изглежда по-малко тромав и е лесен за разбиране.

14. Пакетно изпълнение на заявки.


За да не се умножават заявките, можете да създадете една голяма заявка, да я разделите на пакети и да работите с нея.
Например, трябва да получа следните полета от директорията „Потребители“: „Дата на раждане“ и наличните роли за всеки потребител. качете това в различни таблични части на формуляра. Разбира се, можете да направите това с една заявка, след което ще трябва да преминете през записите или да ги свиете, или можете да направите следното:

ИЗБЕРЕТЕ Users.Link AS пълно име, Users.Date of Birth, Users.Role PUT vtUsers FROM Directory.Users AS Users; /////////////////////////////////////////////// // /////////////////////////// ИЗБЕРЕТЕ tueUsers.Пълно име, tueUsers.Дата на раждане ОТ tueUsers КАТО tueUsers ГРУПИРАНЕ ПО tueUsers.пълно име, tueUsers . Дата на раждане; /////////////////////////////////////////////// // /////////////////////////// ИЗБЕРЕТЕ wUsers.Пълно име, wUsers.Роля ОТ wUsers КАТО wUsers ГРУПИРАНЕ ПО wUsers.Пълно име, wUsers. Дата на раждане

tPackage = Request.ExecutePackage();

TP_BirthDate = tPackage.Upload();
TP_Roles = tPackage.Unload();

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

15. Условия в пакетна заявка

Например, имаме пакетна заявка, където първо получаваме полетата: „Име, дата на раждане, код“ от директорията „Потребители“ и искаме да получим записи с условия за тези полета от директорията „Лични лица“.

ИЗБЕРЕТЕ Users.Individual.Name AS Име, Users.Individual.Date of Birth AS Дата на раждане, Users.Individual.Code AS Code PLACE vtUsers FROM Directory.Users AS Users; /////////////////////////////////////////////// // //////////////////////////// ИЗБЕРЕТЕ Физически лица. Връзка КАТО Физическо лице ОТ директория. Физически лица КАТО Физически лица

Можете да наложите такива условия:

WHERE Individuals.Code IN (SELECT vtUsers.Code FROM vtUsers) И Individuals.Name IN (SELECT vtUsers.Code FROM vtUsers) AND Individuals.BirthDate IN (SELECT vtUsers.DateBirth FROM tvUsers)

И можете да го направите така:

WHERE (Individuals.Code, Individuals.Name, Individuals.Date of Birth) IN (ИЗБЕРЕТЕ tueUsers.Code, tueUsers.Name, tueUsers.Дата на раждане ОТ tueUsers)

Освен това е необходимо да се поддържа ред.

16. Извикване на конструктора на заявки за „условие“ в групова заявка

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

Необходимо е да поставите скоби след конструкцията „B“ и да оставите празно пространство (интервал) между скобите, да изберете това пространство и да извикате конструктора на заявката. Дизайнерът ще има достъп до всички таблици на груповата заявка. Техниката работи както на виртуални регистрационни таблици, така и на раздела „Условия“. В последния случай трябва да поставите отметка в квадратчето „P (произволно условие)“ и да влезете в режим на редактиране „F4“.

Заявките често бяха измислени в движение и те просто служат за илюстрация на „техниките“, които обмислях.

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

upd1. Точки 11,12
upd2. Точки 13,14,15,16

Използвани книги:
Език за заявки "1C:Enterprise 8" - E.Yu. Хрусталева
Професионално развитие в системата 1C:Enterprise 8."

В тази статия искаме да обсъдим всичко с вас 1C функции на езика за заявки, и конструкции на език за заявки. Каква е разликата между функция и дизайн? Функцията се извиква със скоби и възможните параметри в тях, а конструкцията се изписва без скоби. Несъмнено всички структури и функции на езика за заявки 1Cправят процеса на събиране на данни гъвкав и многофункционален. Тези функции и конструкции се прилагат към полета за заявки, а някои се прилагат и към условия.

1C Функции на езика за заявки

Защото ясно описание 1C функции на езика за заявкие много по-рядко срещано от описанията на структури, решихме да започнем да разглеждаме функциите. Сега нека разгледаме всеки един поотделно, описвайки неговата цел, синтаксис и пример за използване, така че:

1. функция ВРЕМЕ ЗА СРЕЩА- тази функция създава постоянно поле с тип "Дата".

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

Пример за употреба:

2. Функция DATE DIFFERENCE- връща разликата между две дати в едно от измеренията (година, месец, ден, час, минута, секунда). Измерването се предава като параметър.

Синтаксис: DIFFERENCEDATE(<Дата1>, <Дата2>, <Тип>)

Пример за употреба:

Query.Text = "ИЗБЕРЕТЕ | DIFFERENCEDATE(DATETIME(2015, 4, 17), DATETIME(2015, 2, 1), DAY) | AS Брой дни";

3. Функция VALUE- задава постоянно поле с предварително дефиниран запис от базата данни; можете също да получите празна връзка от всякакъв тип.

Синтаксис: VALUE(<Имя>)

Пример за употреба:

Request.Text = "SELECT //предварително дефиниран елемент | VALUE(Directory.Currencies.Dollar) AS Dollar, //празна връзка | VALUE(Document.Receipt of Goods and Services.EmptyLink) AS Receipt, //трансферна стойност | VALUE(Transfer . Юридическо лице. Физическо лице) КАТО Физическо лице, //предварително дефиниран акаунт | СТОЙНОСТ(Сметкоплан. Самоподдържащи се. Материали) AS Account_10" ;

4. SELECT функция- имаме пред нас аналог на конструкцията IF, който се използва в кода, само този се използва в 1C заявки.

Синтаксис: ИЗБОР КОГА<Выражение>ТОГАВА<Выражение>В ПРОТИВЕН СЛУЧАЙ<Выражение>КРАЙ

Пример за употреба:

Request.Text = //ако сумата е повече от 7500, тогава трябва да има отстъпка от 300 рубли, //така че ако условието е задействано, тогава функцията //връща Сума - 300 //в противен случай заявката ще върне просто Сума "ИЗБЕРЕТЕ | ИЗБЕРЕТЕ | КОГАТО TCReceipts.Amount > 7500 | ТОГАВА TCReceipts.Amount - 300 | ИНАЧЕ TCReceipts.Amount | END AS AmountWithDiscount |FROM | Document.Receipts of GoodsServices.Goods AS TCreceipts";

5. Функция EXPRESS- позволява ви да изразите постоянно поле с определен тип.

Синтаксис: EXPRESS(Име на поле КАТО Име на тип)

Пример за употреба:

Query.Text = "ИЗБЕРЕТЕ РАЗЛИЧНИ | Sales.Registrar.Number, | ИЗБЕРЕТЕ | КОГАТО Sales.Registrar ВРЪЗКА Document.Consumable | ТОГАВА EXPRESS(Sales.Registrar AS Document.Consumable) | ИНАЧЕ ИЗБЕРЕТЕ | КОГАТО Sales.Registrar LINK Document.Implementation | THEN EXPRESS(Sales.Registrar AS Document.Implementation) | END | ... | END AS Number | FROM | RegisterAccumulations.Purchases AS Purchases";

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

Пример за употреба:

Query.Text = "SELECT | EXPRESS(Nomenclature.Comment AS Line(300)) AS Comment, | EXPRESS(Nomenclature.Sum AS Number(15,2)) AS Sum |FROM | Directory.Nomenclature AS Nomenclature";

6. Функция ISNULL(алтернативно изписване ISNULL) - ако полето е от тип NULL, то се заменя с втория параметър на функцията.

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

Пример за употреба:

Също така имайте предвид, че е препоръчително ВИНАГИ да замествате типа NULL с някаква стойност, т.к сравнението с тип NULL винаги връща FALSE, дори ако сравните NULL с NULL. Най-често NULL стойностите се формират в резултат на свързване на таблици (всички видове съединения, с изключение на вътрешни).

Query.Text = //Изберете целия артикул и неговите баланси //ако няма баланс в някой артикул, тогава ще има поле //NULL, което ще бъде заменено със стойността 0 "SELECT | No. Link, | ISNULL (ProductsInStockRemains.InStockRemaining, 0) AS Remainder | ОТ | Директория.Номенклатура AS No. | ЛЯВА ВРЪЗКА Регистрирайте натрупвания. GoodsInWarehouses. Remainings AS GoodsInWarehousesRemains | ON (GoodsInWarehousesRemains. Nomenclature = No. Link)";

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

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

Пример за употреба:

Query.Text = "ИЗБЕРЕТЕ | ПРЕДСТАВЛЕНИЕ(FreeRemainingRemains.Nomenclature) КАТО номенклатура, | ПРЕДСТАВЛЕНИЕ(FreeRemainingRemaining.Warehouse) КАТО Склад, | FreeRemainingRemaining.InStockRemaining |ОТ |Регистър за натрупване.FreeRemaining.Remaining AS FreeRemainingRemaining" ;

Конструкции в езика за заявки 1C

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

1. Строителство ЛИНК- е логически оператор за проверка на референтен тип. Най-често се среща при проверка на поле от сложен тип спрямо определен тип. Синтаксис: ВРЪЗКА<Имя таблицы>

Пример за употреба:

Request.Text = //ако типът стойност на записващото устройство е разписка на документа, //тогава заявката ще върне „Получаване на стоки“, в противен случай „Продажби на стоки“ „ИЗБЕРЕТЕ | ИЗБЕРЕТЕ | КОГАТО Remainings.Registrar LINK Документ.Получаване на стоки и Услуги | ТОГАВА ""Получаване"" | ИНАЧЕ ""Потребление"" | КРАЙ КАТО Вид движение | ОТ | Регистър на натрупване. Оставащи продукти в складове КАТО Остатъци" ;

2. Дизайн МЕЖДУ- този оператор проверява дали стойността е в зададения диапазон.

Синтаксис: МЕЖДУ<Выражение>И<Выражение>

Пример за употреба:

Request.Text = //вземете цялата номенклатура, чийто код е в диапазона от 1 до 100 "SELECT | Nomenclature.Link |FROM | Directory.Nomenclature AS Nomenclature |WHERE | Nomenclature.Code BETWEEN 1 AND 100" ;

3. Конструкция Б и Б ЙЕРАРХИЯ- проверка дали стойността е в прехвърления списък (масиви, таблици със стойности и др. могат да се прехвърлят като списък). Операторът IN HIERARCHY ви позволява да видите йерархията (пример за използване на сметкоплана).

Синтаксис: IN(<СписокЗначений>), В ЙЕРАРХИЯ(<СписокЗначений>)

Пример за употреба:

Request.Text = //изберете всички подсметки на акаунта "ИЗБЕРЕТЕ | Самоподдържащ се. Свържете AS акаунт | ОТ | Сметкоплан. Самоподдържащ се AS Самоподдържащ се | КЪДЕ | Самоподдържащ се. Връзка В ЙЕРАРХИЯ СТОЙНОСТ (Диаграма на Сметки. Самоиздръжка. Стоки)";

4. Дизайн ПОДОБЕН- Тази функция ни позволява да сравним низ с модел на низ.

Синтаксис: КАТО "<ТекстШаблона>"

Опции за модел на редове:

% - последователност, съдържаща произволен брой произволни символи.

Един произволен знак.

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

[^...] - всеки отделен знак или последователност от знаци, изброени в квадратни скоби, с изключение на тези, изброени след знака за отрицание.

Пример за употреба:

Query.Text = //намерете цялата номенклатура, която съдържа корена TABUR и започва //или с малка, или с главна буква t "ИЗБЕРЕТЕ | Номенклатура. Връзка | ОТ | Директория. Номенклатура КАТО Номенклатура | КЪДЕ | Продукти. Име КАТО "" [Tt ]abur%""" ;

5. Проектиране РАЗРЕШЕНО- този оператор ви позволява да изберете само онези записи от базата данни, за които повикващият има разрешение за четене. Тези права се конфигурират на ниво запис (RLS).

Синтаксис: ALLOWED се пише след ключовата дума SELECT

Пример за употреба:

Request.Text = "ИЗБЕРЕТЕ РАЗРЕШЕНИ | Контрагенти. Връзка | ОТ | Директория. Контрагенти КАТО Контрагенти";

6. Дизайн РАЗЛИЧНИ- позволява ви да изберете записи, в които няма дублиращи се записи.

Синтаксис: VARIOUS се пише след ключовата дума SELECT

Пример за употреба:

Request.Text = //избира записи, за които читателят има права "SELECT VARIOUS | Counterparties.Name |FROM | Directory. Counterparties AS Counterparties" ;

Също така конструкцията VARIOUS може да се използва с оператора ALLOWED и други оператори.

Пример за употреба:

Request.Text = //избира различни записи, за които читателят има права "ИЗБЕРЕТЕ РАЗРЕШЕНИ РАЗЛИЧНИ | Контрагенти.Име |ОТ | Директория. Контрагенти КАТО Контрагенти";

7. Дизайн ПЪРВО- избира броя на записите, посочени в параметъра от резултата от заявката.

Синтаксис: FIRST<число>

Пример за употреба:

Request.Text = //изберете първите 4 CCD номера от директорията "SELECT FIRST 4 | CCD Numbers. Link | FROM | Directory. CCD Numbers AS CCD Numbers";

8. Дизайн ЗА ПРОМЯНА- позволява ви да заключите таблица, работи само в транзакции (важи само за автоматични заключвания).

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

Пример за употреба:

Query.Text = "ИЗБЕРЕТЕ | Безплатни остатъчни остатъци. Номенклатура, | Безплатни остатъчни остатъци. Склад, | Безплатни остатъчни остатъци. В наличност Остатъчни | ОТ | Регистър на натрупвания. Безплатни остатъци. Остатъци КАТО безплатни остатъчни остатъци | ЗА ПРОМЯНА | Регистър на натрупвания . Безплатни остатъци. Остатъци";

9. Дизайн ПОРЪЧАЙ ПО- организира данни по конкретно поле. Ако полето е връзка, тогава при задаване на флага АВТОМАТИЧНА ПОРЪЧКАСортирането ще се извърши по представяне на връзка; ако флагът е изключен, тогава връзките се сортират по старшинството на адреса на връзката в паметта.

Синтаксис: СОРТИРАНЕ ПО<НаименованиеПоля>АВТОМАТИЧНА ПОРЪЧКА

Пример за употреба:

Query.Text = "ИЗБЕРЕТЕ | Безплатни остатъчни остатъци. Номенклатура КАТО номенклатура, | Безплатни остатъчни остатъци. Склад КАТО склад, | Безплатни остатъчни остатъци. На склад Оставащи | ОТ | Регистрирайте натрупвания. Безплатни остатъци. Оставащи КАТО безплатни оставащи остатъци | | ПОРЪЧАЙТЕ ПО |НОМЕНКЛАТУРА |АВТОПОРЪЧКА ВАНИЕ";

10. Дизайн GROUP BY- използва се за групиране на низове на заявки по конкретни полета. Числовите полета трябва да се използват с всяка агрегатна функция.

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

Пример за употреба:

Query.Text = "SELECT | ItemsInWarehouses.Nomenclature AS Nomenclature, | ItemsInWarehouses.Warehouse, | SUM(ItemsInWarehouses.InStock) AS STOCK |FROM | RegisterAccumulations.ItemsInWarehouses AS ItemsInWarehouses | |GROUP BY | ItemsInWarehouses.Nomenclature, | ItemsA tWarehouse ah.Warehouse" ;

11. Дизайн HAVING- ви позволява да приложите агрегатна функция към условие за избор на данни, подобно на конструкцията WHERE.

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

Пример за употреба:

Query.Text = //избира групирани записи, където полето InStock е по-голямо от 3 "SELECT | ItemsInStocks.Nomenclature AS Nomenclature, | ItemsInWarehouses.Warehouse, | SUM(ItemsInStocks.InStock) AS INSTOCK |FROM | RegisterAccumulations.ItemsInStocks AS ItemsInStocks | | ГРУПИРАНЕ ПО | ПродуктиВСкладове.Номенклатура, |ПродуктиВСкладове.Склад | |НАЛИЧНИ | СУМА(ПродуктиВСкладове.В наличност) > 3" ;

12. Строителство ИНДЕКС ПО- използва се за индексиране на полето за заявка. Изпълнението на заявка с индексиране отнема повече време, но ускорява търсенето в индексираните полета. Може да се използва само във виртуални таблици.

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

Пример за употреба:

Query.Text = "SELECT | Ts.NameOS, | Ts.FolderNumber, | Ts.CodeOS, | Ts.Term, | Ts.Type | PLACE DataTs | FROM | &Ts AS Ts | | INDEX BY | Ts.NameOS, | Ts .CodeOS";

13. Дизайн КЪДЕ- позволява ви да наложите условие за всякакви полета за избор. Резултатът ще включва само записи, които отговарят на условието.

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

Пример за употреба:

Query.Text = //всички записи с CompensationRemaining са избрани<>0 и //AmountForCalcCompRemaining > 100 "SELECT | CompensationRPORemains.Counterparty, |CompensationRPORemains.Child, | CompensationRPORemains.CompensationRemaining, | CompensationRPORemains.AmountForCalcCompRemains |Поставяне на данниTz |ОТ | Регистър на натрупване.CompensationRP.Remains КАТО компенсация RPОстава | КЪДЕ |КомпенсацияRPORОставаща.Оставаща компенсация<>0 | И CompensationRPORemains.AmountForCalcCompRemaining> 100" ;

14. Дизайн РЕЗУЛТАТИ... ОБЩИ- използва се за изчисляване на общите суми; дизайнът определя полетата, по които ще се изчисляват общите суми, и агрегатните функции, приложени към полетата за общи суми. Когато използвате общи суми за всяко поле след конструкцията TOTAL, данните се групират. Има незадължителна конструкция GENERAL; нейното използване също осигурява допълнително групиране. Ще видите пример за резултат от заявката по-долу.

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

Пример за употреба:

Request.Text = "ИЗБЕРЕТЕ | Изчисления. Споразумение с насрещна страна. Тип на споразумението КАТО Тип договор, | Изчисления. Споразумение с насрещна страна КАТО Договор, | Изчисления. Контрагент, | Изчисления. Сума на салдо за взаимен сетълмент КАТО салдо | ОТ | Регистър на натрупвания. Взаимни Сетълмент С контрагенти. Салда AS Изчисления | ОБЩО | СУМА (Баланс) | Софтуер | ОБЩИ ПОЛОЖЕНИЯ, | Вид на споразумението";

Фигурата очертава групировките, които са били формирани по време на изпълнение на заявката, като най-горната се отнася за раздела GENERAL, а втората за полето Counterparty AgreementAgreement Type.

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

Създайте заявка

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

//Създаване на заявка
Заявка = нова заявка;

//Попълнете текста на заявката
Заявка. Текст= „Тук пишем текста на искането“;

//Предаване на параметри към заявката
Заявка. SetParameter("ParameterName" , ParameterValue) ;

//Изпълнете заявката
Резултат = Заявка. Run() ;

//Качете резултата от заявката към селекцията
Проба = Резултат. Избирам() ;

//Качете резултата от заявката в таблицата със стойности
Таблица = Резултат. Unload() ;

//Последните действия могат да се комбинират
Fetch = Заявка. Run() . Избирам() ;
//или
Таблица = Заявка. Run() . Unload() ;

Основи на езика за заявки 1C

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

От тези обекти, като използвате заявка, можете да получите стойностите на подробности, части от таблица, подробности за части от таблица, промени, ресурси и т.н.

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

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

Заявка. Текст = "ИЗБИРАМ
| *
| ОТ
| Справочник. Контрагенти"
;

Ако трябва да получите само отделни подробности, направете следното:

Заявка. Текст = "ИЗБИРАМ
| код,
| Име,
| Родител
| ОТ
| Справочник. Контрагенти"
;

За да получите такова искане, изпратете съобщение в Конструктор на заявкитрябва да изберете съответните полета в раздела Таблици и полета.

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

Заявка. Текст = "ИЗБИРАМ
| Клиенти.Код AS Номер,

| 1000 AS FieldWithValue
| ОТ
;

Fetch = Заявка. Run() . Избирам() ;

Чао Избор. Цикъл Next().
ClientNumber = Проба. Брой;
ClientName = Избор. име;
Стойност = Проба. FieldWithValue;
Краен цикъл;

Използвайте раздела, за да зададете псевдоними Съюзи/Псевдоними V Създател на заявки.

В раздела ръчно се създава поле с фиксирана или изчислена стойност Таблици и полета, в колона Полета.

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

//Поредете клиентите по име от А до Я и изберете първите 10
Заявка. Текст = „ИЗБЕРЕТЕ ПЪРВИТЕ 10
| Клиенти.Код AS Номер,
| Clients.Name AS Име,
| 1000 AS FieldWithValue
| ОТ

|ПОРЪЧАЙТЕ ПО
| име"
;

//Изберете най-новия клиент по азбучен ред
Заявка. Текст = „ИЗБЕРЕТЕ ТОП 1
| Клиенти.Код AS Номер,
| Clients.Name AS Име,
| 1000 AS FieldWithValue
| ОТ
| Указател Контрагенти AS Клиенти
|ПОРЪЧАЙТЕ ПО
| Име DECREASE"
;

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

//Извадкови данни, разрешени за потребителя
Заявка. Текст = „ИЗБЕРЕТЕ РАЗРЕШЕНО
| Клиенти.Код AS Номер,
| Clients.Name AS Име,
| 1000 AS FieldWithValue
| ОТ
| Справочник. Контрагенти AS Клиенти"
;

//Избор на неповтарящи се елементи
Заявка. Текст = „ИЗБЕРЕТЕ РАЗЛИЧНИ
| Клиенти.Код AS Номер,
| Clients.Name AS Име,
| 1000 AS FieldWithValue
| ОТ
| Справочник. Контрагенти AS Клиенти"
;

Редът се задава в раздела Поръчка V Създател на заявкиброят на избраните елементи, разделителната способност и параметрите за повторяемост са в раздела Допълнително.

Следва продължение…