Контакти

Нові релізи "1С: Управління торгівлею": оновлення без розвитку. Вирішення проблем із реєстрацією зовнішніх компонентів у терміналі Розширення списку методів

23 жовтня вийшов новий реліз конфігурації «1С: Управління торгівлею». В черговий раз в оновлення увійшли зміни щодо ВетІС, ЄДАІС, і майже ніяк не торкнулася загальна функціональність конфігурації.

Що змінилося?

Якщо подивитися на структуру змін, які включені до останнього релізу конфігурації «1С: Управління торгівлею», то більше половини - це оновлення щодо ЄДАІС, ВетІС, і лише кілька рядків в описі релізу присвячено розширенню функціональних можливостей програмного продукту, які не обумовлені жодними законодавчими актами.

Розділи, у яких відбулися зміни:

    у роздрібних продажах додано підтримку зчитування двомірного штрихового коду акцизних і федеральних спеціальних марок нового зразка, що містить цифровий ідентифікатор ЕДАІС;

    доопрацьовано інтеграцію із системою ветеринарного контролю (ВетІС);

    доопрацьовано обмін із системою ЄДАІС;

    додано нові можливості сервісу обміну електронними документами;

    виконано доопрацювання в частині сервісу 1С:Бізнес-мережа;

    доопрацьовано інтеграцію з Яндекс.Касою.

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

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

Чи оперативний облік стає регламентованим?

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

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

Як один з варіантів рішення можна розглядати використання механізму розширень, тим більше що фірма «1С» активно цей функціонал. Безумовно, такий підхід вимагатиме додаткових трудовитрат від розробників. Але це оптимальний спосіб підтримки змін у сучасних конфігураціях.

Більш радикальним буде розподіл функціоналу між типовою конфігурацією «1С: Управління торгівлею»та якимись зовнішніми обліковими чи аналітичними системами. Тут з боку «1С» знову-таки зроблено достатньо для ефективного вирішення таких завдань на рівні платформи.

У будь-якому випадку, тепер при проектуванні корпоративних облікових систем та розподілі функціональних можливостей між конфігураціями потрібно мати на увазі: не виключено, що оновлювати «1С: Управління торгівлею»доведеться якщо не так часто, як "1С: Бухгалтерію", то вже точно не 1-2 рази на рік, як багато хто робив це раніше.

  • Tutorial

Вступ

Ця стаття дає уявлення про роботу зовнішніх компонентів у системі «1С: Підприємство».
Буде показаний процес розробки зовнішньої компоненти системи «1С: Підприємство» версії 8.2, що працює під управлінням ОС сімейства Windows з файловим варіантом роботи. Такий варіант роботи використовують у більшості рішень, призначених для підприємств малого бізнесу. ВК буде реалізована мовою програмування C++.

Зовнішні компоненти "1C: Підприємство"

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

Запуск демонстраційної ВК

Завдання:
  1. Виконати складання зовнішньої компоненти, що постачається з підпискою ІТС і призначеної для демонстрації основних можливостей механізму зовнішніх компонентів у 1С
  2. Підключити демонстраційну компоненту до конфігурації 1С
  3. Переконатись у коректній працездатності заявлених функцій
Компіляція
Демонстраційна ВК розташована на диску підписки ІТС у каталозі "/VNCOMP82/example/NativeAPI".
Для складання демонстраційної ВК будемо використовувати Microsoft Visual Studio 2008. Інші версії даного продукту не підтримують формат проекту Visual Studio, що використовується.


Відкриваємо проект AddInNative. У налаштуваннях проекту підключаємо каталог із заголовними файлами, необхідними для збирання проекту. За умовчанням вони розміщуються на диску ІТС у каталозі /VNCOMP82/include.
Результатом збирання є файл /bind/AddInNative.dll. Це і є скомпільована бібліотека для підключення до конфігурації 1С.
Підключення ВК до конфігурації 1С
Створимо порожню конфігурацію 1С.
Нижче наведено код модуля керованої програми.
перем ДемоКомп; Процедура ПриПочаткуРоботиСистеми() ПідключитиЗовнішнюКомпоненту("...\bind\AddInNative.dll", "DemoVK", ТипЗовнішньоїКомпоненти.Native); ДемоКомп = Новий ("AddIn.DemoVK.AddInNativeExtension"); КінецьПроцедури
Якщо при запуску конфігурації 1С не було повідомлено про помилку, ВК була успішно підключена.
В результаті виконання наведеного коду у глобальній видимості конфігурації з'являється об'єкт ДемоКомп, що має властивості та методи, які визначені в коді зовнішньої компоненти
Демонстрація закладеного функціоналу
Перевіримо працездатність демонстраційної ВК. Для цього спробуємо встановити та прочитати деякі властивості, викликати деякі методи ВК, а також отримати та обробити повідомлення ВК.
У документації, що поставляється на диску ІТС, заявлений наступний функціонал демонстраційної ВК:
  1. Управління станом об'єкта компоненти
    Методи: увімкнути, Вимкнути
    Властивості: Включено
  2. Управлінням таймером
    Кожну секунду компонента надсилає повідомлення системі «1C: Підприємство» з параметрами Component, Timerта рядком лічильника системного годинника.
    Методи: СтартТаймер, СтопТаймер
    Властивості: Є Таймер
  3. Метод ПоказатиВрядкуСтатуса, який відображає у рядку статусу текст, переданий методом як параметри
  4. Метод ЗавантажитиКартинку. Завантажує зображення із зазначеного файлу та передає його в систему «1C: Підприємство» у вигляді двійкових даних.
Переконаємося у працездатності цих функцій. Для цього виконаємо наступний код:
перем ДемоКомп; Процедура ПриПочаткуРоботиСистеми() ПідключитиЗовнішнюКомпоненту(...); ДемоКомп = Новий ("AddIn.DemoVK.AddInNativeExtension"); ДемоКомп.Вимкнути(); Повідомити (ДемоКомп.Включен); ДемоКомп.Включити (); Повідомити (ДемоКомп.Включен); ДемоКомп.СтартТаймер(); КінецьПроцедури Процедура ОбробкаЗовнішньоїПодії(Джерело, Подія, Дані) Повідомити(Джерело + " " + Подія + " " + Дані); КінецьПроцедури
Результат запуску конфігурації наведено на зображенні


На панель «Повідомлення» виведено результати дзвінків методів ДемоКомп.Вимкнути()і Демо.Комп.Включити(). Наступні рядки на тій же панелі містять результати обробки отриманих від ВК повідомлень Джерело, Подіяі Данівідповідно.

Довільне ім'я зовнішньої компоненти

