COM объектуудтай ажиллах гурван тулгуур. COM холболтоор ажиллах нь таны бодож байгаагаас хамаагүй хялбар юм

) Яг зөв

Үүний зэрэгцээ 10 оноо ч хүрээгүй хэвлэлүүд зүгээр л "хөөрөхийг" би нэг бус удаа харсан.
Яагаад ийм зүйл болсон бэ? Хэн нэгэн тэдэнд таалагдсан нь илт байсан бололтой.


Үнэлгээний нийтлэлийг уншалгүйгээр танд хэр их хэрэгтэй байгааг ойлгох эсвэл +/- гэж тийм ч энгийн бусаар үнэлэх нь сайхан байх болно гэж би хэлж байна. Миний таалагдсан зүйлийн тухайд гэвэл би үүнийг ингэж засч залруулах болно: одод зэрэгцэж, олон хүмүүс сайтад цугларсан, олон хүмүүс таалагдсан тул энэ нь маш их ашиг авчирсан тул та өөрөө үүнийг санамсаргүй хэрэг гэж ойлгож байгаа. Нийтлэл үндсэн хуудаснаас гарсан даруйд зөвхөн хүсэлтээр л олдох боломжтой тул санал хураалтаар дамжуулж буй хүн бүр санал өгдөг. Миний ойлгож байгаагаар байнгын сэтгэгдэл = нийтлэлийг сурталчлах нь үүнийг үндсэн хуудсан дээр хадгалах боломжийг танд олгоно.
Чухам ийм учраас тэд олон нийтийн гудамжинд дэлгүүр байрлуулдаг - эцсийн эцэст гол зүйл бол барааны чанар, ач холбогдол биш, харин алхаж буй хүмүүс маргааш нь хаях зүйлээ худалдаж авдаг үйл явцын төлөө. Энэ бол хүн бүрт эртнээс мэдэгдэж байсан өвчин юм - худалдааны донтолт. Эсвэл зүгээр л урсгалыг нэмэгдүүлэх нь зөв худалдан авагчийн магадлалыг нэмэгдүүлдэг.

Мөн давуу болон сул талууд ... - энэ бол зүгээр л зарцуулсан цаг хугацаа, хөдөлмөрт "баярлалаа" юм


Тэдгээр. Хасах нь бас "баярлалаа" гэж тооцогддог уу? Ийм тохиолдолд хэрэглэх ёстой юу, бусад хүмүүс хэр сонирхолтой гэж боддог талаар таны бодлыг мэдэхийг хүссэн юм? Өгүүллэг таны хувьд хор хөнөөлтэй/муу эсвэл зүгээр л хэрэггүй/хоосон үед нь тавих ёстой юу?
Миний бодлоор нийтлэл нь энгийн үнэлгээний өсөлт шиг харагдаж байна, учир нь:
1. Миний иш татсан төрлүүдийн асуудлыг зохиогч огт тоосонгүй, хэдийгээр олон сэтгэгдэл бичихээс залхуураагүй.
2. Өгүүлэлд илт алдаатай байна: энэ нь цорын ганц арга зам гэж хэлсэн

V82 = Шинэ COMObject("V82.ComConnector"); Код = AccountCOM.Code;


гэхдээ би ийм боловсруулалтыг ашиглан үүнийг хялбархан хийж чадна:

Тайлан(Үндсэн. Лавлах. Эсрэг талууд. Нэрээр нь олох("ХХК"). Код);


мөн бүх зүйл сайхан байна! Тэгээд би V82.ComConnector холболтыг сонгоно
Зохиогч нийтлэлдээ дурдсан асуудлуудыг агуулсан байхыг огтхон ч тоохгүй байгаа нь хачирхалтай боловч тэрээр ямар ч хариу үйлдэл үзүүлэхгүй байна.
3. Гэхдээ "Анги байхгүй" гэсэн алдаа гарч ирэхэд асуудал гарсаар байна
4. Гэхдээ 8.2 суулгаад дараа нь 8.1 суулгасан үед асуудал гардаг - OLE/COM-оор дамжуулан стандарт UT-BP солилцоогоор солилцож үзээрэй!
5. Эхлэгчдэд цаг алдахгүйн тулд OLE/COM-ээр дамжуулан бүх нийтээр холбогдох боломжийг олгодог сайт дээрх үндсэн боловсруулалтыг зааж өгнө үү, та тэдэнд зориулж бичээрэй! Дашрамд хэлэхэд яагаад ч юм түүний зураг таны дэлгэц дээр байгаа, яагаад? Үүний үр дүнд гавьяаны талаар 2 үг, хөшигний ард 6 үг бий.

Ерөнхийдөө би шавар хаядаггүй, гэхдээ тодорхой цоорхойг зааж өгдөг, гэхдээ тэг хариу үйлдэл үзүүлдэг. Хэрэв энэ нь таны хуваалцаж буй туршлага юм бол энэ нь ямар нэгэн байдлаар алдаатай, бүрэн бус байна.
Миний хэлэх зүйл бол зохиолч бүх алдаагаа цуглуулах хүсэлтэй байсан бол тэр ядаж бусад хүмүүсийн туршлагыг сонсож, тайлбарыг нь авахгүй байх болно. Үүнийг уншсан хүн зохиогчоос илүү ихийг мэддэг, түүнд (заримдаа буруу) хэлж, тэр ч бас эсэргүүцдэг нөхцөл байдал нэн даруй үүсдэг. Үүний үр дүнд бүх мэдээлэл нийтлэлд биш, харин тайлбарт байна! Хөгжилтэй! Энэ нь ихэвчлэн тохиолддог, гэхдээ та хамгийн сайн сайхныг хүсч байгаа гэдэгт анхаарлаа төвлөрүүлэх шаардлагагүй - би хамгийн сайн сайхныг харуулдаг, бусад нь үүнийг харуулдаг! Үүнийг нийтлэлд оруулаарай, хүн бүр энэ мөргөлдөөнийг унших сонирхолгүй байх болно.

