Лево и десно се спојуваат во 1c барања. TYPE во барање

Јазикот за пребарување е еден од основните механизми на 1C 8.3 за програмерите. Користејќи прашања, можете брзо да ги вратите сите податоци зачувани во базата на податоци. Неговата синтакса е многу слична на SQL, но има некои разлики.

Главните предности на јазикот за пребарување 1C 8.3 (8.2) во однос на SQL:

  • дереференцирање на референтни полиња (се однесува на една или повеќе точки на детали за објектот);
  • работата со резултати е многу погодна;
  • можност за креирање виртуелни табели;
  • барањето може да биде напишано и на англиски и на руски;
  • способност за блокирање податоци за да се избегнат ќор-сокак.

Недостатоци на јазикот за пребарување во 1C:

  • за разлика од SQL, во 1C барањата не дозволуваат менување на податоците;
  • недостаток на складирани процедури;
  • неможност за претворање на низа во број.

Ајде да го погледнеме нашиот мини туторијал за основните конструкции на јазикот за пребарување 1C.

Поради фактот што барањата во 1C ви дозволуваат само да примате податоци, секое барање мора да започне со зборот „SELECT“. По оваа команда се означени полињата од кои мора да се добијат податоци. Ако наведете „*“, ќе бидат избрани сите достапни полиња. По зборот „ОД“ се означува местото од кое ќе се избираат податоците (документи, регистри, именици итн.).

Во примерот дискутиран подолу, имињата на целата номенклатура се избрани од директориумот „Номенклатура“. По зборот „КАКО“, се означени псевдоними (имиња) за табели и полиња.

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

До командата „SELECT“ што можете да ја наведете клучни зборови:

  • РАЗЛИЧНИ. Барањето ќе избере само редови што се разликуваат во најмалку едно поле (без дупликати).
  • FIRST n, Каде n– бројот на редови од почетокот на резултатот што треба да се одберат. Најчесто, оваа конструкција се користи заедно со сортирање (ORDER BY). На пример, кога треба да изберете одреден број документи кои се неодамнешни по датум.
  • ДОЗВОЛЕНО. Овој дизајн ви овозможува да ги изберете од базата на податоци само оние записи што се достапни за тековниот корисник. Врз основа на употребата на овој клучен збор, корисникот ќе добие порака за грешка кога се обидува да побара записи до кои нема пристап.

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

ЗА ПРОМЕНА

Овој предлог ги блокира податоците за да спречи меѓусебни конфликти. Заклучените податоци нема да се читаат од друга врска додека трансакцијата не заврши. Во оваа клаузула, можете да наведете одредени табели што треба да се заклучат. Во спротивно, сите ќе бидат блокирани. Дизајнот е релевантен само за режимот за автоматско заклучување.

Најчесто, клаузулата „ЗА ПРОМЕНА“ се користи при примање салда. На крајот на краиштата, кога неколку корисници работат во програмата истовремено, додека еден добива салда, друг може да ги промени. Во овој случај, добиениот остаток повеќе нема да биде точен. Ако ги блокирате податоците со овој предлог, тогаш додека првиот вработен не го добие точниот биланс и не ги изврши сите потребни манипулации со него, вториот вработен ќе биде принуден да чека.

ИЗБЕРЕТЕ
Меѓусебни спогодби.Вработен,
Меѓусебни порамнувања Износ на меѓусебни порамнувања Биланс
ОД
Регистар на акумулации. Меѓусебни населби со вработените. Баланси како меѓусебни населби
ЗА ПРОМЕНА

КАДЕ

Дизајнот е неопходен за да се наметне некој вид на избор на поставените податоци. Во некои случаи на добивање податоци од регистри, поразумно е да се наведат условите за избор во параметрите на виртуелните табели. Кога се користи „WHERE“, прво се преземаат сите записи, па дури потоа се применува селекцијата, што значително го забавува барањето.

Подолу е пример за барање за добивање контакт лица за одредена позиција. Параметарот за избор има формат: &ParameterName (името на параметарот е произволно).

ИЗБОР (СЛУЧАЈ)

Дизајнот ви овозможува да ги наведете условите директно во телото на барањето.

Во примерот подолу, „Дополнително поле“ ќе содржи текст во зависност од тоа дали документот е објавен или не:

ИЗБЕРЕТЕ
Прием T&U.Link,
ИЗБОР
КОГА ПриемотT&U.Извршени
ТОГАШ „Документот е донесен!“
ДРУГО „Документот не беше објавен...“
КРАЈ КАКО дополнително поле
ОД
Документ.Прием на стоки и услуги КАКО Прием Т&К

ПРИКЛУЧЕТЕ СЕ

Спојувањата поврзуваат две табели врз основа на одредена состојба на врската.

ЛЕВО/ДЕСНО ПРИКЛУЧУВАЊЕ

Суштината на спојувањето LEFT е дека првата наведена табела се зема во целост, а втората е поврзана со неа според условот за поврзување. Ако нема записи што одговараат на првата табела во втората, тогаш NULL се заменува како нивни вредности. Едноставно кажано, главната табела е првата одредена табела и податоците од втората табела (ако ги има) веќе се заменети за нејзините податоци.

На пример, потребно е да се добијат ставки од документите „Прием на стоки и услуги“ и цени од информативниот регистар „Цени на артикли“. ВО во овој случај, ако цената за која било позиција не е пронајдена, наместо тоа, заменете ја NULL. Сите ставки од документот ќе бидат избрани без разлика дали имаат цена или не.

