- Установка Платформы «1С:Предприятие» в ОС Linux
- Установка платформы в Debian-системах на примере Ubuntu Server 16.04
- Установка платформы в RPMS на примере CentOS 7
- Основные проблемы и вопросы по установке Платформы «1С:Предприятие» в Linu x
- 1. При работе возникают ошибки «Не найдена библиотека …»
- 2. Как запустить сервер в режиме отладки?
- 3. Где находится каталог данных кластера серверов и как его изменить?
- 4. Как настроить технологический журнал сервера в Linux ?
- Внешняя компонента Native Api на C++ под Linux (Ubuntu x64) на 1С 8.3
- Внешние компоненты в 1С 8.2
- Введение
- Внешние компоненты «1C: Предприятие»
- Запуск демонстрационной ВК
- Произвольное имя внешней компоненты
- Расширение списка свойств ВК
- Расширение списка методов
- Таймер
- Взаимодействие с системой «1С: Предприятие»
- Тип данных tVariant
Установка Платформы «1С:Предприятие» в ОС Linux
Перед началом установки необходимо скачать дистрибутивы, которые понадобятся в дальнейшем. В данном примере мы будем устанавливать:
- Сервер «1С:Предпритие» 64-bit версии 8.3.13.1644. Пакеты для установки доступны здесь:
- Если для сервера использоваться ключи аппаратной защиты HASP, то необходимо установить на сервер драйвер защиты HASP. Последние версии для различных операционных систем можно скачать:
Если в дальнейшем работа с сервером «1С:Предприятие» на Linux и управление будет осуществляться c других машин, необходимо убедиться в том, что ip-адрес компьютера, на котором расположен сервер, будет корректно разрешаться в его hostname. Откроем консоль сервера от имени пользователя root и получим адрес компьютера:
Имя компьютера можно получить так:
Теперь данные о соответствии ip-адреса и имени необходимо внести в файлы hosts тех машин, откуда будут устанавливаться соединения с кластером серверов:
Для Windows он расположен обычно:
В противном случае при установке клиентского соединения с рабочим процессом кластера будет возникать ошибка.
Установка платформы в Debian-системах на примере Ubuntu Server 16.04
- Откроем консоль сервера от имени пользователя root.
- Создадим директорию, куда поместим (любым удобным образом) архив с Deb-пакетами для установки Сервера 1С:Предприятие, скачанный предварительно.
Копировать в буфер обмена
- Войдем в каталог /1c/soft/1с:
Копировать в буфер обмена
Распакуем архив (при помощи команды tar xzf):
Копировать в буфер обмена
- Для установки пакетов удобнее всего воспользоваться утилитой gdebi. Если она не была ранее установлена, это можно сделать при помощи команды:
Копировать в буфер обмена
Устанавливаем сервер «1С:Предприятие»:
Последние три nls-пакета содержат языковые файлы и требуют обязательной установки только в том случае, если будут использоваться языки, отличные от русского и английского.
Установка будет осуществлена в директорию /opt/1C/v8.3/x86_64.
- Для корректной работы приложений необходимо установить шрифты из состава Microsoft Core Fonts:
Копировать в буфер обмена
Для того, чтобы система «увидела» установленные шрифты, нужно выполнить команду:
Проверить статус работы можно при помощи команды:
Будет выполнена проверка, запущен ли сервис (Starting 1C:Enterprise 8.3 server: OK), и выведено детальное состояние сервиса.
Проверить, запущены ли процессы кластера, можно при помощи команды:
Перейдем к установке драйвера HASP. Для данного примера скачиваем драйвер по адресу:
Для установки драйвера выполняем следующие действия:
- Создадим каталог /1c/soft/hasp:
Копировать в буфер обмена
- В этот каталог любым удобным образом поместим скачанный пакет установки драйвера и перейдем в него:
Копировать в буфер обмена
- Поскольку драйвер использует 32-битные библиотеки, устанавливаем их:
Копировать в буфер обмена
- Устанавливаем драйвер:
Копировать в буфер обмена
- Запускаем драйвер защиты HASP:
Копировать в буфер обмена
Проверить статус можно так:
Установка платформы в RPMS на примере CentOS 7
- Откроем консоль от имени root.
- Создадим директорию, куда поместим (любым удобным образом) архив с RPM-пакетами для установки Сервера 1С:Предприятие, скачанный предварительно.
Копировать в буфер обмена
- Перейдем в директорию /1c/soft/1с
Копировать в буфер обмена
tar xzf rpm64_8_3_13_1644.tar.gz
В данном примере будут установлены все пакеты, но, если в вашей системе не планируется использовать языки, отличные от русского и английского, nls-пакеты вы можете не устанавливать — они содержат только языковые файлы.
Для пакетов x86_64 установка будет осуществлена в директорию /opt/1C/v8.3/x86_64.
- Для корректной работы приложений необходимо установить шрифты из состава Microsoft Core Fonts.
- Скачиваем любым удобным образом (например, при помощи wget) файлы пакета с сервера SourceForge:
Надо скачать все .exe-файлы, кроме wd97vwr32.exe.
- Переименовываем все скачанные .exe-файлы, присвоив им расширение .zip, после чего распакуем их и удалим все, кроме имеющих расширение .ttf – это файлы шрифтов.
- Файлы шрифтов (.ttf-файлы) копируем в каталог /usr/share/fonts/truetype/
Для того, чтобы система «увидела» установленные шрифты, нужно выполнить команду:
Проверить статус работы можно при помощи команды:
Будет выполнена проверка, запущен ли сервис (Starting 1C:Enterprise 8.3 server: OK), и выведено детальное состояние сервиса.
Проверить, запущены ли процессы кластера, можно при помощи команды:
Перейдем установке драйвера HASP. Для данного примера скачиваем драйвер по адресу :
Для установки драйвера выполняем следующие действия:
- Создадим каталог /1c/soft/hasp:
Копировать в буфер обмена
- В этот каталог любым удобным образом поместим скачанный пакет установки драйвера и перейдем в него:
Копировать в буфер обмена
- Поскольку драйвер использует 32-битные библиотеки, устанавливаем их:
Копировать в буфер обмена
- Устанавливаем драйвер:
Копировать в буфер обмена
- Запускаем драйвер защиты HASP:
Копировать в буфер обмена
Проверить статус можно так:
Основные проблемы и вопросы по установке Платформы «1С:Предприятие» в Linu x
1. При работе возникают ошибки «Не найдена библиотека …»
В зависимости от вашего дистрибутива Linux и функционала системы для корректной работы 1С:Предприятие вам может понадобиться дополнительно самостоятельно установить внешние библиотеки. Полный список их представлен в документации:
Обратите внимание, что в документации указано именно имя библиотеки, а не имя пакета. Имя пакета, в который она входит, может отличаться в разных дистрибутивах. В какие именно пакеты входит библиотека, обычно можно найти в репозитории для вашей ОС.
2. Как запустить сервер в режиме отладки?
Для того, чтобы на сервере была доступна отладка, необходимо запустить его в ключом –debug. Для этого сначала остановим сервер «1С:Предприятие»:
ВАЖНО! Не редактируйте параметры запуска сервера в процессе его работы, это может привести к ошибкам при его перезапуске.
Теперь необходимо отредактировать параметры его запуска в конфигурационном файле srv1cv83 (в данном примере с использованием редактора vim):
Находим в редактируемом файле строку SRV1CV8_DEBUG= , убираем в начале этой строки символ комментария # и устанавливаем значение переменной SRV1CV8_DEBUG в 1:
Сохраняем изменения и выходим из файла.
Перезапускаем сервер «1С:Предприятия 8»:
3. Где находится каталог данных кластера серверов и как его изменить?
По умолчанию каталог кластера находится в директории пользователя, от имени которого запущен сервер 1С:Предприятие — $HOMEDIR/.1cv83/1C/1Cv83, например:
Для того, чтобы изменить место изменить место расположения, необходимо, по аналогии с п. 1, изменить параметр SRV1CV8_DATA запуска в конфигурационном файле /etc/sysconfig/srv1cv83.
ВАЖНО! Не забудьте убедиться в наличии прав на директорию данных кластера у пользователя, от имени которого запущен сервер. Увидеть права можно при помощи команды:
Предоставить права можно так:
В конфигурационном файле /etc/sysconfig/srv1cv83 также задаются порты, на которых будут работать процессы кластера, и другие параметры запуска.
4. Как настроить технологический журнал сервера в Linux ?
На сервере создадим каталоги, в который будут помещаться файлы журнала:
Создадим каталог для настроек журнала /opt/1C/v8.3/x86_64/conf:
Поместим в этот каталог файл logcfg.xml со следующим (например) содержимым:
В данном случае собирается полный технологический журнал (не стоит делать так на постоянной основе в продуктиве), срок хранения файлов журналов — 24 часа, находиться они будут в директории /var/log/1c/logs.
ВАЖНО! Необходимо предоставить пользователю, от имени которого работает сервер 1С:Предприятие, права на запись в каталог логов. Например, так:
- Создадим группу пользователей grp1clogs, которой будут даны права на журнал:
Копировать в буфер обмена
- Дадим права этой группе на каталоги журнала:
Копировать в буфер обмена
Источник
Внешняя компонента Native Api на C++ под Linux (Ubuntu x64) на 1С 8.3
Пишу ВК, не могу подключить к 1с на ubuntu. Даже экзапл от 1с не подключается. Поэтому вопрос по нему:
1) Пытаюсь подключи ВК из примера VNCOMPS, приведённым в статье
http://its.1c.ru/db/metodtorg#content:3221:hdoc
(ссылку можно найти в самом конце: «Копирование»).
Внутри в проекте NativeApi есть makefile. С его помощью я собираю .so библиотеку на Ununtu.
Но при «ПодключитьВнешнююКомпоненту» 1с вылетает.
Аналогично, если собираю при помощи «build.sh» (в корне проекта).
В самом makefile меняю флаг с m32 на m64, т.к. 1с и сама система x64. (с параметром m32 не подцепляется всё равно)
Вот пример вызова ВК из 1С 8.3:
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту(«/home/alexeyubuntux64-20gb/Документы/VNCOMP83/example/NativeAPI/AddInNative.so», «AddInNative», ТипВнешнейКомпоненты.Native);
Есть статейка как раз на эту тему http://catalog.mista.ru/public/323372 .
Но, насколько я вижу, все эти моменты уж учтены исправили в VNCOMPS примере.
Но по сути дело в параметрах компиляции. Мб 32битная внешняя компонента подцепляется к 32-x битной 1с нормально, но я развернул на Ubuntu x64 1c enterprise83 8.3.5-1486 amd64. И хочу к ней подцепить ВК.
Есть у кого мысли, как решить этот вопрос?)
VNCOMPS-пример должен работать, но походу надо поправить параметры сборки, или сама платформа, на которой я тестирую — некорректна.
(7) [New Thread 0x7fff4920a700 (LWP 8284)]
[Thread 0x7fff4920a700 (LWP 8284) exited]
*** Error in `/opt/1C/v8.3/x86_64/1cv8c’: free(): invalid next size (fast): 0x0000000003327780 ***
это выводит при подключении ВК
ну на винде цепляется эти компонента (которую я сбилтил через VS).
для ubuntu я изменяю следующее, чтобы норм сбилдить .so:
1) build.sh имеют следующие команды:
#!/bin/sh
/cmake-2.8/bin:$PATH
mkdir build64_310 ; cd build64_310 ;
cmake -D XUL_VERSION:STRING=»31.0″ -D CMAKE_BUILD_TYPE:STRING=RelWithDebInfo -D TARGET_PLATFORM_32:BOOL=OFF —build .. ;
cd ..
cd build64_310 ; make -j 4 ; cd ..; rm -rf build64_310
вместо полного:
#!/bin/sh
#build script for CentOS 5
echo «Build 32 310» ;
if [ ! -d build32_310 ]; then
mkdir build32_310 ; cd build32_310 ;
scl enable devtoolset-2 ‘cmake -D XUL_VERSION:STRING=»31.0″ -D TARGET_PLATFORM_32:BOOL=ON -D CMAKE_SHARED_LINKER_FLAGS:STRING=-m32 -D CMAKE_MODULE_LINKER_FLAGS:STRING=-m32 -D CMAKE_EXE_LINKER_FLAGS:STRING=-m32 -D CMAKE_BUILD_TYPE:STRING=RelWithDebInfo —build .. ‘;
fi ;
cd build32_310 ; scl enable devtoolset-2 ‘make -j 4’ ; cd .. ; rm -rf build32_310
echo «Build 64 310» ;
if [ ! -d build64_310 ]; then
mkdir build64_310 ; cd build64_310 ;
scl enable devtoolset-2 ‘cmake -D XUL_VERSION:STRING=»31.0″ -D CMAKE_BUILD_TYPE:STRING=RelWithDebInfo -D TARGET_PLATFORM_32:BOOL=OFF —build .. ‘;
fi ;
cd build64_310 ; scl enable devtoolset-2 ‘make -j 4’ ; cd ..; rm -rf build64_310
2) в CMakeLists.txt убрал несколько строк, чтобы собиралось только NAtiveAPI.
Убрал следующее:
IF(«$
MESSAGE(FATAL_ERROR «XUL_VERSION must have value!»)
P.S. Мб я что-то лишнее убрал?) но мб всё по делу. всё собирается норм, но не подключается к 1с.
Пытаюсь подцепить компонентц эту x32, выдаётся «Ложь», а не вылетает. Ну это так, как доп инфа.
всё. получилось подключить более менее шаблон этот. я хз что изменилось, но раньше метод GetClassNames не вызывался. логов не было.
вылетало в самом первом методе, который вызывается 1с-кой «GetClassNames».
В итоге в логах всё норм пишет, что вызывается GetClassNames
GetClassObject
CAddInNative
Init
Но установить такие же параметры в моём проекте, что и в тестовом проекте у меня так и не получается.
Мне нужно в одном cmakelists прописать все правила, что описаны в cmakelists(корень примера этого) и makefile (NativeApi проект) тестового примера.
SET(SOURCE_FILES
AddInNative.cpp dllmain.cpp AddInNative.h ComponentBase.h IMemoryManager.h types.h com.h stdafx.h stdafx.cpp AddInDefBase.h)
set_source_files_properties($
А это makefile проекта NativeApi из примера:
TARGET=AddInNative.so
OBJECTS=$(SOURCES:.cpp=.o)
INCLUDES=-I../../include
И cmakelists решения всего:
# Cmake script for project AddIn
set(BUILD_DIR «build»)
set(CMAKE_SKIP_RPATH ON CACHE TYPE BOOL)
OPTION(TARGET_PLATFORM_32 «Build target for i386» OFF)
MARK_AS_ADVANCED(TARGET_PLATFORM_32)
MESSAGE(FATAL_ERROR «XUL_VERSION must have value!»)
Тема закрыта. с типами данных запара была. а ну да. в этом примере от 1С в методе GetClassNames идёт return s_names;, а надо взять код этой функции из шаблона (рядом с примерами лежит):
но это одна из мелочей. у меня до этого вообще даже в начало этой функции на заходило (по логами видно было). более менее качественно ещё раз прописал параметры сборки и всё зафурычило.
Кому нужно, вот так получился cmakelists:
set(SOURCE_FILES
AddInNative.cpp dllmain.cpp AddInNative.h ComponentBase.h IMemoryManager.h
types.h com.h stdafx.h stdafx.cpp AddInDefBase.h)
set_source_files_properties($
set_target_properties( $
target_link_libraries ($
(14) походу нет. вот выдержка из статьи по технологиям ВК:
«В качестве средств разработки можно применять:
Microsoft Visual C++,
Delphi,
C++ Builder,
gcc»
Источник
Внешние компоненты в 1С 8.2
Введение
Эта статья дает представление о работе внешних компонент в системе «1С: Предприятие».
Будет показан процесс разработки внешней компоненты для системы «1С: Предприятие» версии 8.2, работающей под управлением ОС семейства Windows с файловым вариантом работы. Такой вариант работы используется в большинстве решений, предназначенных для предприятий малого бизнеса. ВК будет реализована на языке программирования C++.
Внешние компоненты «1C: Предприятие»
«1С: Предприятие» является расширяемой системой. Для расширения функциональных возможностей системы используются внешние компоненты (ВК). С точки зрения разработчика ВК представляет собой некоторый внешний объект, который имеет свойства и методы, а также может генерировать события для обработки системой «1С: Предприятие».
Внешние компоненты можно использовать для решения класса задач, которые сложно или даже невозможно реализовать на встроенном в «1C: Предприятие» языке программирования. В частности, к такому классу можно отнести задачи, требующие низкоуровневого взаимодействия с операционной системой, например, для работы с специфичным оборудованием.
В системе «1С: Предприятие» используются две технологии создания внешних компонент:
- с использованием Native API
- с использованием технологии COM
При заданных ограничениях между двумя вышеозначенными технологиями разница незначительна, поэтому будем рассматривать разработку ВК с использованием Native API. При необходимости, реализованные наработки могут быть применены для разработки ВК с использованием технологии COM, а также, с незначительными доработками, применены для использования в системе «1С: Предприятие» с другими вариантами работы, отличными от файлового режима работы.
Структура ВК
Внешняя компонента системы «1С: Предприятие» представлена в виде DLL-библиотеки. В коде библиотеки описывается класс-наследник IComponentBase. В создаваемом классе должны быть определены методы, отвечающие за реализацию функций внешней компоненты. Более подробно переопределяемые методы будут описаны ниже по ходу изложения материала.
Запуск демонстрационной ВК
Задача:
- Выполнить сборку внешней компоненты, поставляемой с подпиской ИТС и предназначенной для демонстрации основных возможностей механизма внешних компонент в 1С
- Подключить демонстрационную компоненту к конфигурации 1С
- Убедиться в корректной работоспособности заявленных функций
Компиляция
Демонстрационная ВК расположена на диске подписки ИТС в каталоге «/VNCOMP82/example/NativeAPI».
Для сборки демонстрационной ВК будем использовать Microsoft Visual Studio 2008. Другие версии данного продукта не поддерживают используемый формат проекта Visual Studio.
Открываем проект AddInNative. В настройках проекта подключаем каталог с заголовочными файлами, необходимыми для сборки проекта. По умолчанию они располагаются на диске ИТС в каталоге /VNCOMP82/include.
Результатом сборки является файл /bind/AddInNative.dll. Это и есть скомпилированная библиотека для подключения к конфигурации 1С.
Подключение ВК к конфигурации 1С
Создадим пустую конфигурацию 1С.
Ниже приведен код модуля управляемого приложения.
Если при запуске конфигурации 1С не было сообщено об ошибке, то ВК была успешно подключена.
В результате выполнения приведенного кода в глобальной видимости конфигурации появляется объект ДемоКомп, имеющий свойства и методы, которые определены в коде внешней компоненты.
Демонстрация заложенного функционала
Проверим работоспособность демонстрационной ВК. Для этого попробуем установить и прочитать некоторые свойства, вызвать некоторые методы ВК, а также получить и обработать сообщение ВК.
В документации, поставляемой на диске ИТС заявлен следующий функционал демонстрационной ВК:
- Управление состоянием объекта компоненты
Методы: Включить, Выключить
Свойства: Включен - Управлением таймером
Каждую секунду компонента посылает сообщение системе «1C: Предприятие» с параметрами Component, Timer и строкой счетчика системных часов.
Методы: СтартТаймер, СтопТаймер
Свойства: ЕстьТаймер - Метод ПоказатьВСтрокеСтатуса, который отображает в строке статуса текст, переданный методу в качестве параметров
- Метод ЗагрузитьКартинку. Загружает изображение из указанного файла и передает его в систему «1C: Предприятие» в виде двоичных данных.
Убедимся в работоспособности этих функций. Для этого исполним следующий код:
Результат запуска конфигурации приведен на изображении
На панель «Сообщения» выведены результаты вызовов методов ДемоКомп.Выключить() и Демо.Комп.Включить(). Последующие строки на той же панели содержат результаты обработки полученных от ВК сообщений — Источник, Событие и Данные соответственно.
Произвольное имя внешней компоненты
Задача: Изменить имя внешней компоненты на произвольное.
В предыдущем разделе использовался идентификатор AddInNativeExtension, смысл которого не был пояснен. В данном случае AddInNativeExtension — это наименование расширения.
В коде ВК определен метод RegisterExtensionAs, возвращающий системе «1С: Предприятие» имя, которое необходимо для последующей регистрации ВК в системе. Рекомендуется указывать идентификатор, который в известной мере раскрывает суть внешней компоненты.
Приведем полный код метода RegisterExtensionAs с измененным наименованием расширения:
В приведенном примере имя ВК изменено на SomeName. Тогда при подключении ВК необходимо указывать новое имя:
Расширение списка свойств ВК
Задача:
- Изучить реализацию свойств ВК
- Добавить свойство строкового типа, доступное для чтения и записи
- Добавить свойство строкового типа, доступное для чтения и записи, которое хранит тип данных последнего установленного свойства. При установке значения свойства никаких действий не производится
- Убедиться в работоспособности произведенных изменений
Для определения свойств создаваемой компоненты разработчику необходимо реализовать следующие методы в коде библиотеки AddInNative.cpp:
GetNProps
Возвращает количество свойств данного расширения, 0 – при отсутствии свойств
FindProp
Возвращает порядковый номер свойства, имя которого передается в параметрах
GetPropName
Возвращает имя свойства по его порядковому номеру и по переданному идентификатору языка
GetPropVal
Возвращает значение свойства с указанным порядковым номером
SetPropVal
Устанавливает значение свойства с указанным порядковым номером
IsPropReadable
Возвращает флаг флаг возможности чтения свойства с указанным порядковым номером
IsPropWritable
Возвращает флаг флаг возможности записи свойства с указанным порядковым номером
Полное описание методов, включая список параметров подробно описан в документации, поставляемой на диске ИТС.
Рассмотрим реализацию приведенных методов класса CAddInNative.
В демонстрационной ВК определены 2 свойства: Включен и ЕстьТаймер (IsEnabled и IsTimerPresent).
В глобальной области видимости кода библиотеки определено два массива:
которые хранят русское и английское названия свойств. В заголовочном файле AddInNative.h определяется перечисление:
ePropIsEnabled и ePropIsTimerPresent, соответственно имеющие значения 0 и 1 используются для замены порядковых номеров свойств на осмысленные идентификаторы. ePropLast, имеющее значение 2, используется для получения количества свойств (методом GetNProps). Эти имена используются только внутри кода компоненты и недоступны извне.
Методы FindProp и GetPropName осужествляют поиск по массивам g_PropNames и g_PropNamesRu.
Для хранения значения полей в модуле библиотеки у класса CAddInNative определены свойства, которые хранят значение свойств компоненты. Методы GetPropVal и SetPropVal соответственно возвращают и устанавливают значение этих свойств.
Методы IsPropReadable и IsPropWritable и возвращают trure или false, в зависимости от переданного порядкового номера свойства в соответствии с логикой приложения.
Для того, чтобы добавить произвольное свойство необходимо:
- Добавить имя добавляемого свойства в массивы g_PropNames и g_PropNamesRu (файл AddInNative.cpp)
- В перечисление Props (файл AddInNative.h) перед ePropLast добавить имя, однозначно идентифицирующее добавляемое свойство
- Организовать память под хранение значений свойств (завести поля модуля компоненты, хранящие соответствующие значения)
- Внести изменения в методы GetPropVal и SetPropVal для взаимодействия с выделенной на предыдущем шаге памятью
- В соответствии с логикой приложения внести изменения в методы IsPropReadable и IsPropWritable
Пункты 1, 2, 5 не нуждаются в пояснении. С деталями реализации этих шагов можно ознакомиться, изучив приложение к статье.
Дадим названия тестовым свойствам Тест и ПроверкаТипа соответственно. Тогда в результате выполнения пункта 1 имеем:
Перечисление Props будет иметь вид:
Для значительного упрощения кода будем использовать STL C++. В частности, для работы со строками WCHAR, подключим библиотеку wstring.
Для сохранения значения метода Тест, определим в классе CAddInNative в области видимости private поле:
Для передачи строковых параметров между «1С: Предприятие» и внешней компонентов используется менеджер памяти «1С: Предприятие». Рассмотрим его работу подробнее. Для выделения и освобождения памяти соответственно используются функции AllocMemory и FreeMemory, определенные в файле ImemoryManager.h. При необходимости передать системе «1С: Предприятие» строковый параметр, внешняя компонента должна выделить под нее память вызовом функции AllocMemory. Ее прототип выглядит следующим образом:
где pMemory — адрес указателя, в который будет помещен адрес выделенного участка памяти,
ulCountByte — размер выделяемого участка памяти.
Пример выделения памяти под строку:
Для удобства работы с строковыми типами данными опишем функцию wstring_to_p. Она получает в качестве параметра wstring-строку. Результатом функции является заполненная структура tVariant. Код функции:
Тогда соответствующая секция case оператора switch метода GetPropVal примет вид:
Для реализации второго свойства определим поле класса CaddInNative
в котором будем сохранять тип последнего переданного значения. Для этого в метод CaddInNative::SetPropVal добавим команду:
Теперь при запросе чтения значения второго свойства будем возвращать значение last_type, чего требует обозначенное задание.
Проверим работоспособность произведенных изменений.
Для этого приведем внешний вид конфигурации 1С к виду:
В результате запуска получим последовательность сообщений:
3
Вася
Петя
22
Второе и третье сообщения являются результатом чтения свойства, установленного на предыдущем шаге. Первое и второе сообщения содержат код типа последнего установленного свойства. 3 соответствует целочисленному значению, 22 — строковому. Соответствие типов и их кодов устанавливается в файле types.h, который находится на диске ИТС.
Расширение списка методов
Задача:
- Расширить функционал внешней компоненты следующим функционалом:
- Изучить способы реализации методов внешней компоненты
- Добавить метод-функцию Функц1, которая в качестве параметра принимает две строки («Параметр1» и «Параметр2»). В качестве результата возвращается строка вида: «Проверка. Параметр1, Параметр2»
- Убедиться в работоспособности произведенных изменений
Для определения методов создаваемой компоненты разработчику необходимо реализовать следующие методы в коде библиотеки AddInNative:
GetNMethods, FindMethod, GetMethodName
Предназначены для получения соответственно количества методов, поиска номера и имени метода. Аналогичны соответствующим методам для свойств
GetNParams
Возвращает количество параметров метода с указанным порядковым номером; если метод с таким номером отсутствует или не имеет параметров, возвращает 0
GetParamDefValue
Возвращает значение по умолчанию указанного параметра указанного метода
HasRetVal
Возвращает флаг наличия у метода с указанным порядковым номером возвращаемого значения: true для методов с возвращаемым значением и false в противном случае
CallAsProc
Выполняет метод с указанным порядковым номером. Если метод возвращает false, возникает ошибка времени выполнения и выполнение модуля 1С: Предприятия прекращается. Память для массива параметров выделяется и освобождается 1С: Предприятием.
CallAsFunc
Выполняет метод с указанным порядковым номером. Если метод возвращает false, возникает ошибка времени выполнения и выполнение модуля 1С: Предприятия прекращается. Память для массива параметров выделяется 1С: Предприятием. Если возвращаемое значение имеет тип строка или двоичные данные, компонента выделяет память функцией AllocMemory менеджера памяти, записывает туда данные и сохраняет этот адрес в соответствующем поле структуры. 1С: Предприятие освободит эту память вызовом FreeMemory.
Полное описание методов, включая список параметров подробно описан в документации, поставляемой на диске ИТС.
Рассмотрим реализацию описанных выше методов.
В в коде компоненты определены два массива:
Они используются в функциях GetNMethods, FindMethod и GetMethodName, по аналогии с описанием свойств.
Методы GetNParams, GetParamDefValue, HasRetVal реализуют switch, в зависимости от переданных параметров и логики приложения возвращают требуемое значение. Метод HasRetVal в своем коде имеет список только методов, которые могут возвращать результат. Для них он возвращает true. Для всехо стальных методов возвращается false.
Методы CallAsProc и CallAsFunc содержат непосредственно исполняемый код метода.
Для добавления метода, который может вызываться только как функция необходимо произвести следующие изменения в исходном коде внешней компоненты:
- Добавить имя метода в массивы g_MethodNames и g_MethodNamesRu (файл AddInNative.cpp)
- Добавить осмысленный идентефикатор метода в перечисление Methods (файл AddInNative.h)
- Внести изменения в код функции GetNParams в соответствии с логикой программы
- При необходимости внести изменения в код метода GetParamDefValue, если требуется использовать значения по умолчанию параметров метода.
- Внести изменения в функцию HasRetVal
- Внести изменения в логику работы функций CallAsProc или CallAsFunc, поместив туда непосредственно исполняемый код метода
Приведем массивы g_MethodNames и g_MethodNamesRu, а также перечисление Methods к виду:
Отредактируем функцию GetNProps, чтобы она возвращала количество параметров метода «Тест»:
Внесем изменения в функцию CAddInNative::GetParamDefValue:
Благодаря добавленной строке
в случае отсутствия одного или нескольких аргументов соответствующие параметры будут иметь пустое значение (VTYPE_EMPTY). Если необходимо наличие значения по умолчанию для параметра, следует задать его в секции eMethTest оператора switch функции CAddInNative::GetParamDefValue.
Так как метод «Тест» может возвращать значение, необходимо внести изменения в код функции HasRetVal:
И добавим исполняемый код метода в функцию CallAsFunc:
Скомпилируем компоненту и приведем код конфигурации к виду:
После запуска конфигурации получим сообщение: «Привет, Мир!», что говорит о том, что метод отработал успешно.
Таймер
Задача:
- Изучить реализацию таймера в демонстрационной ВК
- Модифицировать метод «СтартТаймер», добавив возможность передавать в параметрах интервал срабатывания таймера (в миллисекундах)
- Убедиться в работоспособности произведенных изменений
В WinAPI для работы со временем можно воспользоваться сообщением WM_TIMER. Данное сообщение будет посылаться вашей программе через интервал времени, который вы зададите при создании таймера.
Для создания таймера используется функция SetTimer:
Операционная система будет посылать сообщение WM_TIMER в программу с интервалом указанным в аргументе nElapse (в миллисекундах). В последнем параметре можно указать функцию, которая будет выполняться при каждом срабатывании таймера. Заголовок этой функции должен выглядеть так (имя может быть любым):
Рассмотрим реализацию таймера в демонстрационной ВК.
Так как мы рассматриваем процесс разработки внешней компоненты для ОС семейства Windows, не будем рассматривать реализацию таймера в других операционных системах. Для ОС GNU/Linux, в частности, реализация будет отличаться синтаксисом функции SetTimer и TimerProc.
В исполняемом коде вызывается метод SetTimer, в который передается функция MyTimerProc:
Идентефикатор созданного таймера помещается в переменную m_uiTimer, чтобы в последствии его можно было отключить.
Функция MyTimerProc выглядит следующим образом:
Суть функции сводится к тому, что вызывается метод ExternalEvent, который посылает сообщение системе «1С: Предприятие».
Для расширения функционала метода СтартТаймер произведем следующие действия:
Модифицируем код метода GetNParams так, чтобы он для метода eMethStartTimer возвращал значение 1:
Приведем код метода CallAsProc к виду:
Теперь проверим работоспособность. Для этого в модуле управляемого приложения конфигурации напишем код:
После запуска конфигурации в программу будут поступать сообщения с интервалом в 2 секунды, что говорит о корректной работе таймера.
Взаимодействие с системой «1С: Предприятие»
Для взаимодействия между внешней компонентой и системой «1С: Предприятие» используются методы класса IAddInDefBase, описанного в файле AddInDefBase.h. Перечислим наиболее часто используемые:
Генерация сообщения об ошибке
wcode, scode — коды ошибки (список кодов ошибок с описанием можно найти на диске ИТС)
source — источник ошибки
descr — описание ошибки
Отправка сообщения системе «1С: Предприятие»
wszSource — источник сообщения
wszMessage — текст сообщения
wszData — передаваемые данные
Перехват сообщения осуществляется процедурой ОбработкаВнешнегоСобытия
Регистрация внешней компоненты в системе «1С: Предприятие»
wszProfileName — имя компоненты.
Этих методов достаточно для полноценного взаимодействия ВК и 1С. Для получения данных внешней компонентой от системы «1С: Предприятие» и наоборот внешняя компонента отправляет специальное сообщение, которое в свою очередь перехватывается системой «1С» и, при необходимости вызывает методы внешней компоненты для обратной передачи данных.
Тип данных tVariant
При обмене данными между внешней компонентой и системой «1С: Предприятие» используется тип данных tVariant. Он описан в файле types.h, который можно найти на диске с ИТС:
Тип tVariant представляет из себя структру, которая включает себя:
- смесь (union), предназначенную непосредственно для хранения данных
- идентификатор типа данных
В общем случае работа с переменными типа tVariant происходит по следующему алгоритму:
- Определение типа данных, которые в данный момент хранятся в переменной
- Обращение к соответствующему полю смеси, для непосредственного доступа к данным
Использование типа tVariant значительно упрощает взаимодействие системы «1С: Предприятие» и внешней компоненты
Источник