1С мэдээллийн сангийн хооронд өгөгдөл солилцох нэг сонголт бол COM холболтоор дамжуулан солилцох явдал юм.

COM холболтыг ашигласнаар та нэг 1С мэдээллийн сангаас нөгөөд холбогдож, өгөгдөл уншиж, бичиж болно. Энэ аргыг өгөгдлийн сангийн клиент-сервер хувилбарууд болон файлын мэдээллийн санд хоёуланд нь ашиглаж болно. Энэ нийтлэлд бид ийм төрлийн холболтын жишээг авч үзэх болно. Жишээ нь платформ 8.2-г ашигладаг.

Та 1С програмын хувьд хоёр төрлийн COM объект үүсгэж болно. Энэ V82. ХэрэглээТэгээд V82.COM Холбогч. Тохиолдолд V82. Хэрэглээ 1С програмын бараг бүрэн хуулбарыг эхлүүлэв. ашиглах тохиолдолд V82.COM ХолбогчЖижиг серверийн хэсэг ажиллаж байна.
Энэ тохиолдолд үйл ажиллагааны хурд илүү өндөр боловч зарим функц ажиллахгүй байж магадгүй юм. Ялангуяа гадаад холболттой ажиллах шинж чанарыг тохируулаагүй маягт, нийтлэг модулиудтай ажиллах. Ихэнхдээ та ашиглах хэрэгтэй V82.COM Холбогчзөвхөн функциональ дутагдалтай тохиолдолд л V82. Хэрэглээ. Үйлдлийн хурдны ялгаа нь ялангуяа их хэмжээний мэдээллийн санд мэдэгдэхүйц байх болно.

Ингээд эхэлцгээе

  1. COM объект үүсгэцгээе
    • Учир нь V82. ХэрэглээХолболт = Шинэ COMObject("V82.Application" );
    • Учир нь V82.COM ХолбогчХолболт = Шинэ COMObject("V82.COMConnector" );
  2. Холболтын мөр үүсгэцгээе
    • өгөгдлийн сангийн сервер хувилбарын хувьд ConnectionString = "Srvr = " "ServerName" ";Ref = " "BaseName" ;
    • өгөгдлийн сангийн файл хувилбарын хувьд ConnectionString = "File = " "PathKBase" "; Usr = хэрэглэгчийн нэр; Pwd = нууц үг";
  3. Өгөгдлийн санд холбогдож байнаХолболтыг оролдох = Холболт. Холбох(ConnectionString); Exception Message = New MessageToUser; Захиа. Текст = + ErrorDescription() ; Захиа. Мэдээлэх() ; EndAttempt;
  4. Өгөгдлийн сангаас салгаж байнаХолболт = Тодорхойгүй;

    Объектийн хувьд V82. ХэрэглээХолболтыг зогсоох шаардлагатай, эс тэгвээс бүрэн бус сесс хэвээр үлдэх бөгөөд дараа нь гараар устгах шаардлагатай болно. Тохиолдолд V82.COM Холбогчхолболт хийгдсэн процедур дууссаны дараа холболт автоматаар тасардаг. Бас нэг жижиг цэг бий.

    Холболт хийж байгаа хэрэглэгчийн хувьд тохиргоон дотроос "Програмыг хаахдаа баталгаажуулах хүсэлт гаргах" нүдийг идэвхгүй болгох ёстой.

Одоо бүх кодыг нэгтгэж үзье

Холболт = Шинэ COMObject("V82.Application" ); //Холболт = Шинэ COMObject("V82.COMConnector"); ConnectionString = "Srvr = " "Server1C" ";Ref = " "MyBase" "; Usr = Петя; Pwd = 123" ; //ConnectionString = "Файл = ""С:\MyBase""; Usr = Петя; Pwd = 123";Холболтыг оролдох = Холболт. Холбох(ConnectionString); Exception Message = New MessageToUser; Захиа. Текст = "Мэдээллийн санд холбогдож чадсангүй"+ DescriptionError() ; Захиа. Мэдээлэх() ; EndAttempt; Холболт = Тодорхойгүй;

Холболтын төрлийн хувьд V82. ХэрэглээЭнэ аргыг анх үүсгэсэн COM объектод ашигладаг V82.COM Холбогчаргыг холболтод хэрэглэнэ. Дараа нь хүсэлтийг стандарт 1С хэрэгслийг ашиглан боловсруулдаг. кодонд энэ нь иймэрхүү харагдаж байна:

Хүсэлт = Холболт. NewObject("Хүсэлт"); // Учир нь V82.COM Холбогч Хүсэлт = Холболт. NewObject("Хүсэлт"); // Учир нь V82. Хэрэглээ Хүсэлт. Текст = "СОНГОХ | Байгууллагын албан тушаал, дүрэм. | Байгууллагын албан тушаал.Нэр|FROM | Байгууллагын албан тушаалын лавлах "Байгууллагын албан тушаал".; Үр дүн = Хүсэлт. Run(); Жишээ = Үр дүн. Choose();

Баяртай сонголт. Next() Loop EndLoop ; 1C: Enterprise 8.3 хувилбарын хувьд COM объект үүсгэхдээ ашиглах ёстойгоос бусад бүх зүйл өөрчлөгдөөгүй хэвээр байна."V83.COMConnector" эсвэл.

"V83. Хэрэглээ"

Хэвлэх (Ctrl+P)

1С мэдээллийн сангийн хооронд өгөгдөл солилцох нэг сонголт бол COM холболтоор дамжуулан солилцох явдал юм. COM холболтыг ашигласнаар та нэг 1С мэдээллийн сангаас нөгөөд холбогдож, өгөгдөл уншиж, бичиж болно. Энэ аргыг өгөгдлийн сангийн клиент-сервер хувилбарууд болон файлын мэдээллийн санд хоёуланд нь ашиглаж болно. Энэ нийтлэлд 8.3 платформ дээрх эдгээр төрлийн холболтуудыг авч үзэх болно

