نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی پرتال اطلاعاتی

رشته اتصال به 1c 8.3. سه رکن کار با اشیاء COM

سلام هابراوچان ها

در این مقاله، می خواهم در مورد چگونگی ایجاد یکپارچگی با پلتفرم 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 انجام شود. اگر در حالت اتصال خارجی در کد تابعی فراخوانی شود که در این حالت در دسترس نباشد، یک استثنا مطرح می شود (که به اسکریپت پایتون ما ارسال می شود). فراخوانی توابع ناامن باید با ساختارهایی مانند احاطه شوند

# اگر OuterConnection نیست، سپس هشدار ("سلام!")؛ #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, LargeB, ForeignKey Base = declarative_base () class Abonent (Base): __tablename__ = "idger ==abonents_lum" درست) حساب = ستون (یونیکد (32)، فهرست = درست) کد = ستون (یونیکد (32)) آدرس = ستون (یونیکد (512)) فیو = ستون (یونیکد (256)) منبع = ستون (یونیکد (16) ) psu = ستون (یونیکد (256)) tso = ستون (یونیکد (256)) np = ستون (یونیکد (256)) خیابان = ستون (یونیکد (256)) خانه = ستون (عدد صحیح) تخت = ستون (عدد صحیح) mro = ستون (یونیکد (256)) کلاس پرداخت (پایه): __tablename__ = "پرداخت ها" # و غیره ...

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

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

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

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

Import pythoncom import 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)

همانطور که از کد می بینید، کلاینت برای کار با 1C مقداردهی اولیه می شود. تعریف یک شی COM "V82.COMConnector" نامیده می شود. لطفا توجه داشته باشید که این نام برای پلتفرم V8.2 معتبر است، اگر نسخه 8.1 را دارید، نام "V81.COMConnector" خواهد بود.

در یک کلاینت اولیه، متد Connect () را فراخوانی می کنیم و یک رشته اتصال به آن ارسال می کنیم. رشته شامل نام سرور، پایه، کاربر و رمز عبور است. شی V82 حاصل، اتصال با برنامه 1C را ذخیره می کند. این روش Disconnect () یا هر چیزی شبیه آن را ندارد. برای قطع ارتباط از پایه کافی است با استفاده از تابع del () شی را از حافظه حذف کنید یا به متغیر None نسبت دهید.

با داشتن یک شی، می توانید به هر فیلد و روشی از زمینه جهانی 1C دسترسی داشته باشید، با اشیاء جهانی مانند TabularDocument، ValuesTable و غیره کار کنید. توجه به این نکته مهم است که هنگام کار از طریق اتصال COM، 1C در حالت "اتصال خارجی" عمل می کند. هیچ گونه عملکردی برای کار تعاملی در آن موجود نیست، به عنوان مثال، گفتگوهای پاپ آپ، اعلان ها، و مهمتر از همه، فرم ها. من مطمئن هستم که شما بیش از یک بار توسعه دهندگان پیکربندی را نفرین خواهید کرد که مهمترین عملکرد را در رویه Button1Click () در ماژول فرم سند قرار داده اند.

بیایید در مورد چیز مهمی به عنوان ویژگی های سیریلیک صحبت کنیم. علیرغم این واقعیت که 1C یک محیط دو زبانه است و برای هر روش روسی یک آنالوگ به زبان انگلیسی وجود دارد، دیر یا زود باید به ویژگی سیریلیک روی آورد. اگر در زبان های PHP یا VBSCript این مشکلی ایجاد نمی کند،

Set Con = CreateObject ("v81.COMConnector") Set v8 = Con.Connect ("ConnectionString") Set AccountsManager = v8.Documents.Invoices .... Set AccountsRecord = AccountsManager.CreateElement () AccountsRecord ....Contractor .... AccountsWrite.Write ()

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

# کدگذاری = cp1251 کاتالوگ = getattr (V82.کاتالوگ ها، "حساب های شخصی")

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

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

