دریافت داده از طریق اتصال com از 1s. سه رکن کار با اشیاء COM. کار بر روی یک اتصال COM ساده تر از آن چیزی است که فکر می کنید. یک اتصال OLE ایجاد کنید

چاپ (Ctrl+P)

یکی از گزینه های تبادل داده بین پایگاه های داده 1C تبادل از طریق اتصال COM است. با استفاده از اتصال COM، می توانید از یک پایگاه داده 1C به پایگاه داده دیگری متصل شوید و داده ها را بخوانید یا بنویسید. این روش را می توان هم در نسخه های سرویس گیرنده-سرور پایگاه های داده و هم در پایگاه های داده فایل استفاده کرد. این مقاله در مورد این نوع اتصالات در پلت فرم 8.3 بحث می کند

اتصال com

شما می توانید دو نوع شی COM برای برنامه 1C ایجاد کنید. این اتصالات ole است V83.Application و اتصالات com V83.COMConnector . در صورت V83.Applicationیک نسخه تقریباً کامل از برنامه 1C راه اندازی شد. در صورت استفاده V83.COMConnectorیک بخش کوچک سرور راه اندازی شد. سرعت عمل در این مورد بالاتر است، اما برخی از عملکردها ممکن است در دسترس نباشند. به طور خاص، کار با فرم ها و ماژول های رایج که خاصیت کار با اتصالات خارجی برای آنها تنظیم نشده است. بیشتر شما باید استفاده کنید V83.COMConnectorو فقط در صورت عدم عملکرد V83.Application. تفاوت در سرعت عملیات می تواند به ویژه در پایگاه های داده با حجم زیاد قابل توجه باشد. برای پلتفرم 8.2 استفاده شده است V82.Application یا V82.COMConnector

یک اتصال OLE ایجاد کنید

اتصال = COMObject جدید ("V83.Application") ;

یک اتصال COM ایجاد کنید

اتصال = COMObject جدید ("V83.COMConnector");

رشته اتصال

//برای گزینه مشتری-سرور
رشته اتصال= "Srvr = ""ServerName" ";Ref = " "BaseName" ;
/گزینه /For file mode:
رشته اتصال= "File = "PathKBase" "؛ Usr = نام کاربری; Pwd = رمز عبور;
تلاش
اتصال = اتصال . اتصال(ConnectionString)؛
استثنا
Message = New MessageToUser;
پیام . متن = "اتصال به پایگاه داده ناموفق بود" + DescriptionErrors(); پیام . برای گزارش ();
پایان تلاش ;

قطع ارتباط

اتصال = تعریف نشده
برای شی V83.Applicationلازم است اتصال را قطع کنید، در غیر این صورت یک جلسه ناقص باقی می ماند که سپس باید به صورت دستی حذف شود. در صورت V83.COMConnectorهنگامی که رویه ای که در آن اتصال برقرار شد، اتصال به طور خودکار قطع می شود و یک نکته کوچک دیگر وجود دارد. برای کاربری که تحت آن اتصال برقرار می شود، چک باکس "درخواست تایید هنگام بستن برنامه" باید در تنظیمات آن غیرفعال باشد.

متد NewObject().

برای ایجاد یک شی جدید، می توانید از متد ()NewObject استفاده کنید، به عنوان مثال:

برای V83.COMConnector

RequestCOM = اتصال NewObject( "درخواست ") ;
TableCOM = اتصال NewObject( "جدول ارزش ها") ;
ArrayCOM = اتصال. NewObject ("آرایه") ;

ViewCOM =Connection.NewObject

برای V83.Application

RequestOLE = اتصال NewObject(" درخواست ") ;
TableOLE = اتصال. NewObject("جدول ارزش ها") ;
ArrayOLE = Connection.NewObject("آرایه" ) ؛
ViewCOM =Connection.NewObject("UniqueIdentifier"، StringUID)؛

RequestCOM . متن ="انتخاب کنید
| موقعیت های سازمان ها. کد،
| موقعیت های سازمان ها. نام
|از | فهرست پست های سازمان ها
چگونه به موقعیت های سازمان ها”;

نتیجه = RequestCOM. اجرا کن()؛
نمونه = نتیجه انتخاب کنید () ؛
انتخاب خداحافظ. بعد()چرخه
چرخه پایان ;
همچنین می توانید از مدیران شی پیکربندی استفاده کنید:
DirectoryCOM = اتصال. دایرکتوری ها نام دایرکتوری
DocumentCOM = اتصال مستندات. نام سند؛
RegisterCOM = اتصال. ثبت اطلاعات. RegisterName ;

دریافت و مقایسه شمارش از طریق اتصال COM

برای مقایسه مقادیر عناصر شمارش تعریف شده در پیکربندی، لازم است این عناصر را به یکی از انواع اولیه تبدیل کنید که مقایسه آن آسان است. چنین انواعی می توانند عددی یا عددی باشند نوع رشته. شما می توانید مقدار یک عنصر enumeration را به یک نوع عددی تبدیل کنید:

تعداد مورد = Connection.Directories.Directory1.FindByCode(1).Props1;

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

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

اگر EnumerationItemNumber = 0 سپس گزارش دهید( "Enumer value1");

ElseIfEnumerationItemNumber = 1 سپسگزارش ("EnumerationValue2");

endIf;

بازیابی یک شی از طریق COM توسط شناسه