com холболт Та 1С програмын хувьд хоёр төрлийн COM объект үүсгэж болно. Эдгээр нь ole холболтууд юм болон com холболтууд V83.COM Холбогч . Тохиолдолд Та 1С програмын хувьд хоёр төрлийн COM объект үүсгэж болно. Эдгээр нь ole холболтууд юм 1С програмын бараг бүрэн хуулбарыг эхлүүлэв. Хэрэглэсэн тохиолдолд V83.COM ХолбогчЖижиг серверийн хэсэг ажиллаж байна. Энэ тохиолдолд үйл ажиллагааны хурд илүү өндөр боловч зарим функц ажиллахгүй байж магадгүй юм. Ялангуяа гадаад холболттой ажиллах шинж чанарыг тохируулаагүй маягт, нийтлэг модулиудтай ажиллах. Ихэнхдээ та ашиглах хэрэгтэй V83.COM Холбогчзөвхөн функциональ дутагдалтай тохиолдолд л Та 1С програмын хувьд хоёр төрлийн COM объект үүсгэж болно. Эдгээр нь ole холболтууд юм. Үйлдлийн хурдны ялгаа нь ялангуяа их хэмжээний мэдээллийн санд мэдэгдэхүйц байх болно. 8.2 платформын хувьд ашигласан V82.Application эсвэл V82.COMConnector

OLE холболт үүсгэнэ үү

Холболт = Шинэ COMObject(“V83.Application” );

COM холболт үүсгэнэ үү

Холболт = Шинэ COMObject(“V83.COMConnector” );

Холболтын мөр

//Клиент-сервер сонголтын хувьд
Холболтын мөр= “Srvr = ““ServerName” “;Ref = “ “BaseName” ;
//Файлын горимын хувьд:
Холболтын мөр= "Файл = ""PathKBase" “; Usr = Хэрэглэгчийн нэр; Pwd = Нууц үг";
оролдлого
Холболт = Холболт . Холбох(ConnectionString);
Үл хамаарах зүйл
Message = New MessageToUser;
Захиа . Текст = "Мэдээллийн санд холбогдож чадсангүй" + Тодорхойлолт алдаа(); Захиа . Мэдээлэх();
EndAttempt;

Салгах

Холболт = Тодорхойгүй;
Объектийн хувьд Та 1С програмын хувьд хоёр төрлийн COM объект үүсгэж болно. Эдгээр нь ole холболтууд юмХолболтыг зогсоох шаардлагатай, эс тэгвээс бүрэн бус сесс хэвээр үлдэх бөгөөд дараа нь гараар устгах шаардлагатай болно. Тохиолдолд V83.COM Холбогчхолболт хийгдсэн процедур дууссаны дараа холболт автоматаар тасардаг. Бас нэг жижиг цэг бий. Холболт хийж байгаа хэрэглэгчийн хувьд тохиргоон дотроос "Програмыг хаахдаа баталгаажуулах хүсэлт" гэсэн нүдийг идэвхгүй болгох ёстой.

NewObject() арга

Шинэ объект үүсгэхийн тулд та NewObject() аргыг ашиглаж болно, жишээлбэл:

Учир нь V83.COM Холбогч

COM хүсэлт = Холболт. Шинэ объект( "Хүсэлт") ;
TableCOM = Холболт. Шинэ объект( "Үнэт зүйлсийн хүснэгт") ;
ArrayCOM = Холболт. NewObject("Массив");

ViewCOM =Connection.NewObject

Учир нь Та 1С програмын хувьд хоёр төрлийн COM объект үүсгэж болно. Эдгээр нь ole холболтууд юм

RequestOLE = Холболт. NewObject(" Хүсэлт") ;
TableOLE = Холболт. NewObject("Үнэт зүйлсийн хүснэгт") ;
ArrayOLE = Connection.NewObject("Масив");
ViewCOM =Connection.NewObject(“UniqueIdentifier”, StringUID);

COM хүсэлт . Текст ="СОНГО
| Байгууллагын албан тушаал, дүрэм.
| Байгууллагын албан тушаал.Нэр
|FROM | лавлах.Байгууллагуудын албан тушаал
БАЙГУУЛЛАГЫГ ХЭРХЭН БАЙРЛАХ ВЭ”;

Үр дүн = RequestCOM. Run();
Дээж = Үр дүн. () сонгоно уу;
Баяртай сонголт. Дараачийн()Цикл
EndCycle;
Та мөн тохиргооны объектын менежерүүдийг ашиглаж болно:
DirectoryCOM = Холболт. Лавлахууд. DirectoryName;
DocumentCOM = Холболт. Баримт бичиг. Баримт бичгийн нэр;
RegisterCOM = Холболт. Мэдээллийн бүртгэл. Бүртгэлийн нэр;

COM холболтоор тооллогыг хүлээн авах, харьцуулах

Тохиргоонд тодорхойлсон тооллогын элементүүдийн утгыг харьцуулахын тулд эдгээр элементүүдийг харьцуулахад хялбар энгийн төрлүүдийн аль нэгэнд хөрвүүлэх шаардлагатай. Ийм төрлүүд тоон төрөл эсвэл мөрийн төрөл байж болно. Та тоолох элементийн утгыг дараах байдлаар тоон төрөл болгон хувиргаж болно.

Зүйлийг тоолох = Connection.Directories.Directory1.FindByCode(1).Props1;

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

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

Хэрэв EnumerationItemNumber = 0 бол мэдээлэх( "Тоолох утга1");

ElseIfEnumerationItemNumber = 1 Дараа ньТайлан("ТооцооныҮнэ2");

endIf;

Объектыг COM-оор танигчаар татаж авч байна

Тохиргооны объектын менежерээр дамжуулан бид com объектыг олж авдаг, жишээлбэл:
DocumentCOM = Холболт. Баримт бичиг. Баримт бичгийн нэр;

Дараа нь бид өвөрмөц таних тэмдэгт мөрийг авна:

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

Тодорхойлогч = Шинэ U өвөрмөц танигч(StringUID);
ХАМТ linkByIdentifier = Documents[DocumentName].GetLink(Identifier);

Хэрэв та com объектыг танигчаар баримтаар олох шаардлагатай бол дараах байдлаар бичих хэрэгтэй.

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

