Delphi і 1c - експорт та імпорт, delphisite

V1CEnterprise.Application - версія незалежний ключ
V77.Application - версія залежний ключ
V77S.Application - версія залежний ключ, SQL-версія
V77L.Application - версія залежний ключ, локальна версія
V77M.Application - версія залежний ключ, мережева версія
Наприклад, створимо OLE-об'єкт для сервера "1С: Підприємство". Для простоти створимо об'єкт без прив'язки до конкретної версії і типу програми:

procedure TForm1. Create1C;

onesobj: = createoleobject # 40; 'V1CEnterprise.Application' # 41; ;

onesobj: = UnAssigned;
Втім, це не обов'язково, так як при закритті вашого застосування OLE-об'єкт буде звільнений автоматично.
Підсумуємо отримані знання: створимо OLE-об'єкт "1С: Підприємство", проініціалізіруем його і коректно звільнимо:

procedure TForm1. Create1C;

onesobj: = createoleobject # 40; 'V1CEnterprise.Application' # 41; ;

onesobj. initialize # 40; onesobj. rmtrade,

Як працювати з отриманим об'єктом
Резонне питання. Власне, заради цього все і затівалося, чи не так. ) Насправді, все дуже просто. Після того, як ми створили і проініціалізувати OLE-об'єкт, працювати з ним можна в такий спосіб:
За допомогою методу EvalExpr ()
Метод EvalExpr обчислює вираз, записане параметрі на вбудованій мові 1С: Підприємство і повертає результат обчислення. Результатом виразу може бути число, рядок, дата або значення будь-якого агрегатного типу даних.
За допомогою методу CreateObject ()
Метод CreateObject створює об'єкт агрегатного типу даних системи 1С: Підприємство і повертає посилання на нього. Ця функція зазвичай використовується одночасно з явним визначенням змінної типу OLEVariant і присвоєнням їй посилання на об'єкт агрегатного типу даних.
За допомогою методу ExecuteBatch ()
Метод ExecuteBatch виконує послідовність операторів, записану в параметрі на вбудованій мові 1С: Підприємство. Метод повертає -1, якщо послідовність операторів виконана успішно, або 0 в іншому випадку.
Викликом атрибутів і методів системи 1С: Підприємство як OLE Automation сервера
Тут є кілька підводних каменів, про які я відразу хочу попередити:
При виклику атрибутів і методів системи 1С: Підприємство необхідно використовувати їх англомовні синоніми (вони вказані для кожного методу в книзі "Опис вбудованої мови")
Для створюваного агрегатного типу даних в середовищі Delphi необхідно завести змінну типу OLEVariant
У разі, якщо викликається метод OLE-об'єкта не вимагає параметрів (або один з параметрів є необов'язковим), в якості параметра йому необхідно передавати EmptyParam (або - для Delphi 3 - порожній рядок).
Для звернення до російськомовних ідентифікаторів об'єктів агрегатних типів (наприклад, реквізитів довідників) слід використовувати метод об'єкта агрегатного типу getattrib () для отримання значення атрибута, і setattrib () для установки значення.
Для комплексної ілюстрації всього вищеописаного я приведу приклад, в якому вміст довідника "Номенклатура" цілком експортується в таблицю бази даних (в прикладі мається на увазі, що вже створена таблиця table1, поля якої адекватні довідником. Таблиця table2 посилається на ту ж фізичну таблицю, що і table1 , і служить лише для пошуку вже доданих елементів):

procedure TForm1. exportsprav;

counter: integer; // Лічильник імпортованих записів

onesobj: Olevariant; // OLE-об'єкт програми 1С: Підприємство

ware, ware2: olevariant; // Агрегатні об'єкти

val. edizm, nds, np: olevariant;

pf: integer; // Проміжні змінні

table1. open; // Відкриваємо таблицу1

table2. open; // Відкриваємо табліцу2

counter: = 0; // Обнуляємо лічильник записів

onesobj: = createoleobject # 40; 'V1CEnterprise.Application' # 41; ; // Створюємо OLE-об'єкт

// Створюємо необхідні агрегатні об'єкти

ware: = onesobj. createobject # 40; 'Справочнік.Номенклатура' # 41; ;

ware2: = onesobj. createobject # 40; 'Справочнік.Номенклатура' # 41; ;

edizm: = onesobj. createobject # 40; 'Справочнік.ЕдініциІзмереній' # 41; ;

