THE BELL

Є ті, хто прочитали цю новину раніше вас.
Підпишіться, щоб отримувати статті свіжими.
Email
ім'я
Прізвище
Як ви хочете читати The Bell
без спаму

Для взаємного обміну інформаціоей між двома інформаційними базами без сторонніх вивантажень і файлів обміну немає нічого кращого COM-седіненія. І з цим важко посперечатися, тому що використовувати цей вид з'єднання в достатній мірі просто і стабільно. Але в і в даному механізмі є одне вузьке і неприємне место.Речь йде про час установки з'єднання з іншою базою. Воно може в деяких випадках досягати досить великих значень, тобто бути дуже довгим.

У чому ж справа?

У момент з'єднання по COM-з'єднання, що підключається база повністю завантажує конфігурацію бази, до якої ми підключаємося. Спробувавши, наприклад, підключиться до бази "Бухгалтерія підприємства", Нажі очікування тривали б досить довго, так як обсяг конфігурації обчислюється сотнями мегабайт. Стає зрозумілим, що для більш швидкої роботи всі з'єднання необхідно кешувати і підтримувати.

аналіз продуктивності

Задамося питанням, а чи потрібно взагалі кешувати з'єднання і чи принесе це свої плоди при інтенсивній роботі користувача з COM-з'єднанням. Виконаємо вимір часу підключення до конфігурації обсягом 20 кбайт.

Ми бачимо, що підключення до невеликої базі зайняло 3,5 секунди. При підключенні до більш об'ємною базі час збільшиться в кілька разів.

При зберіганні підтримуваного з'єднання ці дії займуть на кілька порядків менше часу.

Як нам зберегти активним наше COM-з'єднання?

Проблема в тому, що платформа 1С не надає стандартних стредств для зраненого COM-з'єднань в ІБ. У довідниках і документах зберігати з'єднання безглуздо, так як воно часто може змінюватися. Найбільш перспективним варіантом виглядає зберігання з'єднання в параметрі сеансу. Але і тут все не так гладко. Адже для зберігання COM-з'єднання немає жодного відповідного типу даних.

Дані міркування призводять до того, що зберігання можливо тільки на клієнті в який-небудь змінної. Розглянемо варіант для керованої форми. Необхідно ініціювати в формі змінну з директивою & НаКліенте, куди ми і будемо зберігати значення підключення. Відповідно викликати це підключення можна теж тільки на клієнті, так як передати COM об'єкт з клієнта на сервер ви не зможете. Для звичайних форм немає поділу на сервер і клієнт і цей механізм стає навіть простіше. Не можна забувати перед закриттям використовуваної форми розривати з'єднання, щоб запобігти витоку пам'яті.

замість висновку

Хоч і дана схема вирішує деякі проблеми продуктивності, однак вона далека від ідеалу. Кожна форма, де потрібно буде підтримувати COM-з'єднання, буде створювати новий сеанс в інформаційній базі приймачі, відповідно буде вимагатися і більшу кількість ліцензій. Також одним з головних мінусів є виняток підтримки з'єднання на сервері

У наступній статті буде розглянуто більш досконалий спосіб, який виключає з себе ці проблеми (підключення через Web сервіси).

Друк (Ctrl + P)

Один з варіантів обміну даними між базами 1С це обмін через COM з'єднання. За допомогою COM з'єднання можна з однієї бази 1С підключитися до іншого і прочитати або записати дані. Користуватися цим методом можна як в клієнт-серверних варіантах баз, так і в файлових базах. У цій статті розглядається такого роду з'єднань на платформа 8.3

com з'єднання

Можна створити два види COM об'єктів для додатка 1С. Це ole з'єднання V83.Application і com з'єднання V83.COMConnector . У випадку з V83.Application запускається практично повноцінний екземпляр додатку 1С. У разі використання V83.COMConnector запускається невелика серверна частина. Швидкість роботи в цьому випадку вище, але деякі функції можуть бути недоступні. Зокрема робота з формами і з загальними модулями для яких не встановлено властивість роботи з зовнішніми з'єднаннями. Переважно треба використовувати V83.COMConnector і тільки в разі нестачі функціоналу V83.Application. Особливо сильно різниця в швидкості роботи може бути помітна на базах великого обсягу. Для платформі 8.2 використовується V82.Application або V82.COMConnector

Встановити OLE з'єднання

З'єднання \u003d Новий COMОб'ект ( "V83.Application");

Встановити COM з'єднання

З'єднання \u003d Новий COMОб'ект ( "V83.COMConnector");

рядок підключення

