При заявка 1s. Характеристики на работа с полето за представяне и функцията за представяне () на езика за заявки. Операторите за избор са нула

Езикът за заявки в 1C 8 е опростен аналог на добре познатия „структуриран език за програмиране“ (както често се нарича SQL). Но в 1C се използва само за четене на данни, модел на обектни данни се използва за промяна на данни.

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

Пример за заявка:

ИЗБИРАМ
Банки. Име,
Банки. Коректна сметка
ОТ
Справочник Банки AS Банки

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

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

Описание на конструкциите на езика за заявки

Структура на заявката

За да получите данни, е достатъчно да използвате конструкциите SELECT (избор) и FROM (от). Най-простата заявка изглежда така:

ИЗБЕРЕТЕ * ОТ Директории Номенклатура

Където "*" означава избор на всички полета на таблицата, а References.Nomenclature - името на таблицата в базата данни.

Помислете за по-сложен и общ пример:

ИЗБИРАМ
<ИмяПоля1>КАК<ПредставлениеПоля1>,
Сума(<ИмяПоля2>) КАК<ПредставлениеПоля2>
ОТ
<ИмяТаблицы1>КАК<ПредставлениеТаблицы1>
<ТипСоединения>СЪЕДИНЕНИЕ<ИмяТаблицы2>КАК<ПредставлениеТаблицы2>
ОТ<УсловиеСоединениеТаблиц>

КЪДЕТО
<УсловиеОтбораДанных>

ГРУПИРАЙ ПО
<ИмяПоля1>

СОРТИРАНЕ ПО
<ИмяПоля1>

РЕЗУЛТАТИ
<ИмяПоля2>
ОТ
<ИмяПоля1>

В тази заявка избираме данните от полетата „FieldName1“ и „FieldName1“ от таблиците „TableName1“ и „TableName“, присвояваме синоними на полетата с помощта на оператора „HOW“, свързваме ги според определено условие „TableConnection“ Състояние”.

От получените данни избираме само данни, които отговарят на условието от „Условие за избор на данни „КЪДЕ“. След това групираме заявката по полето „Име на поле1“, като същевременно сумираме „Име на поле2“. Създаваме общи суми за „ FieldName1“ и последното поле „FieldName2“.

Последната стъпка е да сортирате заявката с помощта на конструкцията "ORDER BY".

Общи проекти

Разгледайте общите конструкции на езика за заявки 1C 8.2.

ПЪРВОн

Използвайки този оператор, можете да получите n брой първи записи. Редът на записите се определя от реда в заявката.

ИЗБЕРЕТЕ ПЪРВИТЕ 100
Банки. Име,
Банки. Код AS BIC
ОТ
Справочник Банки AS Банки
СОРТИРАНЕ ПО
Банки Име

Заявката ще получи първите 100 записа от директорията "Банки", подредени по азбучен ред.

ПОЗВОЛЕН

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

Ако потребителят се опита да прочете записи, които не са му достъпни със заявка, той ще получи съобщение за грешка. За да избегнете това, трябва да използвате конструкцията "ALLOWED", т.е. заявката ще чете само записи, разрешени за нея.

ИЗБЕРЕТЕ РАЗРЕШЕНО
RepositoryAdditionalInformation.Link
ОТ
Указател. Съхранение на допълнителна информация

РАЗЛИЧНИ

Използването на "DIFFERENT" ще направи възможно изключването на дублирани редове от въвеждане на резултата от 1C заявка. Дублирането означава, че всички полета на заявката съвпадат.

ИЗБЕРЕТЕ ПЪРВИТЕ 100
Банки. Име,
Банки. Код AS BIC
ОТ
Справочник Банки AS Банки

EmptyTable

Тази конструкция се използва много рядко за комбиниране на заявки. При присъединяване може да се наложи да посочите празна вложена таблица в една от таблиците. Операторът "EmptyTable" е точно за това.

Пример от помощ 1C 8:

ИЗБЕРЕТЕ Reference.Number, EMPTYTABLE.(Nom, Tov, Qty) КАТО КОМПОЗИЦИЯ
ОТ Документ.Фактура
ОБЕДИНЯВАЙТЕ ВСИЧКИ
ИЗБЕРЕТЕ Link.Number, Composition.(LineNumber, Product, Quantity)
ОТ Документ.Фактура Документ.Фактура.Състав.*

Е НУЛЕВ

Много полезна функция, която ви позволява да избегнете много грешки. IsNULL() ви позволява да замените NULL стойността с желаната. Много често се използва при проверки за наличие на стойност в обединени таблици, например:

ИЗБИРАМ
Референтна номенклатура,
IsNULL(Продукт Remaining.QuantityRemaining,0) AS QuantityRemaining
ОТ


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

ISNULL(InvoiceInvoiceReceived.Date, InvoiceIssued.Date)

AS е оператор, който ни позволява да присвоим име (синоним) на таблица или поле. Видяхме пример за използване по-горе.

Тези конструкции са много сходни - те ви позволяват да получите низово представяне на желаната стойност. Единствената разлика е, че VIEW преобразува всякакви стойности в тип низ, докато REF VIEW преобразува само референтни стойности. РЕФЕРЕНТНОТО ПРЕДСТАВЯНЕ се препоръчва да се използва в заявките за система за композиране на данни за оптимизация, освен ако, разбира се, полето за референтни данни не е планирано да се използва във филтри.

ИЗБИРАМ
View(Link), //string, например "Авансов отчет № 123 от 10.10.2015 г.
Представяне (DeleteMark) AS DeleteMarkText, //низ, "Да" или "Не"
ReferenceRepresentation(DeletionMark) AS DeletionMarkBoolean //boolean, True или False
ОТ
Документ.Предварителен отчет

ЕКСПРЕСНО

Express ви позволява да конвертирате стойностите на полетата в желания тип данни. Можете да конвертирате стойност или в примитивен тип, или в референтен тип.

Експресен тип за справка се използва за ограничаване на исканите типове данни в полетата на съставен тип, често използван за оптимизиране на производителността на системата. Пример:

EXPRESS(Таблица на разходите.Subconto1 AS Директория.Разходни артикули).Тип дейност за данъчно отчитане на разходите

За примитивни типове тази функция често се използва за ограничаване на броя знаци в полета с неограничена дължина (не може да се сравнява с такива полета). За да избегнете грешката " Невалидни параметри в операцията за сравнение. Не могат да се сравняват полета
неограничена дължина и полета от несъвместими типове
”, е необходимо да се изразят такива полета, както следва:

EXPRESS(Коментар КАТО низ(150))

РАЗЛИКА В ДАТАТА

Вземете 267 1C видео урока безплатно:

Пример за използване на IS NULL в 1C заявка:

ИЗБИРАМ ОТ
Реф
ЛЯВО ПРИСЪЕДИНЯВАНЕ
Софтуер
КЪДЕ НЕ Остатъци от стоки Количеството Остатъци Е НУЛЕВ

Типът данни в заявка може да се определи по следния начин: с помощта на функциите TYPE() и VALUETYPE() или с помощта на логическия оператор REFERENCE. Тези две функции са сходни.

Предварително зададени стойности

В допълнение към използването на предадени параметри в заявки на езика за заявки 1C, можете да използвате предварително зададени стойности или . Например, изброявания, предварително дефинирани директории, сметкопланове и т. н. За това се използва конструкцията „Стойност ()“.

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

КЪДЕТО

WHERE Counterparties.KindofContactInformation = Value(Enumeration.Types ofContactInformation.Phone)

WHERE Салда по сметки. Счетоводна сметка = Стойност (Сметкоплан. Самоподдържаща се. Печалба-Загуба)

Връзки

Връзките са 4 вида: НАЛЯВО, ДЯСНО, ПЪЛЕН, ВЪТРЕШЕН.

ЛЯВО и ДЯСНО СЪЕДИНЯВАНЕ

Съединенията се използват за свързване на две таблици по определено условие. Характеристика на ЛЯВО ПРИСЪЕДИНЯВАНЕв това, че вземаме изцяло първата указана таблица и свързваме втората таблица по условие. Полетата на втората таблица, които не могат да бъдат свързани по условие, се попълват със стойността НУЛА.