ИЗБЕРЕТЕ
Прием и У.номенклатура,
Цени.Цена
ОД
Документ Прием на стоки и услуги Стоки КАКО Прием и спецификации
ВНАТРЕШНО ПРИКЛУЧУВАЊЕ Регистрирај сеИнформации.ЦенитеНоменклатура.Рече Последно КАКО Цени
Софтверска потврда&У.Номенклатура = Цени.Номенклатура

ВО ДЕСНОТО се е токму спротивното.

ЦЕЛОСНА КОНЕКЦИЈА

Овој тип на поврзување се разликува од претходните по тоа што како резултат ќе се вратат сите записи и од првата и од втората табела. Ако не се најдат записи во првата или втората табела врз основа на наведената состојба на врската, наместо тоа ќе се врати NULL.

Кога користите целосна врска во претходниот пример, ќе се изберат сите ставки од документот „Прием на стоки и услуги“ и сите најнови цени од регистарот „Цени на артикли“. Вредностите на ненајдените записи и во првата и во втората табела ќе бидат еднакви на NULL.

ВНАТРЕШЕН ПРИКЛУЧУВАЊЕ

Разликата помеѓу ВНАТРЕШЕН ПРИКЛУЧУВАЊЕ и ЦЕЛОСНА ПРИКЛУЧУВАЊЕ е во тоа што ако не се најде запис во барем една од табелите, барањето воопшто нема да го прикаже. Како резултат на тоа, ќе се изберат само оние ставки од документот „Прием на стоки и услуги“ за кои има евиденција во информативниот регистар „Цени на артикли“, доколку во претходниот пример „ЦЕЛО“ го замениме со „ИНТЕРНА“.

ГРУПА ПО

Групирањето во 1C пребарувања ви овозможува да ги собирате редовите на табелата (полиња за групирање) според одредена заедничка карактеристика (полиња за групирање). Полињата за групирање може да се прикажат само со помош на збирни функции.

Резултатот од следното барање ќе биде список на типови производи со максимални цени за нив.

ИЗБЕРЕТЕ
,
MAX(Цена.Цена) КАКО Цена
ОД

ГРУПА ПО
Цени.Номенклатура.Вид на номенклатура

РЕЗУЛТАТИ

За разлика од групирањето, кога се користат збирки, сите записи се прикажуваат и вкупните редови се додаваат на нив. Групирањето прикажува само генерализирани записи.

Резултатите може да се сумираат за целата табела (со користење на клучниот збор „ОПШТО“), за неколку полиња, за полиња со хиерархиска структура (клучни зборови „ХИЕРАРХИЈА“, „САМО ХИЕРАРХИЈА“). При сумирање на резултатите, не е неопходно да се користат збирни функции.

Ајде да погледнеме пример сличен на примерот погоре користејќи групирање. Во овој случај, резултатот од барањето ќе врати не само групирани полиња, туку и детални записи.

ИЗБЕРЕТЕ
Цени.Номенклатура.Тип на номенклатура AS Вид на номенклатура,
Цени.Цена КАКО Цена
ОД
Регистар на информации Цени на номенклатурата Снимка од најновите AS цени
РЕЗУЛТАТИ
MAXIMUM (цена)
СО
Тип Номенклатура

ИМАЊЕ

Овој оператор е сличен на операторот WHERE, но се користи само за збирни функции. Останатите полиња, освен оние што ги користи овој оператор, мора да бидат групирани. Операторот WHERE не е применлив за збирните функции.

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

ИЗБЕРЕТЕ

MAX(Цена.Цена) КАКО Цена
ОД
Регистар на информации Цени на номенклатурата Снимка од најновите AS цени
ГРУПА ПО
Цени.Номенклатура.Вид на номенклатура
ИМАЊЕ
MAXIMUM(Цени.Цена) > 1000

СОРТИРАЈ ПО

Операторот ORDER BY го сортира резултатот од барањето. За да се осигура дека записите се прикажуваат по конзистентен редослед, се користи AUTO ORDER. Примитивните типови се подредени според вообичаените правила. Типовите на референци се подредени по GUID.

Пример за добивање листа на вработени подредени по име:

ИЗБЕРЕТЕ
Вработени.Име AS Име
ОД
Директориум.Вработени КАКО Вработени
СОРТИРАЈ ПО
Име
АВТОМАТСКА НАРАЧКА

Други 1C конструкции на јазикот за пребарување

  • КОМБИНИРАЈТЕ– резултати од две прашања во едно.
  • КОМБИНИРАЈ СЕ– слично на COMBINE, но без групирање идентични редови.
  • ПРАЗНА МАСА– понекогаш се користи кога се придружуваат прашања за да се наведе празна вгнездена табела.
  • МЕСТО– создава привремена табела за оптимизирање сложени 1C барања. Таквите барања се нарекуваат сериски барања.