Сайн уу Khabrachans!

Энэ нийтлэлд би өөрийн байгууллагад 1С платформтой интеграцчлал хэрхэн бий болсон талаар ярихыг хүсч байна. Намайг үүнийг хийхэд хүргэсэн зүйл бол энэ сэдвээр техникийн мэдээлэл бараг бүрэн дутмаг байсан юм. 1С-ийг аливаа мэдээллийн системтэй холбох сэдвээр янз бүрийн нийтлэл, тайлангуудыг уншиж байхдаа эдгээр нь маркетингийн, үзүүлэнгийн шинж чанартай бөгөөд хэзээ ч техникийн шинж чанартай биш, асуудал, түүний шийдлийн мөн чанарыг тусгасан гэдэгт дахин дахин итгэлтэй байна.

Энэ арга нь бүх нийтийнх гэж хэлэхгүй гэдгийг би танд анхааруулж байна. 1С-ийн олон тохиргоо, үүнээс ч илүү мэдээллийн систем, хэл, платформууд байдаг тул боломжит хослолуудын тоо асар их байна. Миний зорилго бол нэг боломжит шийдлийг харуулах явдал юм.


Би Python хэлийг 1С-тэй нэгтгэх хэлээр сонгосон. Энэ нь процессын автоматжуулалтад маш тохиромжтой. Үүнийг синтаксийн минимализм (код маш хурдан бичдэг), баялаг стандарт номын сан (гуравдагч талын модулиудын хэрэгцээ бага), хөндлөн платформ - Linix OS дээр бичигдсэн код нь Windows дээр амжилттай ажиллах магадлал өндөр байдаг. .

Эхлэхийн тулд би бидний ажиллах өгөгдлийг тоймлох болно. Тус байгууллага нь Алс Дорнодын бүс нутагт эрчим хүчний борлуулалтын компани юм - ойролцоогоор 400 мянган захиалагчдад үйлчилдэг, 1С мэдээллийн сан нь захиалгат тохиргоонд суурилдаг. Захиалагч бүрийн хувьд түүний төлбөр, хураамж, хэрэглэсэн үйлчилгээ, тооцооны схем, тоолуур, уншилт болон бусад олон өгөгдлийг хадгалдаг.

Нэгэн удаа нэгэн байгууллагад Delphi хэл дээр бичигдсэн, MSSQL/Firebird программыг мэдээллийн сан болгон ашигладаг байжээ. Эдгээр гайхалтай цаг үед та ямар ч хэлээр мэдээллийн санд холбогдож, өртэй захиалагчдыг сонгох, хүлээн авсан төлбөрийг нийтлэх, багаж хэрэгслийн уншилтыг бүртгэх зэрэг олон үйлдэл хийх боломжтой. Үйл ажиллагааг автоматжуулах скриптүүдийн цуглуулга байнга нэмэгдэж байгаа нь гайхах зүйл биш юм. Программистууд програмыг нээхгүйгээр ямар ч үйлдлийг гүйцэтгэх боломжтой.

Харамсалтай нь, 1С руу шилжсэнээр үнэгүй хэрэглүүр дууссан - мэдээллийн санд шууд холбогдох боломжгүй болсон. Ерөнхийдөө 1С платформ нь өөрөө хуваагдашгүй бөгөөд бусад системтэй нэгтгэхэд тийм ч таатай байдаггүй. Тэдний хэлснээр тэр бол өөрийн гэсэн зүйл юм. Өгөгдлийг 1С-д ачаалахдаа үүнийг тэндээс гаргаж авах нь тийм ч хялбар биш гэдгийг санах хэрэгтэй. Гэхдээ тухайн байгууллагад төлбөрийн систем, хувийн данс нэвтрүүлэх шаардлагатай байсан тул ямар нэгэн шийдэл олох шаардлагатай байв.

Миний өмнө тулгарч буй гол ажил бол нэр, хаяг, хэмжих төхөөрөмж, багажийн заалт, төлбөр, хураамж зэрэг хувийн дансны мэдээллийг хурдан олж авах чадвар байв. Дээрээс нь баримт бичгийг бүрдүүлэх - эвлэрлийн тайлан, төлбөрийн баримт. Тиймээс мэдээллийн сантай шууд холбогдох ямар ч боломжгүй - SQL сервер дээрх 1С мэдээллийн баазыг үзсэн хэн бүхэн aaa1, aaa2 гэх мэт хүснэгтүүдийн массыг ойлгоход хэцүү болохыг олж мэдсэн. Гэхдээ ийм хүснэгт болон талбарын нэрээр асуулга үүсгэх нь бодитой бус юм. Нэмж дурдахад, олон тооны 1С хүснэгтүүд (ялангуяа хамгийн чухал нь, тухайлбал хамгийн сүүлийн үеийн, тэнцвэр, эргэлтийн хэсэг) виртуал бөгөөд өөр өөр физик хүснэгтүүдэд тараагдсан бөгөөд олон холболтоор цуглуулсан байдаг. Энэ арга нь тохиромжгүй.

1С платформ нь COM холболтоор холбогдох боломжийг олгодог. Олон Windows програмуудын нэгэн адил 1С-ийг суулгах явцад системд автоматжуулалтын сервер ба COM холбогч гэсэн хоёр COM объект бүртгэгдсэн байдаг. Энэ хоёр объектыг COM технологийг дэмждэг хэлээр ажиллах боломжтой.

Автоматжуулалтын серверийн объект нь ердийн клиент програмаас бараг ялгаагүй 1С програм юм. Үүний ялгаа нь програмын жишээг программчлан удирдах боломжтой юм. COM холбогч объекттой ажиллахдаа 1С програмын хөнгөн хувилбарыг эхлүүлсэн бөгөөд үүнд интерфэйс, харааны эффекттэй холбоотой хэлбэр, функц, аргууд байхгүй байна. Програм нь өөрөө "Гадаад холболт" горимд эхэлдэг. Глобал хувьсагчдыг эхлүүлэх (жишээлбэл, одоогийн хэрэглэгч болон түүний тохиргоог тодорхойлох) 1С гадаад холболтын модульд хийгдэх ёстой. Хэрэв гадаад холболтын горимд код нь энэ горимд байхгүй функцийг дуудвал онцгой тохиолдол гарах болно (энэ нь манай Python скрипт рүү шилжих болно). Аюулгүй функцүүдийн дуудлагууд нь маягтын бүтэцтэй байх ёстой