// Для варіанту клієнт-сервер
СтрокаСоедіненія \u003d "Srvr \u003d" "ІмяСервера" "; Ref \u003d" "ІмяБази";
// Для варіанту файлового режиму:
СтрокаСоедіненія \u003d "File \u003d" "ПутьКБазе" "; Usr \u003d ім'я користувача; Pwd \u003d Пароль ";
спроба
Підключення \u003d З'єднання . Connect(СтрокаСоедіненія);
виняток
Повідомлення \u003d Новий СообщеніеПользователю;
Повідомлення . текст = "Неможливо підключитися до бази" + ОпісаніеОшібкі (); Повідомлення . Повідомити ();
КонецПопиткі;

розрив з'єднання

З'єднання \u003d Не визначено;
для об'єкта V83.Application виконувати призвести до втрати з'єднання обов'язково, в іншому випадку залишиться висіти незавершений сеанс, який потім доведеться видаляти вручну. У випадку з V83.COMConnector з'єднання розривається автоматично при завершенні процедури в якій виконувалося подключеніе.І є ще один маленький момент. Для користувача під яким виконується підключення повинен бути відключений прапорець «Запитувати підтвердження при закритті програми» в його налаштуваннях.

Метод NewObject ()

Для створення нового об'єкта можна скористатися методом NewObject (), наприклад:

для V83.COMConnector

ЗапросCOM \u003d Підключення. NewObject ( "Запит") ;
ТабліцаCOM \u003d Підключення. NewObject ( "ТабліцаЗначеній") ;
МассівCOM \u003d Підключення. NewObject ( "Масив");

УідCOM \u003d Подключеніе.NewObject

для V83.Application

ЗапросOLE \u003d З'єднання. NewObject ( " запит ") ;
ТабліцаOLE \u003d З'єднання. NewObject("ТабліцаЗначеній") ;
МассівOLE \u003d Соедіненіе.NewObject( "Масив");
УідCOM \u003d Соедіненіе.NewObject( "УнікальнийІдентіфікатор", СтрокаУІД);

ЗапросCOM . текст \u003d"ВИБРАТИ
| ДолжностіОрганізацій.Код,
| ДолжностіОрганізацій.Наіменованіе
| З | Справочнік.ДолжностіОрганізацій
ЯК ДолжностіОрганізацій ";

результат \u003d ЗапросCOM. Виконати ();
вибірка \u003d Результат. Вибрати ();
Поки Вибірка. Наступний ()цикл
КонецЦікла;
Можна також використовувати менеджери об'єктів конфігурації:
СправочнікCOM \u003d Підключення. Довідники. ІмяСправочніка;
ДокументCOM \u003d Підключення. Документи. ІмяДокумента;
РегістрCOM \u003d Підключення. РегістриСведеній. ІмяРегістра;

Отримання і порівняння перерахування через COM з'єднання

Для порівняння значень елементів перерахувань, визначених у конфігурації, необхідно виконати перетворення цих елементів до одного з примітивних типів, Порівняння яких не викликає труднощі. Такими типами можуть бути або числовий, або строковий тип. Перетворити значення елемента перерахування до числового типу можна так

ЕлементПеречісленія \u003d Подключеніе.Справочнікі.Справочнік1.НайтіПоКоду (1) .Реквізіт1;

ВозможниеЗначенія \u003d ЕлементПеречісленія.Метаданние (). ЗначеніяПеречісленія;

НомерЕлементаПеречісленія \u003d ВозможниеЗначенія.Індекс (ВозможниеЗначенія.Найті (Соедіненіе.XMLString (ЕлементПеречісленія)));

Якщо НомерЕлементаПеречісленія \u003d 0 Тоді Повідомити ( "ЗначеніеПеречісленія1");

ІначеЕслі НомерЕлементаПеречісленія \u003d 1 тоді Повідомити ( "ЗначеніеПеречісленія2");

КонецЕсли;

Отримання об'єкта через COM за ідентифікатором

Через менеджери об'єктів конфігурації отримуємо com об'єкт, наприклад:
ДокументCOM \u003d З'єднання. Документи. ІмяДокумента;

Потім отримуємо рядок унікального ідентифікатора:

СтрокаУІД \u003d Соедіненіе.string ( ДокументCOM.УнікальнийІдентіфікатор())

Ідентифікатор \u003d Новий У нікальнийІдентіфікатор (СтрокаУІД);
З силкаПоІдентіфікатору \u003d Документи [ІмяДокумента] .ПолучітьСсилку (Ідентифікатор);

Якщо потрібно знайти com об'єкт по документ за ідентифікатором, то тоді потрібно написати так:

УідCOM \u003d Соедіненіе.NewObject( "УнікальнийІдентіфікатор", СтрокаУІД);
СсилкаПоІдентіфікатору \u003d Соедіненіе.Документи [ІмяДокумента] .ПолучітьСсилку (УідCOM);

Привіт Хабравчанам!

У цій статті я хочу розповісти про те, як налагоджена інтеграція з платформою 1С в моїй організації. Спонукало мене це зробити практично повна відсутність технічної інформації на цю тему. Читаючи різні статті та доповіді на тему зв'язки 1С з будь-якої інформаційної системою, раз по раз переконуєшся, що всі вони носять маркетинговий, демонстраційний характер, і ніколи - технічний, що відображає проблему і суть її рішення.

Попереджаю, що спосіб ні в якому разі не претендує на універсальність. Оскільки самих конфігурацій 1С існує чимало, а інформаційних систем, Мов і платформ - ще більше, то кількість можливих комбінацій величезна. Моя мета - продемонструвати одне з можливих рішень.


В якості мови, який буде інтегруватися з 1С, я вибрав Пітон. Він дуже добре підходить для автоматизації процесів. Цьому сприяють мінімалістичний синтаксису (код набирається дуже швидко), багата стандартна бібліотека (менша потреба в сторонніх модулях), кроссплатформенность - з великою ймовірністю, код, написаний в ОС Linix, успішно запрацює в Windows.

Для початку опишу дані, з якими будемо працювати. Організація - енергозбуткова компанія в далекосхідному регіоні - обслуговує приблизно 400 тис. Абонентів, база 1С на самопісний конфігурації. Для кожного абонента зберігаються його платежі, нарахування, споживані послуги та схеми розрахунку, прилади обліку, показання та безліч інших даних.

Колись в організації стояла програма, написана на Дельфі і використовує в якості БД MSSQL / Firebird. В ті славетні часи можна було підключитися до бази за допомогою будь-якої мови і зробити безліч дій - вибрати абонентів-боржників, рознести надійшли оплати, зафіксувати показання приладів. Не дивно, що колекція скриптів, що автоматизують рутину, постійно росла. Програмісти могли виконувати будь-які дії, не відкриваючи саму програму.

На жаль, з переходом на 1С халява скінчилася - не стало можливості з'єднуватися з базою безпосередньо. Взагалі, платформа 1С сама по собі є неподільною і погано йде на інтеграцію з іншими системами. Вона, так би мовити, річ в собі. Завантажуючи дані в 1С, слід пам'ятати, що витягти їх звідти буде не так просто. Але з огляду на те, що організації потрібно впроваджувати платіжні системи та особистий кабінет, Було необхідно знайти якесь рішення.

Основні завдання, що стояли переді мною - це можливість швидкого отримання даних по конкретному особовому рахунку - ПІБ, адреса, прилади обліку, показання приладів, платежі, нарахування. Плюс формування документів - акти звірки, платіжної квитанції. Отже, можливість прямого з'єднання з БД відсутній - кожен, хто переглядав базу 1С на SQL-сервері, бачив, що в масі таблиць виду aaa1, aaa2 розібратися важко. А будувати запити з такими назвами таблиць і полів просто нереально. До того ж, багато таблиці 1С (особливо найважливіші, на кшталт зрізу останніх, залишків і оборотів) є віртуальними і розкидані по різним фізичним таблицями, збираючись множинними Джоін. Це спосіб не підходить.

Платфоми 1С надає можливість з'єднуватися з нею через COM-з'єднання. Подібно до багатьох windows-програм, під час установки 1С в системі реєструються два COM-об'єкта - Automation Server і COM Connector. З обома об'єктами можна працювати, використовуючи мову, в якому передбачена підтримка COM-технології.

Об'єкт Automation Server - це додаток 1С, майже нічим не відрізняється від звичайного клієнтського додатку. Різниця в тому, що додатково з'являється можливість програмного управління екземпляром програми. При роботі з об'єктом COM Connector запускається полегшений варіант 1С-додатки, в якому недоступні форми, а так само функції і методи, що мають відношення до інтерфейсу і візуальних ефектів. Саме під час запуску програми в режимі «Зовнішнє з'єднання». Ініціалізація глобальних змінних (наприклад, визначення поточного користувача і його налаштувань) повинна виконуватися в модулі зовнішнього з'єднання 1С. Якщо в режимі зовнішнього з'єднання в коді буде викликана функція, не доступна в цьому режимі, то буде викликано виключення (яке буде передано в наш пітон-скрипт). Виклик небезпечних функцій слід обрамляти конструкціями виду

# Якщо НЕ ВнешнееСоедіненіе Тоді Попередження ( "Привіт!"); # КонецЕсли

