زنگ

کسانی هستند که این خبر را قبل از شما می خوانند.
برای دریافت آخرین مقالات مشترک شوید.
پست الکترونیک
نام
نام خانوادگی
چگونه می خواهید The Bell را بخوانید
بدون اسپم

برای تبادل اطلاعات بین دو infobase بدون بارگذاری خارجی و تعویض پرونده ها ، چیزی بهتر از اتصال COM وجود ندارد. و بحث با این کار دشوار است ، زیرا استفاده از این نوع اتصال کاملاً ساده و پایدار است. اما در و در این مکانیسم یک تنگنا و مکان ناخوشایند وجود دارد - زمان برقراری ارتباط با پایگاه دیگر. در بعضی موارد ، می تواند به مقادیر زیادی به اندازه کافی برسد ، یعنی خیلی طولانی باش

موضوع چیه؟

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

تجزیه و تحلیل عملکرد

بیایید از خود بپرسیم که آیا به هیچ وجه حافظه پنهان کردن اتصالات ضروری است یا خیر ، آیا این محصول با کاربری فشرده و دارای ارتباط COM حاصلخیز خواهد بود. بیایید زمان اتصال را با پیکربندی 20 KB اندازه بگیریم.

می بینیم که اتصال به یک پایگاه داده کوچک 3.5 ثانیه طول کشید. هنگام اتصال به یک پایگاه داده بزرگتر ، زمان چندین بار افزایش می یابد.

هنگام ذخیره یک اتصال پشتیبانی شده ، این مراحل چندین سفارش از زمان کمتری می گیرد.

چگونه ارتباط COM خود را فعال نگه داریم؟

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

این ملاحظات منجر به این واقعیت می شود که ذخیره سازی فقط در برخی متغیرها روی مشتری امکان پذیر است. بیایید یک گزینه فرم مدیریت شده را در نظر بگیریم. لازم است در قالب یک متغیر با دستور & OnClient ، ابتدا مقادیر اتصال را ذخیره کنید. بر این اساس ، شما می توانید این اتصال را فقط بر روی مشتری فراخوانی کنید ، زیرا نمی توانید یک شی COM را از مشتری به سرور منتقل کنید. برای فرم های منظم ، جدایی بین سرور و مشتری وجود ندارد و این مکانیسم حتی ساده تر می شود. به خاطر داشته باشید که قبل از بستن فرم مورد استفاده خود ، برای جلوگیری از نشت حافظه ، از هم جدا شوید.

به جای خروجی

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

مقاله بعدی راهی بهتر برای رفع این مشکلات (اتصال از طریق خدمات وب) خواهد داشت.

چاپ (Ctrl + P)

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

ارتباط کام

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

اتصال OLE برقرار کنید

اتصال \u003d COMObject جدید ("V83.Application")؛

اتصال COM برقرار کنید

اتصال \u003d COMObject جدید ("V83.COMConnector")؛

رشته اتصال

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

شکستن اتصال

اتصال \u003d نامشخص؛
برای جسم V83. برنامه خاتمه اتصال ضروری است ، در غیر این صورت جلسه ناتمام حلق آویز خواهد ماند ، که پس از آن باید به صورت دستی حذف شود. در صورت V83.COM کانکتور در پایان روشی که در آن برقرار شده است اتصال به طور خودکار خاتمه می یابد و یک نکته کوچک دیگر وجود دارد. برای کاربری که اتصال در آن ایجاد شده است ، باید کادر انتخاب "درخواست تأیید هنگام بستن برنامه" در تنظیمات آن غیرفعال شود.

روش NewObject ()

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

برای V83.COM کانکتور

RequestCOM \u003d اتصال. NewObject ( "درخواست ") ;
TableCOM \u003d اتصال. NewObject ( "جدول ارزشها") ;
ArrayCOM \u003d اتصال. NewObject ("Array")؛

WidCOM \u003d Connection.NewObject

برای V83. برنامه