Карактеристики на јазикот за пребарување

  • SUBSTRINGскратува низа од одредена позиција на одреден број знаци.
  • ГОДИНА...ВТОРАви овозможува да ја добиете избраната вредност на нумерички тип. Влезен параметар е датумот.
  • ПОЧЕТОК НА ПЕРИОДОТ и КРАЈ НА ПЕРИОДОТсе користи при работа со датуми. Типот на период (ДЕН, МЕСЕЦ, ГОДИНА итн.) е означен како дополнителен параметар.
  • ADDKDATEви овозможува да додадете или одземете одредено време од одреден тип од датум (SECOND, MINUTE, DAY, итн.).
  • РАЗЛИКАја одредува разликата помеѓу два датума, означувајќи го типот на излезната вредност (ДЕН, ГОДИНА, МЕСЕЦ итн.).
  • ISNULLја заменува вредноста што недостасува со наведениот израз.
  • РЕПРЕЗЕНТАЦИЈА и ЗАСТАПНИ ЛИНКИдобијте претстава на низа на наведеното поле. Применете се на сите вредности и само на референтните вредности, соодветно.
  • ТИП, ТИП ВРЕДНОСТИсе користат за одредување на типот на влезниот параметар.
  • ЛИНКе логички споредбен оператор за типот на вредност на атрибутот.
  • ЕКСПРЕСсе користи за претворање на вредност во саканиот тип.
  • ДАТУМ ВРЕМЕдобива вредност од типот „Датум“ од нумерички вредности(Година, месец, ден, час, минута, секунда).
  • ЗНАЧЕЊЕво барање 1C се користи за означување на претходно дефинирани вредности - директориуми, набројувања, планови за типови карактеристики. Пример за употреба: " Каде Legal Individual = Value(Enumeration. Legal Individual. Individual)«.

Изградувач на прашања

За да креирате прашања со 1C, има многу удобен вграден механизам - дизајнер на прашања. Ги содржи следните главни јазичиња:

  • „Табели и полиња“ - ги содржи полињата што треба да се изберат и нивните извори.
  • „Поврзувања“ - ги опишува условите за структурата КОНЕКЦИЈА.
  • „Групирање“-содржи опис на структурите за групирање и сумирани полиња врз основа на нив.
  • „Услови“ - е одговорен за избор на податоци во барањето.
  • „Advanced“ - дополнителни параметри за барање, како што се клучни зборови за командата „SELECT“ итн.
  • „Joins/Aliases“ - се означени можностите за спојување на табели и се специфицирани псевдоними (конструкцијата „HOW“).
  • „Нарачка“ е одговорна за сортирање на резултатот од барањата.
  • „Вкупно“ - слично на табулаторот „Групирање“, но се користи за конструкцијата „ВКУПНИ“.

Текстот на самото барање може да се види со кликнување на копчето „Барање“ во долниот лев агол. Во оваа форма, може да се коригира рачно или да се копира.


Побарајте конзола

За брзо прегледување на резултатот од барањето во Enterprise режим или отстранување грешки на сложените прашања, користете . Го содржи текстот на барањето, ги поставува параметрите и го прикажува резултатот.

Можете да ја преземете конзолата за пребарување на дискот ITS или преку .

Внимание! Ова е воведна верзија на лекцијата, чии материјали може да бидат нецелосни.

Најавете се на страницата како студент

Најавете се како ученик за да пристапите до училишните материјали

Јазик за пребарување 1C 8.3 за почетници програмери: врски

Се придружува на прашања

Здружувањето е една од најважните и најважните операции што ги вршат системите за управување со релациони бази на податоци.

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

За да ја разбереме потребата за поврзување, да го решиме следниот проблем.

Имаме директориум во нашата база на податоци Клиенти:

Директориум Бои:

И референтна книга Здруженија:

Нашата задача е да ги изведеме омилените асоцијации на клиентите врз основа на бојата.

Така, на Наташа тревата ќе и биде омилена асоцијација, бидејќи омилена боја и е зелената. А за Петар - сонцето. Читате пробна верзија на лекцијата, достапни се целосни лекции.

За Андреј воопшто нема соодветна асоцијација, бидејќи неговата омилена боја е црвената и нема асоцијации на црвено во базата на податоци.

Постепено ќе го решиме проблемот.

Прво ќе ги прашаме сите клиенти и нивните омилени бои:

Потоа побарајте ги сите здруженија и нивните бои:

Ако се обидеме да го извршиме ова барање, ќе добиеме грешка:

Причината за грешката е што полето Имеприсутни во двете табели одеднаш ( КлиентиИ Здруженија) и системот едноставно не го знае полето од која табела значи.

За да се отстранат ваквите нејаснотии при земање примероци од повеќе од една табела, вообичаено е да се наведе целосни имиња на полиња.Целосното име на полето го вклучува целото име на табелата (на пример, Директориум.Клиенти) и името на самото поле (на пример, Име).

Значи целото име на полето е Имеод масата Клиентиќе Директориум.Клиенти.Име.

И целото име на полето Имеод масата Здруженијаќе Директориум.Асоцијации.Име.

Вкрстена врска

Ајде да го преработиме претходното барање со целосни имиња на полиња:

Само што произведувавме вкрстена врскадве маси. Обрнете внимание на тоа како е формиран резултатот:

Внатрешно спојување

Очигледно, резултатот од вкрстено спојување на две табели не е решение за нашиот проблем. Не ни требаат сите записи од крстот, туку само оние чии полиња Омилена бојаИ Бојаимаат исто значење:

За да ги добиете овие записи, додадете дел на претходното барање КАДЕ:

Ова е она што ни треба - го решивме проблемот!

Во последното барање користевме вкрстено спојување со дополнителен услов (во делот КАДЕ). Читате пробна верзија на лекцијата, достапни се целосни лекции. Таквата врска се нарекува внатрешна.

Постои и друг начин да се напише истото внатрешно спојување:

Споредете го ова и претходното барање. Тие се сосема исти од гледна точка на платформата, само имаат различна синтакса. И ова и претходните барања содржат внатрешен приклучок на табелата Клиентисо маса Здруженијапо полиња Омилена бојаИ Бојасоодветно.

Лева врска

Имајте предвид дека резултатот од внатрешното спојување не го вклучи Андреј. И сето тоа затоа што неговата омилена боја е црвената, а ние воопшто немаме црвени асоцијации во нашата база на податоци.

