1s 8 останаха присъединяване в заявка. Лява и дясна връзка

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

Влезте като студент

Влезте като ученик, за да получите достъп до училищното съдържание

1C 8.3 език за заявки за начинаещи програмисти: връзки

Присъединява се към заявките

Свързването е една от най-важните и необходими операции, извършвани от системите за управление на релационни бази данни.

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

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

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

Указател цветове:

И водач Асоциации:

Нашата задача е да изведем любимите асоциации на клиентите въз основа на цвета.

Така за Наташа тревата ще бъде любимата й асоциация, тъй като любимият й цвят е зелен. А за Петър - слънцето. Четете пробна версия на урока, намират се пълни уроци.

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

Ще решим проблема постепенно.

Първо попитайте всички клиенти и техните любими цветове:

Тогава запитайте всички асоциации и техните цветове:

Ако се опитаме да изпълним тази заявка, ще получим грешка:

Причината за грешката е, че полето имеприсъства и в двете таблици наведнъж ( КлиентиИ Асоциации) и системата просто не знае полето, от което се има предвид конкретната таблица.

За разрешаване на подобни неясноти при избор от повече от една таблица е обичайно да се посочи пълни имена на полета.Пълното име на полето включва пълното име на таблицата (напр. Справочник.Клиенти) и името на самото поле (напр. име).

По този начин пълното име на полето имеот масата Клиентище Указател.Клиенти.Описание.

И пълното име на полето имеот масата Асоциациище Указател.Асоциации.Име.

Кръстосана връзка

Нека пренапишем предишната заявка с пълни имена на полета:

Току що направихме кръстосана връзкадве маси. Обърнете внимание на това как се формира резултатът:

Вътрешно съединение

Очевидно резултатът от кръстосано свързване на две таблици не е решение на нашия проблем. Не са ни нужни всички записи от кръстосаното присъединяване, а само тези с полета Любим цвятИ Цвятимат същото значение:

За да получите тези записи, добавете раздел към предишната заявка КЪДЕТО:

Това е, което ви трябва - ние сме решили задачата!

В последната заявка използвахме кръстосано свързване с допълнително условие (в раздела КЪДЕТО). Четете пробна версия на урока, намират се пълни уроци. Такава връзка се нарича вътрешна.

Има и друг начин да напишете същото вътрешна връзка:

Сравнете тази и предишната заявка. Те са абсолютно еднакви от гледна точка на платформата, просто имат различен синтаксис. И тази, и предишните заявки съдържат вътрешно присъединяване на таблицата Клиентис маса Асоциациипо полета Любим цвятИ Цвятсъответно.

Ляво присъединяване

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

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

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

Такава връзка се нарича ляво присъединяване.

Рляв резултат за присъединяванее всичко записи от вътрешно присъединяванеПЛЮС всичко записи от първата таблица, не е уловена във вътрешността

Право присъединяване

Но нека се върнем отново към вътрешното присъединяване:

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

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

Такава връзка се нарича правилна връзка.

Резултат от правилното присъединяванесе състои от: ПЛЮС всички записи от втората таблица, не е уловена във вътрешносттавръзка (за която не е намерена двойка).

Пълна връзка

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

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

Пълен резултат от връзкатапредставлява: всички записи от вътрешното присъединяванеПЛЮС всички записи от първата таблица, които не попаднаха във вътрешнатавръзка (за която не е намерена двойка) PLUS всички записи от втората таблица, които не попаднаха във вътрешнатавръзка (за която не е намерена двойка).

Псевдоними на таблицата

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

За да съкратите пълния правопис на името на таблицата (напр. Справочник.Клиенти) приемливо е (както за самите полета) да се използват псевдоними .

Нека пренапишем последната заявка, така че при генериране на пълни имена на полета, вместо Справочник.Клиентиможете да използвате псевдоним ДА СЕ, но вместо това Справочник.Асоциации- псевдоним НО:

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

Обработка NULL

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

Какви са стойностите на полето АсоциацияИ Нейният цвятза първия ред? Ами нивите КлиентИ Неговият цвятза последния ред?

Те са равни НУЛА,което, както вече знаем, означава липса на каквато и да е стойност:

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

Ето защо обработката на стойности се счита за задължителна НУЛА когато могат да възникнат.

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

В случая за нивите КлиентИ Асоциацияв случай на откриване НУЛАние ще заменим празния низ "".