#Хэрэв гаднах нэгдэл биш бол Анхааруулга("Сайн уу!"); #EndIf

COM объектуудтай ажиллах нь зөвхөн цонхны технологи учраас стандарт Python түгээлтэд ороогүй нь гайхах зүйл биш юм. Та Python дээр Windows дээр програмчлахад шаардлагатай бүх функцийг хангах модулиудын багц болох өргөтгөлийг суулгах шаардлагатай болно. Үүнийг урьдчилан бэлтгэсэн exe суулгагч хэлбэрээр татаж авах боломжтой. Өргөтгөл нь өөрөө бүртгэл, үйлчилгээ, ODBC, COM объект гэх мэт хандах боломжийг олгодог. Өөр хувилбар болгон та Win32 өргөтгөлтэй хамт ирдэг ActiveState Python түгээлтийг нэн даруй суулгаж болно.

Хэсэг хугацааны турш би вэб програмууд, ялангуяа хувийн данс хөгжүүлэхэд COM холболтыг туршиж үзсэн. Дараах сул талуудыг тодорхойлсон.

COM холболт удаан байна. Бага гүйцэтгэл нь COM технологийн сайн мэддэг сул тал юм.
- 1С-тэй холболт хийх үйл явц нь тохиргооноос хамааран 1-ээс 8 секунд хүртэл үргэлжилж болно (миний хувьд - 6 секунд). Хүсэлт бүрд холболт үүсгэснээр хуудас бүрийг ачаалахад 8 секунд зарцуулагдана гэдгийг хэлэх нь илүүц биз.
- Python дээрх вэб програмууд бие даасан сервер байдлаар ажилладаг тул холболтыг ямар нэг глобал хувьсагчид хадгалж, алдаа гарсан тохиолдолд сэргээх замаар өмнөх цэгийг нөхөж болно. Үнэнийг хэлэхэд, би PHP дээр холболтыг хэрхэн хадгалах талаар бодож амжаагүй байна.
- Вэб програмын платформ хоорондын үйл ажиллагаа алдагдсан.

Дээр дурдсан зүйлс дээр үндэслэн харилцан үйлчлэлийн зарчмыг 2 хэсэгт хуваахаар шийдсэн - эхний платформоос хамааралтай (Цонх дээр суурилсан), 1С өгөгдлийг ямар ч тохиромжтой формат руу байршуулах, хоёр дахь нь платформоос хамааралгүй, зарчмын хувьд 1С-ийн талаар юу ч сэжиглэхгүйгээр өгөгдөлтэй ажиллах чадвартай.

Үйлдлийн стратеги нь дараах байдалтай байна: Python скрипт нь 1С-тэй холбогдож, шаардлагатай асуулга явуулж, өгөгдлийг SQLite мэдээллийн санд байршуулдаг. Та энэ мэдээллийн санд Python, PHP, Java-оос холбогдох боломжтой. Манай төслүүдийн ихэнх нь Python дээр ажилладаг бөгөөд би SQL-ийн түүхий асуулга гараар бичихийг тэвчихгүй болохоор SQLite мэдээллийн сантай хийх бүх ажлыг SQLAlchemy ORM-ээр гүйцэтгэдэг. Шаардлагатай бүх зүйл бол мэдээллийн сангийн өгөгдлийн бүтцийг тунхаглалын хэв маягаар дүрслэх явдал байв.

sqlalchemy.ext.declarative-аас declarative_base-аас sqlalchemy импортлох Багана, Бүхэл тоо, Тоон, DateTime, Юникод, Boolean, LargeBinary, Гадаад Түлхүүр Суурь = declarative_base() анги Abonent(Base): __tablename__ анхдагч Column_base =(International) Үнэн) данс = Багана(Юникод(32), индекс=Үнэн) код = Багана(Юникод(32)) хаяг = Багана(Юникод(512)) fio = Багана(Юникод(256)) эх = Багана(Юникод(16) ) psu = Багана(Юникод(256)) tso = Багана(Юникод(256)) np = Багана(Юникод(256)) гудамж = Багана(Юникод(256)) байшин = Багана(Бүхэл тоо) хавтгай = Багана(Бүхэл тоо) mro = Багана(Юникод(256)) анги Төлбөр(Үндсэн): __хүснэгтийн нэр__ = "төлбөр" # гэх мэт...

Одоо та энэ модулийг ямар ч Python төсөлд импортлоход л хангалттай бөгөөд та өгөгдөлтэй ажиллах боломжтой.

Би таны асуултыг урьдчилан таамаглаж байна - "яагаад SQLite?" Гол шалтгаан нь өгөгдлийн сан нь зөвхөн уншигдах зориулалттай тул SQLite-д бичихтэй холбоотой асуудал биднийг санаа зовох хэрэггүй. Хоёрдугаарт, энэ DBMS-ийн формат нь тохиромжтой байдаг - үүнийг харахад хялбар байдаг (FireFox-ийн супер өргөтгөл зэрэг олон үнэгүй хэрэгслүүд байдаг). Гуравдугаарт, зарим тохиолдолд MySQL сервертэй холбогдоогүй машинуудаас захиалагчдад хандах шаардлагатай болдог. Энэ тохиолдолд SQLite өгөгдлийн сангийн файлыг хуулж авахад хангалттай бөгөөд энэ машин бүх мэдээлэлд хандах боломжтой болно.