# coding = cp1251 q = "" "انتخاب PersonalAccounts.Code AS کد، PersonalAccounts.Structure.PopulatedPart.Name +"، "+ PersonalAccounts. آدرس کوتاه AS، PersonalAccounts. یک مشترک. نام AS fio، PersonalAccounts. بخش CA .Number EXPRESS (CharacteristicsPersonalAccountsSliceLast.Value AS Directory.TerritoriallyNetworkOrganizations) نام AS mro FROM Directory.PersonalAccounts AS PersonalAccounts LEFT JOIN Data Register.CharacteristicsPersonalAccounts.CutLast (، TypeCharacteristics = VALUE (Directory.TypesCharacteristics. = V82.NewObject "Query"، q) selection = query.Execute (). انتخاب کنید () 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.خانه abonent.flat = selection.flat abonent.mro = selection.mro CONN.add (abonent) CONN.commit ()

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

هنگام کار با پرس و جوها، قوانین زیر را پیدا کردم.

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

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

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

پیوند = getattr (V82.Catalogs، "SystemReports"). FindByDescription ("قانون آشتی الین") nav_url = V82.GetURL (پیوند، "گزارش") نام = V82.ExternalReports.Connect (nav_url) ExternalReport = V82Report.CxE. (نام) setattr (گزارش خارجی، "حساب شخصی"، مرجع) table_doc = ExternalReport.GetDoc () مسیر = V82.GetTempFileName ("xls") table_doc.Write (مسیر، V82 .SpreadsheetDocumentFileType.XLS) گزارش = models گزارش .account = reference.Code.strip () report.type = u "act" report.document = باز (مسیر، "rb"). خواندن () CONN.add (گزارش)

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

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

# coding = cp1251 acts = getattr (V82. Documents, "Acceptance Act") act = acts.CreateDocument () setattr (act, "Indication", 1024.23) setattr (act, "Subscriber", "Ivanov") # پر کردن موارد دیگر جزئیات ... عمل کنید. بنویسید ()
اکنون ورود داده ها به صورت خودکار انجام می شود.

بنابراین، من روشی را بیان کرده‌ام که مبتنی بر تخلیه و بارگیری داده‌ها با استفاده از اتصال 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 = "Path to Base" "؛ Usr = نام کاربری؛ Pwd = رمز عبور";
  3. ما به پایه متصل می شویمتلاش برای اتصال = اتصال. اتصال (ConnectionString)؛ پیام استثنا = پیام جدید به کاربر. پیام. متن = + توضیحات خطاها (); پیام. برای گزارش () ; پایان تلاش;
  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)؛ پیام استثنا = پیام جدید به کاربر. پیام. متن = "اتصال به پایگاه داده ناموفق بود"+ توضیحات خطاها (); پیام. برای گزارش () ; پایان تلاش; اتصال = تعریف نشده.

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

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

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

چاپ (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");

رشته اتصال

// برای گزینه مشتری-سرور
StringConnection= "Srvr =" "ServerName" "; Ref =" "BaseName";
// برای گزینه حالت فایل:
StringConnection= "پرونده =" "مسیر به پایگاه" "؛ Usr = نام کاربری; Pwd = رمز عبور ";
تلاش
اتصال = اتصال ... اتصال(ConnectionString)؛
یک استثنا
پیام = پیام جدید به کاربر.
پیام ... متن = "وصل نشدن به پایه" + خطاهای توضیحات (); پیام ... برای گزارش ();
پایان تلاش;

قطع شدن

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

روش NewObject ().

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

برای V83.COMConnector

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

WidCOM = Connection.NewObject

برای V83.Application

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

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

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

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

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

EnumerationElement = Connection.Directories.Directory1.FindByCode (1) .Props1;

PossibleValues ​​= EnumerationElement.Metadata (). EnumerationValues;

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

اگر EnumerationElementNumber = 0 سپس گزارش دهید ( "EnumerationValue1");

ElseIf EnumerationElementNumber = 1 سپسگزارش ("EnumerationValue2")؛

EndIf

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

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

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

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

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

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

WidCOM = Connection.NewObject("UniqueIdentifier"، StringUID)؛
ReferenceById = Connection.Dokumenty [DocumentName] .GetLink (UidCOM);

مقالات مرتبط برتر