Излегува дека за Андреј со неговата црвена боја едноставно немаше натпревар од табелата за асоцијација.

Ајде да го преработиме барањето така што резултатот ги вклучува оние записи од првата табела за кои не беа пронајдени парови од втората табела (во овој случај Андреј):

Оваа врска се нарекува лево придружи.

Рлево приклучување резултатпретставува: сè записи од внатрешен спојПЛУС сè записи од првата табела, не се вклучени во внатрешниот

Правилно поврзување

Но, да се вратиме повторно на внатрешното спојување:

Забележете дека резултатот од внатрешното спојување не ја содржи асоцијацијата Бел снег, бидејќи немаше ниту еден клиент чија омилена боја беше белата.

Ајде да го преработиме барањето така што резултатот ги вклучува оние записи од втората табела за кои не беа пронајдени парови од првата табела (во овој случај, бел снег):

Оваа врска се нарекува правилна врска.

Резултат од десното спојувањее: ПЛУС сè записи од втората табела, не се вклучени во внатрешниотврска (за која не беше пронајден пар).

Целосна врска

Но, што ако ни треба резултатот од барањето да го вклучиме покрај внатрешниот спој АндрејИ Снегистовремено?

За да го направите ова, ќе треба да ги комбинирате резултатите од левиот и десниот спој. Овој тип на врска е веќе измислен и се нарекува целосна врска:

Резултат на целосно поврзувањепретставува: сите записи од внатрешниот спојПЛУС сите записи од првата табела кои не се вклучени во интернатаврска (за која не е пронајден пар) ПЛУС сите записи од втората табела кои не се вклучени во интернатаврска (за која не беше пронајден пар).

Алијаси на табела

Се согласувам дека сите прашања што ги напишавме во оваа лекција изгледаат прилично незгодни. Ова се должи на фактот дека сме принудени да укажеме целосни имињаполиња за да се избегне двосмисленост.

За да го скратите целото име на табелата (на пример, Директориум.Клиенти) дозволено е (како и за самите полиња) да се користат псевдоними.

Ајде да го преработиме последното барање така што при генерирање на целосни имиња на полиња наместо Директориум.Клиентиможете да користите псевдоним ДО, и наместо тоа Именик.Здруженија- псевдоним А:

И за да го направиме резултатот од барањето уште појасен, ајде да додадеме псевдоними за полињата што веќе ги разгледавме во една од претходните лекции:

Ракување со NULL

Погледнете ги подетално резултатите од последното барање (како и многу претходни во оваа лекција).

Кои се вредностите на полето? ЗдружениетоИ HerColorза првата линија? Што можете да кажете за нивите? КлиентИ Нејзината бојаза последната линија?

Тие се еднакви НУЛА,што, како што веќе знаеме, значи отсуство на какво било значење:

И бидејќи НУЛАзначи отсуство на вредност, потоа секој обид да се изврши каква било операција со неа (споредба, собирање...) ќе предизвика недефинирано однесување на базата, непредвидлива грешка.

Затоа обработката на вредностите се смета за задолжителна НУЛА кога и да се појават.

Она што го подразбираме под обработка е дека мораме во нашето барање да кажеме дека ако едно од полињата е еднакво на НУЛА, тогаш некоја друга вредност треба да се замени во ова поле.

Во овој случај, за полињата КлиентИ Здружениетово случај на откривање НУЛАќе ја замениме празната низа "".

И тука се полињата Нејзината бојаИ HerColorсе врски до елементи на директориумот Бои, затоа, во нив може да се заменат само вредности кои се референци на наведените типови. Секој тип на референца (како Директориум или документ) има предефиниран елемент EmptyLink. За да ја покажеме неговата вредност во барањето, ќе ја користиме функцијата ЗНАЧЕЊЕ.

Да се ​​утврди што има на терен НУЛАЌе користиме веќе позната функција од претходните лекции ISNULL:

SELECT ISNULL( K. Name, "" ) AS Client, ISNULL( K. FavoriteColor, VALUE (Directory. Colors. EmptyLink) ) AS ItsColor, ISNULL( A. Name, "" ) AS Association, ISNULL( A. Боја, VALUE (Директориум. Бои. EmptyLink) ) AS Is HerColor ОД Директориумот. Клиенти. Асоцијации AS A BY K. FavoriteColor = A. Боја

Во изгледот (од конзолата за пребарување) резултатот не е променет. Сè уште гледаме празни полиња. Но, ова е само затоа што репрезентациите на жици имаат НУЛАа празните полиња од сите типови се исти и еднакви на празната низа.

Всушност, овие празни полиња повеќе не постојат НУЛА(без вредност) , Сега тие имаат (празни) вредности со кои веќе можете да работите (да вршите операции).

Запомнете, празна вредност и без вредност се две многу различни работи.

Спојување на повеќе од две табели

Може последователно да се придружите онолку табели колку што сакате.

Да претпоставиме дека треба да го решиме следниот проблем. Читате пробна верзија на лекцијата, достапни се целосни лекции. Изнесете ги сите можни опции на клиентите и нивните омилени здруженија и нивните омилени производи врз основа на нивната омилена боја.

За да го направите ова, ајде да ја поврземе табелата последователно по боја Клиентисо маса Здруженијаа потоа (резултатот) со табелата Храна:

Направете го тестот

Започнете го тестот

1. Врските се користат за

; Вгнездени прашања (во развој).

Задача бр. 1: користете барање за да ги изберете сите објавени документи Продажба на стоки и услуги,