Например:

Той ще върне цялата таблица с контрагенти и ще попълни полето „Банка“ само там, където ще бъде изпълнено условието „Име на контрагенти = Име на банки“. Ако условието не е изпълнено, полето Банка ще бъде настроено на НУЛА.

RIGHT JOIN на езика 1Cабсолютно подобни ЛЯВО се присъединетес изключение на една разлика - в ДЯСНО ПРИСЪЕДИНЕТЕ"главната" таблица е втората, а не първата.

ПЪЛНА СВЪРЗВАНЕ

ПЪЛНА СВЪРЗВАНЕсе различава от ляво и дясно по това, че показва всички записи от две таблици, обединява само тези, които могат да бъдат съединени по условие.

Например:

ОТ

ПЪЛНА СВЪРЗВАНЕ
Справочник Банки AS Банки

ОТ

Езикът за заявки ще върне и двете таблици изцяло само ако условието за обединяване на записите е изпълнено. За разлика от ляво/дясно свързване, възможно е NULL да се появят в две полета.

ВЪТРЕШНО СЪЕДИНЕНИЕ

ВЪТРЕШНО СЪЕДИНЕНИЕсе различава от пълния по това, че показва само онези записи, които могат да бъдат свързани според дадено условие.

Например:

ОТ
Указател Контрагенти AS Клиенти

ВЪТРЕШНО СЪЕДИНЕНИЕ
Справочник Банки AS Банки

ОТ
Клиенти.Име = Банки.Име

Тази заявка ще върне само редове, в които банката и контрагентът имат едно и също име.

Асоциации

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

Тоест системата работи точно както обикновените, само за временна маса.

Как да използвате INDEX BY

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

ИЗБИРАМ
CurrenciesCurrencySliceLast.Currency AS Валута,
CurrenciesCurrencySliceLast.Course
PUT Валутни курсове
ОТ
DataRegister.Currency Rates.SliceLast(&Period,) AS Валутни курсовеSliceLast
ИНДЕКС ПО
Валута
;
ИЗБИРАМ
ЦениНоменклатура.Номенклатура,
ЦениНоменклатура.Цена,
Ценова номенклатура. Валута,
RatesCurrency.Course
ОТ
RegisterInformation.PricesNomenclature.SliceLast(&Период,
Артикул B (&номенклатура) И PriceType = &PriceType) КАТО цени на артикул
LEFT JOIN Курсове на валути КАТО Курсове на валути
Номенклатура на цените на софтуера.Валута = КурсовеВалута.Валута

групиране

Езикът за заявки 1C ви позволява да използвате специални агрегатни функции, когато групирате резултатите от заявките. Групирането може да се използва и без агрегатни функции за „елиминиране“ на дубликати.

Има следните функции:

Сума, Количество, Брой различни, Максимум, Минимум, Средно.

Пример #1:

ИЗБИРАМ
Реализация на стоки, услуги, стокова номенклатура,
SUM (Продажба на стоки, услуги, стоки. Количество) AS Количество,
SUM(Продажба на стоки, услуги, стоки. Сума) AS Сума
ОТ

ГРУПИРАЙ ПО
Реализация на стоки, услуги, стоки, номенклатура

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

Пример #2

ИЗБИРАМ
Банки.Код,
NUMBER(DIFFERENT Banks.Reference) AS Брой дубликати
ОТ
Справочник Банки AS Банки
ГРУПИРАЙ ПО
Банки.Код

Този пример ще покаже списък с BIC кодове в директорията „Банки“ и ще покаже колко дубликати съществуват за всеки от тях.

Резултати

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

Един от най-популярните начини за използване на общи суми на практика е груповото отписване на стоки.

ИЗБИРАМ




ОТ
Документ.Продажба на СтокиУслуги.Стоки AS Реализация на СтокиУслугиСтоки
СОРТИРАНЕ ПО

РЕЗУЛТАТИ
SUM(число),
SUM(Сума)
ОТ
Номенклатура