درخواست کنید \u003d اتصال. NewObject (" درخواست ") ;
جدول OLE \u003d اتصال. NewObject("جدول ارزشها") ;
ArrayOLE \u003d اتصال.NewObject("آرایه")؛
WidCOM \u003d Connection.NewObject("UniqueIdentifier" ، StringUID)؛

RequestCOM ... متن \u003d"انتخاب کنید
| مواضع سازمانها. کد ،
| مواضع سازمانها.
| از | دایرکتوری. مواضع سازمانها
مواضع سازمانها ";

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

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

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

EnumerationElement \u003d Connection.Directories.Directory1.FindByCode (1) .Props1؛

PossibleValues \u200b\u200b\u003d EnumerationElement.Metadata (). EnumerationValues؛

EnumerationElementNumber \u003d PossibleValues.Index (PossibleValues.Find (Connection.XMLString (EnumerationElement)))؛

اگر EnumItemNumber \u003d 0 سپس گزارش دهید ( "EnumerationValue1");

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

EndIf؛

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

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

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

StringUID \u003d Connection.string ( DocumentCOM.UniqueIdentifier())

ID \u003d U جدید uniqueID (StringUID);
از جانب linkById \u003d اسناد [DocumentName] .GetLink (ID)؛

اگر شما نیاز به یافتن یک موضوع کام به وسیله سند توسط شناسه دارید ، پس باید اینگونه بنویسید:

WidCOM \u003d اتصال.NewObject("UniqueIdentifier" ، StringUID)؛
ReferenceById \u003d Connection.Dokumenty [DocumentName] .GetLink (UIDCOM)؛

سلام حبراچان!

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

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


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

ابتدا داده هایی را که با آنها کار خواهیم کرد بیان می کنم. این سازمان - یک شرکت فروش انرژی در منطقه خاور دور - تقریباً 400000 مشترکین ، پایه 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 سپس هشدار ("سلام!")؛ # انتهای

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

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

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

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

استراتژی عمل به شرح زیر است: اسکریپت پایتون به 1C متصل می شود ، نمایش داده شدگان لازم را اجرا می کند و داده ها را در پایگاه داده SQLite بارگذاری می کند. شما می توانید از طریق Python ، PHP ، Java به این پایگاه داده وصل شوید. بسیاری از پروژه های ما در پایتون کار می کنند ، و از آنجا که نمی توانم نوشتن نمایش داده های SQL خام با دست را تحمل کنم ، تمام کار با بانک اطلاعاتی SQLite از طریق ORQ SQLAlchemy انجام می شود. فقط توصیف ساختار داده بانک اطلاعاتی به سبک اعلانی ضروری بود:

از sqlalchemy.ext.declarative واردات deklarative_base از واردات sqlalchemy ستون ، علاقه ، عددی ، DateTime ، یونیکد ، بولی ، LargeB ، ForeignKey Base \u003d کلاس اعلان کننده (پایگاه): پایه (پایه): __tablename__ \u003d "abonent" id \u003d ستون (اصلی) درست) حساب \u003d ستون (یونیکد (32) ، فهرست \u003d صحیح) کد \u003d ستون (یونیکد (32)) آدرس \u003d ستون (یونیکد (512)) fio \u003d ستون (یونیکد (256)) منبع \u003d ستون (یونیکد (16) ) psu \u003d ستون (یونیکد (256)) tso \u003d ستون (یونیکد (256)) np \u003d ستون (یونیکد (256)) خیابان \u003d ستون (یونیکد (256)) خانه \u003d ستون (علاقه) مسطح \u003d ستون (علاقه) mro \u003d ستون (یونیکد (256)) کلاس پرداخت (پایه): __tablename__ \u003d "پرداخت" # و غیره ...

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

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

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

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