Објаснување: конфигурации Сметководство 2.0 / 3.0Имплементацијата не складира врска до издадената фактура. Врската помеѓу овие документи е обратна: во фактурата (во деталите База на документи) се чува упатување на имплементацијата на која се однесува. Така, за да разберете кои имплементации немаат фактури, ќе треба да користите две табели во барањето: Продажба на стоки и услугиИ Издадена фактура.

Задача бр. 2: да речеме во базата на податоци на директориумот Договори на договорни странисоздадени дополнителни информации Одложување(регистар на локација за складирање дополнителни информации). Користете барање за да ги изберете сите договори на наведената договорна страна со задоцнување од 0 до 10 дена.

Објаснување: во оваа задача би било можно да се направи без користење на две табели, ако не и за еден услов: избор на договори со нула одложување. Поентата е дека во регистарот дополнителни информацииПразните вредности за дополнителни информации не се складираат, така што нема да има записи за нула одложување таму. Затоа, ќе мора да го прикачите овој регистар во директориумот Договори на договорни страни, ако за некој од договорите нема евиденција со одложување, тогаш е нула.

Нови јазичиња: Врски

Нови механизми: проверка за нула во 1C барање.

Теоретски дел од час бр.3

Ако барањето 1C користи само една табела, тогаш податоците се земаат само од неа. Но, ако треба да изберете податоци од повеќе табели, тогаш треба да поставите врски помеѓу овие табели. Врските се неопходни за да се споредат редовите на една табела со база на податоци со редовите на друга табела и на тој начин да се добие, при формирањето на барањето, конечна табела која ќе ги содржи потребните податоци од сите табели за барања.

Секоја специфична врска е конфигурирана помеѓу две табели, едната од нив се нарекува Лево, друго Во право. Постојат три типа на врски:

  • ВНАТРЕШЕН ПРИКЛУЧУВАЊЕ- запис од левата табела ќе се појави во резултатот од барањето само ако условот за поврзување е исполнет, записот од десната табела ќе се појави во резултатот од барањето само ако условот за поврзување е исполнет;
  • ЛЕВА КОНЕКЦИЈА- записот од левата табела ќе биде вклучен во резултатот од барањето во секој случај, записот од десната табела ќе биде вклучен во изборот само ако е исполнет условот за поврзување. Аналогот на левицата е ПРАВО ПРИДРУЖЕТЕ СЕподатоците од десната табела се вклучени во резултатот во секој случај, податоците од левата табела само ако условот е исполнет. Обично кога се пишува барање се користи Лева врска, ако го користите вистинскиот, следниот пат кога ќе го отворите барањето, дизајнерот на барањето ќе го конвертира во лево, заменувајќи ги табелите;
  • ЦЕЛОСНА КОНЕКЦИЈА- записот од левата табела ќе се појави прво во резултатот на барањето во секој случај, потоа само ако условот за поврзување е исполнет, записот од десната табела ќе се појави прво во резултатот на барањето во секој случај, потоа само ако условот за поврзување се исполнува. Во овој случај, добиените дупликати редови се исклучени од примерокот.

Во теорија, приклучувањето на табелите за прашања е доста тешко да се разбере за необучен 1C програмер, но при проучување на примерите, сите нејасни точки ќе станат појасни.

Картичка за односи во Query Designer

Во дизајнерот на барање, одете на јазичето Врски. Тоа е табела во која се креира потребниот број на врски за сите различни парови на табели. Можете да додавате, бришете, копирате и менувате врски користејќи ги копчињата лоцирани над табелата (нема да ги анализираме сите детално).

Откако ќе додадете нова врска, мора да ги пополните сите колони од табелата. Ајде да ја разгледаме секоја колона од табелата за поврзување:

  • Табела 1. Левата табела за комуникација е избрана во оваа колона. Можете да користите само табели избрани на картичката Табели и полиња;
  • Сите. Знамето во оваа колона се става ако треба да ги изберете сите податоци за левата табела (за Левоили Полнаврски);
  • Табела 2. Во оваа колона е избрана вистинската табела за поврзување;
  • Сите. Знамето во оваа колона се става ако треба да ги изберете сите податоци за десната табела (за Во правоили Полнаврски);
  • бесплатно. Знаме со кое можете да се префрлите во режим на рачно уредување на состојбата на поврзувањето;
  • Состојба на поврзување.Услов во јазикот за пребарување, сличен на условите дискутирани во. Тоа е израз кој секогаш мора да враќа една од двете вредности: Вистинаили Лага.Вообичаено, условот за врска се состои од три дела:
    • Лева страна. Обично поле во левата табела, но може да биде и поле во десната табела или параметар (само во режим за уредување прилагодена состојба);
    • Оператор за споредба. Стандардно, "=", "<>», «<«, «>», «>=», «<=». Но в произвольном режиме редактирования можно использовать и некоторые другие, например «Между»;
    • Десен дел. Обично поле во десната табела, но може да биде и поле во левата табела или параметар (само во режим за уредување прилагодена состојба);

Пополнување и уредување Услови за комуникација, слично на уредување на регуларен услов за кој се дискутираше во последната лекција, со исклучок што стандардно, не е наведен параметар во десниот дел од условот, туку поле во десната табела. Во слободен режим, достапен е и уредник за слободен израз.

Практичен дел од часот бр.3

Да го погледнеме решението за проблемите дадени на почетокот на лекцијата.

Задача бр. 1