Заявката ще доведе до следната йерархия:

Общи резултати

Ако трябва да получите общи суми за всички „общи суми“, използвайте оператора „TOTAL“.

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

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

В което 1 ниво на групиране е агрегирането на всички задължителни полета.

поръчване

Операторът ORDER BY се използва за сортиране на резултата от заявка.

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

ИЗБИРАМ

ОТ
Справочник Номенклатура AS Номенклатура
СОРТИРАНЕ ПО
Име

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

Автоматично подреждане

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

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

ИЗБИРАМ
Номенклатура Име КАТО Име
ОТ
Справочник Номенклатура AS Номенклатура
АВТОМАТИЧНА ПОРЪЧКА

Виртуални маси

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

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

  • първо изрежете;
  • парче от последното.
  • остатъци;
  • обороти;
  • салда и обороти.
  • движения от субконто;
  • обороти;
  • обороти Dt Kt;
  • остатъци;
  • салда и обороти
  • подконто.
  • база;
  • графични данни;
  • действителен срок на валидност.

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

ИЗБИРАМ
Стоки В Складове Остатъци И Обороти. Номенклатура,
Стоки В Складове Остатъци И Обороти.Количество
Стоки В СкладовеОстатъциИОбороти.КоличествоОборот,
Стоки В Складове Остатъци И Обороти.КоличествоВходящи,
Стоки в складове, остатъци и обороти, количество, потребление
Стоки в складове, остатъци и обороти, количество
ОТ
Набирателен регистър Стоки в складове Остатъци и обороти КАТО Стоки в складове Остатъци и обороти

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

Опции за виртуална маса

Много важен аспект при работата с виртуални таблици е използването на параметри. Опциите за виртуална маса са специализирани опции за избор и персонализиране.

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

Пример за използване на такива параметри:

Натрупване Register.GoodsInWarehouses.RemainsAndTurnovers(&StartPeriod, &EndPeriod, Month, Movements ANDPeriodBorders, Nomenclature = &NecessaryNomenclature)

Алгоритъм за виртуални маси

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

Когато използвате виртуална таблица, системата извършва следните манипулации:

  1. Получаваме изчислената стойност, най-близка по дата и размери в таблицата с общите суми.
  2. „Добавете“ сумата от таблицата за движение към сумата от таблицата с общите суми.


Такива прости действия могат значително да подобрят работата на системата като цяло.

Използване на Query Builder

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

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

Текстовият конструктор на заявката се стартира от контекстното меню (щракване с десен бутон) на правилното място в програмния код.

Описание на конструктора на заявки 1C

Нека разгледаме всеки раздел на дизайнера по-подробно. Изключение прави разделът Builder, това е тема за отделна дискусия.

Раздел Таблици и полета

Този раздел определя източника на данни и полетата за показване в отчета. Всъщност тук са описани конструкциите SELECT.FROM.

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

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

Раздел Връзки

Разделът се използва за описание на връзки на няколко таблици, създава конструкции с думата JOIN.

Раздел Групиране

В този раздел системата ви позволява да групирате и обобщавате желаните полета от резултата от таблицата. Описано е използването на структурите ГРУПИРАНЕ ПО, СУМА, МИНИМУМ, СРЕДНО, МАКСИМУМ, ЧИСЛО, БРОЙ РАЗЛИЧНИ.

Раздел Условия

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

Раздел Разширени

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

групиране Избиране на записи:

  • Първо Н– параметър, който връща само N записа в заявката (оператор FIRST)
  • Без повтарящи се– гарантира уникалността на получените записи (оператор РАЗЛИЧЕН)
  • Позволен– позволява ви да изберете само тези записи, които системата ви позволява да изберете, като вземете предвид (ПОЗВОЛЕНА конструкция)

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

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

Раздел Присъединявания/Псевдоними

В този раздел на дизайнера на заявки можете да зададете възможността за свързване на различни таблици и псевдоними (конструкцията AS). Таблиците са изброени от лявата страна. Ако зададете флаговете пред таблицата, ще се използва конструкцията JOIN, в противен случай - JOIN ALL (разлики между двата метода). От дясната страна са посочени съответствия на полета в различни таблици; ако не е посочено съответствие, заявката ще върне NULL.

