1c свържете се към съществуваща com връзка. Три стълба на работа с COM обекти

1c свържете се към съществуваща com връзка. Три стълба на работа с COM обекти

Една от възможностите за обмен на данни между бази данни 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. Приложение".


Ключови думи: 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(), които могат да съдържат действия, извършвани съответно при инициализация и прекратяване на връзката.

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

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 е установена в моята организация. Това, което ме подтикна да направя това, беше почти пълното отсъствие техническа информацияотносно тази тема. Четейки различни статии и доклади по темата за свързването на 1C с всяка информационна система, вие се убеждавате отново и отново, че всички те са от маркетингов, демонстрационен характер и никога технически, отразявайки проблема и същността на неговото решение.

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


Избрах Python като език, който ще бъде интегриран с 1C. Той е много подходящ за автоматизация на процеси. Това се улеснява от минимализма на синтаксиса (кодът се въвежда много бързо), богата стандартна библиотека (по-малко нужда от модули на трети страни), крос-платформа - с голяма вероятност кодът, написан в Linix OS, ще работи успешно на Windows .

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

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

Уви, с прехода към 1C безплатното приключи - вече не беше възможно да се свържете директно с базата данни. Като цяло самата платформа 1C е неделима и не се поддава добре на интеграция с други системи. Тя, както се казва, е нещо само по себе си. Когато зареждате данни в 1C, трябва да запомните, че извличането им от там няма да бъде толкова лесно. Но с оглед на факта, че организацията трябваше да внедри платежни системи и Лична зона, беше необходимо да се намери някакво решение.

Основните задачи, които стояха пред мен, бяха възможността за бързо получаване на данни за конкретен лична сметка- Пълно име, адрес, измервателни уреди, показания на измервателните уреди, плащания, такси. Плюс генериране на документи - протокол за съгласуване, разписка за плащане. Така че няма възможност за директна връзка с базата данни - всеки, който е гледал 1C база данни на SQL сървър, е видял, че е трудно да се разбере масата от таблици като aaa1, aaa2. И изграждането на заявки с такива имена на таблици и полета е просто нереалистично. В допълнение, много 1C таблици (особено най-важните, като част от най-новите баланси и обороти) са виртуални и разпръснати в различни физически таблици, събрани от множество съединения. Този метод не е подходящ.

Платформата 1C предоставя възможност за свързване към нея чрез COM връзка. Подобно на много програми на Windows, по време на инсталирането на 1C в системата се регистрират два COM обекта - Automation Server и COM Connector. И с двата обекта може да се работи с помощта на език, който поддържа COM технология.

Обектът Automation Server е 1C приложение, което почти не се различава от обикновеното клиентско приложение. Разликата е, че е възможно допълнително да се управлява програмно екземпляр на приложение. Когато работите с обект COM Connector, се стартира олекотена версия на приложението 1C, в която не са налични формуляри, както и функции и методи, свързани с интерфейса и визуалните ефекти. Самото приложение стартира в режим "Външна връзка". Инициализиране на глобални променливи (например дефиниране текущия потребители неговите настройки) трябва да се извърши в модула за външна връзка 1C. Ако в режим на външна връзка кодът извика функция, която не е налична в този режим, ще бъде хвърлено изключение (което ще бъде предадено на нашия Python скрипт). Извикванията на опасни функции трябва да бъдат рамкирани с конструкции на формата

#If NOT an OuterJoin Then Warning("Hello!"); #EndIf

Тъй като работата с COM обекти е изключително технология само за Windows, не е изненадващо, че тя не е включена в стандартната дистрибуция на Python. Ще трябва да инсталирате разширение - набор от модули, които предоставят цялата необходима функционалност за програмиране под Windows в Python. Може да бъде изтеглен като предварително изграден exe инсталатор. Самото разширение осигурява достъп до системния регистър, услуги, ODBC, COM обекти и др. Като алтернатива можете незабавно да инсталирате дистрибуцията ActiveState Python, която се предлага с разширение Win32 веднага.

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

COM връзката е бавна. Ниската производителност е добре известен недостатък на COM технологията.
- Процесът на установяване на връзка с 1C, в зависимост от конфигурацията, може да отнеме от 1 до 8 секунди (в моя случай - 6 секунди). Излишно е да казвам, че установяването на връзка за всяка заявка ще доведе до това, че зареждането на всяка страница отнема 8 секунди.
- Тъй като уеб приложенията в Python работят като независими сървъри, предишната точка може да бъде компенсирана чрез съхраняване на връзката в някаква глобална променлива и възстановяването й в случай на грешка. Честно казано, все още не съм мислил как да поддържам връзка в PHP.
- Загубена е междуплатформената функционалност на уеб приложението.

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