nds: = onesobj. createobject # 40; 'Справочнік.СтавкіНДС' # 41; ;

np: = onesobj. createobject # 40; 'Справочнік.СтавкіНП' # 41; ;

ware. selectgroup # 40; 1 # 41; ; // Встановлюємо режим вибірки груп

ware. selectitems # 40; 1 # 41; ; // Відкриваємо вибірку елементів довідника

while ware. GetItem # 40; 1 # 41;> 0 do // Вибираємо все елементи

if ware. level # 40; '' # 41; = 1 then // Якщо ми вибрали групу першого рівня, то

// Інакше шукаємо елемент-батько

ware2. FindItem # 40; ware. getattrib # 40; 'Батько' # 41; # 41; ;

if table2. findkey # 40; # 91; ware2. getattrib # 40; 'Код' # 41; # 93; # 41; then

// Якщо цей елемент ми вже імпортували

pf: = table2. fieldbyname # 40; 'ID' # 41 ;. AsInteger //, то отримуємо його код

pf: = -1; // інакше поміщаємо елемент в групу першого рівня

if ware. deletemark # 40; '' # 41; = 0 then // Якщо елемент не видалений, то

table1. append; // додаємо нове поле до таблиці

// Заповнюємо поля таблиці значеннями відповідних атрибутів елемента довідника

table1. fieldbyname # 40; 'CODE_1S' # 41 ;. AsInteger: = ware. getAttrib # 40; 'Код' # 41; ;

// Заповнюємо поле найменування

table1. fieldbyname # 40; 'NAME' # 41 ;. AsString: = ware. getAttrib # 40; 'Найменування' # 41; ;

table1. fieldbyname # 40; 'PARENT_FOLDER' # 41 ;. AsInteger: = pf;

table1. fieldbyname # 40; 'FULLNAME' # 41 ;. AsString: = ware. getAttrib # 40; 'ПолнНаіменованіе' # 41; ;

// Шукаємо відповідний запис в довіднику "одиниці виміру"

edizm. finditem # 40; ware. getattrib # 40; 'Одиниця виміру' # 41; # 41; ;

// Заповнюємо поле одиниці виміру

table1. fieldbyname # 40; 'EDIZM' # 41 ;. AsString: = edizm. getattrib # 40; 'Найменування' # 41; ;

// так ми отримуємо значення періодичних реквізитів

table1. fieldbyname # 40; 'SEBESTOIM' # 41 ;. AsFloat: =

ware. getAttrib # 40; 'Собівартість' # 41 ;. GetValue # 40; datetostr # 40; now # 41; # 41; ;

table1. fieldbyname # 40; 'PRICEOPT' # 41 ;. AsFloat: = ware. getAttrib # 40; 'Ціна' # 41; ;

nds. finditem # 40; ware. getAttrib # 40; 'Ставка ПДВ' # 41 ;. GetValue # 40; datetostr # 40; now # 41; # 41; # 41; ;

np. finditem # 40; ware. getAttrib # 40; 'СтавкаНП' # 41 ;. GetValue # 40; datetostr # 40; now # 41; # 41; # 41; ;

// Заповнюємо поле ставки ПДВ

table1. fieldbyname # 40; 'STNDS' # 41 ;. AsFloat: = nds. getAttrib # 40; 'Ставка' # 41; ;

// Заповнюємо поле ставки НП

table1. fieldbyname # 40; 'STNP' # 41 ;. AsFloat: = np. getAttrib # 40; 'Ставка' # 41; ;

table1. fieldbyname # 40; 'ARTICUL' # 41 ;. AsString: = ware. getAttrib # 40; 'Артикул' # 41; ;

if Ware. IsGroup # 40; '' # 41; = 1 then // Якщо ми вибрали групу товару, то

table1. fieldbyname # 40; 'IS_FOLDER' # 41 ;. AsInteger: = 1

table1. fieldbyname # 40; 'IS_FOLDER' # 41 ;. AsInteger: = 0;

inc # 40; counter # 41; ;

висновок
На жаль, неможливо вмістити в одну статтю всю інформацію, яка була б вам корисна. Я постарався дати лише той мінімум, який необхідний для отримання деяких базових знань, і здатний стати фундаментом для ваших власних маленьких відкриттів в області інтеграції Delphi і "1С: Підприємство".
Пишіть мені, задавайте питання, і цілком можливо, що незабаром з'явиться продовження статті.

Схожі статті