Раздел за поръчка

Тук определяте реда на сортиране на стойностите (ORDER BY) - низходящ (DESC) или възходящ (ASC).

Има и едно интересно знаме - Автоматично подреждане(в заявката - AUTOORDER). По подразбиране системата 1C показва данни в „хаотичен“ ред. Ако зададете този флаг, системата ще сортира данните по вътрешни данни.

Раздел Пакет на заявка

Можете да създадете нови в раздела Дизайн на заявка и също да го използвате като навигация. В текста на заявката пакетите се разделят със символа “;” (точка и запетая).

Бутон за заявка в инструмента за създаване на заявки

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

В този прозорец можете да направите корекции на заявката и да я изпълните.


Използване на конзолата за заявки

Конзолата за заявки е прост и удобен начин за отстраняване на грешки в сложни заявки и бързо получаване на информация. В тази статия ще се опитам да опиша как да използвам Query Console и ще дам връзка за изтегляне на Query Console.

Нека да разгледаме по-отблизо този инструмент.

Изтеглете конзолата за заявки 1с

Първо, за да започнете с конзолата за заявки, трябва да я изтеглите от някъде. Обработките обикновено се разделят на два вида - управлявани форми и конвенционални (или понякога се наричат ​​8.1 и 8.2 / 8.3).

Опитах се да комбинирам тези два изгледа в една обработка - в желания режим на работа се отваря желаната форма (в управляван режим конзолата работи само в дебел режим).

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

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

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

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

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

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

Параметри на заявката:

Позволява ви да зададете текущите параметри за заявката.

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

  • Бутон Вземете от заявкаавтоматично намира всички параметри в заявката за удобство на програмиста.
  • Флаг Единични параметри за всички заявки– когато е зададено, неговата обработка не изчиства параметрите при преминаване от заявка към заявка в общия списък със заявки.

Задайте параметър като списък със стойностимного просто, достатъчно е да щракнете върху бутона за изчистване на стойност (кръст), когато избирате стойност на параметър, системата ще ви подкани да изберете типа данни, където трябва да изберете „Списък със стойности“:

Също така в горния панел има бутон за извикване на настройките на конзолата за заявки:

Тук можете да зададете опции за автоматично запазване на заявка и опции за изпълнение на заявка.

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

Конструкторът на заявки 1C 8 се извиква от контекстното меню (десен бутон на мишката), когато щракнете върху полето за въвеждане:

Също така в това меню има такива полезни функции като почистване или добавяне на символи за прекъсване на реда („|“) към заявката или получаване на кода на заявката в тази удобна форма:

Заявка = Нова заявка;
Query.Text = ”
|ИЗБЕРЕТЕ
| Валути.Връзка
| ОТ
| Наръчник Валути КАТО валути”;
QueryResult = Query.Execute();

Долното поле на конзолата за заявки показва полето за резултат от заявката, за което е създадена тази обработка:



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

Оптимизация на заявките

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

Селекции във виртуална таблица с помощта на конструкцията WHERE

Необходимо е да се прилагат филтри върху детайлите на виртуална таблица само чрез VT параметрите. В никакъв случай не трябва да използвате конструкцията WHERE за селекция във виртуална таблица, това е груба грешка от гледна точка на оптимизацията. В случай на избор чрез WHERE, всъщност системата ще получи ВСИЧКИ записи и едва след това ще избере необходимите.

ДЯСНО:

ИЗБИРАМ

ОТ
Регистър за натрупване. Взаимни разплащания с вложители на организации. Баланс (
,
Организация = &Организация
И Индивид = &Индивид) КАК Взаимни сетълменти с ДепозитиОрганизацииБаланси

ГРЕШНО:

ИЗБИРАМ
Взаимни разплащания с ДепозиториОрганизацииБаланси.СумаБаланс
ОТ
Регистър на натрупване. Взаимни разплащания с вложители на организации. Салда(,)
КЪДЕТО
Взаимни разплащания с DepositorsOrganizationsBalances.Organization = &Organization
И Взаимни разплащания с DepositorsOrganizationsBalances.Individual = &Individual

