Карманов прости логически изрази в 1s. Логически операции (1s предприятие)

Карманов прости логически изрази в 1s.  Логически операции (1s предприятие)
Карманов прости логически изрази в 1s. Логически операции (1s предприятие)

По правило изучаването на всеки език за програмиране започва с пример за писане на първия най-простата програма("Здравей свят!"). Това се прави, за да се покаже нагледно работата с основни синтактични конструкции. Няма да правим изключение от този често срещан начин на представяне на материала при изучаване на нова среда за разработка и следователно нашата първа статия трябва да се разглежда в същия дух. В него ще анализираме подробно отговорите на следните въпроси относно програмирането на платформата 1C:Enterprise 8:

  • Къде и с каква помощ да напишете програмен код на вградения език 1C?
  • Какво стана софтуерни модулиКакви са правилата за работа с тях?
  • Какво е променлива, как да работим с нея, как и къде да я декларираме?
  • Какво представляват операторите за сравнение, присвояване и условните оператори и как ги използвате?
  • Булеви операции - какво представляват и как се работи с тях?
  • Защо са необходими цикли и как да ги използвате?

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

Приложимост

Материалът е подходящ за платформата "1C:Enterprise 8" издания 8.2. и 8.3.

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

В тази статия започваме да изучаваме вградения език 1C:Enterprise 8. Изпълним кодсъдържащи се в софтуерните модули.

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

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

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

В бъдеще те могат да се използват в процедурите и функциите на този модул. Ако дадена променлива е дефинирана с ключовата дума Export, тогава тя ще бъде достъпна отвън този модул. Пример за ред за деклариране на променлива:

Rem Warehouse, Division, Storekeeper Export;

След декларирането на променливите има раздел с процедури и функции.

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

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

състояние=1;
Нов израз=2;
резултат=3;

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

Разделителят на оператора е знакът ";" (точка и запетая). Този знак е знак за края на оператора. Тези. оператор може да се запише така:

Резултат=100Х200
+400
-600;

Няма значение на колко реда е изявлението.

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

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

Процедура CalculateValue()

Първоначална стойност = 100;
Междинна стойност = Първоначална стойност / 5;
Крайна стойност = Първоначална стойност+Междинна стойност

EndProcedure

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

Променливите са проектирани да съдържат някаква стойност от произволен тип данни. Те се използват за междинно съхранение на информация за обработка.

В почти всеки софтуерен модул, който извършва някакво действие, има различни променливи. Въвеждането на променливи по стойности в платформата 1C:Enterprise 8 е меко.

Например променлива може да съдържа стойност от един тип данни и няколко реда по-късно друг тип:

Създаден = невярно;
Създаден = вярно;
Създаден =100;

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

  • имплицитен начин (споменаването от лявата страна на оператора за присвояване описва дадената променлива, бр предварително описание variable с думата Variable, т.е. няма специална секция за деклариране на променливи);
  • изрична декларация на променливи (Variable ControlData;). Използва се изрична декларация на променливи, например, ако се очаква последващо прехвърляне на тази променлива към функция.

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

В този случай името на променливата трябва да отразява значението на тази променлива. Еднобуквени имена на променливи (като A, B, C) са лоши примери. Те не отразяват същността на променливите.

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

Запазени думи, като Procedure, Function, Loop, EndCycle и др., не могат да се използват в имена на променливи. (тези конструкции са маркирани в червено в програмния модул).

Запазените думи са вградени езикови оператори и има доста от тях. Всички те са представени в Помощник за синтаксис.

Трябва да се отбележи, че типовете данни не са запазени думи (например Array, Boolean, True, False). Системата ще възприеме правилно тези имена на променливи.

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

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

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

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

Булеви операции

Операторите за сравнение много често използват булева логика, която връща True или False.

Например, в условен оператор можете да сравните: Ако събитие = продажба, тогава алгоритъмът ще премине по един клон (т.е. ако стойността е True), според условието False се изпълнява друг клон на алгоритъма.

Условията могат да бъдат доста сложни, могат да се комбинират, като се използват следните оператори: И, ИЛИ и НЕ. И така, за оператора И:

Истина И Истина = Вярно;
Вярно И Невярно = Невярно;
False И True = False;
False И False = False.

За оператора OR е достатъчно един от операндите да е равен на True, тогава стойността на комбинацията ще бъде True. Стойността е False само ако и двата операнда са False.

Операторът NOT просто се обръща настояща стойност(Лъжа към истината, истина към лъжата).

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

Операторът NOT има най-висок приоритет, следван от оператора AND, следван от оператора OR. Всичко, оградено в скоби, има най-висок приоритет и се изпълнява първо.

Например, нека приоритизираме (последователност на изпълнение) за операциите в горния израз:

НЕ(Условие1 ИЛИ Условие2) И Условие3 ИЛИ Условие4
1.Резултат1 = (Условие1 ИЛИ Условие2);
2. Резултат2 = НЕ Резултат1;
3. Резултат3 = Резултат2 И Условие1;
4. Резултат = Резултат3 ИЛИ Условие4;

Има правило за преобразуване:

НЕ (Условие1 ИЛИ Условие2) = НЕ Условие1 И НЕ Условие2.

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

оператор за присвояване

Операторът за присвояване не трябва да се бърка с равенството, въпреки че имат еднакъв правопис.

Принципът на оператора за присвояване е такъв, че на лявата стойност (променливата от лявата страна) се присвоява стойността, която е вдясно от знака за равенство. Да вземем пример:

Променлива1 = Променлива2 = Променлива3;

На променлива1 се присвоява стойност на равенство от булева логика, т.е. True, ако Variable2 = Variable3, или False в противен случай.

При тестване за позицията на начинаещ програмист често се използва задачата: да размените стойностите на две променливи на места.

Този проблем се решава с помощта на оператора за присвояване и има две решения.

Решение №1 с помощта на временна променлива:
TempVar = Променлива1;
Променлива1 = Променлива2;
Променлива2 = Временна променлива;

Решение №2:
Променлива1 = Променлива1 + Променлива2;
Променлива2 = Променлива1 – Променлива2;
Променлива1 = Променлива1 – Променлива2;

Условен оператор

Има такъв оператор If, след което е необходимо да се опише някакво условие (самото условие може да бъде доста голямо). Условието е последвано от думата Then и операторите, които трябва да бъдат изпълнени.

Това може да бъде последвано от ключовата дума Else и поредица от други твърдения. Ако има няколко различни условия, можете да използвате поредица от ключови думи ElseIf(вижте примера по-долу). Цялата структура трябва да бъде завършена с ключовата дума EndIfпоследвано от точка и запетая.

В допълнение към простите и множествените условия съществува съкратена форма на условния оператор: ?(Условие, Израз1, Израз2);

Ако условието е вярно, тогава Израз1, в противен случай - Израз2. Пример за код: ExpensiveItem = ?(Item.Price>100000, True, False);

На практика вместо сравнителни записи със стойността Вярно (Лъжа) Тип:

If Variable = True Then
И
Ако променлива = False Тогава

всъщност се използва еквивалентната нотация:

Ако е променлива тогава
И
Ако НЕ е променлива, тогава

Циклични оператори

За всеки вид цикъл се изисква изрична индикация за края на този цикъл ключова дума Краен цикъл. Има няколко вида цикли.

Цикъл по брояч- цикъл с фиксиран брой повторения. Условието за излизане от цикъла е превишаване на граничната стойност. Пример за използване за изчисляване на стойността на A!

А = 5;
Факториал = 1;
За брояч = 1 чрез цикъл
Факториал = Факториал * Брояч;
EndCycle;

Цикъл по условие- изпълнява се, докато условието е вярно този цикъл. Пример:

RemainderSum = 1000;
Цена на допълнителен артикул = 243;
Количество = 0;
Докато RemainingAmount>0 цикъл
Количество = Количество+1;
Остатъчна сума = Остатъчна сума - Количество * Цена на допълнителни стоки;
Цена на допълнителен артикул = Цена на допълнителен артикул * 0,8;
Краен цикъл
Количество = Количество-1;

Този цикъл изчислява колко единици от даден продукт могат да бъдат закупени за дадена сума (1000 рубли), ако след закупуване на всяка единица от даден продукт предишната му цена се умножи по коефициент 0,8. Първоначалната цена на стоките е 243 рубли.

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

Преминете през колекции (друго име е За всяка).

Платформата има доста голям брой колекции (това са контейнери, които съдържат елементи от определен тип).

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

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

Сума = 0;
За всеки елемент от цикъл на масив
Сума=Сума+Елемент;
EndCycle;

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

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

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

Това завършва първото ни запознаване с развитието на вътрешния език на 1C.

Какво ще кажете за Hello World? Все още не сме го написали, нали? Да, но нищо не ви пречи да го направите сами, защото. знанието вече е достатъчно. Е, ако това не работи, можете да погледнете тук.

Тази статия е своеобразен отговор на публикацията „Защо 1C е лош и защо 1C програмистите са толкова недолюбвани“. Занимавам се с 1C програмиране от много години и искам да кажа, че ни гледат накриво точно заради такива автори на статии. Нека да разгледаме какво имаме сега.

Платформа

Имаме платформа и конфигурации, написани за нея.

