Основи на работа с 1C бази данни чрез OLE
Забележка- по-голямата част от текста, написан тук с примери, е взет от паметта (преди няколко години проучих достатъчно подробно, така че нещо в алгоритмите може да не работи - не съм ги копирал от някъде, а съм ги написал точно там, така че не ги ритайте за синтактични грешки) - в момента не използвам OLE активно (не поради някакви проблеми със самия OLE, а поради липсата на нужда да го използвам в момента).
Основните предимства, поради които OLE се използва активно:
- За извикващата база данни "на барабана" - какъв тип база данни се извиква (DBF или SQL)
- Базовите обекти, които могат да се извикват, могат да се контролират от всички известни методи за работа с обекти в 1C (т.е. методите SelectElements(), UseDate() и т.н. работят с директории, SelectDocuments() и т.н. работят с документи), съответно, можете директно да решите дали си струва да изработите конкретни обекти от OLE базата или да ги пропуснете.
Пример 1.Свързване към 1C база данни чрез OLE.
BaseOle =CreateObject( "V77.Application" ); // Получаване на достъп до OLE обекта 1C |
Локална версия (на потребител): | V77L.Приложение |
Мрежова версия: | V77.Приложение |
SQL версия: | V77S.Приложение |
Сега трябва да знаем няколко параметъра, за да стартираме OLE базата: базова директория, потребителско име и парола. Е, вероятно и желанието да стартирате 1C в изключителен режим :)
BaseCatalogOLe = "C:program files1cv77MyBase" ; UserOle = "Администратор" ; PasswordOle = "qwerty" ; ExclusiveModeOLE = " /m" ; // за неизключително стартиране, посочете празен низ! Стартиране без скрийнсейвър = 1; //за да се появи началният екран (например, за да наблюдавате // процеса на стартиране на OLE базата визуално), задайте тук "0" ConnectionResult = BaseOle . Инициализиране ( BaseOle . RMTrade , "/d" + AblP( DirectoryBasOle ) + " /n" + AbbrP( UserOle )+ " /p" + AbbrP(PasswordOle ) + ExclusiveModeOLE , ?( StartNoSPLASH_SHOW = 1 , "NO_SPLASH_SHOW" , "" )); If ConnectionResult = 0 Then Warning( "Не може да се свърже с посочената база данни - проверете входа!"); EndIf; |
Пример 2.Достъп до обекти на OLE база данни.
Запомнете за в бъдеще като безспорен факт:
- От локалната база данни към базата данни OLE (и съответно обратно) само числови стойности, дати и низове с ограничена дължина могат да бъдат прехвърлени директно чрез метода на присвояване. Тези. локалната база ще разбере перфектно без допълнителни алгоритми за преобразуване на получената стойност само посочените типове стойности. Освен това ограниченията на низовете означават проблеми с разбирането в локалната база данни на атрибутите на базовите OLE обекти от типа "Низ с неограничена дължина". Към това все още трябва да добавяте периодични подробности. Естествено, методът на присвояване означава и опити за сравняване на обекти от различни бази данни в едно и също състояние (например в алгоритмите "If" или "While" и т.н.).
- Има проблеми при опит за прехвърляне на "празна" дата - OLE може да я конвертира например в 31.12.1899 г. и т.н. Ето защо е по-добре предварително да разберете тези стойности, които могат да се появят в локалната база данни при прехвърляне на „празни“ дати, за да осигурите условията за преобразуването им в локалната база данни.
A)Достъп до OLE базови константи:
OLEConstValue = BaseOLE .Constant. EditDisableDate ; |
QueryOLE = BaseOle.CreateObject( "Директория. Фирми" ); // "CreateObject" не работи в OLE! DocOLE = BaseOle .CreateObject( "Document.Invoice" ); |
SprOle . Избор на елементи (); Докато питате. GetItem()= 1 цикъл Отчет( Реф. име); Краен цикъл; |
QueryOLE = BaseOLE .CreateObject( "Директория на фирмата"); // това е препратка в OLE базата данни Doc = CreateObject( "Document.Invoice" ); // и това е документ в локалната база данни Doc . Ново (); // създаване на нов документ в локалната база данни QueryOLE. FindByCode (1, 0); // позиция в OLE базата данни // във фирмата с код "1". Док. Компания = SprOLE. currentItem(); // този метод няма да работи, защото вдясно от "=" е // обектът не е локална база данни и локалната база данни 1C не го разбира! |
Sp = CreateObject( "Директория. Фирми" ); // създаване на обект на директория на локална база данни Ref. FindByName (Заявка. Име, 0, 0); // Или Ask.findByCode(Query.Code,0); // т.е. SprOle.Code и Spr.name // са нормални числови/низови // стойности, които локалната база разбира! Док. Фирма = Реф. currentItem(); // Сега всичко е наред, т.к от двете страни на метода // има само обекти от локалната база! |
DocOle = CreateObject( "Документ. Фактура" ); // Създаване на документ в OLE базата DocOle. Ново (); Проверка = CreateObject( "Директория. Фирми" ); // В локалната база данни получаваме достъп до директорията Ref. FindByCode (1, 0); // Намерете компания с код 1 (ако има такава) в локалната база данни DocOle . Фирма = Реф. currentItem(); // този метод няма да работи |
SprOle = BaseOle .CreateObject("Указател. Фирми"); // създаване на OLE базов референтен обект SprOle. FindByName (Ref. Name, 0, 0); // Или Ask.findByCode(Ref.Code,0); // т.е. RefCode и RefName са нормални числови/низови стойности //, които OLE базата разбира! Докато . Фирма = SprOle. currentItem(); // Сега всичко е наред, т.к от двете страни // на метода има обекти от OLE базата! Докато . Напиши(); // запишете документа в OLE базата данни Ако DocOle . Post()= 0 след това Send("Неуспешно публикуване на документ!"); EndIf; |
RegOLE = BaseOLE .CreateObject( "Регистър. Остатъци от стоки" ); RegOle. SelectTotals(); Чао RegOle. GetTotal () = 1 цикъл // Не забравяйте да посочите името! Report( "Balance for " + RegOle . Item . Name + "in stock" + RegOle . Warehouse . Name + "e equal to " + RegOle . Item Remaining); Краен цикъл; |
OLEEnumValue = BaseOLE .Enumeration. Булева стойност. не знам; // :) |
ViewOnlyReturnsToSuppliers = 1; // да предположим, че това е квадратче за отметка под формата на диалог, // което или поставяме, или премахваме отметката DocOle = BaseOle .CreateObject( "Document.Invoice" ); Докато . Изберете Документи (Начална дата, ConDate); // StartDate и EndDate също са атрибути на формата // на диалога, но OLE базата ги разбира перфектно - // все пак това са дати! Чао чао до . GetDocument() = 1 Цикъл Ако LookOnlyReturnsToSuppliers = 1 Тогава Ако DoOle. FeatureInvoice <> BaseOle .Изброяване. Признати разходи Inc. Върнете доставчик, след което Продължете; EndIf; Иначе Ако до . Атрибут на фактура = BaseOle .Enumeration.Признати разходи Inc. Върнете доставчик, след което Продължете; EndIf; EndIf; Отчет( DocOle . View () + "#" + DocOle .DocNumber + "от " + DocOle .dateDoc); Краен цикъл; |
CountOle = BaseOle .CreateObject( "Акаунт"); Брой . FindByCode("10.5"); // намерен акаунт 10.5 в OLE базата данни |
Тип подсметкаAccountsOle = BaseOle .Типове подсметки. Изпълнители; |
G)Достъп до функциите и процедурите на глобалния модул на OLE базата!
Как го забравих, а? Тъй като глобалният модул се компилира автоматично при стартиране на базата данни, функциите и процедурите на глобалния модул стават достъпни за нас (ще се коригирам - само тези, които имат флаг "Експортиране"). Освен това те също имат различни функции на системата 1C. И те са достъпни за нас чрез 1C OLE функцията -EvalExpr(). Ето примери за работа с базата данни OLE:
RelevanceDateOle = BaseOle. EvalExpr( "GetDateTA()" ); // Връща действителната дата UserNameOle = BaseOle. EvalExpr( "Потребителско име()" ); // връща низа // // сега нека се опитаме да получим цифровата стойност на ДДС на стоковия артикул // чрез функцията на глобалния модул ДДС Процент (ДДС ставка) Експорт! TovOle = BaseOle .CreateObject( "Reference.Nomenclature" ); ТовОле. Избор на елементи (); // Да намерим елемента директория (не групата!) Докато TovOle . GetItem()= 1 цикъл Ако ToVle. ThisGroup()= 0 Тогава Прекъсване; EndIf; Краен цикъл; NumericValueVATPercentItemOle = BaseOle. EvalExpr ( "Процент ДДС (Изброяване. Стойности на ДДС." + Елемент. Ставка на ДДС. Идентификатор ()+ ")" ); |
Алгоритми за преобразуване на обекти в "смилаема форма" междубази.
Ясно е, че алгоритмите за трансформация са необходими не само за прехвърляне на обекти между и бази, но и за такава проста задача като опит за тяхното сравняване един с друг.
И още веднъж ще обърна внимание:ОБЕКТИТЕ НА ЕДНА И ЕДНА БАЗА СЕ РАЗБИРАТ ПЕРФЕКТНО, ПРОБЛЕМИ ВЪЗНИКВАТ САМО КОГАТО ЗАПОЧНЕТЕ ДА СВЪРЗВАТЕ ОБЕКТИ НА РАЗЛИЧНА БАЗА ПОМЕЖДУ ТЯХ,т.е. екип
До . Фирма = SprOle. currentItem(); // където DocOle е базов OLE документ, а SprOle е директория на "Компании" на OLE базата
ще работи добре без грешки. Не забравяйте това, за да не прекалявате с алгоритмите!
И така, повтарям, че можете директно да прехвърляте и можете просто да сравнявате само дати (а не "празни"), числа и низове с ограничена дължина. И така, как можем да сравним обекти с различни бази (не числа, не дати, не низове), т.е. как да ги конвертирате в същия този низ/номер/дата.