Буулгах ажлыг өдөрт нэг удаа шөнийн цагаар хийдэг. 1С-д өгөгдөл оруулах ажлыг ижил аргаар автоматжуулж болно. Жишээлбэл, хувийн дансны вэбсайт дээр захиалагчдын үлдээсэн заалтыг бүртгэх шаардлагатай. Энэ тохиолдолд бид 1С-тэй дахин холбогдож, "Унших үйлдэл" баримт бичгийг програмын дагуу үүсгэж, байршуулна. Би доорх кодыг өгөх болно.

Python дээр COM объектуудтай ажиллах нь ер бусын юм. Нэгдүгээрт, кодын "Питоник байдал" алдагдсан - 1С дахь хувьсагч, функцийг нэрлэх дүрэм нь Python-ийн Зентэй таарахгүй байна. Хоёрдугаарт, 1С объектыг ихэвчлэн кирилл үсгээр нэрлэсэн байдаг бөгөөд энэ нь Python дээр хөгжүүлэхэд асуудал үүсгэдэг гэдгийг бүгд мэддэг ... гэхдээ тэдгээрийг шийдэж болно. Би танд кодыг харахыг санал болгож байна:

Импорт pythoncom импорт win32com.client V82_CONN_STRING = "Srvr=v8_server;Ref=v8_db;Usr=хэрэглэгчийн нэр;Pwd=megapass;" pythoncom.CoInitialize() V82 = win32com.client.Dispatch("V82.COMConnector").Холбох(V82_CONN_STRING)

Кодоос харахад үйлчлүүлэгч 1С-тэй ажиллахаар тохируулагдсан байна. COM объект нь “V82.COMConnector” нэрээр тодорхойлогддог. Энэ нэр нь V8.2 платформд хүчинтэй гэдгийг анхаарна уу, хэрэв танд 8.1 хувилбар байгаа бол нэр нь "V81.COMConnector" байх болно.

Бид эхлүүлсэн клиент дээрх Connect() аргыг дуудаж, холболтын мөрийг дамжуулдаг. Мөр нь серверийн нэр, мэдээллийн сан, хэрэглэгч, нууц үгээс бүрдэнэ. Үүссэн V82 объект нь 1С програмын холболтыг хадгалдаг. Түүнд Disconnect() арга эсвэл үүнтэй төстэй зүйл байхгүй. Өгөгдлийн сангаас салгахын тулд del() функцийг ашиглан объектыг санах ойноос устгаад эсвэл None хувьсагч руу онооно.

Объекттой болсноор та 1С глобал контекстийн аль ч талбар, аргуудад хандаж, TabularDocument, ValueTable гэх мэт бүх нийтийн объектуудтай ажиллах боломжтой. COM холболтоор ажиллах үед 1С нь "Гадаад холболт" горимд ажилладаг гэдгийг анхаарах нь чухал юм. Энэ нь попап харилцах цонх, мэдэгдэл, хамгийн чухал нь маягт гэх мэт интерактив функцийг зөвшөөрдөггүй. Баримт бичгийн маягтын модулийн Button1Press() процедурт хамгийн чухал функцийг хавсаргасан тохиргооны боловсруулагчдыг та нэгээс олон удаа хараана гэдэгт би итгэлтэй байна.

Кирилл үсгийн шинж чанар гэх мэт чухал зүйлийн талаар ярилцъя. 1С нь хоёр хэлтэй орчин бөгөөд орос хэлний арга тус бүрийн хувьд англи хэл дээрх аналог байдаг ч эрт орой хэзээ нэгэн цагт та кирилл үсгийн шинж чанарт хандах хэрэгтэй болно. Хэрэв энэ нь 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 каталог = getattr(V82.Каталог, "Хувийн Данс")

Дараах нь чухал юм: дэлгэрэнгүй нэрс, функц, аргын параметрүүдийг cp1251 кодчилолд дамжуулах ёстой. Тиймээс кодчилолтой төөрөгдүүлэхээс урьдчилан сэргийлэхийн тулд файлын эхэнд үүнийг зарлах нь зүйтэй юм: #coding=cp1251. Дараа нь та тэдгээрийн кодчилолд санаа зовохгүйгээр мөрүүдийг дамжуулж болно. Гэхдээ! 1С-ээс хүлээн авсан бүх мөрүүд (дуудлага хийх функц, асуулгын үр дүн) UTF-8 кодчилолд байх болно.

1С орчинд асуулга ажиллуулж, үр дүнг давтаж, мэдээллийн санг SQLite дээр хадгалдаг кодын жишээ:

#coding=cp1251 q = """ Хувийн дансыг сонго. Код AS код, Хувийн данс. Барилга. Төлбөр. Нэр + ", " + Хувийн данс. Богино хаяг AS хаяг, Хувийн данс. Захиалагч. Нэр AS fio, Хувийн данс. Хэсэг AS psu, EXPRESS гудамж, Хувийн Дансны Барилга. House AS personal S, couple.MainRoom.RoomNumber AS flat , PersonalAccounts.Division.Parent.Name AS FROM Directory.PersonalAccounts AS PersonalAccounts ЗҮҮН ХОЛБОО RegisterInformation.CharacteristicsL. Лавлах. Тэмдэглэлийн төрлүүд.Газарзүйн хувьд сүлжээний байгууллага)) AS Шинж чанар Хувийн дансны хамгийн сүүлийн үеийн програм хангамжийн хувийн дансны хэсэг Холбоос = Хувийн дансны шинж чанар """ query = V82.NewObject("Query", q) сонголт = query. Execute().Choose() CONN = db.connect() CONN.query(models.Abonent).delete() сонгохдоо сонгох.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 = сонголт tso abonent.source = u"ASRN" abonent.np = сонголт. np abonent.street = сонголт.гудамж abonent.house = сонголт.байшин abonent.flat = сонголт.хавтгай abonent.mro = selection.mro CONN.add(abonent) CONN.commit()

Энд CONN нь SQLite мэдээллийн сантай холбогдох сесс юм. Асуулгын объектыг үүсгэж, текстийг нь бөглөнө. Дээр дурдсанчлан, хүсэлтийн текст нь cp1251-д байх ёстой бөгөөд үүний тулд кодчилолыг эхлээд зарласан болно. Хүсэлтийг гүйцэтгэсний дараа давхардсан тоо нэмэхгүйн тулд бүх захиалагчдыг мэдээллийн санд устгаж, дараа нь гогцоонд нэмж, эцсийн амлалт хийгдэнэ.