Изберете ги сите објавени документи со барање Продажба на стоки и услуги,за наведениот период за кој не е креирана фактура.

  • Ајде да создадеме ново барање;
  • Ајде да избереме табели Продажба на стоки и услугиИ Издадена фактураод конецот Документација;
  • Од масата Продажба на стоки и услугиизберете поле Врска;
  • Ајде да одиме на јазичето Услови;
  • Во поглавјето Полиња, да ја отвориме темата Продажба на стоки и услугикористејќи го копчето „+“;
  • Ајде да ги најдеме реквизитите датуми повлечете го во делот за услови, изберете го операторот за споредба Помеѓуи означете ги параметрите за почетокот и крајот на периодот, на пример Почеток на периодотИ Крај на периодот;
  • Од делот Полињаајде да ги повлечеме реквизитите Спроведено, ставете знаменце во линијата со условот бесплатнои избришете го дополнителниот дел од условот „= ​​&Поминато“;
  • Ајде да одиме на јазичето Комуникации;
  • Ајде да создадеме нова врска користејќи го копчето „Додај“;
  • На терен Табела 1изберете табела Продажба на стоки и услуги(ова ќе биде левата табела) ;
  • За правилно да го решиме проблемот, треба да ги добиеме сите имплементации, да им приложиме фактури и ако фактурата не се најде, да ја прикажеме имплементацијата како резултат на барањето. Ајде да ја поделиме оваа задача на две подзадачи:
    • Ајде да ги избереме сите продажби и, користејќи ја врската, да се обидеме да ја најдеме нивната фактура;
    • Користејќи го условот, ќе ги избереме само оние линии каде што нема фактура;
  • Од претходниот став произлегува дека треба да користиме Лева врска, со цел да се изберат сите имплементации. Затоа, да ставиме знаменце во колоната Сите
  • На терен табела 2изберете табела Издадена фактура(ова ќе биде вистинската табела);
  • Бидејќи врската до имплементацијата е зачувана во деталите за фактурата, Д База на документи,во состојба на поврзување избираме:
    • На левата страна на теренот Продажба на стоки и услуги;
    • На десната страна од теренот: InvoiceInvoiceIssued.DocumentBase.
  • Поставувањето на врската е завршено;

Со лево спојување, ако за ред од левата табела нема ниту еден ред од десната табела што ги задоволува условите за поврзување, сите полиња од десната десна табела за даден ред од левата табела имаат вредност НУЛА. Да го искористиме ова за да ги избереме само оние редови од левата табела за кои нема фактура;

Јазикот за барање 1C има посебен логички оператор кој ви овозможува да проверите дали полето содржи вредност НУЛА, неговата синтакса <Поле>Е НИШТА. Враќа вредност Вистинаако полето има вредност НУЛАИ Лага- во спротивен случај.

Забележете дека проверете ја вредноста на полето со НУЛАе можно само со користење на наведената функција, конструкција <Поле>= NULLОваа проверка нема да биде можна.

  • Ајде да одиме на јазичето Услови;
  • Повлечете едно од полињата на табелата во делот за услови Издадена фактура, на пример поле Врска;
  • Поставете знаме во линијата бесплатнои додадете го операторот по полето Е НИШТА, откако претходно го избриша непотребниот дел од состојбата;

Барање = Ново барање; Request.SetParameter ("StartPerid" , StartPerid); Request.SetParameter ("Крај на периодот", Крај на периодот); Барање.Текст = "ИЗБЕРИ | Продажба на стоки и услуги. Врска | ОД | Документ. Продажба на стоки и услуги КАКО Продажба на стоки и услуги | Документ за ЛЕВО ПОВРЗУВАЊЕ. Издадена фактура КАКО Издадена фактура | Софтвер Продажба на стоки и услуги. Врска = Издадена фактура. Основа на документ | КАДЕ | Продажба на стоки и услуги. Датум ПОМЕЃУ & Почеток на периодот и & крајот на периодот | И продажба на стоки и услуги. Спроведена | И Издадена фактура. Референцата Е НИШТА";

Задача бр. 2

  • Ајде да создадеме ново барање;
  • Ајде да го стартуваме дизајнерот на прашања;
  • На јазичето Табели и полињаАјде да избереме две табели: Договори на договорни страниод конецот ДиректориумиИ Дополнителни информацииод конецот Регистри на информации;
  • Од масата Договори на договорни страниизберете поле Врска;

Според условот, резултатот од барањето треба да вклучува договори на само една договорна страна, чија вредност ќе се пренесе на барањето со помош на параметар. Договорната страна на која припаѓа договорот се чува на терен Сопственикдиректориум Договори на договорни страни.

  • Ајде да одиме на јазичето Услови. Од масата Договори на договорни странипреместете го полето во делот за услови Сопственик. На десната страна на условот, ќе го поставиме името на параметарот на кој ќе ја пренесеме другата страна што ни треба, ајде да ја наречеме Контрапартија;
  • Ние, исто така, ќе ја поделиме задачата за избор на договори со доцнење од 0 до 10 на две подзадачи:
    • Ајде да ги избереме сите договори и, користејќи врски, да се обидеме да ги најдеме нивните одложувања;
    • користејќи го условот, ќе избереме само договори со одложувањата што ни се потребни;
  • Ајде да поставиме врски помеѓу договорите и дополнителните информации. Ајде да одиме во табулаторот Врски и да додадеме нова врска;
  • На терен Табела 1изберете табела Договори на договорни страни(ова ќе биде левата табела);
  • Бидејќи ни требаат сите договори, ќе ги искористиме Лева врска.Ајде да ставиме знаменце во колоната Сите, која припаѓа на левата табела;
  • На терен табела 2изберете табела Дополнителни информации(ова ќе биде вистинската табела);
  • Бидејќи упатувањето на договорот е зачувано во димензијата Предметрегистар на информации Дополнителни информации,во состојба на поврзување избираме:
    • На левата страна на теренот Договори на договорни страни.врска;
    • Да го оставиме стандардниот оператор за споредба "=";
    • На десната страна од теренот: Дополнителни информации.Објект.