از طریق مدیران شیء پیکربندی، یک شی com دریافت می کنیم، به عنوان مثال:
DocumentCOM = اتصال مستندات. نام سند؛

سپس یک رشته شناسه منحصر به فرد دریافت می کنیم:

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

شناسه = U جدید شناسه منحصر به فرد (StringUID);
با linkByIdentifier = اسناد[DocumentName].GetLink(Identifier);

اگر می خواهید یک شی com را با سند بر اساس شناسه پیدا کنید، باید به این صورت بنویسید:

WidCOM = Connection.NewObject("UniqueIdentifier"، StringUID)؛
LinkByIdentifier = Connection.Documents[DocumentName].GetLink(WidCOM);

سلام خبرچان ها!

در این مقاله می خواهم در مورد چگونگی ایجاد یکپارچگی با پلتفرم 1C در سازمانم صحبت کنم. چیزی که مرا به این کار وادار کرد غیبت تقریباً کامل بود اطلاعات فنیدر مورد این موضوع با خواندن مقالات و گزارش های مختلف در مورد اتصال 1C با هر سیستم اطلاعاتی، بارها و بارها متقاعد می شوید که همه آنها ماهیت بازاریابی، نمایشی و هرگز فنی ندارند و منعکس کننده مشکل و ماهیت راه حل آن هستند.

من به شما هشدار می دهم که این روش به هیچ وجه ادعای جهانی بودن ندارد. از آنجایی که خود تنظیمات 1C زیادی وجود دارد، و سیستم های اطلاعاتی، زبان ها و سیستم عامل ها - حتی بیشتر، تعداد ترکیب های ممکن بسیار زیاد است. هدف من نشان دادن یک راه حل ممکن است.


من پایتون را به عنوان زبانی که با 1C ادغام خواهد شد انتخاب کردم. برای اتوماسیون فرآیند بسیار مناسب است. این امر با مینیمالیسم نحو تسهیل می شود (کد بسیار سریع تایپ می شود)، غنی کتابخانه استاندارد(نیاز کمتر به ماژول های شخص ثالث)، کراس پلتفرم - با احتمال زیاد، کد نوشته شده در سیستم عامل Linix با موفقیت در ویندوز کار می کند.

برای شروع، من داده هایی را که با آنها کار خواهیم کرد، بیان می کنم. این سازمان یک شرکت فروش انرژی در منطقه خاور دور است - به حدود 400 هزار مشترک خدمات می دهد، پایگاه داده 1C بر اساس پیکربندی سفارشی است. برای هر مشترک، پرداخت ها، هزینه ها، خدمات مصرفی و طرح های محاسباتی، کنتورها، قرائت ها و بسیاری از داده های دیگر ذخیره می شود.

روزی روزگاری، سازمانی برنامه ای داشت که در دلفی نوشته شده بود و از MSSQL/Firebird به عنوان پایگاه داده استفاده می کرد. در آن زمان‌های باشکوه، می‌توانستید با استفاده از هر زبانی به پایگاه داده متصل شوید و اقدامات زیادی را انجام دهید - مشترکین بدهکار را انتخاب کنید، پرداخت‌های دریافتی را ارسال کنید، خواندن ابزار را ضبط کنید. تعجب آور نیست که مجموعه اسکریپت هایی که روال را خودکار می کنند دائما در حال رشد بوده است. برنامه نویسان می توانند هر عملی را بدون باز کردن خود برنامه انجام دهند.

افسوس، با انتقال به 1C، بازی رایگان به پایان رسید - دیگر امکان اتصال مستقیم به پایگاه داده وجود نداشت. به طور کلی، خود پلتفرم 1C غیرقابل تقسیم است و به خوبی خود را برای ادغام با سایر سیستم ها مناسب نمی داند. او، همانطور که می گویند، برای خودش یک چیز است. هنگام بارگیری داده ها در 1C، باید به یاد داشته باشید که استخراج آن از آنجا به این راحتی نخواهد بود. اما با توجه به اینکه سازمان نیاز به پیاده سازی سیستم های پرداخت و منطقه شخصی، لازم بود راه حلی پیدا شود.

وظایف اصلی پیش روی من توانایی به دست آوردن سریع داده ها در مورد یک خاص بود حساب شخصی- نام کامل، آدرس، دستگاه های اندازه گیری، قرائت کنتور، پرداخت ها، هزینه ها. به علاوه تولید اسناد - گزارش آشتی، رسید پرداخت. بنابراین، امکان اتصال مستقیم به پایگاه داده وجود ندارد - هر کسی که به پایگاه داده 1C در یک سرور SQL نگاه کرده باشد، متوجه شده است که درک انبوه جداول مانند aaa1، aaa2 دشوار است. و ساخت پرس و جو با چنین جدول و نام فیلدها به سادگی غیر واقعی است. علاوه بر این، بسیاری از جداول 1C (مخصوصاً مهم‌ترین آنها، مانند برشی از آخرین، تعادل‌ها و چرخش‌ها) مجازی هستند و در جداول فیزیکی مختلف پراکنده هستند و با اتصالات متعدد جمع‌آوری می‌شوند. این روش مناسب نیست.

پلت فرم 1C امکان اتصال به آن از طریق اتصال COM را فراهم می کند. مانند بسیاری از برنامه های ویندوز، در هنگام نصب 1C دو شی COM در سیستم ثبت می شود - سرور اتوماسیون و اتصال COM. هر دو شی را می توان با استفاده از زبانی که از فناوری COM پشتیبانی می کند کار کرد.