Оскільки робота з COM-об'єктами - технологія виключно windows-only, то не дивно, що в стандартному постачанні Пітона вона відсутня. Буде потрібно встановити розширення - набір модулів, що надають весь потрібний функціонал для програмування під Windows на Python. Його можна скачати в вигляді вже зібраного exe-установника. Саме розширення надає доступ до реєстру, службам, ODBC, COM-об'єктів і т.д. В якості альтернативи можна відразу поставити дистрибутив ActiveState Python, в якому розширення Win32 поставляється з коробки.

Деякий час я експериментував з COM-з'єднанням у розробці веб-додатків, зокрема, особистого кабінету. Були виявлені наступні мінуси:

COM-з'єднання працює повільно. Низька продуктивність - відомий мінус COM-технології.
- Процес установки з'єднання з 1С в залежності від конфігурації може зайняти від 1 до 8 секунд (в моєму випадку - 6 секунд). Чи варто говорити, що установка з'єднання на кожен запит призведе до того, то кожна сторінка буде завантажуватися 8 секунд.
- Оскільки веб-додатки на Python працюють як самостійні сервера, то попередній пункт можна компенсувати зберіганням з'єднання в деякій глобальної змінної і в разі помилки відновлювати його. Як підтримувати з'єднання на PHP, я, чесно кажучи, ще не думав.
- Втрачається кроссплатформенность веб-додатки.

Виходячи з перерахованих вище пунктів, було вирішено змінити принцип взаимодейст, розділивши його на 2 частини - першу платформозавісімую (віндового), вивантажують дані 1С в будь-якої зручний формат, і другу, яка не залежатиме від платформи, здатну працювати з даними, нічого не підозрюючи про 1С в принципі.

Стратегія дій полягає в наступному: пітон-скрипт з'єднується з 1С, виконує потрібні запити і вивантажує дані в SQLite базу. До цієї бази можна підключитися з Пітона, PHP, Джави. Більшість наших проектів працює на пітона, і так як я не виношу писати сирі SQL-запити руками, то вся робота з базою SQLite виконується через ORM SQLAlchemy. Знадобилося лише описати структуру даних бази декларативному стилі:

From sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, Numeric, DateTime, Unicode, Boolean, LargeBinary, ForeignKey Base \u003d declarative_base () class Abonent (Base): __tablename__ \u003d "abonents" id \u003d Column (Integer, primary_key \u003d True) account \u003d Column (Unicode (32), index \u003d True) code \u003d Column (Unicode (32)) address \u003d Column (Unicode (512)) fio \u003d Column (Unicode (256)) source \u003d Column (Unicode (16) ) psu \u003d Column (Unicode (256)) tso \u003d Column (Unicode (256)) np \u003d Column (Unicode (256)) street \u003d Column (Unicode (256)) house \u003d Column (Integer) flat \u003d Column (Integer) mro \u003d Column (Unicode (256)) class Payment (Base): __tablename__ \u003d "payments" # і так далі ...

Тепер достатньо імпортувати цей модуль в будь-який пітон-проект, і можна працювати з даними.

Передбачаю ваше запитання - «а чому SQLite»? Головна причина - база потрібна тільки для читання, тому проблеми з записом в SQLite нас хвилювати не повинні. По-друге, формат цієї цієї СУБД зручний - її зручніше переглядати (існуємо безліч безкоштовних утиліт, В тому числі супер-розширення для FireFox). По-третє, в деяких випадках потрібно отримати доступ до абонентів з тих машин, на яких немає з'єднання з MySQL-сервером. У такому випадку достатньо скопіювати файл SQLite-бази, і на цій машині буде доступ до всієї інформації.

Вивантаження відбувається раз на добу вночі. Занесення даних в 1С можна автоматизувати таким же чином. Наприклад, потрібно фіксувати показання, залишені абонентами на сайті особистого кабінету. В цьому випадку знову єднаємося з 1С та програмним методом створюємо і проводимо документ «Акт зняття показань». Код я приведу трохи нижче.

Робота з COM-об'єктами в Пітоні трохи незвичайна. По-перше, втрачається «пітонічность» коду - правила іменування змінних і функцій в 1С, м'яко кажучи, не відповідають дзен Пітона. По-друге, всім відомо, що об'єкти 1С часто іменуються кириличними символами, що викличе проблеми при розробці на Python ... але їх можна вирішити. Пропоную ознайомитися з кодом:

Import pythoncom import win32com.client V82_CONN_STRING \u003d "Srvr \u003d v8_server; Ref \u003d v8_db; Usr \u003d username; Pwd \u003d megapass;" pythoncom.CoInitialize () V82 \u003d win32com.client.Dispatch ( "V82.COMConnector"). Connect (V82_CONN_STRING)