Стратегията на действие е следната: скриптът Python се свързва с 1C, изпълнява необходимите заявки и качва данните в базата данни SQLite. Можете да се свържете с тази база данни от Python, PHP, Java. Повечето от нашите проекти работят в Python и тъй като не мога да понасям ръчно писане на необработени SQL заявки, цялата работа с базата данни SQLite се извършва чрез SQLAlchemy ORM. Всичко, което се изискваше, беше да се опише структурата на данните на базата данни в декларативен стил:

От sqlalchemy.ext.declarative import declarative_base от sqlalchemy import Column, Integer, Numeric, DateTime, Unicode, Boolean, LargeBinary, ForeignKey Base = declarative_base() class Abonent(Base): __tablename__ = "abonents" id = Column(Integer, primary_key= True) акаунт = Колона(Unicode(32), индекс=True) код = Колона(Unicode(32)) адрес = Колона(Unicode(512)) fio = Колона(Unicode(256)) източник = Колона(Unicode(16) ) psu = Колона(Unicode(256)) tso = Колона(Unicode(256)) np = Колона(Unicode(256)) улица = Колона(Unicode(256)) къща = Колона(Цяло число) flat = Колона(Цяло число) mro = Колона(Unicode(256)) клас Плащане(База): __tablename__ = "плащания" # и така нататък...

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

Предвиждам въпроса ви - "защо SQLite"? Основната причина е, че базата данни е само за четене, така че проблемите с писането в SQLite не трябва да ни тревожат. Второ, форматът на тази СУБД е удобен - по-удобен е за преглед (има много безплатни комунални услуги, включително супер разширение за FireFox). Трето, в някои случаи беше необходимо да се получи достъп до абонати от машини, които нямат връзка с MySQL сървъра. В този случай е достатъчно да копирате файла с база данни SQLite и тази машина ще има достъп до цялата информация.

Разтоварването се извършва веднъж на ден през нощта. Въвеждането на данни в 1C може да се автоматизира по същия начин. Например, необходимо е да се записват показанията, оставени от абонатите на уебсайта на личния акаунт. В този случай отново се свързваме с 1C и програмно създаваме и публикуваме документа „Акт за показания“. Ще предоставя кода по-долу.

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

Импортиране на pythoncom import win32com.client V82_CONN_STRING = "Srvr=v8_server;Ref=v8_db;Usr=username;Pwd=megapass;" pythoncom.CoInitialize() V82 = win32com.client.Dispatch("V82.COMConnector").Свързване(V82_CONN_STRING)

Както се вижда от кода, клиентът е инициализиран за работа с 1C. COM обектът се дефинира с името „V82.COMConnector“. Моля, обърнете внимание, че това име е валидно за платформа V8.2, ако имате версия 8.1, тогава името ще бъде „V81.COMConnector“.

Извикваме метода Connect() на инициализирания клиент, като му предаваме низа за връзка. Низът се състои от името на сървъра, база данни, потребител и парола. Полученият V82 обект съхранява връзката към приложението 1C. Той няма метод Disconnect() или нещо подобно. За да прекъснете връзката с базата данни, просто изтрийте обекта от паметта с помощта на функцията del() или го присвоете на променливата None.

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

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

Set Con = CreateObject("v81.COMConnector") Set v8 =Con.Connect("Connection string") Set AccountsManager = v8.Documents.Accounts.... Set AccountsRecord= AccountsManager.CreateItem() AccountsRecord.Account = ... .... AccountsRecord.Write()

Тогава кодът на Python просто ще се срине със синтактична грешка. Какво да правя? Редактиране на конфигурацията? Не, достатъчно е да използвате методите getattr и setattr. Чрез предаване на COM обект и името на атрибута на кирилица към тези функции, можете да получите и зададете съответно стойности:

#coding=cp1251 catalog = getattr(V82.Catalogs, "PersonalAccounts")

Важно е следното: имената на детайлите, както и параметрите на функциите и методите трябва да се предават в кодиране cp1251. Следователно, за да избегнете предварително объркване с кодировките, има смисъл да го декларирате в началото на файла: #coding=cp1251. След това можете да предавате низове, без да се притеснявате за тяхното кодиране. Но! Всички низове, получени от 1C (резултати от извикващи функции, заявки), ще бъдат в UTF-8 кодиране.

Пример за код, който изпълнява заявка в среда 1C, обхожда резултата и записва базата данни в SQLite:

#coding=cp1251 q = """ ИЗБЕРЕТЕ Лични акаунти. Код AS код, Лични акаунти. Сграда. Сетълмент. Име + ", " + Лични акаунти. Кратък адрес AS адрес, Лични акаунти. Абонат. Име AS fio, Лични акаунти. Раздел Име AS psu, EXPRESS (Характеристики на част от личните акаунти на последния. Стойност AS Директория. Териториални мрежови организации). Име AS tso, Лични акаунти. Сграда. Населен пункт. Име AS np, Лични акаунти. Сграда. Улица. Име AS улица, Personal Accounts. Building. House AS house, Personal Accounts.MainPremises.PremisesNumber AS flat , PersonalAccounts.Division.Parent.Name AS mro FROM Directory.PersonalAccounts AS PersonalAccounts ЛЯВА ВРЪЗКА RegisterInformation.CharacteristicsPersonalAccounts.Slice of the Last(, TypeCharacteristics = VALUE(Directory.Types of Characteristics.Territorial Network Organization)) AS Characteristics kiPersonalAccountsSliceLast SoftwarePersonalAccounts.Link = CharacteristicsPersonalAccountsSliceLast.Object """ query = V82.NewObject("Query", q) selection = query.Execute().Choose() CONN = db.connect() CONN.query(models.Abonent).delete() while selection.Next(): abonent = models.Abonent() abonent.account = selection.code.strip() abonent.code = selection.code abonent.fio = selection.fio abonent.address = selection.address abonent.psu = selection.psu abonent.tso = selection. tso abonent.source = u"ASRN" abonent.np = selection.np abonent.street = selection.street abonent.house = selection.house abonent.flat = selection.flat abonent.mro = selection.mro CONN.add(abonent) CONN.commit()

Тук CONN е сесията за връзка с базата данни SQLite. Създава се обект на заявка и се попълва текстът му. Както беше отбелязано по-горе, текстът на заявката трябва да бъде в cp1251, за което първо се декларира кодирането. След изпълнение на заявката всички абонати се изтриват в базата данни, за да не се добавят дубликати, след което се добавят в цикъл и следва финалният комит.

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

Когато избирате полета, задайте им имена с латински букви; ще бъде много по-удобно да ги получите чрез селектор (точка), вместо getattr().
- Изберете само примитивни типове данни: низове, числа, дата и булев тип. Никога не избирайте връзки към обект (документ, справочник)! В този контекст вие абсолютно не се нуждаете от връзки и дори сте вредни, защото всяко извикване на връзка или метод ще доведе до заявка през COM връзка. Ако получите достъп до атрибутите на връзката в цикъл, това ще бъде изключително бавно.
- Ако изберете поле от тип Дата, то ще бъде върнато като обект на PyTime. Това е специален тип данни за предаване на дата-час в COM връзка. Не е толкова удобно да се работи, както с обичайната дата и час. Ако предадете този обект на int(), той ще върне клеймо за време, от което след това можете да получите дата и час с помощта на метода fromtimestamp().

Сега нека да разгледаме как се формират печатните документи. Факт е, че на потребителя трябва да се даде възможност да изтегли предварително подготвени документи, например разписка за плащане или отчет за съгласуване. Тези документи се генерират в 1C в съответствие с установените изисквания, внедряването им в Python ще отнеме много време. Затова е по-добре да генерирате документи в 1C и да ги запазвате Excel формат.

По този начин актът за съгласуване се генерира от специален външна обработка. За тези, които не са запознати с терминологията на 1C: обработката е самостоятелна програма, която има свой собствен модул, формуляри, шаблони, предназначени да работят в среда 1C. Необходимо е да инициализирате обработката, да попълните нейните данни и да извикате функция, която ще ни върне документ с електронна таблица, предназначен за преглед в 1C. Този документ трябва да бъде записан във формат Excel и копиран на сървъра или записан в базата данни.

Връзка = getattr(V82.Catalogs, "Системни отчети").FindByDescription("Доклад за съгласуване на Елън") nav_url = V82.GetURL(връзка, "Отчет") име = V82.ExternalReports.Connect(nav_url) ExternalReport = V82.ExternalReports. Create (name) setattr(ExternalReport, "PersonalAccount", reference) table_doc = ExternalReport.GetDoc() path = V82.GetTempFileName("xls") table_doc.Write(path, V82 .SpreadsheetDocumentFileType.XLS) report = models.Report() report .account = reference.Code.strip() report.type = u"act" report.document = open(path, "rb").read() CONN.add(report)