واردات pythoncom را وارد کنید win32com.client V82_CONN_STRING \u003d "Srvr \u003d v8_server؛ Ref \u003d v8_db؛ Usr \u003d نام کاربری؛ Pwd \u003d megapass؛" pythoncom.CoInitialize () V82 \u003d win32com.client.Dispatch ("V82.COMConnector"). اتصال (V82_CONN_STRING)

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

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

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

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

تنظیم Con \u003d CreateObject ("v81.COMConnector") تنظیم v8 \u003d Con.Connect ("ConnectionString") مجموعه AccountsManager \u003d v8.Document.Invoices .... تنظیم AccountsRecord \u003d AccountsManager.CreateElement () AccountsRecord.Contractor \u003d ... .... AccountsWrite.Write ()

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

# برنامه نویسی \u003d cp1251 فروشگاه \u003d getattr (V82.Catalogs ، "حساب های شخصی")

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

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

# coding \u003d cp1251 q \u003d "" "SELECT PersonalAccounts.Code AS code، PersonalAccounts.Structure.PopulatedPart.Name +"، "+ PersonalAccounts.A آدرس کوتاه آدرس AS، PersonalAccounts.A مشترک.Name AS fio، PersonalAccounts.CA بخش psu.Name EXPRESS (خصوصیاتPersonalAccountsSliceLast.Value AS Directory.TerritorallyNetworkOrganizations) .Name AS tso، PersonalAccounts.Structure.PopulatedPart.Name AS np، PersonalAccounts.Street.Room.Room.Number.AS. Street، Face.Accounts. ، PersonalAccounts.Division.Parent.Name AS mro FROM Directory.PersonalAccounts AS PersonalAccounts سمت چپ ثبت نام داده ها. مشخصات خصوصیات شخصی و برنامه های دیگر. SliceLast (، TypeCharakteristics \u003d VALUE (Directory.TypesCharacteristics.TerritorialCounts) \u003d V82.NewObject ( "query" ، q) انتخاب \u003d query.Execute () انتخاب کنید () CONN \u003d db.connect () CONN.query (model.Abonent) .delete () را هنگام انتخاب.Next (): abonent \u003d model.Abonent () abonent.account \u003d selection.code.strip () abonent.code \u003d selection.code abonent.fio \u003d selection.fio abonent.address \u003d انتخاب.address abonent.psu \u003d انتخاب.psu abonent.tso \u003d انتخاب.tso abonent.source \u003d u "ASRN" abonent.np \u003d selection.np abonent.street \u003d selection.street abonent.house \u003d selection.house abonent.flat \u003d selection.flat abonent.mro \u003d selection.mro CONN.add (جزء) CONN.commit ()

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

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

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

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

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

Link \u003d getattr (V82.Catalogs ، "SystemReports"). FindByDescription ("قانون آشتی ایلین") nav_url \u003d V82.GetURL (پیوند ، "گزارش") name \u003d V82.ExternalReports.Connect (nav_url) ExternalReport \u003d V82.ExternalReports.Creport (name) setattr (ExternalReport، "Account Personal"، مرجع) table_doc \u003d ExternalReport.GetDoc () path \u003d V82.GetTempFileName ("xls") Table_doc.Write (path، V82 .ShapsheetDocumentFileType.XLS) report \u003d model.Report (report) .account \u003d reference.Code.strip () report.type \u003d u "act" report.document \u003d باز (مسیر ، "rb") را بخوانید () CONN.add (گزارش)

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

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

# coding \u003d cp1251 act \u003d getattr (V82.Document، "Acceptance Act") act \u003d act.CreateDocument () setattr (عمل ، "نشانه" ، 1024.23) setattr (عمل ، "مشترک" ، "ایوانف") # پر کردن جزئیات دیگر. .. act.Write ()
اکنون ورود داده ها به صورت خودکار است.

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

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

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

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

) درست است

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


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

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


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

V82 \u003d شیء جدید COM ("V82.ComConnector")؛ کد \u003d CounterpartySOM.Code؛


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

گزارش (پایه. کتابهای مرجع. پیمانکاران. FindByName ("LLC") کد)؛