Завдання: Змінити ім'я зовнішньої частини довільне.
У попередньому розділі використовувався ідентифікатор AddInNativeExtension, зміст якого був пояснений. В даному випадку AddInNativeExtension- це найменування розширення.
У коді ВК визначено метод RegisterExtensionAs, що повертає системі «1С: Підприємство» ім'я, яке необхідне для подальшої реєстрації ВК у системі. Рекомендується вказувати ідентифікатор, який певною мірою розкриває суть зовнішньої компоненти.
Наведемо повний код методу RegisterExtensionAsіз зміненим найменуванням розширення:
bool CAddInNative::RegisterExtensionAs(WCHAR_T** wsExtensionName) ( wchar_t *wsExtension = L"SomeName"; int iActualSize = ::wcslen(wsExtension) + 1; WCHAR_T* dest = 0; ((void**)wsExtensionName, iActualSize * sizeof(WCHAR_T))) ::convToShortWchar(wsExtensionName, wsExtension, iActualSize); return true; ) return false;
У наведеному прикладі ім'я ВК змінено на SomeName. Тоді при підключенні ВК необхідно вказувати нове ім'я:
ДемоКомп = Новий ("AddIn.DemoVK.SomeName");

Розширення списку властивостей ВК

Завдання:
  1. Вивчити реалізацію властивостей ВК
  2. Додати властивість рядкового типу, доступна для читання та запису
  3. Додати властивість рядкового типу, доступна для читання та запису, яка зберігає тип даних останньої встановленої властивості. При встановленні значення властивості ніяких дій не провадиться

Для визначення властивостей створюваної компоненти розробнику необхідно реалізувати такі методи у коді бібліотеки AddInNative.cpp:
GetNProps
Повертає кількість властивостей даного розширення, 0 – за відсутності властивостей
FindProp
Повертає порядковий номер властивості, ім'я якого передається у параметрах
GetPropName
Повертає ім'я властивості за його порядковим номером та за переданим ідентифікатором мови
GetPropVal
Повертає значення властивості із зазначеним порядковим номером
SetPropVal
Встановлює значення властивості із зазначеним порядковим номером
IsPropReadable
Прапор повертає прапор можливості читання властивості із зазначеним порядковим номером
IsPropWritable
Повертає прапор прапора можливості запису властивості із зазначеним порядковим номером