Як видно з коду, инициализируется клієнт для роботи з 1С. Визначення COM-об'єкта відбувається по імені «V82.COMConnector». Зверніть увагу, що ця назва справедливо для платформи V8.2, якщо у вас версія 8.1, то ім'я буде «V81.COMConnector».

У Ініціалізувати клієнта ми викликаємо метод Сonnect (), передаючи йому рядок підключення. Рядок складається з імені сервера, бази, користувача і пароля. Отриманий об'єкт V82 зберігає в собі з'єднання з додатком 1С. У нього немає методу Disconnect () або чогось в цьому роді. Щоб відключитися про бази, досить видалити об'єкт з пам'яті функцією del () або привласнити змінної None.

Маючи об'єкт, можна звертатися до будь-яких полях і методам глобального контексту 1С, оперувати універсальними об'єктивним типу ТаблічнийДокумент, ТабліцаЗначеній і тд. Важливо врахувати, що при роботі через COM-з'єднання 1С працює в режимі «Зовнішнє з'єднання». У ньому недоступні будь-які функції для інтерактивної роботи, наприклад, спливаючі діалоги, повідомлення, і, що найголовніше, форми. Упевнений, що ви не раз проклянете розробників конфігурації, які укладають найважливіший функціонал в процедуру Кнопка1Нажатіе () в модулі форми документа.

Давайте поговоримо про таку важдной речі, як кірріліческіе атрибути. Не дивлячись на те, що 1С - двомовне середовище і для кожного російського методу є англомовний аналог, рано чи пізно буде потрібно звернутися до кірріліческому атрибуту. якщо на мовах PHP або VBSCript це не викличе жодних проблем,

Set Con \u003d CreateObject ( "v81.COMConnector") Set v8 \u003d Con.Connect ( "строкаПодключенія") Set СчетаМенеджер \u003d v8.Документи.Счета .... Set СчетаЗапісь \u003d СчетаМенеджер.СоздатьЕлемент () СчетаЗапісь.Контрагент \u003d .... .... СчетаЗапісь.Запісать ()

Те код на Python просто вилетить з помилкою Syntax Error. Що ж робити? Правити конфігурацію? Ні, достатньо скористатися методами getattr і setattr. Передаючи в ці функції COM-об'єкт і кириличне ім'я аттрибута, можна відповідно отримувати і встановлювати значення:

# Coding \u003d cp1251 catalog \u003d getattr (V82.Catalogs, "ЛіцевиеСчета")

Важливо наступне: імена реквізитів, а так само параметри функцій і методів повинні передаватися в кодуванні cp1251. Тому, щоб заздалегідь уникнути путініци з кодуваннями, має сенс оголосити її на початку файлу: # coding \u003d cp1251. Після цього можна передавати рядки, не хвилюючись про їх кодуванні. Але! Всі рядки, отримані з 1С (результати виконання функцій, запитів), будуть в кодуванні UTF-8.

Приклад коду, який виконує в середовищі 1С запит, перебирає результат і зберігає в SQLite базу:

# Coding \u003d cp1251 q \u003d "" "ВИБРАТИ ЛіцевиеСчета.Код ЯК code, ЛіцевиеСчета.Строеніе.НаселеннийПункт.Наіменованіе +", "+ ЛіцевиеСчета.КраткійАдрес ЯК address, ЛіцевиеСчета.Абонент.Наіменованіе ЯК fio, ЛіцевиеСчета.Дівізіон.Наіменованіе ЯК psu, ВИРАЗИТИ (ХарактерістікіЛіцевиеСчетаСрезПоследніх.Значеніе ЯК Справочнік.ТерріторіальноСетевиеОрганізаціі) .Наіменованіе ЯК tso, ЛіцевиеСчета.Строеніе.НаселеннийПункт.Наіменованіе ЯК np, ЛіцевиеСчета.Строеніе.Уліца.Наіменованіе ЯК street, ЛіцевиеСчета.Строеніе.Дом ЯК house, ЛіцевиеСчета.ОсновноеПомещеніе.НомерПомещенія ЯК flat , ЛіцевиеСчета.Дівізіон.Родітель.Наіменованіе ЯК mro З Справочнік.ЛіцевиеСчета ЯК ЛіцевиеСчета ЛІВЕ З'ЄДНАННЯ РегістрСведеній.ХарактерістікіЛіцевиеСчета.СрезПоследніх (, ВідХарактерістікі \u003d ЗНАЧЕННЯ (Справочнік.ВідиХарактерістік.ТерріторіальноСетеваяОрганізація)) ЯК ХарактерістікіЛіцевиеСчетаСрезПоследніх ПО ЛіцевиеСчета.Ссилка \u003d ХарактерістікіЛіцевиеСчетаСрезПоследніх.Об'ект "" "query \u003d V82.NewObject ( "Query", q) selection \u003d query.Execute (). Choose () CONN \u003d db.connect () CONN.query (models.Abonent) .delete () while selection.Next (): abonent \u003d models.Abonent () abonent.account \u003d selection.code.strip () abonent.code \u003d selection.code abonent.fio \u003d selection.fio abonent.address \u003d selection.address abonent.psu \u003d selection.psu abonent.tso \u003d selection.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 (abonent) CONN.commit ()

