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С: Підприємство".
Пишіть мені, задавайте питання, і цілком можливо, що незабаром з'явиться продовження статті.