Розглянемо реалізацію наведених методів класу CAddInNative.
У демонстраційній ВК визначено 2 властивості: Включеноі Є Таймер (IsEnabledі IsTimerPresent).
У глобальній області видимості коду бібліотеки визначено два масиви:
static wchar_t *g_PropNames = (L"IsEnabled", L"IsTimerPresent"); static wchar_t *g_PropNamesRu = (L"Увімкнено", L"ЄТаймер");
які зберігають російську та англійську назви властивостей. У заголовному файлі AddInNative.hвизначається перерахування:
enum Props (ePropIsEnabled = 0, ePropIsTimerPresent, ePropLast // Always last);
ePropIsEnabledі ePropIsTimerPresentвідповідно мають значення 0 і 1 використовуються для заміни порядкових номерів властивостей на осмислені ідентифікатори. ePropLast, має значення 2, використовується отримання кількості властивостей (методом GetNProps). Ці імена використовуються лише всередині коду компоненти та недоступні ззовні.
Методи FindProp та GetPropName здійснюють пошук за масивами g_PropNamesі g_PropNamesRu.
Для зберігання значення полів у модулі бібліотеки у класу CAddInNative визначені властивості, які зберігають значення властивостей компонентів. Методи GetPropValі SetPropValвідповідно повертають та встановлюють значення цих властивостей.
Методи IsPropReadableі IsPropWritableі повертають trureабо false, залежно від переданого порядкового номера властивості відповідно до логіки програми.
Для того щоб додати довільну властивість необхідно:

  1. Додати ім'я властивості, що додається в масиви g_PropNamesі g_PropNamesRu(файл AddInNative.cpp)
  2. У перелік Props(файл AddInNative.h) перед ePropLastдодати ім'я, що однозначно ідентифікує властивість, що додається
  3. Організувати пам'ять під збереження значень властивостей (завести поля модуля компоненти, що зберігають відповідні значення)
  4. Внести зміни до методів GetPropValі SetPropValдля взаємодії з виділеною на попередньому кроці пам'яттю
  5. Відповідно до логіки програми внести зміни до методів IsPropReadableі IsPropWritable
Пункти 1, 2, 5 не потребують пояснення. З деталями реалізації цих кроків можна ознайомитись, вивчивши додаток до статті.
Дамо назви тестовим властивостям Тесті ПеревіркаТипувідповідно. Тоді в результаті виконання пункту 1 маємо:
static wchar_t *g_PropNames = (L"IsEnabled", L"IsTimerPresent", L"Test", L"TestType"); static wchar_t *g_PropNamesRu = (L"Увімкнено", L"ЄТаймер", L"Тест", L"ПеревіркаТипу");
Перелік Propsматиме вигляд:
enum Props (ePropIsEnabled = 0, ePropIsTimerPresent, ePropTest1, ePropTest2, ePropLast // Always last);
Для значного спрощення коду використовуватимемо STL C++. Зокрема, для роботи з рядками WCHAR, підключимо бібліотеку wstring.
Для збереження значення методу Тест, визначимо у класі CAddInNativeв області видимості private поле:
string test1;
Для передачі рядкових параметрів між «1С:Підприємство» та зовнішньою компонентою використовується менеджер пам'яті «1С:Підприємство». Розглянемо його роботу докладніше. Для виділення та звільнення пам'яті відповідно використовуються функції AllocMemoryі FreeMemory, визначені у файлі ImemoryManager.h. При необхідності передати системі «1С: Підприємство» рядковий параметр, зовнішня компонента має виділити під неї пам'ять викликом функції AllocMemory. Її прототип виглядає так:
virtual bool ADDIN_API AllocMemory (void** pMemory, unsigned long ulCountByte) = 0;
де pMemory- адресу вказівника, в який буде вміщено адресу виділеної ділянки пам'яті,
ulCountByte- Розмір ділянки пам'яті, що виділяється.
Приклад виділення пам'яті під рядок:
WCHAR_T * t1 = NULL, * test = L "TEST_STRING"; int iActualSize = wcslen(test1)+1; m_iMemory->AllocMemory((void**)&t1, iActualSize * sizeof(WCHAR_T)); ::convToShortWchar(&t1, test1, iActualSize);
Для зручності роботи з рядковими типами даних опишемо функцію wstring_to_p. Вона отримує як параметр wstring-рядок. Результатом функції є заповнена структура tVariant. Код функції:
bool CAddInNative::wstring_to_p(std::wstring str, tVariant* val) ( char* t1; TV_VT(val) = VTYPE_PWSTR; m_iMemory->AllocMemory((void**)&t1, (str.length()+1) * sizeof(WCHAR_T));memcpy(t1, str.c_str(), (str.length()+1) * sizeof(WCHAR_T));val -> pstrVal = t1;val -> strLen = str.length(); return true;
Тоді відповідна секція case оператора switch методу GetPropValнабуде вигляду:
case ePropTest1: wstring_to_p(test1, pvarPropVal); break;
Методу SetPropVal:
case ePropTest1: if (TV_VT(varPropVal) != VTYPE_PWSTR) return false; test1 = std::wstring((wchar_t*)(varPropVal -> pstrVal)); break;
Для реалізації другої властивості визначимо поле класу CaddInNative
uint8_t last_type;
в якому зберігатимемо тип останнього переданого значення. Для цього до методу CaddInNative::SetPropVal додамо команду:
last_type = TV_VT(varPropVal);
Тепер при запиті читання значення другої властивості повертатимемо значення last_type, Що вимагає зазначене завдання.
Перевіримо працездатність змін.
Для цього наведемо зовнішній вигляд конфігурації 1С до вигляду:
перем ДемоКомп; Процедура ПриПочаткуРоботиСистеми() ПідключитиЗовнішнюКомпоненту("...", "DemoVK", ТипЗовнішньоїКомпоненти.Native); ДемоКомп = Новий ("AddIn.DemoVK.SomeName"); ДемоКомп.ПеревіркаТіпа = 1; Повідомити(Рядок(ДемоКомп.ПеревіркаТипу)); ДемоКомп.Тест = "Вася"; Повідомити(Рядок(ДемоКомп.Тест)); ДемоКомп.Тест = "Петя"; Повідомити(Рядок(ДемоКомп.Тест)); Повідомити(Рядок(ДемоКомп.ПеревіркаТипу)); КінецьПроцедури
В результаті запуску отримаємо послідовність повідомлень:
3
Вася
Петро
22

Друге та третє повідомлення є результатом читання властивості, встановленого на попередньому кроці. Перше та друге повідомлення містять код типу останньої встановленої властивості. 3 відповідає цілісному значенню, 22 - рядковому. Відповідність типів та їх кодів встановлюється у файлі types.h, що знаходиться на диску ІТС.

Розширення списку методів

Завдання:
  1. Розширити функціонал зовнішньої компоненти наступним функціоналом:
  2. Вивчити способи реалізації методів зовнішньої компоненти
  3. Додати метод-функцію Функц1, яка як параметр приймає два рядки («Параметр1» та «Параметр2»). Як результат повертається рядок виду: «Перевірка. Параметр1, Параметр2»
  4. Переконатися у працездатності здійснених змін

Для визначення методів створюваної компоненти розробнику необхідно реалізувати такі методи у коді бібліотеки AddInNative:
GetNMethods, FindMethod, GetMethodName
Призначені для отримання відповідно до кількості методів, пошуку номера та імені методу. Аналогічні відповідним методам для властивостей
GetNParams
Повертає кількість параметрів методу із зазначеним порядковим номером; якщо метод із таким номером відсутній або не має параметрів, повертає 0
GetParamDefValue
Повертає значення за промовчанням вказаного параметра вказаного методу
HasRetVal
Повертає прапор наявності у методу із зазначеним порядковим номером значення, що повертається: true для методів із повертаним значенням і falseв іншому випадку
CallAsProc
false, виникає помилка часу виконання та виконання модуля 1С: Підприємства припиняється. Пам'ять для масиву параметрів виділяється та звільняється 1С: Підприємством.
CallAsFunc
Виконує метод із зазначеним порядковим номером. Якщо метод повертає false, виникає помилка часу виконання та виконання модуля 1С: Підприємства припиняється. Пам'ять для масиву властивостей виділяється 1С: Підприємством. Якщо значення, що повертається, має тип рядок або двійкові дані, компонента виділяє пам'ять функцією AllocMemoryменеджер пам'яті, записує туди дані і зберігає цю адресу у відповідному полі структури. 1С: Підприємство звільнить цю пам'ять викликом FreeMemory.
Повний опис методів, включаючи список параметрів, докладно описаний у документації, що поставляється на диску ІТС.
Розглянемо реалізацію описаних вище методів.
У коді компоненти визначені два масиви:
static wchar_t *g_MethodNames = (L"Enable", L"Disable", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadPicture"); static wchar_t *g_MethodNamesRu = (L"Включити", L"Вимкнути", L"ПоказатиВ рядкуСтатусу", L"СтартТаймер", L"СтопТаймер", L"ЗавантажитиМалюнок");
та перерахування:
enum Methods (eMethEnable = 0, eMethDisable, eMethShowInStatusLine, eMethStartTimer, eMethStopTimer, eMethLoadPicture, eMethLast // Always last);
Вони використовуються у функціях GetNMethods, FindMethodі GetMethodName, За аналогією з описом властивостей.
Методи GetNParams, GetParamDefValue, HasRetValреалізують switch, залежно від переданих параметрів та логіки програми повертають необхідне значення. Метод HasRetValу своєму коді має лише список методів, які можуть повертати результат. Для них він повертає true. Для всіх сталевих методів повертається false.
Методи CallAsProcі CallAsFuncмістять безпосередньо виконуваний код методу.
Для додавання методу, який може викликатися лише як функція, необхідно зробити наступні зміни у вихідному коді зовнішньої компоненти:
  1. Додати ім'я методу до масивів g_MethodNamesі g_MethodNamesRu(файл AddInNative.cpp)
  2. Додати осмислений ідентефікатор методу до переліку Methods (файл AddInNative.h)
  3. Внести зміни до коду функції GetNParamsвідповідно до логіки програми
  4. При необхідності внести зміни до коду методу GetParamDefValue, якщо потрібно використовувати значення за промовчанням параметрів методу.
  5. Внести зміни до функції HasRetVal
  6. Внести зміни до логіки роботи функцій CallAsProcабо CallAsFunc, помістивши туди код методу, що безпосередньо виконується.
Наведемо масиви g_MethodNamesі g_MethodNamesRu, а також перерахування Methodsдо вигляду:
static wchar_t *g_MethodNames = (L"Enable", L"Disable", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadPicture", L"Test"); static wchar_t *g_MethodNamesRu = (L"Включити", L"Вимкнути", L"ПоказатиВ рядкуСтатусу", L"СтартТаймер", L"СтопТаймер", L"ЗавантажитиМалюнок", L"Тест");

Enum Methods (eMethEnable = 0, eMethDisable, eMethShowInStatusLine, eMethStartTimer, eMethStopTimer, eMethLoadPicture, eMethTest, eMethLast // Always last);
Відредагуємо функцію GetNPropsщоб вона повертала кількість параметрів методу «Тест»:
long CAddInNative::GetNParams(const long lMethodNum) ( switch(lMethodNum) ( case eMethShowInStatusLine: return 1; case eMethLoadPicture: return 1; case eMethTest: return 2; default:)
Внесемо зміни до функції :
bool CAddInNative::GetParamDefValue(const long lMethodNum, const long lParamNum, tVariant *pvarParamDefValue) ( ​​TV_VT(pvarParamDefValue)= VTYPE_EMPTY; switch(lMethodNum) howInStatusLine: case eMethStartTimer: case eMethStopTimer: case eMethTest: / / There are no parameter values ​​by default break; default: return false;) return false;
Завдяки доданому рядку
case eMethTest:
у разі відсутності одного чи кількох аргументів відповідні параметри матимуть порожнє значення ( VTYPE_EMPTY). Якщо необхідно значення за промовчанням для параметра, слід задати його в секції eMethTestоператора switch функції CAddInNative::GetParamDefValue.
Оскільки метод «Тест» може повертати значення, необхідно внести зміни до коду функції HasRetVal:
bool CAddInNative::HasRetVal(const long lMethodNum) ( switch(lMethodNum) ( case eMethLoadPicture: case eMethTest: return true; default: return false; ) return false; )
І додамо виконуваний код методу у функцію CallAsFunc:
bool CAddInNative::CallAsFunc(const long lMethodNum, tVariant* pvarRetValue, tVariant* paParams, const long lSizeArray) ( ... std::wstring s1, s2; switch(LoMethodNum) ( case eMeMe if (!lSizeArray || !paParams) return false; s1 = (paParams) -> pwstrVal; s2 = (paParams+1) -> pwstrVal; break;) return ret;
Скомпілюємо компоненту і наведемо код конфігурації до виду:
перем ДемоКомп; Процедура ПриПочаткуРоботиСистеми() ПідключитиЗовнішнюКомпоненту("...", "DemoVK", ТипЗовнішньоїКомпоненти.Native); ДемоКомп = Новий ("AddIn.DemoVK.SomeName"); пер = ДемоКомп.Тест ("Привіт,", "Світ!"); Повідомити(пер); КінецьПроцедури
Після запуску конфігурації отримаємо повідомлення: «Привіт, Світ!», що свідчить, що метод відпрацював успішно.

Таймер

Завдання:
  1. Вивчити реалізацію таймера у демонстраційній ВК
  2. Модифікувати метод "СтартТаймер", додавши можливість передавати в параметрах інтервал спрацьовування таймера (у мілісекундах)
  3. Переконатися у працездатності здійснених змін

У WinAPI для роботи з часом можна скористатися повідомленням WM_TIMER. Це повідомлення надсилатиметься вашій програмі через інтервал часу, який ви поставите під час створення таймера.
Для створення таймера використовується функція SetTimer:
UINT SetTimer(HWND hWnd, // описувач вікна UINT nIDevent, // ідентифікатор (номер) таймера UINT nElapse, // затримка TIMERPROC lpTimerFunc); // покажчик на функцію
Операційна система надсилатиме повідомлення WM_TIMERу програму з інтервалом зазначеним у аргументі nElapse(У мілісекундах). В останньому параметрі можна вказати функцію, яка виконуватиметься при кожному спрацюванні таймера. Заголовок цієї функції має виглядати так (ім'я може бути будь-яким):
void __stdcall TimerProc (HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
Розглянемо реалізацію таймера у демонстраційній ВК.
Так як ми розглядаємо процес розробки зовнішньої компоненти для ОС сімейства Windows, не розглядатимемо реалізацію таймера в інших операційних системах. Для ОС GNU/Linux, зокрема, реалізація буде відрізнятися синтаксисом функції SetTimerі TimerProc.
У виконуваному коді викликається метод SetTimer, до якого передається функція MyTimerProc:
m_uiTimer = ::SetTimer(NULL,0,100,(TIMERPROC)MyTimerProc);
Ідентефікатор створеного таймера міститься у змінну m_uiTimerщоб його можна було відключити.
Функція MyTimerProcвиглядає наступним чином:
VOID CALLBACK MyTimerProc(HWND hwnd, // handle of window for timer messages UINT uMsg, // WM_TIMER message UINT idEvent, // timer identifier DWORD dwTime // current system time) ( if (!pAsyncEvent) return; w "ComponentNative", *what = L"Timer"; wchar_t *wstime = new wchar_t; if (wstime) ( wmemset(wstime, 0, TIME_LEN); , what, wstime); delete wstime; ) )
Суть функції зводиться до того, що викликається метод ExternalEvent, що посилає повідомлення системі «1С: Підприємство».
Для розширення функціоналу методу СтартТаймерзробимо такі дії:
Модифікуємо код методу GetNParamsтак, щоб він для методу eMethStartTimerповертав значення 1:
case eMethStartTimer: return 1;
Наведемо код методу CallAsProcдо вигляду:
case eMethStartTimer: if (!lSizeArray || TV_VT(paParams) != VTYPE_I4 || TV_I4(paParams)<= 0) return false; pAsyncEvent = m_iConnect; #ifndef __linux__ m_uiTimer = ::SetTimer(NULL,0,TV_I4(paParams),(TIMERPROC)MyTimerProc); #else // код для GNU/Linux #endif break;
Тепер перевіримо працездатність. Для цього в модулі керованого додатка конфігурації напишемо код:
перем ДемоКомп; Процедура ПриПочаткуРоботиСистеми() ПідключитиЗовнішнюКомпоненту("...", "DemoVK", ТипЗовнішньоїКомпоненти.Native); ДемоКомп = Новий ("AddIn.DemoVK.SomeName"); ДемоКомп.СтартТаймер(2000); КінецьПроцедури
Після запуску конфігурації до програми надходитимуть повідомлення з інтервалом у 2 секунди, що говорить про коректну роботу таймера.

Взаємодія із системою «1С: Підприємство»

Для взаємодії між зовнішньою компонентою та системою «1С: Підприємство» використовуються методи класу IAddInDefBase, описаного у файлі AddInDefBase.h. Перерахуємо найчастіше використовувані:
Генерація повідомлення про помилку
віртуальний bool ADDIN_API AddError(unsigned short wcode, const WCHAR_T* source, const WCHAR_T* descr, long scode)
wcode, scode- коди помилки (список кодів помилок з описом можна знайти на диску ІТС)
source- джерело помилки
descr- Опис помилки
Надсилання повідомлення системі «1С: Підприємство»
virtual bool ADDIN_API ExternalEvent(WCHAR_T* wszSource, WCHAR_T* wszMessage, WCHAR_T* wszData) = 0;
wszSource- Джерело повідомлення
wszMessage- Текст повідомлення
wszData- дані, що передаються
Перехоплення повідомлення здійснюється процедурою Обробка Зовнішньої Події
Реєстрація зовнішньої компоненти у системі «1С: Підприємство»
virtual bool ADDIN_API RegisterProfileAs(WCHAR_T* wszProfileName)
wszProfileName- Ім'я компоненти.
Цих методів достатньо повноцінного взаємодії ВК і 1С. Для отримання даних зовнішньою компонентою від системи «1С: Підприємство» та навпаки зовнішня компонента відправляє спеціальне повідомлення, яке у свою чергу перехоплюється системою «1С» і, при необхідності, викликає методи зовнішньої компоненти для зворотної передачі даних.

Тип даних tVariant

При обміні даними між зовнішньою компонентою та системою «1С: Підприємство» використовується тип даних tVariant. Він описаний у файлі types.h, який можна знайти на диску з ІТС:
struct _tVariant ( _ANONYMOUS_UNION union ( int8_t i8Val; int16_t shortVal; int32_t lVal; int intVal; unsigned int uintVal; int64_t llVal; uint8_t ui8Val; uint8_t ui8Val; uint64_t ullVal; int32_t errCode; long hRes; float fltVal; double dblVal; bool bVal; char chVal; wchar_t wchVal; DATE date; IID IDVal; struct _tVariant *pvarVal; struct tm tmVal; strVal;uint32_t strLen ; //count of bytes ) __VARIANT_NAME_3/*str*/; _ANONYMOUS_STRUCT struct ( WCHAR_T* pwstrVal; uint32_t wstrLen; //count of symbol ) __VARIANT_NAME_4/*wstr*/; ) __VARIANT_NAME_1; uint32_t cbElements; //Dimension for an one- dimensional array in pvarVal TYPEVAR vt;);
Тип tVariantявляє собою структуру, яка включає себе:
  • суміш (union), призначену безпосередньо для зберігання даних
  • ідентифікатор типу даних
У загальному випадку робота зі змінними типу tVariantвідбувається за наступним алгоритмом:
  1. Визначення типу даних, які на даний момент зберігаються у змінній
  2. Звертання до відповідного поля суміші, для безпосереднього доступу до даних
Використання типу tVariantзначно спрощує взаємодію системи «1С: Підприємство» та зовнішньої компоненти

додаток

Каталог examples містить приклади до статті
examples/1 - запуск демонстраційної компоненти
examples/2 - демонстрація розширення списку властивостей
examples/3 - демонстрація розширення списку методів
Кожен каталог містить проект VS 2008 та готову конфігурацію 1C.

Варіант синтаксису: На ім'я та місцезнаходження

Синтаксис:

Підключити Зовнішню Компоненту (<Местоположение>, <Имя>, <Тип>)
Параметри:

<Местоположение>(обов'язковий)

Тип: Рядок.
Розташування зовнішнього компонента.
Як місце розташування може використовуватися:
шлях до файлу зовнішнього компонента у файловій системі (недоступно на веб-клієнті), не ZIP-архів;
повне ім'я макета, що зберігає двійкові дані або ZIP-архів;
URL до зовнішнього компонента, у вигляді двійкових даних або ZIP-архіву, в , аналогічному ОтриматиНавігаційнеПосилання.
<Имя>(обов'язковий)

Тип: Рядок.
Символічне ім'я зовнішнього компонента, що підключається.
Ім'я має задовольняти правила іменування вбудованої мови.
<Тип>(Необов'язковий)

Тип: Тип Зовнішньої Компоненти.
Тип зовнішнього компонента, що підключається.
Не використовується, якщо компонент упакований у ZIP-архів.
Опис варіанта методу:

Підключає компоненти, виконані за технологією Native та COM.
Компонент може зберігатися в інформаційній базі або макеті конфігурації у вигляді двійкових даних або ZIP-архіві.
Для режимів запуску "Тонкий клієнт" та "Веб-клієнт" компонент повинен бути попередньо встановлений методом Встановити Зовнішню Компоненту.
Варіант синтаксису: За ідентифікатором

Синтаксис:

Підключити Зовнішню Компоненту (<ИдентификаторОбъекта>)
Параметри:

<ИдентификаторОбъекта>(обов'язковий)

Тип: Рядок.
Ідентифікатор об'єкта зовнішнього компонента як ProgID (Programmatic Identifier) ​​реєстру MS Windows (наприклад: "AddIn.Scanner").
Повинна відповідати інформації, що у реєстраційної базі даних системи (Registry).
Опис варіанта методу:

Компонент має бути виконаний за технологією COM та зареєстрований у реєстрі MS Windows.
Ці компоненти сумісні з компонентами 1С:Підприємства 7.7.
Увага! Варіант методу не працює на сервері та у зовнішньому з'єднанні.
Значення, що повертається:

Тип: Бульово.
Істина – підключення пройшло успішно.
Опис:

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

Доступність:

Тонкий клієнт, веб-клієнт, сервер, зовнішнє з'єднання.
Примітка:

Зовнішні компоненти можуть бути виконані за технологією Native API чи COM. Компоненти, виконані за технологією COM, сумісні з компонентами 1С: Підприємства 7.7.
Веб-клієнт може працювати лише з компонентами в інформаційній базі, запакованими в архів.
Тонкий клієнт може працювати з компонентами в інформаційній базі, запакованими в архів, та компонентами, які розташовані у файловій системі.
Товстий клієнт може працювати з усіма варіантами зберігання компонентів. При цьому якщо компонент встановлений методом Встановити Зовнішню Компоненту, то використовується встановлений компонент, а якщо не встановлений, то компонент буде отриманий в момент підключення.
Сервер може працювати з усіма компонентами. Компонент кешується на сеанс роботи сервера.
Приклад:

Якщо Підключити ЗовнішнюКомпоненту("AddinObject.Scanner") Тоді
Повідомити("Компонента для сканера штрих-кодів завантажена");
Інакше
Повідомити("Компонента для сканера штрих-кодів не завантажена");
КінецьЯкщо;

Запитання: Зовнішня компонента Native Api на C++ під Linux (Ubuntu x64) на 1С 8.3


Пишу ВК, не можу підключити до 1с на ubuntu. Навіть екзапл від 1с не підключається. Тому питання щодо нього:

1) Намагаюся підключи ВК із прикладу VNCOMPS, наведеним у статті

(Посилання можна знайти в самому кінці: «Копіювання»).
Усередині проекту NativeApi є makefile. За його допомогою я збираю.so бібліотеку на Ununtu.
Але при "Підключити Зовнішню Компоненту" 1с вилітає.
Аналогічно, якщо збираю за допомогою build.sh (в корені проекту).

У самому makefile змінюю прапор з m32 на m64, т.к. 1с та сама система x64. (З параметром m32 не підчіплюється все одно)
Ось приклад виклику ВК із 1С 8.3:
ПідключенняВиконано = Підключити Зовнішню Компоненту("/home/alexeyubuntux64-20 gb/Документи/VNCOMP83/example/NativeAPI/AddInNative.so", "AddInNative", ТипЗовнішньоїКомпоненти.Native); Є статейка на цю тему.
Але, наскільки я бачу, всі ці моменти вже враховані виправили у прикладі VNCOMPS.

Але, по суті, справа в параметрах компіляції. Мб 32-бітна зовнішня компонента підчіпляється до 32-х бітної 1с нормально, але я розгорнув на Ubuntu x64 1c enterprise83 8.3.5-1486 amd64. І хочу до неї підчепити ВК.

Чи є у кого думки, як вирішити це питання?)
VNCOMPS-приклад повинен працювати, але походу треба виправити параметри складання, або сама платформа, на якій я тестую - некоректна.

Відповідь:Цікаво, а насправді можна зовнішню компоненту написати?

Питання: Не підключається зовнішній компонент (Native)


Скомпілював приклад з ІТС для 64 і 32 бітної системи.

Підключаю так:
Результат Підключення = Підключити Зовнішню Компоненту (Шлях КДЛЛ, "Comp", Тип Зовнішньої Компоненти. Native); На одному ПК підключення відбувається, на іншому немає. Є різниця в ос. Де підключення проходить, там стоїть Win7, де немає Win10. При цьому на ПК, де моя компонента не працює, працюють типові компоненти.

Тестував на різних платформах (8.3.4.482, 8.3.6.2100, 8.3.11.2700, 8.3.12.1412).

Як зрозуміти, чому не підключається?

Відповідь: vc_redist не забув?

Питання: 1С8 та зовнішня компонента з типом Native


Добридень.
Є конфігурація БП 3.0.50.12 та бажання впровадити в неї зважування від компанії Терези-Софт за допомогою UniServerAuto.
Розробники скомпілювали компонент на Native для Windows 32 і 64, і з файлом maifest склали в архів. Також є приклад для 1С, як можна вважати вагу. У ньому за допомогою макета із двійковими даними вказано, я так розумію, архів цей. У прикладі все непогано: встановлюється компонент, підключається, потім встановлюється зв'язок і зчитується вага.
Але як тільки починаєш собі в 1С переносити – вага не зчитується. Начебто все просто написано, але де граблі не зрозумію.
У кого буде трохи часу – допоможіть, гляньте одним оком, може рішення на поверхні, а я ходжу десь не там і роблю не те. Раніше мені не доводилося працювати з технологією Native.

А у вкладенні мій текст обробки

Відповідь:

Ну що, є новини у мене...
Почав просто по кроках дивитися, в який момент почне збоїти. Для цього створив порожню базу та обробку з командою. За аналогією з прикладом постачальника переніс макет у нову конфу – працює з другого разу. Тобто. з першого разу немає, а з другого – так. Це наштовхнуло на думку, що все-таки треба буде у своїй обробці розвести підключення компоненти та об'єкта за різними процедурами.
Далі переніс це у свою базу із підключенням макета – працює. Фух, вже добре .... Але хотілося б без внесення змін до конфігурації, значить йдемо далі

Пробую макет додати до обробки. Її розмір відразу збільшується з 10кб до 3Мб і помічається суттєве уповільнення роботи - не підходить. Починаю копати у бік підключення компоненти через DLL. Тобто. по суті ще й з чого почав. Але тут є одне "АЛЕ": пошуком на ім'я dll по папці користувача помітив, що ця dll лежить там, де (я так зрозумів) складаються зареєстровані в 1С dll-ки:
C:\Users\USER\AppData\Roaming\1C\1cv8\ExtCompT
відповідно немає потреби використовувати повний шлях до dll, можна просто прописати її ім'я:
Підключити Зовнішню Компоненту ("Add1CUniServerAuto32.dll", "UniServerAuto", Тип Зовнішньої Компоненти. Native);

Спробую... лається на реєстрацію, але результат зважування повертає. Виходить, що вже dll зареєстрована і отже її потрібно просто підключати. Забираю і все працює.
Підводжу підсумок:
1. В обробку зважування в процедуру При відкритті внесіть підключення зовнішньої компоненти та підключення до об'єкта.
2. Шлях до dll Не писав, вказав просто її ім'я.

Тепер сиджу і думаю, а коли dll встановилася у 1С? У момент встановлення? Навряд чи... У момент запуску конфігурації розробника цієї dll, де вона встановлюється при відкритті форми? Не знаю, але мені здається близько... Як ви думаєте?
І друге, на новому місці, коли з'явиться потреба встановлення такого ж терміналу, що треба зробити, щоб усе запрацювало? Встановити повністю ПЗ, запустити конфу постачальника щоб перевірити роботу і потім (теоретично) моя обробка повинна заробити? Щось якось складно... Або ж після встановлення ПЗ у моїй обробці зробити Встановити Зовнішню Компоненту один раз?

Ваші думки щодо цього хотілося б почути...

Запитання: Зовнішня компонента.dll


Всім доброго дня.
Таке питання.
Компонента dll, яка чудово працює в 1С 7.7
в 1с 8.1 не хоче взагалі завантажитись...
Пробував і вставити її в C:\Program Files\1cv81\bin\cache1c.dll
Пробував реєструвати засобами regsvr32 "C:\Program Files\1cv81\bin\cache1c.dll"
Реєструється без проблем.
Коли хочу до неї звернутися, отримую повідомлення про помилку:

Помилка завантаження зовнішньої компоненти! cache1c.dll
Процедура КнопкаВиконатиНатискання(Кнопка) Спроба ЗавантажитиЗовнішнюКомпоненту( "C:\Program Files\1cv81\bin\cache1c.dll"); Виняток Повідомити( "Помилка завантаження зовнішньої частини!"+ "cache1c.dll"); КінецьСпроби; Спроба// Отримати об'єкт компоненти. // m = Новий ("cache1c.GTMcmd"); m = Новий COMОб'єкт ("cache1c.GTMcmd"); Виняток Повідомити(); КінецьСпроби; КінецьПроцедури

Відповідь:Банально до неможливості...
Потрібно витримати паузи між викликами (мілісекунди).
Процедура Кнопка Виконати Натискання (Кнопка) Спроба // Отримати об'єкт компоненти. m = Новий COMОб'єкт ("cache1c.GTMcmd"); Виняток Повідомити( "Не вдалося створити об'єкт зовнішньої частини"); КінецьСпроби; m.RemoteHost = "192.168.1.101"; m.RemotePort = 6330; m.Підключити(); m.Пауза(100); ...... і т.д
Для 1с 7.7 - це не потрібно, виходить, що швидше звернення.

Питання: Робота зовнішньої компоненти із сервером 1С...


Добридень,

Є зовнішня компонента, написана на С++, завдання якої отримання інформації із зовнішньої бази даних і повернення результату запиту як Таблиці значень в 1С.
Для формування таблиці значень на даний момент використовується інтерфейс IDispatch * pBackConnection, що отримується як параметр функції Init(). Далі я просто, використовуючи функції 1С, формую таблицю значень, заповнюю її і повертаю її в другий параметр в CallAsFunc(...).
Проблеми розпочалися із переходом на тонких клієнтів 1С. На стороні сервера зовнішня компонента до ладу не запускається. Можна запустити на стороні клієнта, але це виглядає як милиці і випадає із загальної логіки "клієнт-сервер" в 1С. Наприклад, клієнт не розуміє, що таке таблиця значень, проблеми з "глобальними" змінними, сеансами тощо.
NativeAPI ще більш урізаний у цьому плані.
Танці з бубном призвели до того, що я зміг запустити зовнішню компоненту під сервером 1С, але робота відбувається до того моменту, поки не робиться спроба викликати Invoke у pBackConnection. 64-бітна версія сервера 8.2 щось намагається робити, доки не відвалюється по таймауту, 32-бітна (ВК природно теж 32 бітна) просто відразу відвалюється.
Припускаю, що сервер 1С не обслуговує режим роботи.
Відповідно виникають питання, чи це тимчасово чи логіка 1С зводиться до скасування цієї схеми роботи? Якщо створити внутрішні структури 1С (таблицю значень) у такий спосіб не можна, чи є в принципі опис, що являє собою таблиця значень на системному рівні, щоб спробувати створити її на С++, заповнити, а потім просто підсунути 1С як поворотний параметр? Хотілося б хоча б одержати напрям, у який бік копати.

Дякую.

Відповідь:

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

В рамках одного сеансу можна було, і можна зараз, оголосити змінні в модулі сеансу, які житимуть і будуть видно в рамках сеансу з різних місць... взагалі-то, їх 4 штуки.
- модуль сеансу;
- модуль звичайного додатку;
- модуль керованого додатка;
- модуль зовнішнього з'єднання.

Ну і звичайно, треба пам'ятати про контекст. Серверний контекст безпосередньо не доступний на стороні клієнта і навпаки.

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

Таблиця на формі... а вона пов'язана з якоюсь таблицею об'єкта (обробки, наприклад)? чи ні. Якщо так, то вона доступна і на сервері (&На сервері) там і редагуйте.

І так, ТаблицяЗначень не доступна в УФ на стороні клієнта. Ну так вже вирішила 1С.

Та гаразд! Ось з Excel працює, з FSO працює і купою всього іншого, а тут не працює. Відловлюйте помилку та аналізуйте.

Спроба
...
ваші дії
...
Виняток
стор = ОписПомилки();
КінецьСпроби;

За сучасних апаратних можливостей, це взагалі не аргумент.

Суто Ваша особиста думка. Нічого спільного з реальністю немає. У жодному вигляді. Повторю ще раз, 1С чудово працює з COM. Як із in-proc, так і з out-proc.

Наведіть код, яким ви завантажуєте і звертаєтеся до ВК.

До речі, ВК... у Вашому випадку це COM або Native API?
Якщо COM, то ви реєструєте її як... через regsvr32... як тоді розрулюєте питання розрядності?

Запитання: Встановлення зовнішньої компоненти


Підкажіть плз як встановити зовнішню компоненту. Під час виконання наступного коду видається помилка. У макеті знаходити NameDecl.dll

Спроба Встановити Зовнішню Компоненту ("Загальний Макет.Макет"); Виняток КінецьСпроби;
Помилка: Встановлення зовнішньої частини не виконано!

Відповідь: ()
Підключити Зовнішню Компоненту ("Загальний Макет.Макет", "NameDecl", Тип Зовнішньої Компоненти. Native) видає БРЕХНЯ ,
Новий("AddIn.NameDecl.CNameDecl", Невизначено) = (()): Тип не визначений (AddIn.NameDecl.NameDecl)

Запитання: Не підключається native dll на 1с 8.1 (fptrwin32_fz54_9_11_0_5549.dll)


Вітаю.
1С оновив dll для онлайн-кас атол для ФДД 1.05 (входить в обробку обслуговування fptrwin32_fz54_9_11_0_5549.dll).
У мене стара 1С 8.1. Вона на відміну від 8.2 не підтримує роботу із зовнішнім обладнанням аналогічно 8.2, тому спочатку потрібно зареєструвати dll у windows, а потім лише в 1С підключати?

Прогід = "AddIn.ІнтеграційнаКомпонента.ATOL_KKT_1C83_V9"; Завантажити ЗовнішнюКомпоненту("C:fptrwin32_fz54_9_11_0_5549.dll"); Підключити Зовнішню Компоненту (ПрогІД); Драйвер = Новий (ПрогІД);

Однак стара обробка була написана на "технології" com, а нова native. Відповідно при реєстрації regsvr32 видає помилку:
Модуль завантажений, але точку входу DllRegisterServer не знайдено. І пропонує перевірити, чи цей файл є правильним файлом dll або OCX.
Хто з такою ситуацією стикався, як викручувалися? Розумію, що аналогічна проблема буде і в 7.7.
Код 8.2:

Макет = ОтриматиМакет("ІнтеграційнаКомпонента"); Адреса = ПоміститиВчаснеСховище(Макет); Підключити Зовнішню Компоненту (Адреса, "Інтеграційна Компонента", Тип Зовнішньої Компоненти. Native); Драйвер = Новий("AddIn.ІнтеграційнаКомпонента.ATOL_KKT_1C83_V9");

1C 8.2:
Підключити Зовнішню Компоненту (<Местоположение>, <Имя>, <Тип>)
1С 8.1:
Підключити Зовнішню Компоненту (<Идентификатор объекта>)
Параметри:
<Идентификатор объекта>(обов'язковий)
Тип: Рядок. ProgID (Programmatic Identifier) ​​об'єкта зовнішньої компоненти. Повинна відповідати інформації, що у реєстраційної базі даних системи (Registry).
Опис:
Підключає об'єкти зовнішньої компоненти до 1С:Підприємству.
Недоступний на сервері 1С: Підприємство. Не використовується у модулі зовнішнього з'єднання.
Примітка:
Зовнішні компоненти сумісні з компонентами 1С: Підприємства 7.7.
Приклад:
Спроба
Підключити Зовнішню Компоненту ("AddinObject.Scanner");
Повідомити("Компонента для сканера штрих-кодів завантажена");
Виняток
Повідомити("Компонента для сканера штрих-кодів не завантажена");
КінецьСпроби

Якось можна цю dll на 8.1 підключити чи ні?

Дякую!

Відповідь:

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

Приклад коду 8.3:
Перем Драйвер Експорт;
Функція ПідключенняКомпонентиККТ() Експорт
Спроба

Макет = ОтриматиМакет("ІнтеграційнаКомпонента");
Адреса = ПоміститиВчаснеСховище(Макет);
Підключити Зовнішню Компоненту (Адреса, "Інтеграційна Компонента", Тип Зовнішньої Компоненти. Native);
Драйвер = Новий("AddIn.ІнтеграційнаКомпонента.SMDrvFR1C20");
Результат = Істина;

Виняток

Результат = Брехня;

КінецьСпроби;
Повернення Результат
КінецьФункції

Приклад коду 8.1

Функція СтворитиОб'єктДрайвера(Драйвер) Експорт

Результат = Істина;

Спроба

РядокСполуки="File="""Шлях до бази""";
КомОбъект= Новий COMОбъект("V83.ComConnector");
Коннект = КомОбъект.Connect (Рядок З'єднання);

Обробка = Коннект.Обробки.ПідключенняЗовнішньоїКомпоненти.Створити();
РезультатПідключення = Обробка.ПідключенняКомпонентиККТ();
Якщо Результат Підключення Тоді
Драйвер = Обробка. Драйвер;
КінецьЯкщо;

Виняток
Хто займався цим або стикався з подібними винесеннями, поясніть на простому прикладі сам принцип. Начебто з підключенням зовнішніх компонентів все зрозуміло.

// Приклад заповнення таблиці значеньТЗ.Очистити(); Запит = Новий Запит; Запит.Текст = "ВИБРАТИ | Номенклатура.Посилання ЯК Номенклатура | З | Довідник.Номенклатура ЯК Номенклатура"; РезультатЗапиту = Запит.Виконати(); Вибірка = РезультатЗапиту.Вибрати(); Поки Вибірка.Наступний() Цикл Стор = ТЗ.Додати();
Не могли б ви на цьому прикладі пояснити, яку частину коду зазвичай виносять. Логічно було б винести частину із запитом, але тоді як із зовнішньої компоненти ми звернемося до БД із зовнішньої компоненти в обхід платформи? Текст виносити безглуздо. Або виносити саме формування табличної частини. Поділіться досвідом хто стикався з це.

Відповідь:А що слово "Несумісно" завжди означає слово "Погано"? Так мені здається, що назви я свій стиль «1С: Найгірше програмування на цьому скриптовому движку, яке існує в природі (у перекладі літературною мовою)!» і то, напевно, знайдуться охочі зацінити цього звіра. А так схоже на класику: Я Пастернака не читав, але я повністю з ним не згоден!

Питання: Підключення зовнішньої компоненти до 1с 8.3.6 та Win8


До самописної конфігурації треба підключити Зовнішкомпоненту vk_rs232.dll. Начебто зареєструвала через regsvr32.exe. "Начебто" тому, що отримала повідомлення, що "компонента зареєстрована, але чогось там з брандмауером". Надіявшись на першу половину повідомлення, пишу код в 1с
ПісляПідключення = Новий ОписОповіді("ПісляПідключенняВК",ЦяФорма); ПочатиУстановкуЗовнішньоїКомпоненти(,"C:\Controller\vk_rs232.dll"); ПочатиПідключенняЗовнішньоїКомпоненти(ПісляПідключення,"C:\Controller\vk_rs232.dll","ДЛЛ_Терези");
і отримую помилку, що
"Встановлення зовнішньої компоненти не виконано! Можливо відсутня компонента для клієнтської програми, що використовується!".

І тепер я не зрозумію:
1. Може все ж таки компонента не зареєструвалася в реєстрі - як її там перевірити?
2. Може її "версія" не працює під Win8, хоча вона має 32-біт.
3. Може сама 1с надто нова, тобто. відповідно не може працювати з цією dll-кою?
4. Ну і банальне – я пишу щось не те.

Відповідь:І все це призвело до мене в наступній проблемі. Зовнішкомп установлено, тепер її треба підключити. І тут обидва варіанти
Підключити ЗовнішнюКомпоненту("C:Controller\vk_rs232.dll","Терези")
Підключити ЗовнішнюКомпоненту("ЗагальнийМакет.Макет","Терези")


Це з деякими особливостями роботи функції глобального контексту Підключити Зовнішню Компоненту() .

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

При цьому користувачі бачать, наприклад, таку картинку:

У той час як при роботі з локальних комп'ютерів жодних проблем із підключенням зовнішніх компонентів немає.

З чим це пов'язано? Це пов'язано з тим, що коли користувачі працюють через сервер терміналів, вони мають менше прав, ніж при роботі на локальному комп'ютері.

У цьому легко переконатись, якщо зайти на сервер терміналів під обліком з адміністративними правами.

Причина такої різниці у тому, що 1С неспроможна зареєструвати зовнішню компоненту в реєстрі, коли користувач працює у терміналі під звичайними правами, т.к. у звичайного користувача немає прав на запис у гілку системного реєстру HKEY_CLASSES_ROOT.

У публікаціях на тему підключення зовнішніх компонентів в терміналі пропонуються різні методи вирішення цієї проблеми.

Наприклад, такі:

1. Запустити вперше 1С під адміністративними правами.

Цей варіант далеко не завжди спрацьовує. Нижче поясню чому.

2. Дати звичайним користувачам терміналу право на запис у гілку системного реєстру HKEY_CLASSES_ROOT.

Недостатньо "просунутим" користувачам краще цього не робити, інакше можуть бути проблеми.

3. За допомогою різних "примочок" реєструвати ВК від імені користувача з повними правами.

Теж не їсти добре.

То як же краще вийти з цієї ситуації?

Я пропоную свій варіант вирішення цієї проблеми. На мою думку – простий та красивий.

Досліджуючи цю проблему, я поставив питання - а навіщо 1С взагалі намагається зареєструвати ВК по новому шляху? Адже вона вже зареєстрована у системі.

Справа виявилася в тому, що в типових конфігураціях 1С (наприклад "Управління Торгівлею") використовується такий синтаксис методу глобального контексту.

Підключити ЗовнішнюКомпоненту("Довідник.ПідключаєтьсяОбладнання.Макет.ДрайверАТОЛСканерШтрихкоду", "АТОЛСканер");

Як бачимо, ВК драйвера підключається з макета "ДрайверАТОЛСканерШтрихкода" довідника "Обладнання, що підключається".

Що при цьому відбувається?

1С зберігає компонент у тимчасовій папці користувача, наприклад "C:\Documents and Settings\User\Local Settings\Temp\1032\v8_4_12.tmp"

і намагається зареєструвати її у гілці реєстру HKEY_CLASSES_ROOTсаме цим шляхом.

На терміналі у звичайних користувачів немає прав на зміну цієї гілки реєстру, тому компонент у них не підключається.

Тепер про те, як вийти із цієї ситуації.

Метод глобального контексту Підключити Зовнішню Компоненту має кілька варіантів синтаксису. Ось цим ми й скористаємося.

Отже, за кроками:

1. Реєструємо зовнішню компоненту утилітою regsvr32.exe на сервері терміналів у папці C:\WINDOWS\SYSTEM32 для 32-розрядної ОС або в папці C:\WINDOWS\SYSWOW64 для 64-розрядної ОС.

2. Використовуємо один із двох додаткових варіантів синтаксису методу Підключити Зовнішню Компоненту():

Варіант 1:

Підключити Зовнішню Компоненту ("C: WINDOWS SysWOW64 Scaner1C.dll", "АТОЛСканер", Тип Зовнішньої Компоненти.COM);

Об'єктДрайвера = Новий ("AddIn.АТОЛСканер.Scaner45");

Варіант 2:

ProgID = "AddIn.Scaner45";

Підключити Зовнішню Компоненту (ProgID);

Об'єкт Драйвера = Новий (ProgID);

На мій погляд, варіант № 2 кращий.

При цьому 1С не намагається перереєструвати ВК новим шляхом у реєстрі і таким чином, усі проблеми вирішуються.

Ну от, власне, і все. Успіхів у роботі!

[необхідно зареєструватися для перегляду посилання]



Сподобалася стаття? Поділіться їй