Тут CONN - це сесія з'єднання з SQLite-базою. Створюється об'єкт запиту query, заповнюється його текст. Як було відмічено вище, текст запиту повинен бути в cp1251, для чого спочатку оголошена кодування. Після виконання запиту в базі видаляються всі абоненти, щоб не додати дублі, потім додаються в циклі і слід фінальний комит.

При роботі з запитами я виявив такі правила.

Вибираючи поля, призначайте їм назви латиницею, буде набагато зручніше звертатися до них через селектор (точку), замість getattr ().
- Вибирайте тільки прімітіние типи даних: рядки, числа, дату і булево. Ніколи не вибирайте посилання на об'єкт (документ, довідник)! В даному контексті посилання вам абсолютно не потрібні і навіть шкідливі, тому що будь-яке звернення до реквізиту або методу посилання приведе до запиту через COM-з'єднання. Якщо звертатися до атрибутів посилання в циклі, то це буде вкрай повільно.
- Якщо ви вибираєте поле типу Дата, то воно буде повернуто як об'єкт PyTime. Це спеціальний тип даних для передачі дати-часу в COM-з'єднання. З ним не так зручно працювати, як зі звичним datetime. Якщо передати цей об'єкт в int (), то повернеться timestamp, з якого потім можна отримати datetime методом fromtimestamp ().

Тепер розглянемо, як формуються друковані документи. Справа в тому, що споживачеві потрібно надавати можливість скачувати заздалегідь підготовлені документи, наприклад, платіжну квитанцію або акт звірки. Ці документи формуються в 1С відповідно до встановлених вимог, їх реалізація на Python займе багато часу. Тому краще згенерувати документи в 1С і зберігати їх в формат Excel.

Так, документ акту звірки генерується спеціальної зовнішньої обробкою. Для тих, хто не знайомий з термінологією 1С: обробка - це автономна програма, що має свій модуль, форми, шаблони, призначена для запуску в середовищі 1С. Необхідно ініціювати обробку, заповнити її реквізити та викликати функцію, яка поверне нам табличний документ, Призначений для перегляду в 1С. Цей документ потрібно зберегти в формат Excel і скопіювати на сервер або записати в базу.

Link \u003d getattr (V82.Catalogs, "ОтчетиСістеми"). FindByDescription ( "Акт Узгодження Елен") nav_url \u003d V82.GetURL (link, "Звіт") name \u003d V82.ExternalReports.Connect (nav_url) ExternalReport \u003d V82.ExternalReports.Create (name) setattr (ExternalReport, "ЛіцевойСчет", reference) table_doc \u003d ExternalReport.GetDoc () path \u003d V82.GetTempFileName ( "xls") table_doc.Write (path, V82 .SpreadsheetDocumentFileType.XLS) report \u003d models.Report () report .account \u003d reference.Code.strip () report.type \u003d u "act" report.document \u003d open (path, "rb"). read () CONN.add (report)

У наведеному фрагменті виконується наступне. Підключається обробка, що формує документ. Обробка може бути вбудована в конфігурацію, зберігатися на диску або в базі даних 1С (в якомусь довіднику). Оскільки обробки часто змінюються, то, щоб кожного разу не оновлювати конфігурацію, самі часто мінливі обробки зберігаються в довіднику «ОтчетиСістеми», в реквізиті типу «сховище значення» з ім'ям Звіт. Обробку можна форматувати, вивантаживши її з бази на диск і довантажити, або методом GetURL (), в який потрібно передати посилання на елемент довідника і ім'я реквізиту. Отриманого об'єкту обробки ми призначаємо значення реквізитів, викликаємо експортовану функцію GetDoc (), отримуємо табличний документ, який зберігається в тимчасовий Excel-файл. Вміст цього файлу записується в SQlite-базу.

Останнє, що залишається розглянути - це програмне занесення даних в 1С. Припустимо, що потрібно занести показання від абонентів. Для цього достатньо створити і провести документ «Акт зняття показань»:

# Coding \u003d cp1251 acts \u003d getattr (V82.Documents, "АктСнятіяПоказаній") act \u003d acts.CreateDocument () setattr (act, "Показання", 1024.23) setattr (act, "Абонент", "Іванов") # Заповнення інших реквізитів. .. act.Write ()
Тепер занесення даних автоматизовано.