И ето нивите Неговият цвятИ Нейният цвятса препратки към референтни елементи Цветове, така че само стойности, които са препратки към посочените типове, могат да бъдат заместени в тях. Всеки референтен тип (напр. Directory или Document) има предварително дефиниран елемент Празна връзка. За да посочим стойността му в заявката, използваме функцията ЗНАЧЕНИЕ.

За да се определи какво има в полето НУЛАще използваме функцията, която вече ни е позната от предишни уроци ISNULL:

SELECT ISNULL( K. Име, "" ) КАТО клиент, ISNULL( K. FavoriteColor, VALUE(Reference. Colors. EmptyReference) ) КАТО Негов цвят, ISNULL( A. Name, "" ) КАТО асоциация, ISNULL( A. Цвят, VALUE (Справка. Цветове. EmptyReference) ) КАТО ItsColor FROM Reference. Клиенти КАК ДА ПОПЪЛНЯМ Ръководство за свързване. АСОЦИАЦИИ КАТО ОТ К. Любим цвят = А. Цвят

На външен вид (от конзолата за заявки) резултатът не се е променил. Все още виждаме празни полета. Но това е само защото низовите представяния НУЛАи празните полета от всички типове са еднакви и равни на празния низ.

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

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

Съединяване на повече от две маси

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

Да предположим, че трябва да решим следния проблем. Четете пробна версия на урока, намират се пълни уроци. Изведете всички възможни варианти на клиенти и техните любими асоциации и любимите им продукти въз основа на любимия им цвят.

За да направите това, ние последователно свързваме таблицата по цвят Клиентис маса Асоциации, а след това (резултантният резултат) с таблица Храна:

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

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

1. Връзките са свикнали да

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

Нека ви напомня, че може да има няколко типа връзки в езика за заявки 1C8, а именно: ЛЯВО ПРИСЪЕДИНЯВАНЕ, ДЯСНО ПРИСЪЕДИНЯВАНЕ, ВЪТРЕШНО ПРИСЪЕДИНЕНИЕ, ПЪЛНА ВРЪЗКА. Нека разгледаме всеки един от тях подробно.

  • ЛЯВО ПРИСЪЕДИНЯВАНЕ

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

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

    ИЗБЕРЕТЕ "001" КАТО код на артикула, "ябълки" като име КОМБИНИРАНЕ НА ВСИЧКИ ИЗБЕРЕТЕ "002", "портокали" КОМБИНИРАНЕ НА ВСИЧКИ SELECT "003", "мандарини"

    Има и таблица "Държави" като тази:

    Код на продукта Страната
    001 Русия
    002 Турция
    003 Мароко

    Ние също го конструираме със заявка:

    ИЗБЕРЕТЕ "001" КАТО Код на артикула, "Русия" КАТО Държава КОМБИНИРАНЕ НА ВСИЧКИ ИЗБЕРЕТЕ "002", "Турция" КОМБИНИРАНЕ НА ВСИЧКИ ИЗБЕРЕТЕ "003", "Мароко"

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

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

    ИЗБЕРЕТЕ "001" КАТО Код на артикула, "Ябълки" КАТО Име PUT BT_Item КОМБИНИРАНЕ НА ВСИЧКИ SELECT "002", "Портокали" КОМБИНИРАНЕ НА ВСИЧКИ SELECT "003", "Мандарина" ; ////////////////////////////////////////////////// / ////////////////////////////// ИЗБЕРЕТЕ "001" КАТО Код на артикула, "Русия" КАТО Държава ПОЛОЖЕТЕ BT_Държава КОМБИНИРАНЕ НА ВСИЧКИ ИЗБЕРЕТЕ "002 " , "Турция" КОМБИНИРАНЕ НА ВСИЧКИ ИЗБИРАНЕ "003", "Мароко" ; ////////////////////////////////////////////////// / //////////////////////////////// ИЗБЕРЕТЕ BT_Software Country BT_Product.ProductCode = VT_Country.ProductCode

    Можете да копирате този код в конзолата за заявки и да го стартирате, за да получите следния резултат:

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

    Да кажем, че за нашия продукт имаме повече цени. И те могат да се променят в зависимост от датата:

    Код на продукта дата на Цена
    001 01.01.2016 120
    001 01.02.2016 150
    002 01.01.2016 200
    004 01.01.2016 350

    Тук виждаме, че за продукта с код 001 (Ябълки) имаме 2 записа в таблицата с цените. Мандарините няма цена. И освен това в цените има код на продукта 004, който не е в таблицата с продуктите. Нека извършим ляво присъединяване за продукти и цени с условие за връзка в полето с код и да видим какво получаваме.

    ИЗБЕРЕТЕ "001" КАТО Код на артикула, "Ябълки" КАТО Име PUT BT_Item КОМБИНИРАНЕ НА ВСИЧКИ SELECT "002", "Портокали" КОМБИНИРАНЕ НА ВСИЧКИ SELECT "003", "Мандарина" ; ////////////////////////////////////////////////// / /////////////////////////////// ИЗБЕРЕТЕ "001" AS Код на артикула, "01.01.2016" AS Дата, 120 AS Цена PUT BT_Price КОМБИНИРАНЕ ВСИЧКИ ИЗБОР "001", "02/01/2016", 150 КОМБИНИРАНЕ ВСИЧКИ ИЗБОР "002", "01/01/2016", 200 КОМБИНИРАНЕ ВСИЧКИ ИЗБОР "004", "01/01/2016", 350 ; ////////////////////////////////////////////////// / ////////////////////////////// ИЗБЕРЕТЕ BT_Item.ItemCode, BT_Item.Name, BT_Price.Price, BT_Price.Date ОТ BT_Item AS BT_Item LEFT JOIN BT_Price AS BT_Price ON BT_Product.ProductCode = VT_Price.ProductCode

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

    Нека анализираме резултата. Всички записи бяха избрани от таблицата "Продукти", т.к Тя е нашата основна. За мандарините цената е NULL, защото запис с код 003 не е в таблицата с цените. И записът с код 004 от таблицата с цените (а ние го имаме спомагателен) беше игнориран, т.к. няма съвпадение за него в продуктовата таблица. И както виждаме, имаме 2 записа с ябълки, въпреки факта, че има само един запис с код 001 в продуктовата таблица. Тук се крие част от коварството на масата.

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

  • ДЯСНО ПРИСЪЕДИНЯВАНЕ

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

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

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

    НАЛЯВО ПРИСЪЕДИНЕТЕ BT_Price AS BT_Price

    INNER JOIN BT_Price AS BT_Price

    тогава завършваме с:

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

  • ПЪЛНА ВРЪЗКА

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

    ПЪЛНА ВРЪЗКА BT_Price AS BT_Price

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

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

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

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

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