Горният фрагмент прави следното: Обработката, която генерира документа, е свързана. Обработката може да бъде вградена в конфигурацията, съхранявана на диск или в база данни 1C (в някаква директория). Тъй като обработката се променя често, за да не се актуализира конфигурацията всеки път, най-често променящата се обработка се съхранява в директорията „Системни отчети“, в атрибут „съхранение на стойност“, наречен Отчет. Обработката може да се инициализира, като се разтовари от базата данни на диска и се зареди или чрез метода GetURL(), към който трябва да подадете връзка към елемента на директорията и името на атрибута. Присвояваме стойностите на детайлите на получения обект за обработка, извикваме експортираната функция GetDoc() и получаваме документ с електронна таблица, който се записва във временен файл на Excel. Съдържанието на този файл се записва в базата данни SQlite.

Последното нещо, което остава да се обмисли, е програмното въвеждане на данни в 1C. Да приемем, че трябва да въведете свидетелства от абонати. За да направите това, достатъчно е да създадете и изпълните документа „Акт за вземане на показания“:

#coding=cp1251 acts = getattr(V82.Documents, "Act of Taking Testimony") act = acts.CreateDocument() setattr(act, "Testimony", 1024.23) setattr(act, "Subscriber", "Ivanov") # Попълване в други подробности... act.Write()
Въвеждането на данни вече е автоматизирано.

И така, очертах метод, който се основава на програмно качване и изтегляне на данни чрез COM връзка. Този метод работи успешно в моята организация от почти година. Базата данни, формирана от 1C, обслужва 3 платежни системи, интернет придобиване (плащане с карти през интернет), както и личен акаунт. В допълнение към базата данни са свързани различни скриптове за автоматизиране на рутината.

Въпреки недостатъците на метода (бавна скорост на COM връзка), като цяло той работи стабилно. Имаме данни в независима от платформата форма (SQLite), с която може да се работи от всеки език. И основната част от кода е написана на Python, което означава, че са налични много инструменти и техники, за които дори не можете да мечтаете в 1C.

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

Желая ви успех и не забравяйте, че 1C не е толкова страшен, колкото се представя!

) Това е вярно

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


Това е, което казвам, че би било хубаво да разберете колко имате нужда от него, без да четете статията за рейтинг, или да го оцените не толкова примитивно +/-. Колкото до това, което ми хареса, бих го коригирал по следния начин: спечели толкова много поради факта, че звездите се подредиха и много хора се събраха в сайта и много го харесаха, сами разбирате, че това е въпрос на случайност, защото веднага след като статията напусне начална страницатогава вече може да се намери само по заявка и така всеки минаващ гласува. И, доколкото разбирам, постоянните коментари = популяризиране на статията ви позволяват да я поддържате на главната страница.
Точно затова те поставят магазини на обществени улици - в крайна сметка това, което често е важно не е качеството и уместността на стоките, а проходимостта на мястото; хората, които се разхождат, често купуват нещо, което ще изхвърлят на следващия ден, просто в името на процеса. Това е отдавна позната на всички болест – пристрастяването към пазаруването. Или просто увеличаването на потока увеличава вероятността за правилния купувач.

И плюсовете и минусите... - това е просто един вид "благодаря" за отделеното време и труд


Тези. Минусът също ли се брои за „благодаря“? Исках да знам вашето мнение дали трябва да се използва в такива случаи и колко интересно е мнението на другите? Когато статията е вредна/лоша или просто безполезна/празна за теб да я сложиш?
Според мен статията изглежда като обикновено повишаване на рейтинга, защото:
1. Проблемът с типовете, който цитирах, беше напълно игнориран от автора, въпреки че не го мързеше да напише куп коментари.
2. В статията има очевидна неточност: твърди се, че това е единственият начин

V82 = Нов COMObject("V82.ComConnector"); Код = AccountCOM.Code;


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

Доклад(База. Директории. Контрагенти. Търсене по име("LLC"). Код);


и всичко е наред! И избирам връзката V82.ComConnector
Някак странно е, че на автора изобщо не му пука, че статията му съдържа посочените проблеми, но не реагира по никакъв начин.
3. Но все още има проблем, когато се появи грешката „Класът не съществува“.
4. Но има проблем, когато се инсталира 8.2, а след това 8.1 - опитайте да обмените през OLE/COM със стандартен UT-BP обмен!
5. Бихте ли посочили основната обработка на сайта, която позволява универсално свързване през OLE/COM, така че начинаещите да не губят време, вие пишете за тях! Между другото, по някаква причина нейната снимка е на вашия дисплей, защо? И в резултат 2 думи по същество и още 6 зад кадър.

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

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