شیء Automation Server یک برنامه 1C است که تقریباً هیچ تفاوتی با یک برنامه مشتری معمولی ندارد. تفاوت این است که یک فرصت اضافی وجود دارد کنترل برنامهنمونه برنامه هنگام کار با یک شی COM Connector، نسخه سبک وزن برنامه 1C راه اندازی می شود که در آن فرم ها و همچنین عملکردها و روش های مربوط به رابط و جلوه های بصری در دسترس نیستند. خود برنامه در حالت "اتصال خارجی" شروع می شود. مقداردهی اولیه متغیرهای سراسری (به عنوان مثال، تعریف کاربر فعلیو تنظیمات آن) باید در ماژول اتصال خارجی 1C انجام شود. اگر در حالت اتصال خارجی، کد تابعی را فراخوانی کند که در این حالت موجود نیست، یک استثنا ایجاد می شود (که به اسکریپت پایتون ما ارسال می شود). فراخوانی به توابع ناامن باید با ساختارهای فرم قاب شود

#اگر یک OuterJoin نیست، پس هشدار ("سلام!")؛ #EndIf

از آنجایی که کار با اشیاء COM یک فناوری منحصراً مبتنی بر ویندوز است، تعجب آور نیست که در توزیع استاندارد پایتون گنجانده نشده است. شما باید یک برنامه افزودنی را نصب کنید - مجموعه ای از ماژول ها که تمام عملکردهای لازم را برای برنامه نویسی تحت ویندوز در پایتون فراهم می کند. می توان آن را به عنوان یک نصب کننده از پیش ساخته شده exe بارگیری کرد. خود افزونه دسترسی به رجیستری، خدمات، اشیاء ODBC، COM و غیره را فراهم می کند. به عنوان یک جایگزین، می‌توانید بلافاصله توزیع ActiveState Python را که با پسوند Win32 خارج از جعبه ارائه می‌شود، نصب کنید.

مدتی با یک اتصال COM در توسعه برنامه های کاربردی وب، به ویژه یک حساب شخصی آزمایش کردم. معایب زیر مشخص شد:

اتصال COM کند است. عملکرد پایین یکی از معایب شناخته شده فناوری COM است.
- فرآیند برقراری ارتباط با 1C، بسته به پیکربندی، می تواند از 1 تا 8 ثانیه طول بکشد (در مورد من - 6 ثانیه). نیازی به گفتن نیست، ایجاد یک اتصال برای هر درخواست منجر به بارگیری هر صفحه 8 ثانیه می شود.
- از آنجایی که برنامه های وب در پایتون به عنوان سرورهای مستقل کار می کنند، نقطه قبلی را می توان با ذخیره اتصال در یک متغیر سراسری و بازیابی آن در صورت بروز خطا جبران کرد. صادقانه بگویم، من هنوز به نحوه حفظ اتصال در PHP فکر نکرده ام.
- عملکرد چند پلتفرمی برنامه وب از بین رفته است.

بر اساس نکات ذکر شده در بالا، تصمیم گرفته شد که اصل تعامل را تغییر دهیم و آن را به 2 قسمت تقسیم کنیم - اولین بخش وابسته به پلت فرم (مبتنی بر پنجره)، آپلود داده های 1C در هر قالب مناسب و دوم، مستقل از پلت فرم، قادر به کار با داده ها بدون شک در مورد 1C در اصل.

استراتژی اقدام به شرح زیر است: اسکریپت پایتون به 1C متصل می شود، پرس و جوهای لازم را اجرا می کند و داده ها را در پایگاه داده SQLite آپلود می کند. می توانید از پایتون، پی اچ پی، جاوا به این پایگاه داده متصل شوید. اکثر پروژه‌های ما در پایتون کار می‌کنند و از آنجایی که من نمی‌توانم پرس و جوهای خام 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__" = "ingere=inger" True) account = Column(Unicode(32), index=True) code = Column(Unicode(32)) address = Column(Unicode(512)) fio = Column(Unicode(256)) source = Column(Unicode(16) ) psu = Column(Unicode(256)) tso = Column(Unicode(256)) np = Column(Unicode(256)) street = Column(یونیکد(256)) خانه = Column(Integer) Flat = Column(Integer) mro = Column(Unicode(256)) class Payment(Base): __tablename__ = "Payments" # و غیره...

اکنون فقط باید این ماژول را در هر پروژه پایتون وارد کنید و می توانید با داده ها کار کنید.

من سؤال شما را پیش بینی می کنم - "چرا SQLite"؟ دلیل اصلی این است که پایگاه داده فقط خواندنی است، بنابراین مشکلات نوشتن در SQLite نباید ما را نگران کند. ثانیا، فرمت این DBMS راحت است - برای مشاهده راحت تر است (بسیاری وجود دارد خدمات رایگان، از جمله یک پسوند فوق العاده برای فایرفاکس). ثالثاً، در برخی موارد لازم بود از ماشین هایی که به سرور MySQL اتصال ندارند، به مشترکین دسترسی پیدا کنید. در این صورت کافی است فایل دیتابیس SQLite را کپی کنید و این دستگاه به تمامی اطلاعات دسترسی خواهد داشت.