Отже, я виклав спосіб, який заснований на програмної вивантаженні і завантаженні даних з використанням COM-з'єднає. Цей метод успішно функціонує в моїй організації майже рік. База, яка формується з 1С, обслуговує 3 платіжні системи, інтернет-еквайринг (оплата картами через інтернет), а так же особистий кабінет. Крім цього, до бази підключаються різні скрипти для автоматизації рутини.

Незважаючи на недоліки методу (повільна швидкість COM-з'єднання), в цілому він функціонує стабільно. У нас є дані в платформонезавісимость вигляді (SQLite), з якими можна працювати з будь-якої мови. І основна частина коду написана на Python, а значить, доступні безліч засобів і прийомів, про які навіть не можна мріяти в 1С.

Це один з можливих способів взаимодейст з 1С. Я впевнений, що він не новий і напевно вже був кимось випробуваний, оптимізований. Однак, я постарався викласти максимум деталей процесу, щоб уберегти вас від підводних каменів, на які сам наступав.

Бажаю всім удачі, і пам'ятайте, що не такий страшний 1С, як його малюють!

)Все вірно

Одночасно, я бачив не раз, коли просто "злітали" публікації які не тягнули навіть на 10 балів.
Чому так відбувалося? Мабуть тому, що кому то вони явно припали до душі.


Я про це і говорю, що було б непогано не читаючи статтю по рейтингу зрозуміти наскільки вона тобі потрібна, або оцінити її не так примітивно +/-. Щодо припала до душі я б скорегував так: вона так багато набрала через те що так зірки склалися і на сайті зібралося багато народу і багатьом сподобалося, самі розумієте це справа випадку тому як тільки стаття йде з головної сторінки то її вже можна знайти тільки за запитом, а так голосують все мимо проходять. І підтримувати на головній, наскільки я розумію, дозволяють якраз постійні коментарі \u003d розкрутка статті.
Саме для цього і ставлять магазини на прохідних вулицях - адже часто важлива не якість і актуальність товару, а прохідність місця, люди гуляючи часто купують те що викинуть на наступний день, просто заради процесу. Це давно всім відома хвороба - шопомания. Або просто збільшення потоку збільшує ймовірність потрібного покупця.

А плюси і мінуси ... - це всього лише якесь "спасибі" за витрачений час і працю


Тобто мінус теж вважається за "спасибі"? Я ось і хотів дізнатися ваше ставлення до того чи потрібно ставити в таких випадках його, і як цікаво вважають інші? Чи ставити його коли стаття шкідлива / погана або коли вона тобі просто нікому не потрібна / порожня.
На мій погляд стаття скидається на просто підвищення рейтингу, т.к .:
1. Наведені мною проблема з типами взагалі проігнорована автором, хоча він не полінувався написати купу коментів.
2. У статті явна неточність: сказано що можна тільки так

V82 \u003d Новий COMоб'ект ( "V82.ComConnector"); Код \u003d КонтрагентСОМ.Code;


а ось я спокійно роблю за допомогою обробки ось так:

Повідомити (База.Справочнікі.Контрагенти.НайтіПоНаіменованію ( "ТОВ"). Код);


і все нормально! А підключення вибираю V82.ComConnector
Дивно якось що автору зовсім плювати на те що його стаття містить такі проблеми на які вказали, а він не реагує ніяк.
3. Але ж є ще проблема коли вискакує помилка "Клас не існує"
4. А є проблема коли встановлена \u200b\u200b8.2, а потім встановлена \u200b\u200b8.1 - спробуйте-но обмінятися по ОЛЄ / COM типовим обміном УТ-БП!
5. Чи могли б вказати основні обробки на сайті які дозволяють універсально підключатися по ОЛЄ / COM щоб новачки не витрачали часу, ви ж для них пишіть! Та ж до речі її картинка чомусь у вас красується, з чого б ?. А в результаті 2 слова по суті, і ще 6 за кадром.

Загалом, я не поливаю брудом, а вказую на конкретні прогалини, але реакції нуль. Якщо це той досвід яким ви ділитеся то він якийсь помилковий і неповний.
Я до того що якби у автора було б бажання зібрати всі глюки то він би міг хоча б прислухатися до чужого досвіду, а не огризатися на коменти. Тут же складається ситуація коли той хто прочитав її знають більше ніж автор, кажуть йому (іноді і некоректно), а він ще й відбивається. У підсумку вся інформація не в статті, а в коментах! Забавно! Так часто буває, але не потрібно при цьому робити наголос на те що хотіли як краще - я ж показую як краще, і інші показують! Увімкніть це в статтю і вона буде стоїть, не всім же цікаво читати цю перепалку.