Актуализацията на платформата носи допълнителна функционалност, премахва редица грешки и естествено носи някои. По принцип, лично според мен, хленченето за това, че след актуализиране на платформата, работата в офиса е станала не е правилно. Първо, архивирането на бази данни преди актуализиране трябва да ви предпази от проблеми с базите данни. Е, никой не отмени възможността да се върне към старата платформа. Все едно да обвинявате Microsoft или авторите на свободния софтуер за факта, че след пускането на корекцията / актуализацията всичко се е объркало и мисълта да направите копие на данните не ви е хрумнала. Да, има проблеми с софтуерни ключове. Но можете да използвате хардуерните (те са малко по-скъпи) или можете да инсталирате неортодоксални пачове за периода на поддръжката, за да възстановите работата на офиса, което временно ще помогне за решаване на проблема с липсата / неработоспособността на ключът. По-важна е работата на офис от 30-40 души.

Конфигурации

Тук има къде да се разхождат критиците, но да вървим по ред.

Да приемем, че имаме обикновена търговска организация и функционалността на конфигурацията Trade Management 10.3/11 ни е достатъчна.

Тук имаме две възможности за използване на този софтуерен продукт:

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

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

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

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

За прехвърляне на данни между търговията и счетоводството обикновено се използват правила за обмен. Това е някакъв вид правило, написано на xml, което описва кои обекти с данни се разтоварват, как се зареждат; можете също да посочите допълнителна обработка преди, след по време на разтоварване / товарене. Ако нашата търговска конфигурация е непроменена, тогава не докосваме правилата за качване (с редки изключения, ако внезапно има кардинални промени). Ние също няма да променяме много често правилата за качване. Фактът на получаване / продажба на стоки винаги ще бъде прехвърлен. Но процедурата за изчисляване на данъци и други неща вече ще бъде изчислена в актуализираното счетоводство и това няма да повлияе по никакъв начин на конфигурацията за търговия.

Мисля, че е глупаво да напомням, но все пак се осмелявам. Винаги си струва да правите резервни копия преди актуализации и промени. Е, трябва да признаете, че е глупаво да хленчим, че след актуализацията всичко се развали и цялата компания си струва дял. защото няма как да продадете, да пишете или да се обадите. Всички контакти, акаунти и информация в базата данни.

Използване на 1C в различни бизнес области

Да, 1C е монополист на пазара софтуерпредназначени за автоматизиране на счетоводството и доставката финансови отчети.

Ако говорим за сегмента на малкия бизнес, тогава почти всяка програма, която е малко по-сложна, може да се използва за счетоводство в повечето фирми. осеви таблицив ексел. Счетоводно отчитане на стоки/услуги на парче, осчетоводяване на задължения/задължения, ведомост за заплати. Докладването е възможно чрез програми на трети страни, в който просто се въвеждат крайните числа.
Ако бизнесът е по-голям, тогава конкурентите на 1C са Navision, Oracle, в много големи примери това е SAP.

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

1C има несъмнени предимства при свързването на търговско оборудване (везни, скенери, терминали, табла). Освен това в стандартните конфигурации това се прави на ниво потребител. Добавете свързаност външна обработкаИ печатни формиза разширяване на функционалността, получаване на допълнителни отчети, без да правите промени в конфигурацията. В резултат на това, ако подходите правилно, тогава няма смисъл да се катерите „вътре“ в конфигурацията.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

IN дадено исканеизбираме данните на полетата „FieldName1“ и „FieldName1“ от таблиците „TableName1“ и „TableName“, присвояваме синоними на полетата с помощта на оператора „КАК“, свързваме ги според определено условие „TableConnection Condition“.

От получените данни избираме само данни, които отговарят на условието от „Условие за избор на данни „КЪДЕ“. След това групираме заявката по полето „Име на поле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 г.
Представяне (DeletionMark) AS DeleteMarkText, //низ, "Да" или "Не"
ReferenceRepresentation(DeletionMark) AS DeletionMarkBoolean //boolean, True или False
ОТ
Документ.Предварителен отчет

ЕКСПРЕСНО

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

Express for reference type се използва за ограничаване на исканите типове данни в полета композитен тип, често използвани за оптимизиране на производителността на системата. Пример:

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 и ще дам връзка за изтегляне на Query Console.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

Необходимо е да се прилагат филтри върху детайлите на виртуална таблица само чрез BT параметрите. В никакъв случай не трябва да използвате конструкцията 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 експерт трябва да знае.

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

27.06.2017

NULL, ISNULL() и IS NULL в 1C заявки

Какво е NULL

НУЛАв резултат на заявка означава, че няма стойност (не е празна стойност, не е нула, не е нулева препратка).
Например, в резултат на свързване на таблици на заявки, не е намерена стойност в една от таблиците при свързване чрез полета за свързване. Или заявката се отнася до несъществуващ атрибут (свойство).

NULL не е равно на NULL!

Ако искате да наложите селекция (условие) с проверка за NULL в 1C заявка, тогава конструкция като "WHERE VT.Field1 = NULL" винаги ще се върне ЛЪЖА! За да проверите, трябва да използвате специален оператор