تخلیه بار یک بار در روز در شب انجام می شود. وارد کردن داده ها به 1C را می توان به همان روش خودکار کرد. به عنوان مثال، لازم است خوانش های باقی مانده توسط مشترکان را در وب سایت حساب شخصی ثبت کنید. در این مورد، ما دوباره به 1C متصل می شویم و سند "Act of Reading" را به صورت برنامه ای ایجاد و ارسال می کنیم. من کد زیر را ارائه خواهم کرد.

کار با اشیاء COM در پایتون کمی غیر معمول است. اولا، "Pythonicity" کد از بین رفته است - قوانین نامگذاری متغیرها و توابع در 1C، به بیان ملایم، با Zen of Python مطابقت ندارد. ثانیا، همه می دانند که اشیاء 1C اغلب با کاراکترهای سیریلیک نامگذاری می شوند، که در هنگام توسعه در پایتون مشکلاتی ایجاد می کند ... اما می توان آنها را حل کرد. پیشنهاد می کنم کد را ببینید:

Import 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").Connect(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()

سپس کد پایتون به سادگی با یک خطای نحوی خراب می شود. چه باید کرد؟ پیکربندی را ویرایش کنید؟ خیر، استفاده از روش getattr و setattr کافی است. با ارسال یک شی COM و نام سیریلیک ویژگی به این توابع، می توانید مقادیر را بر اساس آن دریافت و تنظیم کنید:

#coding=cp1251 catalog = getattr(V82.Catalogs، "Personal Accounts")

موارد زیر مهم است: نام جزئیات، و همچنین پارامترهای توابع و روش ها، باید در رمزگذاری cp1251 منتقل شوند. بنابراین، برای جلوگیری از سردرگمی با رمزگذاری ها از قبل، منطقی است که آن را در ابتدای فایل اعلام کنید: #coding=cp1251. سپس می توانید رشته ها را بدون نگرانی در مورد رمزگذاری آنها عبور دهید. ولی! تمام رشته های دریافت شده از 1C (نتایج فراخوانی توابع، پرس و جوها) در رمزگذاری UTF-8 خواهند بود.

نمونه ای از کدی که یک پرس و جو را در محیط 1C اجرا می کند، در نتیجه تکرار می شود و پایگاه داده را در SQLite ذخیره می کند:

#coding=cp1251 q = """ حساب های شخصی را انتخاب کنید. کد AS کد، حساب های شخصی. ساختمان. تسویه حساب. نام + "، " + حساب های شخصی. آدرس کوتاه AS، حساب های شخصی. مشترک. نام AS fio، حساب های شخصی. بخش. نام AS psu، EXPRESS (ویژگی‌های حساب‌های شخصی برش آخرین. فهرست ارزش به‌عنوان. سازمان‌های شبکه منطقه‌ای). نام AS tso، حساب‌های شخصی. ساختمان. نقطه جمعیت. نام AS np، حساب‌های شخصی. ساختمان. خیابان. نام خیابان AS، حساب‌های شخصی. ساختمان. خانه به‌عنوان خانه، حساب شخصی a. اتاق اصلی. اریستیک = VALUE(Directory.Types of Characteristics.Territorial Network Organization)) AS CharacteristicsL PersonalAccountsSliceLast نرم افزار PersonalAccounts.Link = CharacteristicsPersonalAccountsSliceLast.Object """ query = V82.Queryhoose",(Qexe)QueryOject. ) 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 = انتخاب. .street abonent.house = selection.house abonent.flat = selection.flat abonent.mro = selection.mro CONN.add(abonent) CONN.commit()

در اینجا CONN جلسه اتصال با پایگاه داده SQLite است. یک شی پرس و جو ایجاد می شود و متن آن پر می شود. همانطور که در بالا ذکر شد، متن درخواست باید در cp1251 باشد، که ابتدا کدگذاری برای آن اعلام شده است. پس از اجرای درخواست، تمامی مشترکین در پایگاه داده حذف می شوند تا موارد تکراری اضافه نشود، سپس در یک حلقه اضافه می شوند و commit نهایی انجام می شود.

هنگام کار با درخواست ها، قوانین زیر را کشف کردم.

هنگام انتخاب فیلدها، نام آنها را با حروف لاتین اختصاص دهید؛ دسترسی به آنها از طریق انتخابگر (نقطه) به جای getattr() بسیار راحت تر خواهد بود.
- فقط انواع داده های اولیه را انتخاب کنید: رشته ها، اعداد، تاریخ و بولی. هرگز پیوندهای یک شی (سند، کتاب مرجع) را انتخاب نکنید! در این زمینه، شما مطلقاً به پیوندها نیاز ندارید و حتی مضر هستند، زیرا هر تماسی به یک پایه پیوند یا روش منجر به درخواست از طریق اتصال COM می شود. اگر به ویژگی های پیوند در یک حلقه دسترسی داشته باشید، بسیار کند خواهد بود.
- اگر فیلدی از نوع Date را انتخاب کنید، به عنوان یک شی PyTime برگردانده می شود. این یک نوع داده ویژه برای انتقال تاریخ-زمان در یک اتصال COM است. کار با آن به اندازه تاریخ معمولی راحت نیست. اگر این شی را به int() ارسال کنید، یک timestamp برمی‌گرداند که می‌توانید با استفاده از متد fromtimestamp() datetime را دریافت کنید.