Получаване на стойността на поле от съставен тип чрез точка

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

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

ГРЕШНО:

ИЗБИРАМ
RecordSet.Registrator.Date,
RecordSet.Number
ОТ
Регистър на натрупване. Организация на стоките КАТО набор от записи

Тоест, всъщност такава заявка ще се отнася не до една таблица, а до 22 таблици на база данни (този регистър има 21 типа регистратори).

ДЯСНО:

ИЗБИРАМ
ИЗБОР
WHEN GoodsOrg.Registrar LINK Document.Sale of GoodsServices
THEN EXPRESS(GoodsOrg.Registrar AS Document.Sale of GoodsServices).Дата
WHEN GoodsOrg.Registrar LINK Document.Receipt of GoodsServices
THEN EXPRESS (Документ на регистратора на стоки/организация AS. Получаване на стоки/услуги). Дата
КРАЙ КАТО Дата,
GoodsOrg.Quantity
ОТ
RegisterAccumulation.GoodsOrganizations AS GoodsOrg

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

ДЯСНО:

ИЗБИРАМ
СтокиОрганизации.Дата,
СтокиОрганизации.Количество
ОТ
RegisterAccumulation.GoodsOrganizations AS GoodsOrganizations

Подзаявки в условие за присъединяване

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

ГРЕШНО:

ИЗБИРАМ …

ЛЯВО ПРИСЪЕДИНЯВАНЕ (
ИЗБЕРЕТЕ ОТ Регистър на информация. Граници
КЪДЕТО …
ГРУПИРАЙ ПО…
) ОТ …

ДЯСНО:

ИЗБИРАМ …
PUT Ограничения
ОТ Регистър на информация. Граници
КЪДЕТО …
ГРУПИРАЙ ПО…
ИНДЕКС ПО…;

ИЗБИРАМ …
ОТ Документ.Реализация на СтокиУслуги
LEFT JOIN Граници
ОТ …;

Свързване на записи към виртуални таблици

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

Използване на филтри върху неиндексирани полета

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

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

  1. Индексът съдържа всички полета, изброени в условието.
  2. Тези полета са в самото начало на индекса.
  3. Тези селекции вървят в ред, т.е. стойностите, които не участват в условието на заявката, не се „вклиняват“ между тях.

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

Използване на логическо ИЛИ в условия

Това е всичко, тази статия обхваща основните аспекти на оптимизацията на заявките, които всеки 1C експерт трябва да знае.

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

За да покажете референтни полета в отчет, е необходимо да получите представянето на референтното поле в заявката и да го използвате в изхода, а не самата връзка. Този раздел описва някои функции на полето "Изглед" и функциите за получаване на изгледи - View(). Можете да прочетете повече за показването на референтни полета в раздела „Извеждане на референтни полета“.

Представителство на терен

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

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

Функция View()

Функцията за изглед е предназначена да получи текстово представяне на всяка стойност, която може да бъде получена с помощта на езика за заявки. Функцията View() работи както за референтни, така и за примитивни типове. За референтни типове резултатът от функцията е напълно подобен на получаване на полето "Изглед" от препратката, предадена като параметър на функцията. За примитивните типове резултатът от функцията е низ, в който е преобразувана стойността, предадена като параметър. Особеността на тази функция е, че нейният резултат не може да се използва в израз. Тази функция е свързана с факта, че преобразуването на стойности в низ се извършва вече при получаване на данни от резултата от заявката, т.к. преобразуването на произволна стойност в низ при изпълнение на заявка на сървъра не се извършва, поради факта, че при преобразуване на стойности в низ трябва да се вземат предвид локалните настройки.

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

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