Додадовме врска со која ќе ги избереме сите дополнителни. информации за секој договор. Но бидејќи ни треба само уште едно дополнително. мешање - Одложување, треба да додадеме уште една врска. Во овој случај Одложувањее дополнителен имот. Дополнителни својства се од типот План на типови карактеристики Дополнителни детали и информации.Во регистарот Дополнителни информациидополнителна вредност својствата се чуваат во димензија Имотот. Така, треба да додадеме врска што ги ограничува дополнителните информации само на својството Deferral.

  • Ајде да додадеме нова врска;
  • На терен Табела 1изберете табела Договори на договорни страни;
  • Важно е да знаете дека ако имате повеќе врски на ист пар табели, тогаш мора да го користите истиот тип на спојување за нив. Во нашиот случај, ова е Лева врска.Затоа, да ставиме знаменце во колоната Сите, што се однесува на левата табела;
  • На терен табела 2изберете табела Дополнителни информации;
  • Во условот за релација нема да треба да го користиме левото поле од табелата, наместо тоа ќе наметнеме услов на димензијата Имотот, изедначувајќи го со дополнителни. имот Одложување, кој ќе биде предаден на барањето користејќи го параметарот;
  • Ајде да го поставиме знамето бесплатново значење Вистинаи рачно напишете го следниот текст за услов: „Дополнителни информации. Својство = &PropertyDelay“;

  • Поставувањето на врската е завршено;

Сега останува само да се наметне услов за висината на одложувањето. Бидејќи го користиме интервалот од 0 до 10, ќе биде неопходно да се користи операторот за споредба Between. Бидејќи нултата повратна линија не е зачувана во дополнителни информации, кога ќе се поврзете во овој случај, сите полиња на регистарот ќе ја вратат вредноста НУЛА. Со цел да се замени вредноста во состојба НУЛАдо 0, ќе ја користиме функцијата јазик за пребарување ISNULL(<Выражение1>, <Выражение2>) . Функцијата се враќа Израз 1, ако не е еднаков НУЛАИ Израз 2во спротивно.

  • Ајде да одиме на јазичето Условипобарајте дизајнер и додадете нова состојба;
  • Ајде да поставиме знаме во него бесплатнои одете во уредникот за слободно изразување;
  • Во делот функции на јазикот за пребарување ќе ја прошириме гранката Функции -> Други функции;
  • Ајде да повлечеме функција во делот за изрази ISNULL;
  • По добиената конструкција, ќе го внесеме операторот за споредба Between и ќе го поставиме интервалот: 0 и 10;
  • Кликнете ОК, состојбата е подготвена;

Последното нешто што треба да направите е да ја прикажете вредноста на одложувањето во полињата за барање. Со цел наместо тоа НУЛАбеше прикажана вредноста 0, ние исто така го користиме уредникот за слободни изрази и функцијата ISNULL.

  • Ајде да одиме на јазичето Табели и полињаи додадете ново поле;
  • Во уредникот за слободни изрази што се отвора, изберете ја функцијата ISNULL;
  • Наместо израз 1, внесете го полето AdditionalInformation.Value, а наместо изразот 2, внесете 0;
  • Кликнете ОК, полето е подготвено;

Како резултат на тоа, ќе добиеме барање со следниов текст:

Барање = Ново барање; Query.SetParameter ("PropertyDelay", PropertyProperty); Request.SetParameter ("Сметка", Сметка); Query.Text = "ИЗБЕРЕТЕ | Договори со друга страна. Линк, | ISNULL(Дополнителни информации. Вредност, 0) AS Field1 | FROM | Директориум. Договори со другата страна AS договори за друга страна | ЛЕВО ПРИКЛУЧУВАЈТЕ Информации Регистрирај се. Дополнителни информации | AS Дополнителни информации | ON Договори контрапарти Врска = Дополнителни информации. Објект | И (Дополнителни информации. Сопственост = &PropertyDelay) | КАДЕ |Договори со друга страна. Сопственик = &Договорна страна | И ISNULL(Дополнителни информации.Вредност, 0) ПОМЕЃУ 0 И 10";

Исто така, прочитајте ги написите за јазикот за пребарување 1C 8.

Кога сакаме да видиме податоци од повеќе табели истовремено, т.е. да се соберат неколку табели во една, се појавува концептот на поврзување на табели и односи меѓу нив. Постојат четири типа на врски:

  • лево;
  • право,
  • внатрешен;
  • заврши.

Ќе го разгледаме секој тип користејќи апстрактен пример. Има 2 табели, во првата складираме описни информации за ставката, во втората за нејзините салда:

За да добиеме едно од овие табели, треба експлицитно да наведеме кои полиња ќе ги поврземе, по која состојба и тип. Сега ќе стане појасно.

Лева врска

Користејќи лево спојување, му кажуваме на системот дека како резултат на тоа сакаме да ги видиме сите записи од левата табела и записите од десната кои го задоволуваат условот за поврзување. Да претпоставиме дека ги поврзуваме табелите со полето за производ со еднаков услов, тогаш ќе добиеме табела како:

Барање.Текст =
„ИЗБЕРИ
| Номенклатура.Производ,
| Номенклатура.Боја КАКО Номенклатура на боја,
| Останува.Боја КАКО БојаОстанува,
| Биланси.Количина
|ОД