حال بیایید نحوه تشکیل اسناد چاپی را بررسی کنیم. واقعیت این است که باید به مصرف کننده فرصت داده شود تا اسناد از پیش آماده شده را دانلود کند، به عنوان مثال، رسید پرداخت یا گزارش تطبیق. این اسناد در 1C مطابق با الزامات تعیین شده تولید می شوند؛ پیاده سازی آنها در پایتون زمان زیادی را می طلبد. بنابراین، بهتر است اسناد را در 1C تولید کرده و در آن ذخیره کنید فرمت اکسل.

بنابراین، سند قانون آشتی توسط یک خاص تولید می شود پردازش خارجی. برای کسانی که با اصطلاحات 1C آشنایی ندارند: پردازش یک برنامه مستقل است که دارای ماژول، فرم ها، قالب های خاص خود است که برای اجرا در محیط 1C طراحی شده است. لازم است پردازش را مقداردهی اولیه کنید، جزئیات آن را پر کنید و تابعی را فراخوانی کنید که یک سند صفحه گسترده را که برای مشاهده در 1C در نظر گرفته شده است به ما بازگرداند. این سند باید با فرمت اکسل ذخیره شده و در سرور کپی شود یا در پایگاه داده ثبت شود.

پیوند = getattr(V82.کاتالوگ‌ها، "گزارش‌های سیستم").FindByDescription("گزارش آشتی الن") nav_url = V82.GetURL(پیوند، "گزارش") نام = V82.ExternalReports.Connect(nav_url) ExternalReport = V82.ExternalReports.x ایجاد (نام) setattr(ExternalReport، "PersonalAccount"، مرجع) table_doc = ExternalReport.GetDoc() مسیر = V82.GetTempFileName("xls") table_doc.Write(path, V82 .SpreadsheetDocumentFile report = modelsport.XLS) گزارش .account = reference.Code.strip() report.type = u"act" report.document = open(path, "rb").read() CONN.add(گزارش)

قطعه بالا کارهای زیر را انجام می دهد: پردازشی که سند را ایجاد می کند متصل است. پردازش می تواند در پیکربندی ساخته شود، روی دیسک یا در پایگاه داده 1C (در برخی دایرکتوری ها) ذخیره شود. از آنجایی که پردازش مرتباً تغییر می کند، برای اینکه پیکربندی هر بار به روز نشود، پردازشی که اغلب در حال تغییر است در فهرست "گزارش های سیستم"، در یک ویژگی "ذخیره سازی مقدار" به نام گزارش ذخیره می شود. پردازش را می توان با تخلیه آن از پایگاه داده به دیسک و بارگذاری آن، یا با استفاده از متد GetURL() که باید پیوندی به عنصر دایرکتوری و نام ویژگی ارسال کنید، مقداردهی اولیه کرد. مقادیر جزئیات را به شی پردازشی دریافتی اختصاص می دهیم، تابع صادر شده (GetDoc) را فراخوانی می کنیم و یک سند صفحه گسترده دریافت می کنیم که در یک فایل اکسل موقت ذخیره می شود. محتویات این فایل در پایگاه داده SQlite نوشته شده است.

آخرین چیزی که باید در نظر گرفته شود، ورود برنامه ای داده ها به 1C است. بیایید فرض کنیم که باید شهادت مشترکین را وارد کنید. برای انجام این کار، کافی است سند "عمل گرفتن شهادت" را ایجاد و اجرا کنید:

#coding=cp1251 acts = getattr(V82.Documents, "Act of Testimony") act = acts.CreateDocument() setattr(act, "Testimony", 1024.23) setattr(act, "Subscriber", "Ivanov") # Filling در جزئیات دیگر ... act.Write()
ورود داده ها در حال حاضر خودکار است.

بنابراین، من روشی را بیان کردم که مبتنی بر آپلود و دانلود برنامه‌ای داده‌ها با استفاده از اتصال COM است. این روش تقریباً یک سال است که در سازمان من با موفقیت عمل می کند. پایگاه داده که از 1C تشکیل شده است، به 3 سیستم پرداخت، خرید اینترنتی (پرداخت با کارت از طریق اینترنت) و همچنین یک حساب شخصی خدمات می دهد. علاوه بر این، آنها به پایگاه داده متصل می شوند اسکریپت های مختلفبرای خودکار کردن روال

علیرغم کاستی های روش (سرعت کم اتصال COM)، به طور کلی پایدار عمل می کند. ما داده هایی به شکل مستقل از پلتفرم (SQLite) داریم که می توان با هر زبانی با آن کار کرد. و قسمت اصلی کد به زبان پایتون نوشته شده است، به این معنی که ابزارها و تکنیک های زیادی در دسترس هستند که حتی نمی توانید در 1C رویای آنها را ببینید.

این یکی از راه های ممکنتعامل با 1C. من مطمئن هستم که جدید نیست و احتمالا قبلاً توسط کسی تست و بهینه شده است. با این حال، سعی کردم تا حد امکان جزئیات بیشتری را از این روند ارائه دهم تا شما را از دام هایی که خودم در آن قدم گذاشته ام محافظت کنم.

برای همه شما آرزوی موفقیت دارم و به یاد داشته باشید که 1C آنقدرها هم که تصور می شود ترسناک نیست!

یکی از گزینه های تبادل داده بین پایگاه های داده 1C تبادل از طریق اتصال COM است.