ИМА NULL в заявката 1C

За да тествате стойност (или да работите със стойности) за NULL, трябва да използвате следната конструкция "WHERE VT.Field1 IS NULL" Или друг пример, използвайте в конструкцията ИЗБОР"CHOICE | WHEN VT.Field1 IS NULL | THEN" Струва си да се отбележи, че функцията за проверка на поле за NULL е една от най-ресурсоемките в 1C заявките. Следователно, ако искате да го използвате в условие на заявка, помислете дали е възможно да замените такава проверка вътрешна връзка(вид обединяване в заявки, при което в селекцията остават само записите, които присъстват и в двете таблици).

Функция ISNULL() в 1C заявка

функция ISNULL()ви позволява да замените липсващата стойност в полето за заявка с посочената стойност (стандартна стойност, мъниче).
Например, ако няма информация за цената на стоките, тогава ние я посочваме равна на 0 (нула) "SELECT | HAVE NULL(T.Price, 0) AS Price | FROM Remaining Goods AS VT"

Заключение

Пишете заявки правилно и оптимално. Защото лошата заявка е спирачка и шит код)

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

В езика за програмиране 1C тази цел се изпълнява от конструкцията

Ако< Логическое выражение>Тогава //Инструкция набор 1 ElseIf< Логическое выражение>Тогава //Набор от инструкции 2 Else //Набор от инструкции 3 EndIf ;

Алгоритъмът на работа е доста прост. Логическите изрази след операторите се проверяват последователно АкоИ ElseIf. Веднага щом следващият логически израз приеме стойност Вярнонаборът от команди, следващи този логически израз, се изпълнява. Не се правят повече проверки и блокира изпълнението If…EndIf;това свършва. Ако всички логически изрази имат стойност Лъжа, наборът от команди, следващ оператора, ще бъде изпълнен В противен случай.
Дизайн ElseIf<Логическое выражение>Тогаваможе да се повтори толкова пъти, колкото е необходимо. Може обаче изобщо да не се използва, като оператора В противен случай. Тоест в най-простия случай имаме:

Ако< Логическое выражение>Тогава //Command set EndIf ;

Могат да се използват булеви изрази математически операторисравнения (=, >,<, >=, <=, <>) и булеви операции (И, ИЛИ, НЕ). Важно е да се разбере, че булевият израз трябва да върне също Лъжаили Вярно.

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

Функция &AtClient CheckPermissions() Връща True ; EndFunction &AtClient GetWhatNumber() Връщане 1 ; EndFunction &AtClient Процедура BooleanExpressions() Failure = False; If NOT Failure Then //Instruction Set EndIf ; If GetWhatNumber() = 1 Then //Instruction set EndIf ; If CheckPermissions() Then //Набор от команди EndIf ; EndProcedure

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

Ако< ЛогическоеВыражение_1>ИЛИ< ЛогическоеВыражение_2>Тогава

Ясно е, че ако ние BooleanExpression_1 = Вярно, след това проверете за истина Булев израз_2няма смисъл, защото във всеки случай BooleanExpression_1 ИЛИ BooleanExpression_2 = True. И започвайки от версия 8.0, платформата прави точно това, т.е. следващите логически изрази ще бъдат оценени само ако вече оценените не позволяват недвусмислено определяне на резултата като цяло. Познаването на този факт ви позволява да избегнете грешки и да намалите количеството код.
Като пример, нека разгледаме често срещана ситуация, при която имаме атрибут от съставен тип и трябва да го проверим за пълнота. Да кажем, че имаме подпора от композитен тип контрагент, който може да приеме типа Справочник.Физически лицаили Справочник.Организации. За времето на този пример забравете за функцията ValueFilled(). Както знаете, когато все още не сме избрали типа на съставен атрибут, неговата стойност е равна на Недефиниран. По този начин атрибутът е празен, когато стойността му е недефинирана или е нулева препратка. И можем да напишем нашето условие в две версии:

// Опция_1 Ако Изпълнител = Недефинирано ИЛИ Изпълнител. Empty() Then Message = New MessageToUser; Съобщение. Текст = „Няма избран контрагент“; Съобщение. Докладвам() ; EndIf ; // Option_2 Ако контрагент. Empty() OR Contractor = Undefined Then Message = New MessageToUser; Съобщение. Текст = „Няма избран контрагент“; Съобщение. Докладвам() ; EndIf ;

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

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

? (< Логическое выражение> , < ВыражениеЕслиИстина> , < ВыражениеЕслиЛожь> )

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

If Failure Then MessageText = "Грешка" ; Else MessageText = „Операцията приключи“; EndIf ;

напишете само в един ред:

Текст на съобщението = ? (Отхвърляне, "Грешка", „Операцията приключи“) ;