Заявка .Текст = "ИЗБИРАМ | usStorageUnits.Reference | ОТ | Reference.usStorageUnits КАТО usStorageUnits // Пример 1. сравнение с празна булева стойност: |КЪДЕ | setStorageUnit.Allow SelectionFromStandbyZone = False // Пример 2. но ако това булево значение е дефинирано, тогава това е по-добре: // условие за отрицателно булево значение: |КЪДЕ | НЕ със StorageUnits.Allow WithdrawalFromStandbyZone // Пример 3. избор по условие на празно поле от тип "референция на конкретен тип" |КЪДЕ | setStorageUnit.ActiveFilterRegion = VALUE(Catalog.FilterRegion us.NullReference) // Пример 3а. избор по условие на празно поле от типа "документ от определен тип" |КЪДЕ | OurInformationRegister.Document = VALUE(Document.OurDocument.EmptyReference) // Пример 3b. избор по условие на празно поле от типа "документи от различни видове" ( съставно поле) |КЪДЕ | (OurInformationRegister.Document = VALUE(Document.OurDocument1.EmptyReference) | ИЛИ OurInformationRegister.Document = VALUE(Document.OurDocument2.EmptyReference) | ИЛИ... (и т.н. – избройте последователно условията за всички възможни типове на това съставно поле) ) // Пример 4. или обратното, ако трябва да изберете попълнена стойност от типа "низ", тогава условието ще помогне: | КЪДЕ | usStorageUnits.Name > """" // Пример 5. ако трябва да изберете документи от определен тип, със съставен тип данни, например в регистъра "Изпълнени задачи", ресурсът "Задача" има съставен тип, сред стойностите на който възможен е документът "Избор". |КЪДЕ | EXPRESS(InformationRegisterJobs, които трябва да бъдат изпълнени.Job AS Document.Filter) REF Document.Filter // Пример 5а. Друг подобен пример, когато трябва да изберете документи от определен тип | ИЗБОР | КОГА ДА ИЗРАЗЯ (agDocument Compliance.DocumentBU AS Document.Incoming Goods/Services) REFERENCE Document.Incoming Goods/Services | ТОГАВА ""Получаване на стоки или услуги"" | КОГА ДА ИЗРАЗЯ (ar Съответствие на документи.ДокументBU AS Документ.Продажби на стоки или услуги) РЕФЕРЕНТЕН документ.Продажби на стоки на услуги | ТОГАВА "Реализация на стоки и услуги" | ИНАЧЕ """" | КРАЙ КАТО KindDocument // Пример 6. избор по условие на недефинирана стойност: |КЪДЕ | SavedSettings.User = Недефиниран // Пример 7. избор по вид движение "Входящи" на регистъра за натрупване, "Разходи" - аналогично): |КЪДЕ | RegGoodsRetail.MovementType = VALUE(MovementAccumulationType.Income) // Пример 8. Как да посочите в заявката, че не е необходимо да изпълните заявката (например, трябва програмно да върнете празен резултат от заявката в зависимост от някакво условие - Query.Text = StrReplace(Query.Text, "WHERE Doc.Link = &DocumentLink" , "КЪДЕ ДА ЛЪЖА");). За да направите това, просто добавете условието "Where is False". Между другото, независимо от количеството данни, поискани в извадката, такава заявка ще бъде изпълнена незабавно. |КЪДЕ ДА ЛЕЖА // Пример 9. Проверка дали резултатът от заявката съдържа данни: Ако неЗаявка.Бягай().празна() Тогава // Пример 10. избор по условие на празна дата: |КЪДЕ | tbRows.CancellationDate = DATETIME(1, 1, 1)

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

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

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

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

За да програмирате в 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.Execute().Select();

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

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

Резултатът може да бъде разтоварен в обикновена таблица:
Избор = Request.Execute().Upload(); //Резултат - таблица със стойности

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

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

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

Основните принципи за изграждане на 1C заявка -
SELECT Списък с полета FROM TableName WHERE Условия

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

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

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

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

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

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

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

Натрупване Register.RegisterName.Turnovers(&StartDate, &EndDate) – заявка 1C от оборотния регистър за периода от началната до крайната дата.

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

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

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

КЪДЕТО
Държани

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

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

Организация

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

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

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

//изчислете сумата

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

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

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

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

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

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

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

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

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

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

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

В раздела Поръчка е посочено сортирането. В раздела Общо - сумиране на общите суми.

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