با استفاده از اتصال COM، می توانید از یک پایگاه داده 1C به پایگاه داده دیگری متصل شوید و داده ها را بخوانید یا بنویسید. این روش را می توان هم در نسخه های سرویس گیرنده-سرور پایگاه های داده و هم در پایگاه های داده فایل استفاده کرد. در این مقاله به نمونه هایی از این نوع اتصال می پردازیم. نمونه ها از پلتفرم 8.2 استفاده می کنند.

شما می توانید دو نوع شی COM برای برنامه 1C ایجاد کنید. این V82.Applicationو V82.COMConnector. در صورت V82.Applicationیک نسخه تقریباً کامل از برنامه 1C راه اندازی شد. در صورت استفاده V82.COMConnectorیک بخش کوچک سرور راه اندازی شد.
سرعت عمل در این مورد بالاتر است، اما برخی از عملکردها ممکن است در دسترس نباشند. به طور خاص، کار با فرم ها و ماژول های رایج که خاصیت کار با اتصالات خارجی برای آنها تنظیم نشده است. بیشتر شما باید استفاده کنید V82.COMConnectorو فقط در صورت عدم عملکرد V82.Application. تفاوت در سرعت عملیات می تواند به ویژه در پایگاه های داده با حجم زیاد قابل توجه باشد.

پس بیایید شروع کنیم

  1. بیایید یک شی COM ایجاد کنیم
    • برای V82.Applicationاتصال = COMObject جدید ("V82.Application") ;
    • برای V82.COMConnectorاتصال = COMObject جدید ("V82.COMConnector");
  2. بیایید یک رشته اتصال ایجاد کنیم
    • برای نسخه سرور پایگاه داده ConnectionString = "Srvr = " "ServerName" ";Ref = " "BaseName" ;
    • برای نسخه فایل پایگاه داده ConnectionString = "File = " "PathKBase" "؛ Usr = نام کاربری؛ Pwd = رمز عبور";
  3. اتصال به پایگاه دادهتلاش اتصال = اتصال. اتصال (ConnectionString)؛ Exception Message = New MessageToUser; پیام. متن = + ErrorDescription() ; پیام. برای گزارش () ; پایان تلاش ;
  4. قطع ارتباط از پایگاه دادهاتصال = تعریف نشده

    برای شی V82.Applicationلازم است اتصال را قطع کنید، در غیر این صورت یک جلسه ناقص باقی می ماند که سپس باید به صورت دستی حذف شود. در صورت V82.COMConnectorهنگامی که رویه ای که در آن اتصال برقرار شد، اتصال به طور خودکار قطع می شود و یک نکته کوچک دیگر وجود دارد.

    برای کاربری که تحت آن اتصال برقرار می شود، چک باکس "درخواست تایید هنگام بستن برنامه" باید در تنظیمات آن غیرفعال باشد.

حالا بیایید همه کدها را کنار هم بگذاریم

اتصال = COMObject جدید ("V82.Application") ; //Connection = New COMObject("V82.COMConnector"); ConnectionString = "Srvr = " "Server1C" ";Ref = " "MyBase" "; Usr = Petya; Pwd = 123" ; //ConnectionString = "File = ""С:\MyBase""؛ Usr = Petya؛ Pwd = 123";تلاش اتصال = اتصال. اتصال (ConnectionString)؛ Exception Message = New MessageToUser; پیام. متن = "نمی توان به پایگاه داده متصل شد"+ DescriptionError() ; پیام. برای گزارش () ; پایان تلاش ; اتصال = تعریف نشده

برای نوع اتصال V82.Applicationاین روش برای شی COM که در ابتدا ایجاد شده بود و برای استفاده می شود V82.COMConnectorروش برای اتصال اعمال می شود. کار بیشتر با درخواست ادامه می یابد به معنی استاندارد 1C. در کد به شکل زیر است:

درخواست = اتصال. NewObject("درخواست") ; // برای V82.COMConnector درخواست = اتصال. NewObject("درخواست") ; // برای V82.Application درخواست. متن = "انتخاب کنید | موقعیت های سازمان ها. کد، | موقعیت های سازمان ها. نام|از | فهرست پست های سازمان ها به عنوان موقعیت های سازمان ها"; نتیجه = درخواست اجرا کن()؛ نمونه = نتیجه انتخاب کنید() ؛ انتخاب خداحافظ. Next() Loop EndLoop ;

برای نسخه 1C: Enterprise 8.3 همه چیز بدون تغییر باقی می ماند به جز اینکه هنگام ایجاد اشیاء COM باید از آن استفاده کنید "V83.COMConnector"یا "V83.Application".

) درست است

در عین حال، من بیش از یک بار دیده ام که نشریاتی که حتی به 10 امتیاز هم نرسیده اند، به سادگی "برگشتند".
چرا این اتفاق افتاد؟ ظاهراً به این دلیل که کسی به وضوح آنها را دوست داشته است.