Ще разгледаме всеки тип на абстрактен пример. Има 2 таблици, в първата съхраняваме описателна информация за номенклатурата, във втората за нейните останки:

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

Ляво присъединяване

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

Заявка.Текст =
„ИЗБЕРЕТЕ
| Номенклатура. Продукт,
| Номенклатура. Цвят AS Цветна номенклатура,
| Цвят AS Цветни остатъци,
| Останки Количество
| ОТ

";

За стола нямаше съвпадения от таблицата с остатъци, така че полетата бяха попълнени с NULL стойности, които трябва да бъдат обработени от функцията ISNULL, вижте Функции на езика за заявки 1C 8.

Лявото присъединяване работи като цикъл в цикъл - взема първия запис от лявата таблица и преминава през всички записи от дясната таблица, за да удовлетвори условието за връзка. След това се взема вторият запис от лявата таблица и т.н. Ако изведнъж няколко записа от дясната таблица удовлетворят условието за връзка, тогава към получената таблица ще бъдат добавени няколко реда (според броя на успешните връзки). Както можете да видите, получената таблица не е информативна, данните не отразяват истинската същност, така че е по-добре да свържете тези таблици с две полета: Продукт и Цвят, само че този път ще обработим NULL:

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

Право присъединяване

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

Вътрешно съединение

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

Заявка.Текст =
„ИЗБЕРЕТЕ
| Номенклатура. Продукт,
| Номенклатура. Цвят,
| Остава.Количество AS Количество
| ОТ
| Номенклатура AS Номенклатура
| ВЪТРЕШНО СОЕДИНЕНИЕ Остатъци КАТО остатъци
| Номенклатура на софтуера.Продукт = Остава.Продукт
| И Номенклатура.Цвят = Остава.Цвят";

Пълна връзка

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

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

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

Заявка.Текст =
„ИЗБЕРЕТЕ
| Номенклатура Заря Артикул AS Артикул Заря,
| НоменклатураЗаря.Цена AS PriceZarya,
| Номенклатура Dawn. Елемент AS Item Dawn,
| НоменклатураDawn.Price AS PriceDawn
| ОТ

Това не е точно това, от което се нуждаем, нека комбинираме продуктовото поле в едно и обработим NULL:

Заявка.Текст =
„ИЗБЕРЕТЕ
//конструкция ISNULL беше обсъдена в раздела за функция на езика на заявките
//ако цената не е дефинирана, тогава я инициализирайте
//защо 1000000 вижте обясненията по-долу
| ISNULL(НоменклатураZarya.Price, 1000000) AS PriceZarya,
| ISNULL(NomenclatureDawn.Price, 1000000) AS PriceDawn
| ОТ
| НоменклатураЗаря AS НоменклатураЗаря
| ПЪЛНА ВРЪЗКА NomenclatureDawn КАТО НоменклатураDawn
| ON NomenclatureDawn.Product = NomenclatureDawn.Product";

Остава само да изберете минималната цена. Окончателното тяло на заявката ще изглежда така:

Заявка.Текст =
„ИЗБЕРЕТЕ
| ISNULL(NomenclatureDawn.Item, NomenclatureDawn.Item) КАТО артикул,
| ИЗБОР
| WHEN ISNULL(NomenclatureDawn.Price, 1000000) > ISNULL(NomenclatureDawn.Price, 1000000)
| THEN ISNULL(НоменклатураЗора.Цена, 1000000)
| ELSE NULL(НоменклатураЗаря.Цена, 1000000)
| КРАЙ КАТО ЦЕНА
| ОТ
| НоменклатураЗаря AS НоменклатураЗаря
| ПЪЛНА ВРЪЗКА NomenclatureDawn КАТО НоменклатураDawn
| ON NomenclatureDawn.Product = NomenclatureDawn.Product";

Ако цената не е дефинирана (NULL), тогава тя трябва да бъде инициализирана с някаква стойност, в противен случай операцията за сравнение за повече/по-малко ще се провали с грешка. ние инициализираме цената с нереално голяма сума, така че тя да "загуби" в операцията за сравнение, тъй като според условието на задачата избираме най-ниската цена.

← Езикови функции за заявки 1C 8 | Присъединява се към заявки 1C 8 →

Това води до някои трудности. Например, когато се опитвате да прекратите „висяща“ сесия от следния формуляр:

Правенето на това чрез „COM връзка със сървърния агент“ няма да работи и операцията ще се провали.

За да създадете ръчно COM връзка за 32-битова версия на платформата 1C, работеща на 64-битова версия на операционната система, трябва да изпълните следните стъпки.

1. Необходимо е да регистрирате 32-битова библиотека в системата comcntr.dll. За да направите това, отворете командния ред cmd.exe на сървъра като администратор и изпълнете следните команди:

C:\Users\Administrator>cd C:\Program Files (x86)\1cv8\8.3.6.2390\bin C:\Program Files (x86)\1cv8\8.3.6.2390\bin>regsvr32 comcntr.dll

В прозореца, който се показва със съобщение за успешната регистрация на библиотеката, щракнете върху "OK":

папка кошчетрябва да търсите по пътя, където имате инсталирана текущата версия на платформата 1C. Към момента на писане на статията - нейният номер 8.3.6.2390 .

2. Стартирайте конзолата “Component Services”: Старт -> Административни инструменти -> Компонентни услуги. Разгънете клона „Услуги за компоненти“. Извикваме менюто, като щракнете с десния бутон върху клона „COM + Applications“ и изберете New -> Application:

3. Ще видите прозореца за добре дошли на „Помощника за инсталиране на COM + приложение“, в който трябва да щракнете върху „Напред“:

4. В следващия прозорец кликнете върху „Създаване на ново приложение“:

5. Въведете желаното име за новото приложение. Примерът използва V83_ComConnector, маркирайте метода на активиране като „Приложение на сървъра“ и щракнете върху следващото:

6. В следващия прозорец изберете акаунта, който агентът на 1C сървъра използва при стартиране. В примера това е акаунтът на локалния администратор на сървъра. Въведете двойка вход/парола и щракнете върху "Напред":

7.

8. В следващата стъпка трябва да добавите (ако има смисъл) потребителя, от чието име стартира 1C сървърния агент и съответно чийто акаунт ще се използва за проверка на работата на нашето ново COM + приложение. В прозореца на този пример е посочен само администраторът на домейна, от името на който е стартиран „Съветникът за инсталиране на COM + приложение“, щракнете върху бутона „Добавяне“:

9. В следващия прозорец въведете името на акаунта, под който работи агентът на 1C сървъра, и щракнете върху „OK“:

10. Връщайки се към "Съветникът ...", уверете се, че акаунтът, който търсите, е добавен и щракнете върху "Напред":

11. Затворете „Съветника за инсталиране на COM+ приложения“, като щракнете върху „Край“:

12. Връщаме се към прозореца на конзолата на Component Services. Уверете се, че е създадено COM+ приложение с вашето име (в примера V83_ComConnector):

13. Разширете дървото на създаденото приложение и, като щракнете с десния бутон върху клона „Компоненти“, създайте нов компонент Създаване -> Компонент:

14. Ще видите прозореца за добре дошли на „Съветника за инсталиране на COM + компоненти“, в който трябва да щракнете върху „Напред“:

15. В следващия прозорец кликнете върху „Инсталиране на нови компоненти“:

16. Използвайте прозореца на Explorer, за да изберете библиотеката comcntr.dll, разположен по пътя C:\Program Files (x86)\1cv8\8.3.6.2390\bin , който регистрирахме в системата в първата стъпка. Уверете се, че пътят към тази библиотека съвпада с версията на вашата платформа. В примера това е 8.3.6.2390 . И щракнете върху "Отвори":

17. В следващия прозорец „Съветници...“ щракнете върху „Напред“:

18. Затворете "COM+ Components Installer", като щракнете върху "Finish":

19. Ще се върнете в прозореца на конзолата на компонентни услуги. Проверете дали е създаден нов компонент в нашето COM+ приложение:

20. Извикайте свойствата му:

21. И в раздела „Сигурност“, в полето „Роли, зададени изрично за избрани обекти:“, проверете с мишката CreatorOwnerи щракнете върху "OK":

22. Връщайки се към конзолата на Component Services, затворете я и рестартирайте сървъра.

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

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

Самият синтаксис е много подобен на класическия T-SQL, с изключение на това, че в 1C, използвайки езика на заявките, можете да получите данни само с помощта на конструкцията Select. Езикът поддържа и по-сложни конструкции, като (заявка в заявка). Заявките в 1C 8 могат да се правят както на кирилица, така и на латиница.

В статията ще се опитам да говоря за основните ключови думи в езика за заявки 1C:

  • изберете
  • разрешено
  • различни
  • експресно
  • първо
  • за смяна
  • смисъл
  • тип стойност (и REF оператор)
  • избор
  • Групирай по
  • като има
  • ISNULL
  • Има NULL
  • връзки - десни, ляво, вътрешни, пълни.

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

За отстраняване на грешки в заявки в системата 1C 8.2 е предоставен специален инструмент - конзолата за заявки. Можете да видите описанието и да го изтеглите на линка -.

Помислете за най-важните и интересни оператори на езика за заявки 1C.

ИЗБЕРЕТЕ

В езика за заявки 1C Enterprise 8 всяка заявка започва с ключовата дума ИЗБЕРЕТЕ. Няма конструкции UPDATE, DELETE, CREATE TABLE, INSERT на езика 1C, тези манипулации се извършват с помощта на обектната техника. Целта му е само да чете данни.

Например:

ИЗБЕРЕТЕ
CurrentCatalog.Name
ОТ
Справка.Номенклатура AS CurrentReference

Заявката ще върне таблица с имена на елементи.

до конструкцията ИЗБЕРЕТЕключови думи могат да бъдат намерени ЗА СМЯНА, ПОЗВОЛЕН, РАЗЛИЧНИ, ПЪРВО

ПОЗВОЛЕН- избира само записи от таблицата, за които текущият потребител има права.

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

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

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

CurrentCatalog.Name,

КОГА CurrentCatalog.Service ТОГАВА

"Обслужване"

END КАТО Вид Номенклатура

Справка.Номенклатура AS CurrentReference

Примерът ще върне текстова стойност в полето "Тип номенклатура" - "Продукт" или "Услуга".

КЪДЕТО

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

ИЗБЕРЕТЕ
Directory.Name
ОТ
CurrentDirectory.Номенклатура AS CurrentDirectory
WHERE CurrentDirectory.Service = TRUE

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

"КЪДЕ услуга"

По същество избираме редове, чийто израз след ключовата дума е равен на "Вярно".

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

КЪДЕ Код = "005215"

Използвайки оператора "VALUE ()" в условията, използвайте препратката към предварително дефинирани елементи и изброявания в заявката 1C:

WHERE Тип на елемент = Стойност (Изброяване. Типове елементи. Елемент)

Стойностите за време могат да бъдат посочени, както следва:

КЪДЕ Входяща дата > DATETIME(2012,01,01):

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

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

WHERE ItemGroup= &ItemGroup

Условието може да бъде наложено на типа атрибут, ако е от съставен тип:

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

WHERE Регистър за натрупване. Регистратор B (&Списък с документи за избор)

Състоянието може да бъде сложно, състоящо се от няколко условия:

КЪДЕ DateIncoming > DATETIME(2012,01,01) И ItemGroup= &ItemGroup И НЕ Услуга

ГРУПИРАЙ ПО

1C 8.2 езикова конструкция на заявки, използвана за групиране на резултата.

Например:

ИЗБЕРЕТЕ
Получаване на стоки, услуги, стоки, стоки,
SUM(Входящи стоки, услуги, стоки. количество) AS Количество,
SUM(Входящи стоки, услуги, стоки. Сума) AS Сума
ОТ
Документ.Получаване на стокиУслуги.Стоки като получаване на стокиУслугиСтоки

ГРУПИРАЙ ПО
Получаване на Стоки, Услуги, Стоки.Стоки

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

Освен ключовата дума СУМмогат да се използват други агрегатни функции: НОМЕР, БРОЙ РАЗЛИЧНИ, МАКСИМАЛНО, МИНИМАЛ, СРЕДНОТО.

ИМАЩА

Конструкция, която често се забравя, но е много важна и полезна. Позволява ви да зададете избора под формата на агрегатна функция, това не може да се направи в конструкцията КЪДЕТО.

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

ИЗБЕРЕТЕ
Получаване на стоки, услуги, стоки, стоки,
SUM(Входящи стоки, услуги, стоки. количество) AS Количество,
SUM(Входящи стоки, услуги, стоки. Сума) AS Сума
ОТ
Документ.Получаване на стокиУслуги.Стоки като получаване на стокиУслугиСтоки

ГРУПИРАЙ ПО
Получаване на СтокиУслугиСтоки.стоки

SUM(Входящи стоки, услуги, стоки. количество) > 5

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

ЗНАЧЕНИЕ()

Например:

WHERE Bank = Стойност(Catalog.Banks.EmptyReference)

WHERE Тип номенклатура = Стойност(Директория.Типове номенклатура.Продукт)

WHERE Тип на елемент = Стойност (Изброяване. Типове артикули. Услуга)

TYPE в заявка

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

ЕКСПРЕС()

Операторът Express в 1C заявки се използва за преобразуване на типове данни.

Синтаксис: ЕКСПРЕС(<Выражение>КАК<Тип значения>)

С него можете да конвертирате стойности на низове в дати или референтни стойности в низови данни и т.н.

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

ИЗБЕРЕТЕ
ContactInformation.Object,
EXPRESS(ContactInformation.View AS STRING(150)) AS View
ОТ
Регистър на информацията Информация за контакт AS Информация за контакт

ГРУПИРАЙ ПО
EXPRESS(ContactInformation.Representation AS A STRING(150)),
ContactInformation.Object

ISNULL (ISNULL)

Доста полезна функция на езика за заявки 1C, която проверява стойността в записа и дали е равна на НУЛА,тя ви позволява да го замените със собствена стойност. Най-често се използва при получаване на виртуални таблици на баланси и обороти за скриване НУЛАи поставете ясна 0 (нула).

ISNULL(TaxesPrevMonth.FSS е приложено освобождаване, 0)

Такава функция на езика за заявки 1C IS NULL при липса на стойност ще върне нула, което ще избегне грешка.

ПРИСЪЕДИНЯВАНЕ

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

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

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

Пример за ляво присъединяване в заявка на 1C:

Той ще върне цялата таблица и ще попълни полето "Банка" само на онези места, където ще бъде изпълнено условието "Counterparties.Name = Banks.Name". Ако условието не е изпълнено, полето Банка ще бъде зададено на НУЛА.

ДЯСНО ПРИСЪЕДИНЕНИЕ в 1C 8.3абсолютно подобни ЛЯВО присъединяване, с изключение на една разлика: ДЯСНО ПРИСЪЕДИНЯВАНЕ"главната" маса е втората, а не първата.

ПЪЛНА ВРЪЗКА

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

Например:

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

НА

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

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

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

Например:

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

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

НА
Клиенти.Име = Банки.Име

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

Заключение

Това е само малка част от синтаксиса от езика за заявки 1C 8, в бъдеще ще се опитам да разгледам някои точки по-подробно, да покажа и много повече!