و همه چیز خوب است! و اتصال V82.ComConnector را انتخاب می کنم
به نوعی عجیب است که نویسنده به هیچ وجه اهمیتی نمی دهد که مقاله وی حاوی چنین مشکلاتی باشد که عنوان شد ، اما به هیچ وجه واکنشی نشان نمی دهد.
3. اما هنوز خطایی "کلاس وجود ندارد" وجود دارد
4. و هنگام نصب 8.2 مشکلی وجود دارد ، و سپس 8.1 نصب می شود - سعی کنید با یک مبادله معمولی UT-BP در OLE / COM تبادل کنید!
5- می توانید پردازش اصلی را در سایت نشان دهید که به شما امکان می دهد از طریق OLE / COM به صورت جهانی متصل شوید تا تازه ها وقت خود را تلف نکنند ، برای آنها می نویسید! به همین دلیل تصویر او به دلایلی که می خواهید شکایت کنید ، چرا؟ در نتیجه ، 2 کلمه در اصل ، و 6 مورد دیگر در پشت صحنه.

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

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

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

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

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

  1. بیایید یک شی COM ایجاد کنیم
    • برای V82. برنامه اتصال \u003d COMObject جدید ("V82.Application")؛
    • برای V82.COM کانکتور اتصال \u003d COMObject جدید ("V82.COMConnector")؛
  2. بیایید یک رشته اتصال تشکیل دهیم
    • برای نسخه سرور پایگاه داده ConnectionString \u003d "Srvr \u003d" "ServerName" "؛ Ref \u003d" "BaseName"؛
    • برای نسخه پرونده پایه ConnectionString \u003d "File \u003d" "مسیر به پایگاه" "؛ Usr \u003d نام کاربری؛ Pwd \u003d رمز عبور";
  3. ما به پایه وصل می شویم تلاش برای اتصال \u003d اتصال. اتصال (ConnectionString)؛ پیام استثنا \u003d پیام جدید به کاربر؛ پیام متن \u003d + توضیحات خطاها ()؛ پیام برای گزارش ()؛ پایان تلاش؛
  4. اتصال را به پایه می شکنیم اتصال \u003d نامشخص؛

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

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

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

اتصال \u003d COMObject جدید ("V82.Application")؛ // اتصال \u003d COMObject جدید ("V82.COMConnector")؛ ConnectionString \u003d "Srvr \u003d" "Server1C" "؛ Ref \u003d" "MyBase" "؛ Usr \u003d Petya؛ Pwd \u003d 123"؛ // ConnectionString \u003d "File \u003d" "С: \\ MyBase" "؛ Usr \u003d Petya؛ Pwd \u003d 123"؛ تلاش برای اتصال \u003d اتصال. اتصال (ConnectionString)؛ پیام استثنا \u003d پیام جدید به کاربر؛ پیام متن \u003d "اتصال به بانک اطلاعاتی انجام نشد" + توضیحات خطاها ()؛ پیام برای گزارش ()؛ پایان تلاش؛ اتصال \u003d نامشخص؛

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

درخواست \u003d اتصال. NewObject ("درخواست")؛ // برای V82.COM کانکتور درخواست \u003d اتصال. NewObject ("درخواست")؛ // برای V82. برنامه درخواست. متن \u003d "SELECT | مواضع سازمانها. کد ، | مواضع سازمانها. | از | دایرکتوری. مواضع سازمانها به عنوان مواضع سازمانها "؛ نتیجه \u003d درخواست. اجرا کن ()؛ نمونه \u003d نتیجه. انتخاب کنید() ؛ در حالی که نمونه برداری. بعدی () حلقه پایان حلقه؛

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

زنگ

کسانی هستند که این خبر را قبل از شما می خوانند.
برای دریافت آخرین مقالات مشترک شوید.
پست الکترونیک
نام
نام خانوادگی
چگونه می خواهید The Bell را بخوانید
بدون اسپم