این همان چیزی است که من می گویم، که خوب است بدون خواندن مقاله رتبه بندی بفهمید چقدر به آن نیاز دارید، یا آن را نه چندان ابتدایی +/- ارزیابی کنید. در مورد آنچه که دوست داشتم، من آن را به این صورت تصحیح می کنم: به دلیل این واقعیت است که ستاره ها در یک راستا قرار گرفتند و افراد زیادی در سایت جمع شدند و بسیاری آن را پسندیدند، شما خودتان متوجه می شوید که این موضوع شانسی است زیرا به محض خروج مقاله صفحه نخستپس از آن می توان آن را در حال حاضر تنها با درخواست پیدا کرد، و بنابراین هرکسی که از طریق رای عبور می کند. و تا جایی که من متوجه شدم نظرات ثابت = تبلیغ مقاله به شما امکان می دهد آن را در صفحه اصلی نگه دارید.
دقیقاً به همین دلیل است که آنها مغازه ها را در خیابان های عمومی می گذارند - بالاخره آنچه اغلب مهم است کیفیت و ارتباط کالاها نیست، بلکه قابل تردد بودن مکان است؛ مردمی که پیاده روی می کنند اغلب چیزی می خرند که روز بعد آن را دور می اندازند. به خاطر فرآیند این یک بیماری است که مدتهاست برای همه شناخته شده است - اعتیاد به خرید. یا به سادگی افزایش جریان، احتمال خرید مناسب را افزایش می دهد.

و جوانب مثبت و منفی ... - این فقط یک نوع "متشکرم" برای زمان و کار صرف شده است


آن ها آیا منهای نیز به عنوان "متشکرم" به حساب می آید؟ میخواستم نظرتون رو بدونم که آیا در اینجور مواقع باید ازش استفاده کرد و نظر بقیه چقدر جالبه؟ آیا باید آن را زمانی قرار دهید که مقاله مضر/بد است یا زمانی که برای شما به سادگی بی فایده/خالی است؟
به نظر من، مقاله به نظر یک افزایش رتبه ساده است، زیرا:
1. مشکل انواعی که ذکر کردم توسط نویسنده کاملاً نادیده گرفته شد، اگرچه او برای نوشتن یک دسته نظر تنبلی نداشت.
2. یک نادرستی آشکار در مقاله وجود دارد: می گویند این تنها راه است

V82 = COMObject جدید ("V82.ComConnector"); کد = AccountCOM.Code;


اما من به راحتی می توانم آن را با استفاده از پردازش مانند زیر انجام دهم:

گزارش (پایه. دایرکتوری ها. طرفین. یافتن بر اساس نام ("LLC"). کد);


و همه چیز خوب است! و من اتصال V82.ComConnector را انتخاب می کنم
به نوعی عجیب است که نویسنده اصلاً اهمیتی نمی دهد که مقاله اش حاوی مشکلاتی است که به آنها اشاره شد، اما به هیچ وجه واکنشی نشان نمی دهد.
3. اما وقتی خطای «Class does not exist» ظاهر می شود، همچنان مشکل وجود دارد
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، باید یک رشته از پارامترها ایجاد کنید. بسته به نوع امنیت اطلاعات، متفاوت خواهد بود ظاهر. با استفاده از رشته دریافتی، یک اتصال ایجاد می شود که با کمک آن می توانید داده ها را از پایگاه داده دیگری برای تجزیه و تحلیل و پردازش با استفاده از هر روشی جمع آوری کنید.

Connection ParametersFileIB = "File=""Path_to_database""; Usr=""User_name"";Pwd=""Password"""; Connection ParametersClientServerIB = "Srvr=""Server_Name""; Ref=""Database_Name""; Usr=""User_Name""; Pwd=""Password""";

عملکرد اتصال ساده است و اگر همه پارامترها به درستی مشخص شده باشند، نباید سؤالی ایجاد کند. برای سرعت بخشیدن به اشکال زدایی و تجزیه و تحلیل خطاهای احتمالیبهتر است اتصال را در ساختار "Try" محصور کنید. تابع مقداری از نوع "COM object" را برمی گرداند که با آن برای به دست آوردن داده های لازم کار خواهید کرد.

&OnServer Function ConnectToBase() exportConnectionIB Parameters = "File=""E:\1c database\ERP""; Usr=""Administrator"";Pwd=""1"""; V83COMCon= COMObject جدید ("V83.COMConnector"); تلاش برای بازگشت V83COMCon.Connect (پارامترهای اتصال IB); گزارش استثنا (ErrorDescription()); بازگشت تعریف نشده؛ EndAttempt; EndFunction

از طریق یک اتصال COM نه تنها می توانید داده ها را انتخاب کنید، بلکه آنها را به پایگاه داده ای که به آن متصل می شوید نیز اضافه کنید. به یاد داشته باشید که ما می توانیم 4 نوع داده اولیه را از طریق یک شی COM انتقال دهیم. انواع دیگر باید با استفاده از توابع جستجوی داخلی پلت فرم مشخص شوند. لطفاً توجه داشته باشید که توابع پلتفرم جهانی نیز از طریق یک اتصال COM فراخوانی می شوند.

ما داده ها را از پایگاه داده 1C دریافت می کنیم

پس از دریافت شی مورد نظر، باید داده ها را از پایگاه داده دیگری بخوانید. برای انجام این کار، از یک درخواست از طریق اتصال COM در 1C 8.3 با استفاده از مقدار دریافت شده از نوع "COM object" از تابع استفاده می کنیم. مهم است که ابتدا به پایگاه داده متصل شوید و سپس درخواست را اجرا کنید. اجرا از طریق روش NewObject انجام می شود و نوع شی را به صورت رشته ای به عنوان پارامتر - "Request" مشخص می کند.