Хүсэлттэй ажиллахдаа би дараах дүрмийг олж мэдсэн.

Талбаруудыг сонгохдоо латин үсгээр нэрлэнэ үү; getattr()-ийн оронд сонгогч (цэг)-ээр дамжуулан хандах нь илүү тохиромжтой байх болно.
- Зөвхөн анхдагч өгөгдлийн төрлийг сонгоно уу: мөр, тоо, огноо, логик. Объект руу (баримт бичиг, лавлах ном) холбоосыг хэзээ ч бүү сонго! Энэ нөхцөлд танд холбоос огт хэрэггүй бөгөөд бүр хортой, учир нь холбоосын тулгуур эсвэл арга руу залгах нь COM холболтоор дамжуулан хүсэлт гаргахад хүргэдэг. Хэрэв та холбоосын шинж чанаруудад давталтаар хандвал энэ нь маш удаан байх болно.
- Хэрэв та Date төрлийн талбарыг сонговол энэ нь PyTime объект болж буцаагдах болно. Энэ нь COM холболтоор огноо цагийг дамжуулах тусгай өгөгдлийн төрөл юм. Энэ нь ердийн огноотой ажиллахад тийм ч тохиромжтой биш юм. Хэрэв та энэ объектыг int() руу шилжүүлбэл энэ нь цагийн тэмдэг буцаана, үүнээс та fromtimestamp() аргыг ашиглан огноог авах боломжтой.

Одоо хэвлэсэн баримтууд хэрхэн бүрддэгийг харцгаая. Баримт нь хэрэглэгчдэд урьдчилан бэлтгэсэн баримт бичгүүдийг, жишээлбэл, төлбөрийн баримт эсвэл тохирлын тайланг татаж авах боломжийг олгох ёстой. Эдгээр баримт бичгүүдийг 1С-д тогтоосон шаардлагын дагуу боловсруулсан болно. Тиймээс 1С-д баримт бичгийг үүсгэж, Excel форматаар хадгалах нь дээр.

Тиймээс, нэгтгэлийн тайлангийн баримт бичгийг гадны тусгай боловсруулалтаар бий болгодог. 1С-ийн нэр томъёог мэдэхгүй хүмүүст: боловсруулалт нь 1С орчинд ажиллахад зориулагдсан өөрийн модуль, маягт, загвар бүхий бие даасан програм юм. Боловсруулалтыг эхлүүлэх, дэлгэрэнгүй мэдээллийг бөглөж, 1С-д үзэх зориулалттай хүснэгтийн баримт бичгийг бидэнд буцааж өгөх функцийг дуудах шаардлагатай. Энэ баримт бичгийг Excel форматаар хадгалж, серверт хуулж эсвэл мэдээллийн санд бүртгэсэн байх ёстой.

Холбоос = getattr(V82.Каталогууд, "Системийн тайлангууд").FindByDescription("Эллений эвлэрлийн тайлан") nav_url = V82.GetURL(холбоос, "Тайлан") нэр = V82.ExternalReports.Connect(nav_url) Гадаад тайлан = V82.Гадаад тайлан. (Нэр) setattr(ExternalReport, "PersonalAccount", лавлагаа) table_doc = ExternalReport.GetDoc() path = V82.GetTempFileName("xls") table_doc.Write(зам, V82 .SpreadsheetDocumentFileType.XLS) тайлан() = загвар.Тайлан үүсгэх тайлан .акаунт = лавлагаа.Код.стрип() тайлан.төрөл = u"үйлдэл" тайлан.баримт бичиг = нээлттэй(зам, "rb").унших() CONN.add(тайлан)

Дээрх фрагмент нь дараахь зүйлийг хийдэг. Баримт бичгийг үүсгэдэг боловсруулалт холбогдсон байна. Боловсруулалтыг тохиргоонд суулгаж, диск дээр эсвэл 1С мэдээллийн санд (зарим лавлахад) хадгалах боломжтой. Боловсруулалт байнга өөрчлөгддөг тул тохиргоогоо шинэчлэхгүйн тулд хамгийн их өөрчлөгддөг боловсруулалтыг "Системийн тайлан" лавлах буюу "Үнэ цэнэ хадгалах" шинж чанарт "Report" гэж нэрлэдэг. Боловсруулалтыг өгөгдлийн сангаас диск рүү буулгаж, ачаалах эсвэл GetURL() аргыг ашиглан эхлүүлж болох бөгөөд үүнд директорийн элемент болон атрибутын нэрний холбоосыг дамжуулах шаардлагатай. Бид хүлээн авсан боловсруулалтын объектод дэлгэрэнгүй мэдээллийг өгч, GetDoc() экспортолсон функцийг дуудаж, түр зуурын Excel файлд хадгалагдсан хүснэгтийн баримт бичгийг хүлээн авдаг. Энэ файлын агуулгыг SQlite мэдээллийн санд бичсэн болно.

Хамгийн сүүлд анхаарах зүйл бол өгөгдлийг 1С-д програмаар оруулах явдал юм. Та захиалагчдаас мэдүүлэг оруулах хэрэгтэй гэж бодъё. Үүнийг хийхийн тулд "Мэдэгдэл авах акт" баримт бичгийг бүрдүүлж, хэрэгжүүлэхэд хангалттай.

#coding=cp1251 acts = getattr(V82.Documents, "Act of Mocumony") act = acts.CreateDocument() setattr(act, "Гэрчлэл", 1024.23) setattr(act, "Захиалагч", "Иванов") # Бөглөх бусад дэлгэрэнгүй .. act.Write()
Мэдээлэл оруулах нь одоо автоматжсан.