";

Немаше совпаѓања за столот од табелата со остатоци, така што полињата беа пополнети со NULL вредности, кои мора да се обработат од функцијата ISNULL, видете 1C 8 Функции на јазикот на барањето.

Левиот спој работи приближно како јамка во јамка - го зема првиот запис од левата табела и поминува низ сите записи од десната табела за да се осигура дека условот за поврзување е задоволен. Потоа се зема вториот запис од левата табела итн. Ако одеднаш неколку записи од десната табела го задоволуваат условот за поврзување, тогаш во добиената табела ќе се додадат неколку редови (според бројот на успешни врски).Како што можеме да видиме, добиената табела не е информативна, податоците не се одразуваат вистинската суштина, па затоа е подобро да ги поврзете овие табели со две полиња: Производ и Боја, само што овој пат ќе се справиме со NULL:

Барање.Текст =
„ИЗБЕРИ
| Номенклатура.Производ,
| Номенклатура.Боја,
| ISNULL(Remaining.Quantity, 0) AS Количина
|ОД
| Номенклатура AS Номенклатура
| LEFT JOIN Остатоци КАКО Остатоци
| Софтверска номенклатура.Производ = Преостанат.Производ

Правилно поврзување

Десната врска во суштина не се разликува од левата. Ако ги замените табелите, десниот спој ќе се претвори во лев спој; згора на тоа, кога се користи конструкторот, самиот систем ги конвертира сите десни спојувања во леви спојувања.

Внатрешно спојување

Користејќи внатрешен спој, му кажуваме на системот дека како резултат на тоа сакаме да ги видиме само оние записи што ги задоволуваат условите за поврзување и од десната и од левата табела. Така, бројот на добиените записи ќе биде помал или еднаков на бројот на записи од најкратката табела што учествува во спојувањето. Ајде да примениме внатрешно спојување на полињата Производ и Боја на нашите табели:

Барање.Текст =
„ИЗБЕРИ
| Номенклатура.Производ,
| Номенклатура.Боја,
| Остатоци.Количина КАКО Количина
|ОД
| Номенклатура AS Номенклатура
| ВНАТРЕШЕН ПРИКЛУЧЕН Остатоци КАКО Остатоци
| Софтверска номенклатура.Производ = Преостанат.Производ
| И Nomenclature.Color = Remaining.Color";

Целосна врска

Целосното спојување ќе резултира со сите записи од двете табели, оние записи што го задоволуваат условот за поврзување ќе се поврзат, оние записи што не го задоволуваат условот за поврзување сепак ќе завршат во резултатот од барањето, но со некои NULL полиња. Целосно е како левата и десната врска во едно.

Може да има многу проблеми на оваа тема, ајде да се обидеме да решиме еден од нив. Нашата организација е дилер на 2 фабрики за мебел: „Зарија“ и „Расвет“. Асортиманот со трошоците за секоја од фабриките се чува во различни табели. Неопходно е да се создаде единствен ценовник и да се вклучат производи по минимална цена:

Ајде да примениме целосно придружување со избор од сите полиња, ќе се поврземе по производ:

Барање.Текст =
„ИЗБЕРИ
| НоменклатураZarya.Производ AS ProductZarya,
| НоменклатураЗарија.Цена КАКО ЦенаЗарија,
| Номенклатура Rassvet Производ AS Product Rassvet,
| НоменклатураRassvet.Цена AS PriceRassvet
|ОД

Ова не е токму она што ни треба, ајде да го комбинираме полето на производот во едно и да обработиме NULL:

Барање.Текст =
„ИЗБЕРИ
//конструкцијата ISNULL беше дискутирана во делот за функции на јазикот за пребарување
//ако цената не е дефинирана, тогаш иницијализирајте ја
//зошто 1000000 види објаснување подолу
| ISNULL(номенклатураЗарија.Цена, 1000000) AS PriceZarya,
| ISNULL (номенклатураRassvet. Цена, 1000000) AS PriceRassvet
|ОД
| НоменклатураZarya AS НоменклатураZarya
| Целосна врска НоменклатураЗора КАКО номенклатураЗора
| Software NomenclatureZarya.Product = NomenclatureDawn.Product";

Останува само да се избере минималната цена. Конечниот текст на барањето ќе изгледа вака:

Барање.Текст =
„ИЗБЕРИ
| ISNULL(NomenclatureZarya.Product, NomenclatureDawn.Product) AS производ,
| ИЗБОР
| КОГА ИМА ISNULL (номенклатураZarya. Цена, 1000000) > ISNULL(номенклатураRassvet. Цена, 1000000)
| ТОГАШ ISNULL (номенклатураRassvet. Цена, 1000000)
| ELSE ISNULL (номенклатураЗарија. Цена, 1000000)
| КРАЈ КАКО ЦЕНА
|ОД
| НоменклатураZarya AS НоменклатураZarya
| Целосна врска НоменклатураЗора КАКО номенклатураЗора
| Software NomenclatureZarya.Product = NomenclatureDawn.Product";

Ако цената не е дефинирана (NULL), тогаш мора да се иницијализира со некоја вредност, инаку операцијата за споредба за повеќе/помалку ќе пропадне со грешка. Цената ја иницијализираме со нереално голема сума за да „изгуби“ во операцијата за споредба, бидејќи според условите на проблемот ја избираме најниската цена.

← Функции на јазикот за пребарување 1C 8 | Се придружува во 1C 8 прашања →

Споделете со пријателите или заштедете за себе:

Се вчитува...