رویه &روی سرور TestCOMOnServer() اتصال = ConnectToBase(); اگر TypeValue(Connection) Type("Undefined") سپس RequestBPZO = Connection.NewObject("Request"); RequestBPZO.Text = "انتخاب اول 15 | DirectoryUser.Name به عنوان نام |FROM | Directory.users AS DirectoryUser"; Select = RequestBPZO.Execute().select(); در حالی که Selection.next() حلقه گزارش (Selection.Number); چرخه پایان endIf; پایان رویه >

به عنوان مثال، برای به دست آوردن اطلاعات در مورد کاربران یک بخش خاص، از طریق پارامترها در درخواست شرط می گذاریم. یک پارامتر از نوع ساده خواهد بود - یک رشته، و تقسیم یک پیوند به عنصر دایرکتوری "ساختار سازمانی" خواهد بود. نتیجه پرس و جو جدولی با فیلدهای فهرست شده از نوع موجود در پایگاه داده ای است که اتصال COM به آن رخ داده است. اگر نیاز به تبدیل آنها به انواع دیگر دارید، از توابع پلت فرم استاندارد استفاده کنید:

  • خط ();
  • عدد()؛
  • تاریخ().
RequestBPZO = Connection.NewObject("درخواست"); RequestBPZO.Text = "اولین 15 را انتخاب کنید | DirectoryUser.Name به عنوان نام | FROM | Directory.Users AS DirectoryUser I WHERE | DirectoryUser.Department = &RequiredDepartment | و DirectoryUser.Name مانند ""%"" + &RequiredName"+ "%""" درخواست BPZO.SetParameter("بخش مورد نیاز"، اتصال. دایرکتوری ها. ساختار سازمانی. یافتن با کد ("00-000023")); RequestBPZO.SetParameter("RequiredName","Ekaterina"); Select = RequestBPZO.Execute().select(); در حالی که Selection.next() حلقه گزارش (Selection.Name); چرخه پایان

اگر نیاز به انتقال یک آرایه به پایگاه داده برای انتخاب بر اساس چندین پارامتر، به عنوان مثال، بخش ها دارید، از دستور NewObject نیز استفاده می شود. به طور مشابه، می‌توانید فهرست یا جدولی از مقادیر را ارسال کنید و آنها را با عناصر پایگاه داده دیگری از طریق یک اتصال پر کنید. تمام روش های موجود از اشیاء و مکانیسم های پلت فرم برای جستجو در دسترس شما هستند.

RequestBPZO = Connection.NewObject.("درخواست"); RequestBPZO.Text = "اولین 15 را انتخاب کنید | DirectoryUser.Name به عنوان نام | FROM | Directory.Users AS DirectoryUser I WHERE | DirectoryUser.Department B (&NecessaryDepartment) | و DirectoryUser.Name مانند ""%""""""""%" "؛ Array of Departments = Connection.NewObject("Array"); Array of Departments.Add(Connection.Directories.Enterprise Structure.Find By Code("00-000023")); Array of Departments.Add(Connection.Directories.Enterprise Structure.Find By Code("00-000038")); Array of Departments.Add(Connection.Directories.Enterprise Structure.Find By Code("00-000046")); درخواست BPZO.SetParameter("Required Department", Array of Departments); RequestBPZO.SetParameter("RequiredName","Ekaterina"); Select = RequestBPZO.Execute().select(); در حالی که Selection.next() حلقه گزارش (Selection.Name); چرخه پایان

هنگام انتقال اسناد یا عناصر دایرکتوری، همیشه مسئله کنترل انتقال یک شی خاص مطرح می شود. با کمک اتصالات COM، چنین مشکلاتی را می توان از طریق یک شناسه منحصر به فرد حل کرد. شما باید با استفاده از تابع "GetLink" و با استفاده از شناسه به عنوان رشته، یک شی را در پایگاه داده افزونه با شناسه از امنیت اطلاعات فعلی پیدا کنید. اگر یکی پیدا نشد، می توانید آن را با استفاده از اتصال COM ایجاد کنید.

StrIdent = String(Directories.Users.FindByCode("00-0000313").UniqueIdentifier()); اگر NOT ValueFilled(Connection.Directories.Users.GetLink(Connection.NewObject("UniqueIdentifier", StrIdent))) سپس NewUser = Connection.Directories.Users.CreateItem(); NewUser.Name = Directories.Users.FindByCode("00-0000313").Name; NewUser.Individual = Directories.Users.FindByCode("00-0000313").Individual; NewUser.Write(); endIf;

همچنین، یک اتصال COM حق استفاده از رویه ها و عملکردهای ماژول های رایج 1C را با فعال بودن ویژگی "اتصال خارجی" دارد. علاوه بر این شرط، تابع یا رویه فراخوانده شده باید Export باشد و شامل اقدامات تعاملی انجام شده روی سرور نباشد. در غیر این صورت، خطای نامعتبر بودن عملیات را مشاهده خواهید کرد.

ترکیب..؛ VariableFunction = اتصال..; فراخوانی تابع> نام ماژول عمومی> فراخوانی رویه> نام ماژول عمومی>

امکانات اتصال خارجی با پایگاه داده دیگر در 1C بسیار گسترده است و می تواند به شما امکان انجام کارهای زیادی را بدهد. مهم است که بتوانید ابزارها را به درستی ارزیابی کرده و انتخاب کنید راه حل بهینه. در بیشتر موارد، این مهارت تنها با تجربه یا با مطالعه نمونه هایی از کار متخصصان با تجربه ظاهر می شود.