Один з варіантів обміну даними між базами 1С це обмін через COM з'єднання.

За допомогою COM з'єднання можна з однієї бази 1С підключитися до іншого і прочитати або записати дані. Користуватися цим методом можна як в клієнт-серверних варіантах баз, так і в файлових базах. У цій статті і розберемо приклади такого роду сполук. У прикладах використовується платформа 8.2.

Можна створити два види COM об'єктів для додатка 1С. це V82.Application і V82.COMConnector. У випадку з V82.Application запускається практично повноцінний екземпляр додатку 1С. в разі використання V82.COMConnector запускається невелика серверна частина.
Швидкість роботи в цьому випадку вище, але деякі функції можуть бути недоступні. Зокрема робота з формами і з загальними модулями для яких не встановлено властивість роботи з зовнішніми з'єднаннями. Переважно треба використовувати V82.COMConnector і тільки в разі нестачі функціоналу V82.Application. Особливо сильно різниця в швидкості роботи може бути помітна на базах великого обсягу.

Отже, приступимо

  1. Створимо COM об'єкт
    • для V82.Application З'єднання \u003d Новий COMОб'ект ( "V82.Application");
    • для V82.COMConnector З'єднання \u003d Новий COMОб'ект ( "V82.COMConnector");
  2. Сформуємо рядок підключення
    • для серверного варіанту бази СтрокаСоедіненія \u003d "Srvr \u003d" "ІмяСервера" "; Ref \u003d" "ІмяБази";
    • для файлового варіанту бази СтрокаСоедіненія \u003d "File \u003d" "ПутьКБазе" "; Usr \u003d ім'я користувача; Pwd \u003d Пароль";
  3. Виконуємо підключення до бази Спроба Підключення \u003d З'єднання. Connect (СтрокаСоедіненія); Виняток Повідомлення \u003d Новий СообщеніеПользователю; Повідомлення. Текст \u003d + ОпісаніеОшібкі (); Повідомлення. Повідомити (); КонецПопиткі;
  4. Розриваємо з'єднання з базою З'єднання \u003d Не визначено;

    для об'єкта V82.Application виконувати призвести до втрати з'єднання обов'язково, в іншому випадку залишиться висіти незавершений сеанс, який потім доведеться видаляти вручну. У випадку з V82.COMConnector з'єднання розривається автоматично при завершенні процедури в якій виконувалося подключеніе.І є ще один маленький момент.

    Для користувача під яким виконується підключення повинен бути відключений прапорець «Запитувати підтвердження при закритті програми» в його налаштуваннях.

А тепер зберемо весь код в купу

З'єднання \u003d Новий COMОб'ект ( "V82.Application"); // З'єднання \u003d Новий COMОб'ект ( "V82.COMConnector"); СтрокаСоедіненія \u003d "Srvr \u003d" "Server1C" "; Ref \u003d" "MyBase" "; Usr \u003d Петя; Pwd \u003d 123"; // СтрокаСоедіненія \u003d "File \u003d" "З: \\ MyBase" "; Usr \u003d Петя; Pwd \u003d 123"; Спроба Підключення \u003d З'єднання. Connect (СтрокаСоедіненія); Виняток Повідомлення \u003d Новий СообщеніеПользователю; Повідомлення. текст \u003d "Неможливо підключитися до бази" + ОпісаніеОшібкі (); Повідомлення. Повідомити (); КонецПопиткі; З'єднання \u003d Не визначено;

Про людське око підключення V82.Application метод застосовується для COM об'єкта, який створювався спочатку, а для V82.COMConnector метод застосовується до підключення. далі робота із запитом йде стандартними засобами 1С. в коді це виглядає так:

Запит \u003d Підключення. NewObject ( "Запит"); // для V82.COMConnector Запит \u003d З'єднання. NewObject ( "Запит"); // для V82.Application Запит. Текст \u003d "ВИБРАТИ | ДолжностіОрганізацій.Код, | ДолжностіОрганізацій.Наіменованіе | З | Справочнік.ДолжностіОрганізацій ЯК ДолжностіОрганізацій "; Результат \u003d Запит. Виконати (); Вибірка \u003d Результат. Вибрати (); Поки Вибірка. Наступний () Цикл КонецЦікла;

Для версії 1С: Підприємство 8.3 все залишається без змін за винятком того, що при створенні COMОб'ектов треба використовувати «V83.COMConnector» або «V83.Application».

THE BELL

Є ті, хто прочитали цю новину раніше вас.
Підпишіться, щоб отримувати статті свіжими.
Email
ім'я
Прізвище
Як ви хочете читати The Bell
без спаму