Тиймээс би COM холболтыг ашиглан программчлан байршуулах, өгөгдөл татахад үндэслэсэн аргыг тодорхойлсон. Энэ арга манай байгууллагад амжилттай хэрэгжиж эхлээд жил шахам болж байна. 1С-ээс бүрдсэн мэдээллийн сан нь 3 төлбөрийн систем, интернет эквайринг (интернетээр дамжуулан картаар төлбөр хийх), хувийн дансанд үйлчилдэг. Нэмж дурдахад янз бүрийн скриптүүд нь мэдээллийн санд холбогдож, горимыг автоматжуулах болно.

Аргын сул талуудыг үл харгалзан (COM холболтын хурд удаан) ерөнхийдөө тогтвортой ажилладаг. Бид ямар ч хэл дээр ажиллах боломжтой платформоос хамааралгүй (SQLite) хэлбэрийн өгөгдөлтэй. Кодын гол хэсэг нь Python хэл дээр бичигдсэн бөгөөд энэ нь 1С дээр мөрөөдөж ч чадахгүй олон хэрэгсэл, арга техникийг ашиглах боломжтой гэсэн үг юм.

Энэ бол 1С-тэй харилцах боломжит аргуудын нэг юм. Энэ нь шинэ зүйл биш бөгөөд магадгүй аль хэдийн хэн нэгэн туршиж, оновчтой болгосон гэдэгт би итгэлтэй байна. Гэсэн хэдий ч би та бүхнийг өөрийнхөө тулгарсан бэрхшээлээс хамгаалахын тулд үйл явцын талаар аль болох дэлгэрэнгүй танилцуулахыг хичээсэн.

Та бүхэнд амжилт хүсье, мөн 1С нь төсөөлж байгаа шигээ аймшигтай биш гэдгийг санаарай!

Гадны байршуулалт, файл солилцохгүйгээр хоёр мэдээллийн баазын хооронд мэдээлэл солилцохын тулд COM холболтоос илүү сайн зүйл байхгүй. Үүнтэй маргах нь хэцүү, учир нь энэ төрлийн холболтыг ашиглах нь маш энгийн бөгөөд тогтвортой байдаг. Гэхдээ энэ механизмд нэг гацаа, тааламжгүй газар байдаг бөгөөд бид өөр суурьтай холбоо тогтооход шаардагдах цаг хугацааны талаар ярьж байна. Зарим тохиолдолд энэ нь нэлээд том утгад хүрч болно, i.e. маш урт байх.

Юу болсон бэ?

COM холболтоор холбогдох үед холбогдсон мэдээллийн сан нь бидний холбогдож буй мэдээллийн сангийн тохиргоог бүрэн ачаалдаг. Жишээлбэл, Аж ахуйн нэгжийн нягтлан бодох бүртгэлийн мэдээллийн санд холбогдохыг оролдсоны дараа тохиргооны хэмжээ хэдэн зуун мегабайт байдаг тул хүлээх хугацаа нэлээд удаан үргэлжлэх болно. Илүү хурдан ажиллахын тулд бүх холболтыг кэш болгож, хадгалах шаардлагатай байгаа нь тодорхой болсон.

Гүйцэтгэлийн шинжилгээ

Холболтуудыг кэш хийх шаардлагатай эсэх, хэрэглэгч COM холболттой эрчимтэй ажиллах үед энэ нь үр дүнгээ өгөх эсэхийг өөрөөсөө асууцгаая. Холболтын хугацааг 20 кБ тохиргоонд хэмжиж үзье.

Жижиг суурьтай холбогдоход 3.5 секунд зарцуулагдсаныг бид харж байна. Томоохон мэдээллийн санд холбогдох үед хугацаа хэд дахин нэмэгдэх болно.

Тогтмол холболтыг хадгалах үед эдгээр үйлдэл нь хэд хэдэн дарааллаар бага хугацаа шаардагдана.

Бид COM холболтоо хэрхэн идэвхтэй байлгах вэ?

Асуудал нь 1С платформ нь мэдээллийн аюулгүй байдалд COM холболтыг хадгалах стандарт хэрэгслээр хангаагүй явдал юм. Холболтыг лавлах, баримт бичигт хадгалах нь утгагүй, учир нь энэ нь байнга өөрчлөгдөж байдаг. Хамгийн ирээдүйтэй сонголт бол холболтыг сессийн параметрт хадгалах явдал юм. Гэхдээ энд ч гэсэн бүх зүйл тийм ч жигд биш байна. Эцсийн эцэст, COM холболтыг хадгалахад тохиромжтой ганц өгөгдлийн төрөл байдаггүй.

Эдгээр аргументууд нь зөвхөн зарим хувьсагч дахь үйлчлүүлэгч дээр хадгалах боломжтой гэдгийг харуулж байна. Удирдах маягтын сонголтыг авч үзье. Хувьсагчийг &OnClient заавраар маягтаар эхлүүлэх шаардлагатай бөгөөд бид холболтын утгыг хадгалах болно. Үүний дагуу та COM объектыг үйлчлүүлэгчээс сервер рүү шилжүүлэх боломжгүй тул та энэ холболтыг зөвхөн клиент дээр дуудаж болно. Ердийн маягтуудын хувьд сервер болон үйлчлүүлэгчийн хооронд ямар ч ялгаа байхгүй бөгөөд энэ механизм нь илүү хялбар болно. Санах ой алдагдахаас сэргийлж ашиглаж буй маягтаа хаахаас өмнө холболтыг хаахаа бүү мартаарай.

Гаралтын оронд

Хэдийгээр энэ схем нь гүйцэтгэлийн зарим асуудлыг шийддэг ч энэ нь тийм ч тохиромжтой биш юм. COM холболтыг дэмжих шаардлагатай хэлбэр бүр нь хүлээн авагчийн мэдээллийн санд шинэ сесс үүсгэх бөгөөд үүний дагуу илүү олон тооны лиценз шаардлагатай болно. Мөн гол сул талуудын нэг нь серверт холбогдох дэмжлэгийг хассан явдал юм

Дараагийн өгүүллээр эдгээр асуудлыг арилгах илүү дэвшилтэт аргыг авч үзэх болно (Вэб үйлчилгээгээр дамжуулан холболт).



Холбогдох хэвлэлүүд