1с создание документа из внешней системы
Мы в фирме 1С широко используем собственные разработки для организации работы компании. В частности, «1С:Документооборот 8». Помимо управления документами (как следует из названия) это ещё и современная ECM-система (Enterprise Content Management — управление корпоративным контентом) с широким набором функциональных возможностей – почта, рабочие календари сотрудников, организация совместного доступа к ресурсам (например, бронирование переговорных), учёт рабочего времени, корпоративный форум и многое другое.
В фирме 1С документооборотом пользуется более тысячи сотрудников. База данных стала уже внушительной (11 млрд. записей), а это значит, что она требует более тщательного ухода и более мощного оборудования.
Как устроена работа нашей системы, с какими сложностями при обслуживании базы мы сталкиваемся и как их решаем (в качестве СУБД мы используем MS SQL Server) – расскажем в статье.
Для тех, кто впервые читает про продукты 1С.
1С:Документооборот — это прикладное решение (конфигурация), реализованное на базе фреймворка для разработки бизнес-приложений — платформе 1С:Предприятие.
«1С:Документооборот 8» (сокращённо – ДО) позволяет автоматизировать работу с документами на предприятии. Один из основных инструментов взаимодействия сотрудников – электронная почта. Помимо почты ДО также решает и другие задачи:
А ещё благодаря подключенному к Документообороту другому нашему продукту – Системе взаимодействия – мы непосредственно в Документообороте получаем функциональность мессенджера – чаты, аудио и видеозвонки (включая групповые, что сейчас стало особенно актуально, в том числе и с мобильного клиента), быстрый обмен файлами плюс возможность написания чат-ботов, упрощающих работу с системой. Ещё один плюс от использования Системы Взаимодействия (по сравнению с другими мессенджерами) – возможность вести контекстные обсуждения, привязанные к конкретным объектам Документооборота – документам, мероприятиям и т.п. То есть Система взаимодействия глубоко интегрируется с целевым приложением, а не выступает просто «отдельной кнопкой».
Число писем в нашем ДО уже перевалило за 100 млн., а вообще в СУБД – более 11 млрд. записей. Суммарно система использует почти 30 Тб хранилища: объём базы – 7,5 Тб, файлы для коллективной работы лежат отдельно и занимают ещё 21 Тб.
Если говорить о более конкретных цифрах, то вот количество писем и файлов на данный момент:
На каком оборудовании мы всё это обрабатываем?
Эти цифры говорят о внушительном объёме задач, так что перед нами встала необходимость выделить под нужды внутреннего ДО довольно производительное оборудование. На текущий день его характеристики следующие: 38 ядер, 240 Гб ОЗУ, 26 Тб дисков. Приводим таблицу серверов:
В будущем мы планируем наращивать мощность оборудования.
Как обстоят дела с загрузкой серверов?
Сетевая активность никогда не была проблемой ни у нас, ни у наших заказчиков. Как правило, слабое место – это процессор и диски, потому что с нехваткой памяти все уже бороться умеют. Приведём скриншоты наших серверов из Resource Monitor, на которых видно, что у нас никакой страшной нагрузки нет, она весьма скромная.
Например, на скриншоте ниже мы видим SQL-сервер, где ЦПУ загружен на 23%. И это очень хороший показатель (для сравнения: если загрузка будет приближаться к 70%, то, скорее всего, сотрудники будут наблюдать довольно существенные замедления работы).
На втором скриншоте показан сервер приложений, на котором работает платформа 1С:Предприятие – он обслуживает только пользовательские сеансы. Здесь нагрузка процессора несколько больше – 38%, она ровная и спокойная. Загрузка диска есть, но она приемлемая.
Третий скриншот показывает ещё один сервер 1С:Предприятия (он второй, у нас их два в кластере). Только предыдущий обслуживает пользователей, а на этом работают роботы. Например, принимают почту, маршрутизируют документы, выполняют обмен данными, считают права и т.п. Все эти фоновые активности выполняют примерно 90-100 фоновых заданий. И вот этот сервер загружен очень сильно – на 88%. Но на людях это не сказывается, и он реализует как раз всю ту автоматику, которую должен делать Документооборот.
Какие есть метрики для определения эффективности работы?
У нас в ДО встроена серьёзная подсистема замеров показателей производительности и вычислений различных метрик. Это нужно для того, чтобы и в текущий момент времени, и в исторической перспективе понимать, что в системе происходит, что становится хуже, что становится лучше. Средства мониторинга – метрики и замеры времени – входят в типовую поставку «1С:Документооборот 8». Метрики требуют настройки на внедрении, но сам механизм типовой.
Метрики – это замеры различных бизнес-показателей в те или иные моменты времени (например, среднее время доставки почты в моменте 10 минут).
Одна из метрик показывает количество активных пользователей в базе. В среднем их 1000-1400 в течение дня. На графике видно, что на момент скриншота в базе было 2144 активных пользователя.
Таких действий больше 30, список под катом.
На позапрошлой неделе у нас средняя активность пользователей увеличилась в полтора раза (на графике показана красным) – это связано с переходом большинства сотрудников на удалённую работу (в связи с известными событиями). Также число активных пользователей увеличилось в 3 раза (на скрине показаны синим), так как сотрудники стали активно пользоваться мобильными: каждый мобильный клиент создаёт подключение к серверу. Сейчас в среднем на каждого нашего сотрудника приходится 2 подключения к серверу.
Для нас, как для администраторов, это сигнал, что нужно внимательнее относиться к вопросам быстродействия, смотреть, не стало ли хуже. А смотрим мы это по другим параметрам. Например, как меняется время доставки почты по внутренней маршрутизации (на скриншоте ниже показано синим). Мы видим, что оно до этого года скакало, а сейчас стабильное – для нас это показатель, что с системой всё в порядке.
Ещё одна прикладная метрика для нас – среднее время ожидания загрузки писем с почтового сервера (на скриншоте показана красным). Грубо говоря, сколько будет письмо гулять по Интернету, прежде чем оно окажется у нашего сотрудника. На скриншоте видно, что это время тоже никак не изменилось за последнее время. Есть отдельные всплески – но они связаны не с задержками, а с тем, что время сбивается на почтовых серверах.
Или, например, ещё метрика (на скриншоте показана синим) – обновление писем в папке. Открытие папки писем – очень частая операция, и нужно, чтобы она выполнялась быстро. Мы замеряем, с какой скоростью она выполняется. Этот показатель измеряется для каждого клиента. Можно посмотреть как общую картину по фирме, так и динамику, например, по отдельному сотруднику. По скриншоту видно, что до этого года метрика была неуравновешенна, потом мы сделали ряд улучшений, и сейчас она не становится хуже – практически ровный график.
Метрики – это, в основном, инструмент администратора для мониторинга системы, для быстрого реагирования на какие-то изменения в поведении системы. На скриншоте – метрики внутреннего ДО за год. Скачок на графиках обусловлен тем, что перед нами поставили задачи по развитию внутреннего ДО.
Вот перечень еще некоторых метрик (под катом).
- Активность пользователей
- Активные пользователи
- Активные процессы
- Количество файлов
- Размер файлов (Мб)
- Количество документов
- Количество объектов к отправке адресатам
- Количество контрагентов
- Невыполненные задачи
- Среднее время ожидания загрузки писем с почтового сервера за последние 10 минут
- Внешний буфер данных: количество файлов
- Отставание границы от текущей даты
- Долгая очередь
- Оперативная очередь
- Возраст необработанной учётной записи по внешней маршрутизации
- Размер очереди приемки по внутренней маршрутизации (долгая очередь)
- Размер очереди приемки по внутренней маршрутизации (быстрая очередь)
- Время доставки почты по внутренней маршрутизации (долгая очередь)
- Время доставки почты по внутренней маршрутизации (быстрая очередь)
- Время доставки почты по внешней маршрутизации (среднее)
- Число документов Бронирование
- Число документов Отсутствие
- Число документов «Запись о работе с контрагентом»
- Почта Обновление писем в папке
- Почта Открытие карточки письма
- Почта Перенос письма в папку
- Почта Переход по папкам
Наша система круглосуточно делает замеры более 150 показателей, но не все из них можно оперативно отслеживать. Они могут пригодиться потом, в какой-нибудь исторической перспективе, а сосредоточиться можно на самых важных для бизнеса.
На одном из внедрений было выбрано, например, только 5 показателей. Заказчик поставил перед собой цель сделать минимальный набор показателей, но в то же время такой, чтобы он покрывал основные сценарии работы. Включать в акт приёма 150 показателей было бы неоправданно, потому что даже внутри предприятия сложно согласовать, какие показатели считать приемлемыми. А про эти 5 показателей они знали и уже предъявляли их к системе до начала проекта внедрения, включив в конкурсную документацию: время открытия карточки не более 3 секунд, время исполнения задачи с файлом не больше 5 секунд и т.д. У нас в ДО как раз и были метрики, которые очень чётко отражали исходный запрос из ТЗ заказчика.
А ещё у нас есть профильный анализ замеров производительности. Показатели производительности – это фиксация длительности каждой выполняющейся операции (запись письма в базу, отправка письма на почтовый сервер и т.д.). Это используется исключительно техническими специалистами. Показателей производительности у нас в программе копится очень много. Сейчас мы измеряем примерно 1500 ключевых операций, которые разбиты по профилям.
Один из наиболее важных для нас профилей – «Список ключевых показателей почты с точки зрения потребителей». Этот профиль включает в себя, например, следующие показатели:
- Выполнение команды: Отбор по тегу
- Открытие формы: Форма списка
- Выполнение команды: Отбор по папке
- Отображение письма в области чтения
- Сохранение письма в любимую папку
- Поиск писем по реквизитам
- Cоздание письма
Как мы обслуживаем такую большую базу данных?
Наш внутренний ДО – пример реально работающего высоконагруженного проекта. Расскажем о технических особенностях его базы данных.
Сколько времени идёт реструктуризация больших таблиц базы данных?
SQL-сервер требует периодического обслуживания, наведения порядка в таблицах. По-хорошему это нужно делать минимум раз в сутки, а для высоковостребованных таблиц – ещё чаще. Но если база большая (а у нас число записей уже перевалило за 11 млрд.), то ухаживать за ней непросто.
Мы делали реструктуризацию таблиц 6 лет назад, но потом она стала занимать столько времени, что мы уже не вписывались в ночные интервалы. А так как эти операции сильно нагружают SQL-сервер, он не может качественно обслуживать других пользователей.
Поэтому сейчас нам приходится применять различные ухищрения. Например, мы не можем выполнять эти процедуры на полных наборах данных. Приходится прибегать к процедуре Update Sample 500000 rows – это занимает 14 минут. Она выполняет обновление статистики не по всем данным таблицы, а отбирает полмиллиона строк, и по ним рассчитывает статистику, которую использует для всей таблицы. Это некоторое допущение, но мы вынуждены на него идти, потому что для конкретной таблицы сбор статистики по всему миллиарду записей будет выполнятся неприемлемо долгое время.
Другие операции обслуживания мы тоже оптимизировали, сделав их частичными.
Обслуживание СУБД – это вообще сложная задача. В случае активного взаимодействия сотрудников, база быстро разрастается, администраторам становится всё тяжелее обслуживать её – делать обновления статистики, дефрагментацию, индексацию. Здесь надо применять разные стратегии, мы хорошо знаем, как это делать, у нас есть опыт, мы можем им делиться.
Как реализован бэкап при таких объёмах?
Полный бэкап СУБД производится раз в день ночью, инкрементальный – каждый час. Также каждый день создаётся каталог файлов, и он является порцией инкрементального бэкапа файлового хранилища.
Сколько времени выполняется полный бэкап?
На жёсткий диск полный бэкап выполняется за три часа, частичный – за час. На ленту пишется дольше (спецустройство, которое делает резервную копию на специальную кассету, хранящуюся вне офиса; на ленту делают отчуждаемую копию, которая сохранится, если, например, серверная сгорит). Бэкап делается ровно на том же сервере, параметры которого были выше – SQL-сервер с 20% загрузки процессора. На момент бэкапа, конечно же, системе становится значительно хуже, но она всё равно работоспособна.
Есть ли дедупликация?
Дедупликация файлов есть, обкатываем её на себе, и скоро она войдёт в новую версию Документооборота. Также обкатываем на себе механизм дедупликации контрагентов. Дедупликации записей на уровне СУБД нет, так как в этом нет необходимости. Платформа 1С:Предприятие хранит в СУБД объекты, и только платформа может отвечать за их согласованность.
Есть ноды только для чтения?
А помеченные на удаление письма совсем не удаляются?
Пока нет. Задачи облегчить базу у нас нет. Было несколько довольно серьёзных случаев, когда приходилось обращаться к помеченным на удаление письмам, в том числе и 2009 года. Поэтому пока решили хранить всё. А вот когда стоимость этого станет неоправданной, будем думать про удаление. Но, если нужно какое-то отдельное письмо удалить из базы с концами, чтобы не было никаких следов, то такое можно сделать по спецзапросу.
А зачем это хранить? Есть статистика обращений к старым документам?
Именно статистики нет. Точнее, она есть в виде протокола работы пользователей, но он хранится недолго. Записи старее года стираются из протокола.
Ситуации, когда надо было поднять старую переписку пятилетней и даже десятилетней давности, были. И это всегда делалось не из праздного любопытства, а для принятия сложных бизнес-решений. Был случай, когда без истории переписки было бы принято неправильное бизнес-решение.
Как проводится экспертиза ценности и уничтожение документов согласно срокам хранения?
Для бумажных документов это делается обычным традиционным способом, как и у всех. Для электронных не делаем – пусть себе хранятся. Место есть. Польза есть. Всем хорошо.
Какие перспективы развития есть?
Сейчас наш ДО решает примерно 30 внутренних задач, часть которых мы перечисляли в начале статьи. Также ДО используется для подготовки конференций, которые мы дважды в год проводим для наших партнёров: вся программа, все доклады, все параллельные секции, залы – всё это верстается в ДО, а потом выгружается из него, и делается печатная программа.
На подходе для ДО ещё несколько задач, помимо тех, что он уже решает. Есть общефирменные задачи, а есть уникальные и редкие, нужные только какому-то конкретному подразделению. Необходимо им помогать, а значит, расширять «географию» использования системы внутри 1С – расширять область применения, решать задачи всех подразделений. Это стало бы лучшим тестом на производительность и надёжность. Хотелось бы увидеть работу системы на триллионах записей, петабайтах информации.
Внешние источники данных (добавление, изменение, удаление) на примерах
В версии платформы 8.3.5.1068 (и позднее) появилась возможность добавления, изменения и удаления данных во внешних источниках программными средствами 1С. Примеры данной возможности представлены в данной статье.
Для того, чтобы запись во внешние источники стала возможной, компания 1С добавила новые свойства таблицам данных и полям внешних источников:
- Для всей таблицы - свойство ТолькоЧтение. ТолькоЧтение = Истина означает, что изменение данных в этой таблице невозможно;
- Для отдельных полей таблицы - свойства ТолькоЧтение, РазрешитьNull и ЗначениеЗаполнения:
- ТолькоЧтение = Истина означает, что изменение данных в этом поле невозможно;
- РазрешитьNull = Истина означает, что в данное поле может быть записано значение NULL;
- ЗначениеЗаполнения содержит стандартное значение этого поля (если такое существует).
Эти свойства вы (при описании таблиц вручную) или платформа (при создании таблиц конструктором) можете использовать следующим образом.
- ТолькоЧтение = Истина устанавливать, например, для представлений (view), таблиц, получаемых на основе выражения (результат функции) и подобных. Данные в таких таблицах изменять нельзя;
- ТолькоЧтение = Истина указывать для полей, устанавливаемых автоматически (AUTOINCREMENT), вычисляемых полей и подобных. Данные в таких полях изменять нельзя;
- РазрешитьNull = Истина устанавливать для всех полей, кроме ключевых, и тех, которые во внешнем источнике описаны как NOT NULL;
- ЗначениеЗаполнения поля устанавливать в том случае, когда во внешнем источнике указано стандартное значение этого поля (значение DEFAULT).
Добавлять, изменять и удалять данные во внешних источниках можно с помощью встроенного языка или интерактивно. Во встроенном языке для этого используются следующие методы менеджера таблицы:
- СоздатьНаборЗаписей() - для необъектных таблиц;
- Новый метод СоздатьОбъект() - для объектных таблиц.
Соответственно у объектов ВнешнийИсточникДанныхТаблицаНаборЗаписей и ВнешнийИсточникДанныхТаблицаОбъектпоявились новые методы Записать() и Удалить().
Добавление данных
При добавлении данных во внешний источник вы создаёте объект (или набор записей), устанавливаете значения полей и записываете. При этом есть некоторые особенности, о которых полезно знать.
Например, при попытке установить значение поля, у которого ТолькоЧтение = Истина, будет выдана ошибка. А при непосредственной записи в базу данных в выражении INSERT такие поля будут пропущены. В остальные поля записываются те значения, которые вы им присвоили. Поэтому значения Null и значения по умолчанию нужно присваивать полям в явном виде.
Далее представлен небольшой пример. В нём данные добавляются в объектную таблицу shop_feature, у которой существует два поля:
- id (РазрешитьNull = Истина);
- name (РазрешитьNull = Истина);
Выполнение оператора Записать() приведёт к тому, что сначала будет вызван обработчик события ПередЗаписью, затем выполнена физическая запись в таблицу внешнего источника (INSERT), затем будет вызван обработчик события ПриЗаписи.
С ключевым полем таблицы внешнего источника вы можете поступать следующим образом. Если ключевое поле доступно для изменения, то тогда вы «вручную» задаёте его значение перед записью. Если изменение ключевого поля запрещено, то платформа самостоятельно получит ключ в INSERT или непосредственно после. Вы можете вмешаться в этот процесс с помощью метода УстановитьСсылкуНового() до физической записи (в обработчике события ПередЗаписью) или непосредственно после физической записи (в обработчике события ПриЗаписи).
Изменение данных
При изменении данных обновляются значения всех полей таблицы, у которых ТолькоЧтение = Ложь.
Если же необходимо записать только некоторые поля, вы можете указать их перечень прямо из встроенного языка с помощью методов УстановитьЗаписываемыеПоля() и ПолучитьЗаписываемыеПоля().
Удаление данных
При удалении данных выполняется непосредственное удаление строки из таблицы базы данных. При этом поиск ссылок на удаляемый объект не выполняется. Если такая функциональность нужна, вы можете запрограммировать её самостоятельно в обработчике события ПередУдалением().
Транзакции
Чтение данных внешних источников, как и ранее, выполняется вне транзакции, а при записи платформа открывает неявную транзакцию. При этом и чтение, и запись вы можете выполнять и в явных транзакциях с помощью методов объектаВнешнийИсточникДанныхМенеджер:
Блокировки
Для управления блокировками рекомендуется использовать свойство внешнего источникаРежимУправленияБлокировкойДанных:
а также свойство таблицы внешнего источника УровеньИзоляцииТранзакций:
Кроме этого, можно самостоятельно задать уровень блокировок в методе НачатьТранзакцию().
Дополнил типовую статью примерами) Будет больше времени - добавлю больше примеров.
Эта статья дает представление о работе внешних компонент в системе «1С: Предприятие».
Будет показан процесс разработки внешней компоненты для системы «1С: Предприятие» версии 8.2, работающей под управлением ОС семейства Windows с файловым вариантом работы. Такой вариант работы используется в большинстве решений, предназначенных для предприятий малого бизнеса. ВК будет реализована на языке программирования C++.Внешние компоненты «1C: Предприятие»
- с использованием Native API
- с использованием технологии COM
Структура ВК
Внешняя компонента системы «1С: Предприятие» представлена в виде DLL-библиотеки. В коде библиотеки описывается класс-наследник IComponentBase. В создаваемом классе должны быть определены методы, отвечающие за реализацию функций внешней компоненты. Более подробно переопределяемые методы будут описаны ниже по ходу изложения материала.
Запуск демонстрационной ВК
- Выполнить сборку внешней компоненты, поставляемой с подпиской ИТС и предназначенной для демонстрации основных возможностей механизма внешних компонент в 1С
- Подключить демонстрационную компоненту к конфигурации 1С
- Убедиться в корректной работоспособности заявленных функций
Компиляция
Демонстрационная ВК расположена на диске подписки ИТС в каталоге «/VNCOMP82/example/NativeAPI».
Для сборки демонстрационной ВК будем использовать Microsoft Visual Studio 2008. Другие версии данного продукта не поддерживают используемый формат проекта Visual Studio.
Открываем проект AddInNative. В настройках проекта подключаем каталог с заголовочными файлами, необходимыми для сборки проекта. По умолчанию они располагаются на диске ИТС в каталоге /VNCOMP82/include.
Результатом сборки является файл /bind/AddInNative.dll. Это и есть скомпилированная библиотека для подключения к конфигурации 1С.Подключение ВК к конфигурации 1С
Создадим пустую конфигурацию 1С.
Ниже приведен код модуля управляемого приложения.Если при запуске конфигурации 1С не было сообщено об ошибке, то ВК была успешно подключена.
В результате выполнения приведенного кода в глобальной видимости конфигурации появляется объект ДемоКомп, имеющий свойства и методы, которые определены в коде внешней компоненты.Демонстрация заложенного функционала
Произвольное имя внешней компоненты
Задача: Изменить имя внешней компоненты на произвольное.
В предыдущем разделе использовался идентификатор AddInNativeExtension, смысл которого не был пояснен. В данном случае AddInNativeExtension — это наименование расширения.
В коде ВК определен метод RegisterExtensionAs, возвращающий системе «1С: Предприятие» имя, которое необходимо для последующей регистрации ВК в системе. Рекомендуется указывать идентификатор, который в известной мере раскрывает суть внешней компоненты.
Приведем полный код метода RegisterExtensionAs с измененным наименованием расширения:В приведенном примере имя ВК изменено на SomeName. Тогда при подключении ВК необходимо указывать новое имя:
Расширение списка свойств ВК
- Изучить реализацию свойств ВК
- Добавить свойство строкового типа, доступное для чтения и записи
- Добавить свойство строкового типа, доступное для чтения и записи, которое хранит тип данных последнего установленного свойства. При установке значения свойства никаких действий не производится
- Убедиться в работоспособности произведенных изменений
Полное описание методов, включая список параметров подробно описан в документации, поставляемой на диске ИТС.
Рассмотрим реализацию приведенных методов класса CAddInNative.
В демонстрационной ВК определены 2 свойства: Включен и ЕстьТаймер (IsEnabled и IsTimerPresent).
В глобальной области видимости кода библиотеки определено два массива:которые хранят русское и английское названия свойств. В заголовочном файле AddInNative.h определяется перечисление:
- Добавить имя добавляемого свойства в массивы g_PropNames и g_PropNamesRu (файл AddInNative.cpp)
- В перечисление Props (файл AddInNative.h) перед ePropLast добавить имя, однозначно идентифицирующее добавляемое свойство
- Организовать память под хранение значений свойств (завести поля модуля компоненты, хранящие соответствующие значения)
- Внести изменения в методы GetPropVal и SetPropVal для взаимодействия с выделенной на предыдущем шаге памятью
- В соответствии с логикой приложения внести изменения в методы IsPropReadable и IsPropWritable
Перечисление 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 примет вид:
Метода SetPropVal:
Для реализации второго свойства определим поле класса CaddInNative
в котором будем сохранять тип последнего переданного значения. Для этого в метод CaddInNative::SetPropVal добавим команду:
Теперь при запросе чтения значения второго свойства будем возвращать значение last_type, чего требует обозначенное задание.
Проверим работоспособность произведенных изменений.
Для этого приведем внешний вид конфигурации 1С к виду:Расширение списка методов
- Расширить функционал внешней компоненты следующим функционалом:
- Изучить способы реализации методов внешней компоненты
- Добавить метод-функцию Функц1, которая в качестве параметра принимает две строки («Параметр1» и «Параметр2»). В качестве результата возвращается строка вида: «Проверка. Параметр1, Параметр2»
- Убедиться в работоспособности произведенных изменений
- Добавить имя метода в массивы g_MethodNames и g_MethodNamesRu (файл AddInNative.cpp)
- Добавить осмысленный идентефикатор метода в перечисление Methods (файл AddInNative.h)
- Внести изменения в код функции GetNParams в соответствии с логикой программы
- При необходимости внести изменения в код метода GetParamDefValue, если требуется использовать значения по умолчанию параметров метода.
- Внести изменения в функцию HasRetVal
- Внести изменения в логику работы функций CallAsProc или CallAsFunc, поместив туда непосредственно исполняемый код метода
Отредактируем функцию GetNProps, чтобы она возвращала количество параметров метода «Тест»:
Внесем изменения в функцию CAddInNative::GetParamDefValue:
Благодаря добавленной строке
в случае отсутствия одного или нескольких аргументов соответствующие параметры будут иметь пустое значение (VTYPE_EMPTY). Если необходимо наличие значения по умолчанию для параметра, следует задать его в секции eMethTest оператора switch функции CAddInNative::GetParamDefValue.
Так как метод «Тест» может возвращать значение, необходимо внести изменения в код функции HasRetVal:И добавим исполняемый код метода в функцию CallAsFunc:
Скомпилируем компоненту и приведем код конфигурации к виду:
Таймер
- Изучить реализацию таймера в демонстрационной ВК
- Модифицировать метод «СтартТаймер», добавив возможность передавать в параметрах интервал срабатывания таймера (в миллисекундах)
- Убедиться в работоспособности произведенных изменений
Рассмотрим реализацию таймера в демонстрационной ВК.
Так как мы рассматриваем процесс разработки внешней компоненты для ОС семейства Windows, не будем рассматривать реализацию таймера в других операционных системах. Для ОС GNU/Linux, в частности, реализация будет отличаться синтаксисом функции SetTimer и TimerProc.
В исполняемом коде вызывается метод SetTimer, в который передается функция MyTimerProc:Идентефикатор созданного таймера помещается в переменную m_uiTimer, чтобы в последствии его можно было отключить.
Функция MyTimerProc выглядит следующим образом:Приведем код метода CallAsProc к виду:
Теперь проверим работоспособность. Для этого в модуле управляемого приложения конфигурации напишем код:
Взаимодействие с системой «1С: Предприятие»
Читайте также: