Да вляза
Всички компютърни тайни за начинаещи и професионалисти
  • Промяна на цвета на текста и фона
  • Създаване на ваша собствена презентация Как да промените фона в OpenOffice презентация
  • Как да премахнете горни и долни колонтитули в Excel Вмъкнете горен и долен колонтитул в Excel
  • Как да задавате, променяте, мащабирате размери в AutoCAD?
  • FTP услуга - прехвърляне на файлове
  • Използване на слоеве в AutoCAD Създаване на нов слой в AutoCAD
  • Три стълба на работа с COM обекти. Работата през COM връзка е по-лесна, отколкото си мислите. V8: COM връзка Връзка през com 1s 8.3

    Три стълба на работа с COM обекти.  Работата през COM връзка е по-лесна, отколкото си мислите.  V8: COM връзка Връзка през com 1s 8.3

    Ключови думи: COM, свързване, външно, OLE, автоматизация, свързване, ComConnector, Srvr

    Когато използвате 1C:Enterprise 8.0 COM връзки за достъп до данни, има следните предимства в сравнение с използването на сървър за автоматизация:

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

    2. По-бърз достъп до свойствата и методите на обектите на 1C:Enterprise, тъй като организирането на достъп не изисква междупроцесна комуникация;
    3. По-малко потребление на ресурси на операционната система.

    По принцип работата с 1C:Enterprise 8.0 чрез COM връзка е подобна на работата с 1C:Enterprise в режим на автоматизация на сървъра. Основните разлики са следните:

    1. В случай на сървър за автоматизация се стартира пълноценно приложение 1C:Enterprise 8.0, а в случай на COM връзка се стартира сравнително малък COM сървър в процеса.

    2. При работа чрез COM връзка не е налична функционалност, по един или друг начин свързана с организацията на потребителския интерфейс на 1C:Enterprise 8.0;
    3. При работа с COM връзка не се използва приложният модул за конфигуриране на 1C:Enterprise 8.0. Неговата роля при работа с COM връзка се играе от модула за външна връзка.

    1.1 Процедура за установяване на COM връзка

    За да организирате достъпа до данните на 1C:Enterprise 8.0 чрез COM връзка, се извършва следната последователност от действия:

    1. създава се COM обект с идентификатор V8.COMConnector, с помощта на който се осъществява връзката;

    2. извиква се методът Connect на предварително създадения обект V8.COMConnector. Методът Connect връща връзка към обект за COM връзка с информационната база 1C:Enterprise 8.0;
    3. Чрез получения обект за COM връзка се осъществява достъп до валидните методи, свойства и обекти на информационната база, с която се осъществява връзката.

    важно!Поради липсата на потребителски интерфейс в COM връзка, не всички обекти, свойства и методи могат да се използват в COM връзка.

    1C:Enterprise обекти, достъпни външно чрез COM връзка:

    1. Експортирани променливи и процедури/функции на външния модул за свързване

    2. Експортирани променливи и процедури/функции на общи модули
    3. Включване и изключване на цели модули чрез задаване на свойства на общи модули

    4. Включване и изключване на фрагменти от общи модули с помощта на препроцесор
    5. Глобален контекст 1C:Enterprise 8.0, с изключение на обекти, тясно свързани с клиентското приложение (TextDocument, TabularDocument, ...)

    1.2 Модул за външна връзка

    Както вече беше отбелязано, отговорностите на приложния модул при работа чрез COM връзка се изпълняват от модула за външна връзка. Този модул може да има процедури за манипулиране на събития When SystemStarts() и WhenSystemCompletes(), които могат да съдържат действия, извършвани съответно при инициализация и прекратяване на връзката.

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

    1.3 Общи модули

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

    1.4 Обект "V8.COMConnector"

    Единствената задача, решавана от COM обекта V8.COMConnector, е установяването на COM връзка с информационната база 1C:Enterprise 8.0. Могат да се установят неограничен брой връзки с помощта на един екземпляр на обекта V8.COMConnector. Обектът V8.COMConnector има един метод Connect, предназначен да установи COM връзка с информационната база 1C:Enterprise 8.0.

    <СтрокаСоединенияИБ>

    Линията на връзка със системата за сигурност на информацията е верига от фрагменти във формата Параметър=Стойност. Фрагментите са разделени един от друг с ";". Ако дадена стойност съдържа интервал, тя трябва да бъде затворена в двойни кавички (").

    Общи параметри:

    Usr - потребителско име;
    Pwd - парола.

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

    Файл - директория на информационната база.

    За опцията клиент-сървър са дефинирани следните параметри:

    Srvr - Име на сървъра на 1C:Enterprise;
    Ref - име на информационната база на сървъра.

    Методът Connect установява COM връзка към информационната база 1C:Enterprise 8.0 и връща връзка към обекта за COM връзка.

    // Създава се обект на конектор
    V8 = Нов COMObject("V8.COMConnector");
    // създава се обект за COM връзка
    Връзка = V8.Connect("File=""c:\InfoBases\Trade""; Usr=""Директор"";")

    1.5 Обект за COM връзка

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

    В допълнение, COM връзката има допълнителен метод NewObject, който може да се използва за създаване на стойности от определени типове.

    tk = Връзка. Нов обект ("Таблица със стойности");

    String метод Позволява ви да получите низови представяния на стойностите на 1C:Enterprise.

    Изглед = Connection.String(Data.UniqueIdentifier());

    1.6. Характеристики на работа с COM връзка

    В Automation и в COM връзка TRUE и FALSE имат следните стойности: -1 (минус едно) и 0.

    Възможно е да се организира пул от COM връзки. В същото време няколко обекта за COM връзка се създават ПРЕДВАРИТЕЛНО на приемащия сървър 1C:Enterprise и отнема още по-малко време за установяване на връзка, тъй като не е необходимо да се създава нов обект.

    Въведен е нов обект Query Builder, предназначен да генерира текстове на заявки въз основа на посочените настройки. Този обект поддържа функционалност за създаване на отчети, която не е свързана с извеждане на отчета в документ с електронна таблица или други задачи, свързани с потребителския интерфейс. Този обект може да се използва на сървъра на 1C:Enterprise и в COM връзка.

    Можете да използвате COM обекти, когато изпълнявате вградения език на сървъра на 1C:Enterprise.

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

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

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

    Свързваме се чрез COM към базата данни 1C

    За реализиране на COM връзка в 1C се използва специален механизъм, наречен COMConnector. Този обект се инсталира заедно с платформата и се използва за свързване на информационни бази. Трябва да се отбележи, че за версии 8.2 и 8.3 се използват обекти с различни имена - съответно “V82.COMConnector” и “V83.COMConnector”.

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

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

    1. Какъв тип е - файл или клиент-сървър;
    2. Къде се намира;
    3. Какво име и парола можете да използвате, за да влезете?
    4. Какви данни ви интересуват?

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

    Параметри на връзкатаFileIB = "File=""Path_to_database""; Usr=""User_name"";Pwd=""Password"""; Параметри на връзкатаClientServerIB = "Srvr=""Име_на_сървър""; Ref=""Име_на_база_данни""; Usr=""Име_на_потребител"; Pwd=""Парола""";

    Функцията за свързване е проста и не трябва да предизвиква въпроси, ако всички параметри са посочени правилно. За да ускорите отстраняването на грешки и анализа на възможните грешки, по-добре е да поставите връзката в конструкцията „Опитай“. Функцията ще върне стойност от типа “COM object”, с която ще работите за получаване на необходимите данни.

    &OnServer функция ConnectToBase() exportConnectionIB Параметри = "File=""E:\1c база данни\ERP""; Usr=""Administrator"";Pwd=""1"""; V83COMCon=Нов COMObject("V83.COMConnector"); Опит за връщане V83COMCon.Connect(IB Connection Parameters); Доклад за изключение (Описание на грешка ()); Връщане Недефинирано; EndAttempt; EndFunction

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

    Получаваме данни от базата данни 1C

    След като получите желания обект, трябва да прочетете данни от друга база данни. За да направим това, използваме заявка чрез COM връзка в 1C 8.3, използвайки получената стойност на типа „COM обект“ от функцията. Важно е първо да се свържете с базата данни и след това да изпълните заявката. Изпълнението се осъществява чрез метода NewObject, като се посочва типа на обекта в низова форма като параметър - „Заявка“.

    &OnServer процедура TestCOMOnServer() Connection = ConnectToBase(); If TypeValue(Connection) Type("Undefined") Then RequestBPZO = Connection.NewObject("Request"); RequestBPZO.Text = "ИЗБЕРЕТЕ първите 15 | DirectoryUser.Name AS Име |FROM | Directory.users AS DirectoryUser"; Изберете = RequestBPZO.Execute().select(); Докато Selection.next() цикъл Report(Selection.Number); EndCycle; endIf; Край на процедурата >

    Например, за да получим информация за потребителите на определен отдел, ще зададем условие в заявката чрез параметри. Единият параметър ще бъде от прост тип - низ, а разделянето ще бъде връзка към директория елемент "Структура на предприятието". Резултатът от заявката е таблица с изброените полета от типа, че съществуват в базата данни, към която е възникнала COM връзката. Ако трябва да ги конвертирате в други типове, използвайте стандартните функции на платформата:

    • линия();
    • Число();
    • Дата на().
    RequestBPZO = Connection.NewObject("Заявка"); RequestBPZO.Text = "ИЗБЕРЕТЕ първите 15 | DirectoryUser.Name AS Име | FROM | Directory.Users AS DirectoryUser I WHERE | DirectoryUser.Department = &RequiredDepartment | И DirectoryUser.Name като ""%"" + &RequiredName+ ""%""" ; Заявка BPZO.SetParameter("Необходим отдел", Връзка. Директории. Структура на предприятието. Намиране по код("00-000023")); RequestBPZO.SetParameter("RequiredName","Ekaterina"); Изберете = RequestBPZO.Execute().select(); Докато Selection.next() цикъл Report(Selection.Name); EndCycle;

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

    RequestBPZO = Connection.NewObject.("Заявка"); RequestBPZO.Text = "ИЗБЕРЕТЕ първите 15 | DirectoryUser.Name AS Име | FROM | Directory.Users AS DirectoryUser I WHERE | DirectoryUser.Department B (&NecessaryDepartment) | И DirectoryUser.Name като ""%"" + &NecessaryName+ ""%" " "; Масив от отдели = Connection.NewObject("Масив"); Масив от отдели.Add(Connection.Directories.Enterprise Structure.Find By Code("00-000023")); Масив от отдели.Add(Connection.Directories.Enterprise Structure.Find By Code("00-000038")); Масив от отдели.Add(Connection.Directories.Enterprise Structure.Find By Code("00-000046")); Заявка BPZO.SetParameter("Необходим отдел", масив от отдели); RequestBPZO.SetParameter("RequiredName","Ekaterina"); Изберете = RequestBPZO.Execute().select(); Докато Selection.next() цикъл Report(Selection.Name); EndCycle;

    При прехвърляне на документи или елементи от директория винаги възниква въпросът за контролиране на прехвърлянето на конкретен обект. С помощта на COM връзки такива проблеми могат да бъдат решени чрез уникален идентификатор. Трябва да намерите обект в базата данни на добавките по идентификатор от текущата информационна сигурност, като използвате функцията „GetLink“, като използвате идентификатора като низ. Ако такъв не бъде намерен, можете да го създадете чрез COM връзка.

    StrIdent = String(Directories.Users.FindByCode("00-0000313").UniqueIdentifier()); Ако НЕ е ValueFilled(Connection.Directories.Users.GetLink(Connection.NewObject("UniqueIdentifier", StrIdent))) тогава NewUser = Connection.Directories.Users.CreateItem(); NewUser.Name = Directories.Users.FindByCode("00-0000313").Име; NewUser.Individual = Directories.Users.FindByCode("00-0000313").Individual; NewUser.Write(); endIf;

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

    Съединение..; VariableFunction = Връзка..; извикване на функция>общо име на модул>извикване на процедура>общо име на модул>

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

    Печат (Ctrl+P)

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

    com връзка

    Можете да създадете два типа COM обекти за приложението 1C. Това са стари връзки V83.Приложение и com връзки V83.COMConnector . В случай на V83.ПриложениеСтартира се почти пълноценно копие на приложението 1C. В случай на използване V83.COMConnectorСтартира се малка сървърна част. Скоростта на работа в този случай е по-висока, но някои функции може да не са налични. По-специално, работа с формуляри и общи модули, за които не е зададено свойството да работят с външни връзки. Най-вече трябва да използвате V83.COMConnectorи то само при липса на функционалност V83.Приложение. Разликата в скоростта на работа може да бъде особено забележима при бази данни с голям обем. За използвана платформа 8.2 V82.Application или V82.COMConnector

    Установете OLE връзка

    Връзка = Нов COMObject(“V83.Application” ) ;

    Установете COM връзка

    Връзка = Нов COMObject(“V83.COMConnector” ) ;

    Низ за свързване

    //За опцията клиент-сървър
    Низ за свързване= “Srvr = ““Име на сървър” “;Ref = “ “Базово име” ;
    //За опция за файлов режим:
    Низ за свързване= “Файл = ““PathKBase” “; Usr = потребителско име; Pwd = парола”;
    опит
    Връзка = Връзка . Свържете се(Свързващ низ) ;
    Изключение
    Съобщение = Ново съобщение до потребител;
    Съобщение . Текст = „Неуспешно свързване с базата данни“ + DescriptionErrors(); Съобщение . Докладвам();
    EndAttempt ;

    Прекъсване на връзката

    Връзка = Недефинирана;
    За обект V83.ПриложениеНеобходимо е да прекратите връзката, в противен случай ще остане незавършена сесия, която след това ще трябва да бъде изтрита ръчно. В случай на V83.COMConnectorвръзката се прекъсва автоматично, когато приключи процедурата, в която е направена връзката.И има още един малък момент. За потребителя, под който се осъществява връзката, квадратчето „Искане на потвърждение при затваряне на програмата“ трябва да бъде деактивирано в настройките му.

    Метод NewObject().

    За да създадете нов обект, можете да използвате метода NewObject(), например:

    За V83.COMConnector

    ЗаявкаCOM = Връзка. Нов обект( "Искане") ;
    TableCOM = Връзка. Нов обект( „Таблица със стойности“) ;
    ArrayCOM = Връзка. NewObject(“Масив”);

    ViewCOM = Connection.NewObject

    За V83.Приложение

    ЗаявкаOLE = Връзка. Нов обект(“ Заявка ") ;
    TableOLE = Връзка. Нов обект(„Таблица със стойности“) ;
    ArrayOLE = Connection.NewObject("Масив");
    ViewCOM = Connection.NewObject(“UniqueIdentifier”, StringUID);

    ЗаявкаCOM . Текст ="ИЗБИРАМ
    | Позиции на организации. Код,
    | Позиции на организации. Име
    | ОТ | Справочник. Позиции на организациите
    КАК ДА ПОЗИЦИИ НА ОРГАНИЗАЦИИ”;

    Резултат = ЗаявкаCOM. Изпълнение();
    проба = Резултат. Избирам () ;
    Чао Избор. Следващия()Цикъл
    Краен цикъл;
    Можете също да използвате мениджъри на конфигурационни обекти:
    DirectoryCOM = Връзка. Справочници. име на директория;
    ДокументCOM = Връзка. Документация. Име на документ;
    RegisterCOM = Връзка. Информационни регистри. RegisterName ;

    Получаване и сравняване на изброяване чрез COM връзка

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

    Enum Item = Connection.Directories.Directory1.FindByCode(1).Props1;

    PossibleValues​ = Enum Element.Metadata().Enum Values;

    EnumerationElementNumber = PossibleValues.Index(PossibleValues.Find(Connection.XMLString(EnumerationElement)));

    Ако EnumerationItemNumber = 0, тогава Report( „Enumer value1“);

    ElseIfEnumerationItemNumber = 1 ТогаваДоклад("EnumerationValue2");

    endIf;

    Извличане на обект чрез COM по идентификатор

    Чрез мениджърите на конфигурационни обекти получаваме com обект, например:
    ДокументCOM = Връзка. Документация. Име на документ;

    След това получаваме уникален идентификаторен низ:

    StringUID =Connection.string ( DocumentCOM.UniqueIdentifier())

    Идентификатор = Нов U уникален идентификатор (StringUID);
    СЪС linkByIdentifier = Документи[Име на документ].GetLink(Идентификатор);

    Ако трябва да намерите com обект по документ по идентификатор, тогава трябва да напишете така:

    WidCOM = Connection.NewObject(“UniqueIdentifier”, StringUID);
    LinkByIdentifier = Connection.Documents[DocumentName].GetLink(WidCOM);

    Една от възможностите за обмен на данни между бази данни 1C е обменът чрез COM връзка.

    С помощта на COM връзка можете да се свържете от една 1C база данни към друга и да четете или записвате данни. Този метод може да се използва както в клиент-сървър версии на бази данни, така и във файлови бази данни. В тази статия ще разгледаме примери за този тип връзка. Примерите използват платформа 8.2.

    Можете да създадете два типа COM обекти за приложението 1C. Това V82.ПриложениеИ V82.COMConnector. В случай на V82.ПриложениеСтартира се почти пълноценно копие на приложението 1C. в случай на използване V82.COMConnectorСтартира се малка сървърна част.
    Скоростта на работа в този случай е по-висока, но някои функции може да не са налични. По-специално, работа с формуляри и общи модули, за които не е зададено свойството да работят с външни връзки. Най-вече трябва да използвате V82.COMConnectorи то само при липса на функционалност V82.Приложение. Разликата в скоростта на работа може да бъде особено забележима при бази данни с голям обем.

    Така че да започваме

    1. Нека създадем COM обект
      • За V82.ПриложениеВръзка = Нов COMObject("V82.Application" ) ;
      • За V82.COMConnectorВръзка = Нов COMObject("V82.COMConnector" ) ;
    2. Нека създадем низ за свързване
      • за сървърната версия на базата данни ConnectionString = "Srvr = " "ServerName" ";Ref = " "BaseName" ;
      • за файловата версия на базата данни ConnectionString = "File = " "PathKBase" "; Usr = потребителско име; Pwd = парола";
    3. Свързване към базата данниОпит за свързване = Връзка. Connect(ConnectionString) ; Съобщение за изключение = New MessageToUser; Съобщение. Text = + ErrorDescription() ; Съобщение. Докладвам() ; EndAttempt ;
    4. Прекъсване на връзката с базата данниВръзка = Недефинирана;

      За обект V82.ПриложениеНеобходимо е да прекратите връзката, в противен случай ще остане незавършена сесия, която след това ще трябва да бъде изтрита ръчно. В случай на V82.COMConnectorвръзката се прекъсва автоматично, когато приключи процедурата, в която е направена връзката.И има още един малък момент.

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

    Сега нека съберем целия код

    Връзка = Нов COMObject("V82.Application" ) ; //Връзка = Нов COMObject("V82.COMConnector"); ConnectionString = "Srvr = " "Server1C" "; Ref = " "MyBase" "; Usr = Petya; Pwd = 123" ; //ConnectionString = "Файл = ""С:\MyBase""; Usr = Петя; Pwd = 123";Опит за свързване = Връзка. Connect(ConnectionString) ; Съобщение за изключение = New MessageToUser; Съобщение. Текст = „Не може да се свърже с базата данни“+ DescriptionError() ; Съобщение. Докладвам() ; EndAttempt ; Връзка = Недефинирана;

    За тип връзка V82.Приложениеметодът се използва за COM обекта, който е създаден първоначално, и за V82.COMConnectorметодът се прилага към връзката. След това заявката се обработва с помощта на стандартни 1C инструменти. в кода изглежда така:

    Заявка = Връзка. NewObject("Заявка"); // За V82.COMConnector Заявка = Връзка. NewObject("Заявка"); // За V82.Приложение Заявка. Текст = „ИЗБЕРЕТЕ | Позиции на организации. Код, | Позиции на организации. Име| ОТ | Справочник. Позиции на организации AS Позиции на организации"; Резултат = Искане. Изпълнение(); Проба = Резултат. Избирам() ; Чао Избор. Next() Loop EndLoop ;

    За версия 1C:Enterprise 8.3 всичко остава непроменено с изключение на това, че когато създавате COM обекти, трябва да използвате "V83.COMConnector"или "V83. Приложение".

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

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

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

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

    Лява връзка

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

    Заявка.Текст =
    "ИЗБИРАМ
    | Номенклатура. Продукт,
    | Номенклатура. Цвят КАТО Цветна номенклатура,
    | Remains.Color AS ColorRemains,
    | Салда.Количество
    | ОТ

    ";

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

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

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

    Правилна връзка

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

    Вътрешно присъединяване

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

    Заявка.Текст =
    "ИЗБИРАМ
    | Номенклатура. Продукт,
    | Номенклатура. Цвят,
    | Остатъци. Количество КАТО количество
    | ОТ
    | Номенклатура КАТО Номенклатура
    | INNER JOIN Остатъци КАТО остатъци
    | Софтуерна номенклатура.Продукт = Оставащ.Продукт
    | И Nomenclature.Color = Remaining.Color";

    Пълна връзка

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

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

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

    Заявка.Текст =
    "ИЗБИРАМ
    | НоменклатураЗаря.Продукт AS ПродуктЗаря,
    | НоменклатураЗаря.Цена AS ПрайсЗаря,
    | Номенклатура Rassvet Продукт AS Продукт Rassvet,
    | НоменклатураРассвет.Цена AS ЦенаРассвет
    | ОТ

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

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

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

    Заявка.Текст =
    "ИЗБИРАМ
    | ISNULL(NomenclatureZarya.Product, NomenclatureDawn.Product) AS продукт,
    | ИЗБОР
    | КОГАТО ИМА NULL(НоменклатураЗаря.Цена, 1000000) > ISNULL(НоменклатураРазсвет.Цена, 1000000)
    | THEN ISNULL(НоменклатураРазсвет.Цена, 1000000)
    | ELSE ISNULL(НоменклатураЗаря.Цена, 1000000)
    | КРАЙ КАТО ЦЕНА
    | ОТ
    | НоменклатураЗаря AS НоменклатураЗаря
    | ПЪЛНА ВРЪЗКА NomenclatureDawn КАТО NomenclatureDawn
    | Софтуерна номенклатураЗаря.Продукт = НоменклатураЗора.Продукт";

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

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