Новые релизы «1С: Управление торговлей»: обновление без развития. Использование внешних COM-компонент (.dll) или любых клиентских методов в регламентных заданиях серверной базы Взаимодействие с системой «1С: Предприятие»
Например, не получится переписать компоненту, если вы не её автор и исходников просто нет. Либо если для ее работы недостаточно поддерживаемых технологией Native API простейших типов (число, строка, булево, дата).
При работе с файловой базой особых проблем нет. Регламентное задание вызывается в фоновом процессе обычного пользователя. Поэтому ему доступны клиенские вызовы. В серверной базе при запуске регламентного задания клиентского контекста нет, соответственно вызов ПодключитьВнешнююКомпоненту() недоступен.
В этом случае можно вызывать компоненту на клиенте. Для этого достаточно выполнить из регламентного задания на сервере запуск еще одного сеанса 1С в котором на клиенте выполнить нужные действия. Ну и не забыть потом завершить запущенный сеанс.
Допустим, у нас в регламентном задании выполняется формирование и сохранение отчета, использующего для склонения ФИО внешнюю COM-компоненту NameDeclension.dll. На файловой базе такое регламентное задание будет работать корректно, на серверной компоненту подключить не получится.
Для устранения проблемы добавим в модуль регламентных заданий процедуру, которая в серверном режиме запустит еще один сеанс и в нем выполнит из внешней обработки вызов формирования отчета на клиенте.
#Если Клиент Тогда Процедура ВыполнитьФормированиеИСохранениеОтчета() Экспорт Если ПодключитьВнешнююКомпоненту("ОбщийМакет.NAMEDECL","Скл",ТипВнешнейКомпоненты.COM) Тогда Компонента = Новый ("AddIn.Скл.NameDeclension"); //Тут код формирования и сохранения отчета Иначе ЗаписьЖурналаРегистрации("РеглЗадания", УровеньЖурналаРегистрации.Ошибка, "Не удалось подключить внешнюю компоненту на клиенте"); КонецЕсли; КонецПроцедуры #Иначе Процедура ВыполнитьФормированиеИСохранениеОтчета() Экспорт ВыполнитьОперациюНаКлиенте("РеглЗадания.ВыполнитьФормированиеИСохранениеОтчета()"); КонецПроцедуры Процедура ВыполнитьОперациюНаКлиенте(ПараметрДляВыполнения) Экспорт ИмяПользователя = ""; ПарольПользователя = ""; ПутьКВнешнейОбработке = "c:/temp/Автозапуск.epf"; Кавычка = """"; КаталогBIN = КаталогПрограммы(); ПутьККонфигурации = СтрокаСоединенияИнформационнойБазы(); ПутьККонфигурации = СтрЗаменить(ПутьККонфигурации, Кавычка, Кавычка + Кавычка); СтрокаЗапуска = Кавычка + КаталогBIN + "1cv8.exe" + Кавычка + " ENTERPRISE" + " /IBConnectionString " + Кавычка + ПутьККонфигурации + Кавычка + " /N " + Кавычка + ИмяПользователя + Кавычка + " /P " + Кавычка + ПарольПользователя + Кавычка + " /Execute " + Кавычка + ПутьКВнешнейОбработке + Кавычка + " /C " + Кавычка + ПараметрДляВыполнения + Кавычка; ЗапуститьПриложение(СтрокаЗапуска); КонецПроцедуры #КонецЕсли
Код внешней обработки, которая просто вызовет в контексте клиента печать нужного отчета из модуля регламентных заданий и завершит сеанс после формирования отчета.
Попытка Выполнить(ПараметрЗапуска); Исключение КонецПопытки; ЗавершитьРаботуСистемы(Ложь);
Удобство решения в том, что при настройке регламентных заданий не важно, в каком режиме будет выполняться запуск задания. Если база файловая, то сразу запустится нужная процедура. Если база серверная и при запуске клиентский контекст отсутствует, то выполнится инициализация нового сеанса и в нем процедура корректно отработает в контексте клиента.
Код для обычного приложения. Теоретически полностью аналогично будет работать и в управляемом.
p.s. Также этот подход можно использовать для выполнения любых клиентских процедур в регламентных заданиях.
Зачастую у программистов возникают проблемы с подключением внешних компонент (например, драйверов торгового оборудования), когда пользователи работают с 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С не пытается перерегистрировать ВК по новому пути в реестре и таким образом, все проблемы решаются.
Ну вот собственно и все. Успехов в работе!
Вариант синтаксиса: По имени и местоположению
Синтаксис:
ПодключитьВнешнююКомпоненту(<Местоположение>, <Имя>, <Тип>)
Параметры:
<Местоположение> (обязательный)
Тип: Строка.
Местоположение внешнего компонента.
В качестве местоположения может использоваться:
путь к файлу внешнего компонента в файловой системе (недоступно на веб-клиенте), не 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") Тогда
Сообщить("Компонента для сканера штрихкодов загружена");
Иначе
Сообщить("Компонента для сканера штрихкодов не загружена");
КонецЕсли;
Мобильное приложение позволяет осуществлять складские операции (инвентаризация товаров и основных средств, перемещение товаров) в 1С Бухгалтерия 3.+. Приложение разработано нативно на Android. Для полноценной работы при обмене через файл требуется только внешняя обработка. Для данного приложения не нужны промежуточные базы и какое-либо дополнительное ПО. Приложение может работать при полном отсутствии связи.
Функциональные возможности:
. Инвентаризация товаров;
. Инвентаризация основных средств;
. Перемещение товаров;
Ссылка на скачивание.
История версий.
Поддержка версий Android.
Android 4.4 и выше.
Поддержка конфигураций.
1С: Бухгалтерия 3.+
Поддержка сканеров штрихкодов и ТСД.
- GS-М100BT поддерживается в режиме SPP;
- ТСД CARIBE PL 50L
- Поддерживаются любые сканеры в режиме HID подключенные через OTG.
Функционал.
Инвентаризация товаров.
Для проведения инвентаризации товаров необходимо в 1С подготовить документ Инвентаризация товаров без фактического количества. Далее необходимо перейти в приложении в раздел Инвентаризация товаров. Если у вас настроен онлайн обмен с 1С, то нажмите в меню Загрузить. При этом загрузятся все документы Инвентаризация товаров, отредактированные документы не будут перезаписаны.
Табличная часть
Соответствие штрихкода ищется в памяти устройства, если не найдено, то ищется в базе 1С, если не найдено, то ищется в базе 1С в основных средствах. Если в результате поиска найдена номенклатура, то произведется поиск в табличной части документа. Если объект будет найден в табличной части, то в этой строке будет добавлено количество 1 + количество, найденное в табличной части. Если объект не будет найден в табличной части, то он будет добавлен в табличную часть документа с фактическим количеством 1 и учетным количеством 0. Если в результате поиска будет найдено основное средство, то программа предложит добавить его в документ Инвентаризация ОС.
Выгрузка документов в 1С
Инвентаризация основных средств.
Для проведения инвентаризации основных средств (далее ОС) необходимо в 1С подготовить документ Инвентаризация ОС без фактического наличия. Далее необходимо перейти в приложении в раздел Инвентаризация ОС. Если у вас настроен онлайн обмен с 1С, то нажмите в меню Загрузить. При этом загрузятся все документы Инвентаризация ОС, отредактированные документы не будут перезаписаны.
Если ваше приложение работает автономно, то загрузить документы можно из файла. Файл выгружается из 1С с помощью обработки.
Документы можно удалить все сразу, нажав на Удалить всё или по одному, смахнув влево или вправо.
Табличная часть
Нажав на нужный документ откроется табличная часть по аналогии с 1С. Табличная часть позволяет добавлять/изменять/удалять строки, редактировать количество.
Сканирование и обработка штрихкодов
Штрихкоды можно сканировать с помощью камеры, ручного сканера, сканера GS-M100BT, ТСД Carible PL 50L или ввести вручную.
Алгоритм поиска штрихкода следующий:
Соответствие штрихкода ищется в памяти устройства, если не найдено, то ищется в базе 1С. Если в результате поиска найдено, то произведётся поиск в табличной части документа. Если объект будет найден в табличной части, то в этой строке будет установлено фактическое наличие. Если объект не будет найден в табличной части, то он будет добавлен в табличную часть документа с фактическим наличием.
Выгрузка документов в 1С
Завершенные документы выгружаются в 1С из меню табличной части.
По аналогии с загрузкой документы можно выгружать онлайн в 1С или через файл.
Назначение и печать штрихкодов номенклатуры.
Для установки штрихкода и печати этикеток необходимо подключить внешнюю печатную форму и в карточке Номенклатуры и нажать на Печать штрихкода. Если у данной номенклатуры нет штрихкода, то штрихкод автоматически сформируется и выведется на печать этикетка. Этикетка будет напечатана размером 60Х30.
Назначение и печать этикеток основных средств.
В качестве штрихкода для ОС используются код справочника ОС. Для печати необходимо подключить внешнюю печатную форму и в карточке ОС нажать Печать штрихкода. Этикетка будет напечатана размером 60Х30.
Настройки.
Описание настроек.
Настройка bluetooth сканера GS-M100BT.
На экране Настройка можно настроить bluetooth сканер штрих кода GS-М100BT. Для первой настройки необходимо сначала открыть "Bluetooth", откроется стандартный интерфейс для сопряжения устройств(на разных устройствах будет выглядеть по разному).
Быстрый старт
- Установить приложение
- Опубликовать интерфейс OData в 1С
- Настроить состав интерфейса OData
- Загрузить все справочники, штрихкоды и документы из 1С в приложение, либо онлайн, либо через файл.
- Провести складские операции
- Выгрузить обработанные данные в 1С
Вопрос: Внешняя компонента 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-x битной 1с нормально, но я развернул на Ubuntu x64 1c enterprise83 8.3.5-1486 amd64. И хочу к ней подцепить ВК.
Есть у кого мысли, как решить этот вопрос?)
VNCOMPS-пример должен работать, но походу надо поправить параметры сборки, или сама платформа, на которой я тестирую - некорректна.
Ответ:
Интересно, а на яве можно внешнюю компоненту написать?
Вопрос: Не подключается внешняя компонента (Native)
Скомпилировал пример c ИТС, для 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


