Знакомство с технологией Automation-сервер на примерах
Разработка - Математика и алгоритмы
Система 1С:Предприятие может использоваться внешними приложениями в качестве Automation-сервера. При работе в качестве Automation-сервера 1С:Предприятие предоставляет доступ ко всем свойствам и методам своего глобального контекста, а также включение и выключение пользовательского интерфейса (главного окна 1С:Предприятия 8). Кроме того, Automation-сервер 1С:Предприятия имеет дополнительные свойства и методы для выполнения действий, специфичных для работы в режиме Automation.
Основное назначение Automation-сервера 1С:Предприятие в управлении приложением 1С:Предприятия 8 из других приложений и выполнение действий аналогичных интерактивным действиям, например, построение отчетов.
Для запуска системы 1С:Предприятие в качестве Automation-сервера из внешнего приложения, выполняется следующая последовательность действий:
создается COMОбъект с идентификатором V83.Application (для тонкого клиента V83C.Application);
выполняется инициализация системы 1С:Предприятие методом Connect (для тонкого клиента существует возможность передать в строке соединения дополнительные параметры прокси сервера);
вызываются свойства и методы системы 1С:Предприятие как Automation-сервера.
Многие современные программные продукты (MS Office, MS FoxPro и т.п.) могут выступать в роли клиентов Automation, что позволяет обмениваться данными между этими продуктами и системой 1С:Предприятие.
Замечание 1: Поскольку система 1С:Предприятие может создавать и использовать Automation-серверы, предоставляемые внешними приложениями (т.е. является Automation-клиентом), то имеется возможность из 1С:Предприятия обращаться к другой копии 1С:Предприятия (например, к другой конфигурации) для обмена данными.
Замечание 2: Нелокализованные версии внешних программ, обращающихся к программе 1С:Предприятие посредством Automation, могут неправильно интерпретировать русские идентификаторы объектов, например, реквизитов справочников. Данное замечание не относится к продуктам MS Office и к программам, использующим в качестве языка обращения к COM-объектам Microsoft Visual Basic. Рекомендуется использовать локализованные версии программных продуктов, либо в конфигурации использовать идентификаторы без символов кириллицы. Для обращения к свойствам и методам объектов системы 1С:Предприятие из внешних приложений рекомендуется использовать их англоязычные синонимы.
Замечание 3: Все созданные объекты Automation существуют до тех пор, пока существует переменная, которая содержит значение данного объекта. Следовательно, сама программа 1С:Предприятие, выступающая в качестве объекта Automation в другой программе, будет находиться в памяти компьютера до удаления или изменения значения переменной, содержащей ее в качестве объекта.
Система 1С:Предприятие в качестве Automation-сервера предоставляет полный доступ к своему глобальному контексту. Поэтому объект Automation-сервер 1С:Предприятие в качестве своих свойств может иметь: системные константы, значения заданных в Конфигураторе объектов, доступ к которым осуществляется с помощью менеджеров (например, константы, перечисления, справочники, документы, журналы документов, отчеты, обработки, планы видов характеристик, планы счетов, планы видов расчета, регистры), а также переменные, объявленные в модуле приложения (управляемого / обычного) с ключевым словом Экспорт.
Automation-сервер 1С:Предприятие в качестве своих методов может иметь: системные процедуры и функции, а также процедуры и функции модуля приложения и общих модулей, объявленные с ключевым словом Экспорт.
Итак, рассмотрим данную технологию на примерах. Для начала решим простую задачу. Мы подключимся из нашей информационной базы к другой информационной базе и обратимся к некоторым свойствам и методам глобального контекста. Для этого мы создадим внешнюю обработку - "РаботаСДругойБазой". Создадим команду, перетащим её на форму. При нажатии на эту кнопку наша обработка будет выполнять определенные действия. Создаем обработчик действия.
В обработчике действия мы создаем новый СОМ - объект. Далее используем метод "Connect(<СтрокаСоединения>) " . В строке соединения данного метода мы укажем путь к нашей информационной базе и имя пользователя, под которым мы будем в неё заходить.
В случае, если подключение выполнить не удалось, мы сообщим об этом пользователю, а если все прошло удачно, то мы обратимся к методу глобального контекста "ИмяПользователя()" для того, чтобы сообщить, под каким пользователем мы заходим в базу. Данная функция доступна в режиме "Внешнее соединение":
&НаКлиенте
Процедура Запуск(Команда)
ДругаяБаза = Новый COMObject("V83.Application");
Подключение = ДругаяБаза.Connect("File=C:\ДругаяБаза;Usr=Администратор;");
Если НЕ Подключение Тогда
Сообщить("Подключение не удалось");
Возврат;
КонецЕсли;
Сообщить(ДругаяБаза.ИмяПользователя());
КонецПроцедуры
Итак, сохраняем обработку и запускаем ее в пользовательском режиме. Нажимаем кнопку "Запуск" и спустя некоторое время система нам сообщает имя пользователя. При этом у нас открывается "ДругаяБаза" в пользовательском режиме.
Теперь немного усложним задачу. Допустим, нам нужно обратиться к справочнику в другой базе при помощи запроса. Если бы мы писали запрос в текущей базе, то мы бы объявили переменную класса "Запрос". Но сейчас мы будем выполнять запрос в рамках другой информационной базы. Для этого мы будем использовать метод NewObject(<Имя>). Далее мы пишем текст запроса. Мы можем напрямую обращаться к свойствам и методам данного запроса. Мы будем использовать методы "Выполнить()" и "Выбрать()". Казалось бы, на выходе у нас должна получиться "ВыборкаИзРезультатаЗапроса". Однако если мы поставим точку останова и посмотрим на выполнение нашего кода в отладчике, то мы увидим, что тип данных - это "CОМОбъект". Более того, все типы другой информационной базы у нас также будут CОМОбъектами. Есть и еще одна странность, мы работаем на клиенте, но при этом выполняем запрос. Дело в том, что мы обращаемся к ДругойБазе, а там программный код исполняется в режиме внешнего соединения.
&НаКлиенте
Процедура Запуск(Команда)
ДругаяБаза = Новый COMObject("V83.Application");
Подключение = ДругаяБаза.Connect("File=C:\ДругаяБаза;Usr=Администратор;");
Если НЕ Подключение Тогда
Сообщить("Подключение не удалось");
Возврат;
КонецЕсли;
Сообщить(ДругаяБаза.ИмяПользователя());
Запрос = ДругаяБаза.NewObject("Запрос");
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Ссылка.НаименованиеПолное);
КонецЦикла;
КонецПроцедуры
Отметим также, что если мы используем следующий код Сообщить(Выборка.Ссылка.НаименованиеПолное); сообщения мы получаем в той же базе, из которой мы запускаем нашу обработку. Если же нам нужно вывести сообщение в "ДругойБазе", то код должен быть следующий: ДругаяБаза.Сообщить(Выборка.Ссылка.НаименованиеПолное);
Отметим также тот факт, что несмотря на то, что "Выборка.Ссылка" у нас имеет тип "CОМОбъект" мы можем получить строковое представление этого значения. Для этого у нас есть метод "String(<Параметр>)". Т.е. вместо Выборка.Ссылка.НаименованиеПолное мы могли использовать ДругаяБаза.String(Выборка.Ссылка), чтобы получить наименование элемента справочника.
Решим еще одну задачу. Из текущей информационной базы нам нужно будет обратиться к "ДругойБазе" и создать элемент справочника "Контрагенты". Вначале код у нас будет похожий, нам прежде всего нужно будет выполнить подключение к информационной базе. Нам нужно будет обратиться к классу СправочникиМенеджер (CatalogsManager).
Код у нас будет аналогичный тому, как если бы мы создавали элемент справочника в нашей базе. Единственное, вначале мы должны указать "ДругаяБаза.":
&НаКлиенте
Процедура Запуск(Команда)
ДругаяБаза = Новый COMObject("V83.Application");
Подключение = ДругаяБаза.Connect("File=C:\ДругаяБаза;Usr=Администратор;");
КонтрагентыОбъект = ДругаяБаза.Справочники.Контрагенты.СоздатьЭлемент();
КонтрагентыОбъект.Наименование = "Контрагент из вызывающей базы";
КонтрагентыОбъект.Записать();
КонецПроцедуры
Следует отметить и одно неудобство при работе с "CОМОбъект" - это то, что у нас не работает контекстная подсказка.
Итак, мы уже научились создавать новые элементы в другой информационной базе, а теперь попробуем открыть только что созданный элемент. Для того, чтобы открыть форму, нам будет необходимо обратиться к методу глобального контекста "ОткрытьФорму()". Отличие будет в том, что мы будем обращаться не напрямую, а используя наш "СОМОбъект" "ДругаяБаза". Мы указываем имя нашего открываемого объекта. Кроме того, нам нужно передать второй параметр, который у нас является структурой, которая будет включать в себя "Ключ" и "Значение", которое будет являться ссылкой на наш элемент справочника:
&НаКлиенте
Процедура Запуск(Команда)
ДругаяБаза = Новый COMObject("V83.Application");
Подключение = ДругаяБаза.Connect("File=C:\ДругаяБаза;Usr=Администратор;");
КонтрагентыОбъект = ДругаяБаза.Справочники.Контрагенты.СоздатьЭлемент();
КонтрагентыОбъект.Наименование = "Контрагент из вызывающей базы";
КонтрагентыОбъект.Записать();
ДругаяБаза.ОткрытьФорму("Справочник.Контрагенты.ФормаОбъекта", новый Структура("Ключ", КонтрагентыОбъект.Ссылка));
КонецПроцедуры
Однако, если мы запустим нашу обработку с таким кодом система нам выдаст ошибку:
"Произошла исключительная ситуация (1C:Enterprise8.3.6.2237) несоответствие типов (параметр номер 2)". Подобные ошибки очень часто возникают при использовании технологии Automation. Дело в том, что мы создаем структуру в текущей базе, а её нужно создать в "ДругаяБаза". Правильный программный код будет следующий:
&НаКлиенте
Процедура Запуск(Команда)
ДругаяБаза = Новый COMObject("V83.Application");
Подключение = ДругаяБаза.Connect("File=C:\ДругаяБаза;Usr=Администратор;");
КонтрагентыОбъект = ДругаяБаза.Справочники.Контрагенты.СоздатьЭлемент();
КонтрагентыОбъект.Наименование = "Контрагент из вызывающей базы";
КонтрагентыОбъект.Записать();
Параметр = ДругаяБаза.NewObject("Структура");
Параметр.Вставить("Ключ", КонтрагентыОбъект.Ссылка);
ДругаяБаза.ОткрытьФорму("Справочник.Контрагенты.ФормаОбъекта", Параметр);
КонецПроцедуры
Когда мы подключаемся к "ДругойБазе", используя технологию OLE Automation у нас происходит обычный запуск приложения. Это означает, что когда мы обращаемся к базе, у нас будут работать обычные модули. Это модуль сеанса, модуль управляемого приложения со всеми событиями ПередНачаломРаботыСистемы(), ПередЗавершениемРаботыСистемы(). Но у нас еще есть модуль внешнего соединения, и в случае использования Automation он не вызывается. Он будет вызываться только когда мы будем подключаться через СОМ напрямую, используя "Менеджер COM-соединений", который обеспечивает возможность надежного и быстрое программного доступа к данным 1С:Предприятия 8 из внешних приложений через Внешнее соединение (External connection).
В общем и целом работа с 1С:Предприятием 8 через внешнее соединение подобна работе с 1С:Предприятием в режиме Automation сервера. Основные отличия заключаются в следующем:
В случае Automation сервера запускается полноценное приложение 1С:Предприятия 8, а в случае внешнего соединения запускается относительно небольшой внутрипроцессный COM-сервер.
При работе через внешнее соединение не доступны функциональные возможности, так или иначе связанные с организацией пользовательского интерфейса 1С:Предприятия 8;
При работе внешнего соединения не используется модуль управляемого приложения (модуль обычного приложения) конфигурации 1С:Предприятия 8. Его роль при работе с внешним соединением играет модуль внешнего соединения.
При использовании внешнего соединения имеются следующие преимущества по сравнению с использованием Automation сервера:
Более быстрая установка соединения, так как не требуется создания отдельного процесса операционной системы, а все действия производятся в рамках вызывающего процесса;
Более быстрое обращение к свойствам и методам объектов 1C:Предприятия, так как для организации обращения не требуется организации межпроцессной коммуникации;
Меньший расход ресурсов операционной системы.
Для организации доступа к данным 1С:Предприятия 8 через внешнее соединение, выполняется следующая последовательность действий:
создается менеджер COM-соединений, с помощью которого производится установка соединения;
производится обращение к методу Connect менеджера COM-соединений. Метод Connect возвращает внешнее соединение с информационной базой 1С:Предприятия 8;
через внешнее соединение производится обращение к допустимым методам, свойствам и объектам информационной базы, с которой установлено соединение.
Важно! В связи с отсутствием пользовательского интерфейса не все объекты, а также свойства и методы можно использовать во внешнем соединении.
Внешнее соединение предоставляет полный доступ к своему глобальному контексту. Поэтому внешнее соединение в качестве своих методов может иметь: системные константы, значения заданных в Конфигураторе объектов, доступ к которым осуществляется с помощью менеджеров (например, константы, перечисления, справочники, документы, журналы документов, отчеты, обработки, планы видов характеристик, планы счетов, планы видов расчета, регистры), а также переменные, объявленные в модуле внешнего соединения с ключевым словом Экспорт.
Также важно помнить, что у нас на уровне роли есть такое право, как возможность подключения к базе, используя технологию Automation. Если у пользователя это право стоит, то под ним можно будет выполнять запуск. В противном случае внешний запуск, используя данную технологию, будет невозможен.
Специальные предложения
См. также
Регистры бухгалтерии. Общая информация 111
05.09.2019 6735 YPermitin 22
"Хочу универсально!" [Часть 1] 65
02.09.2019 4914 SeiOkami 35
Иерархия без "В ИЕРАРХИИ" 117
22.08.2019 4921 ildarovich 16
EnterpriseData – часть 3. Загрузка данных, идентификация объектов 62
22.08.2019 4241 ids79 7
Обработчики событий при записи объектов. Зачем и что за чем? 202
25.07.2019 12815 4 AlbinaAAA 23
Как проводятся документы в типовых конфигурациях от 1С 137
24.07.2019 16090 skv_79 32
FizzBuzz на 1С. Чем короче, тем веселее. Варианты принимаются... 8
24.07.2019 2869 vandalsvq 16
Управление качеством кода 136
22.07.2019 8263 Stepa86 29
Что делает "В ИЕРАРХИИ" в запросе? 94
16.07.2019 8212 YPermitin 34
Создание отчетов с помощью СКД - основные понятия и элементы 208
25.06.2019 21058 ids79 17
Реализуем Стек, Очередь и Приоритетную очередь в 1С 52
24.06.2019 7813 RonX01 63
Организация хранения промежуточных данных 3
29.05.2019 1957 scientes 1
Вычисление 200 тысяч знаков числа pi 73
28.05.2019 3993 Oleg_nsk 93
Регистры накопления. Виртуальные таблицы. Часть №1: Обороты 84
20.05.2019 11118 YPermitin 5
Даем названия переменным: как префиксы экономят наше время 10
06.05.2019 3216 Designer1C 69
Заметки по SQL: Срез последних - аналог запроса 15
15.01.2019 6323 IVC_goal 5
Разработка и сценарное тестирование с Vanessa-ADD. Концепция, теория и сквозной пример создания сценария 222
09.01.2019 27596 Vladimir Litvinenko 69
Многопоточное восстановление последовательностей 41
05.12.2018 7255 _ASZ_ 29
Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С 127
10.11.2018 22286 ids79 40
Основные понятия и механизмы оптимизации клиент-серверного взаимодействия в 1C 147
23.08.2018 22916 Rain88 42
Теорема номер тринадцать 15
15.03.2018 9362 vasilev2015 24
Введение в CI для 1С 87
21.11.2017 19335 real_MaxA 22
Как работает серверный вызов в 1С 459
18.11.2017 44258 pahich 77
#Область ВНЕШНИЕ_ВЫЗОВЫ или MVC в 1С, библиотечность и упрощение интеграции кода 43
12.10.2017 14813 for_sale 58
Групповая разработка конфигураций в крупном холдинге 68
15.08.2017 17551 stas_ganiev 15
Автоматизация процесса 1С-разработки 91
07.06.2017 23032 ekaruk 9
Пишем игру Минер. Обработка событий ActiveX в 1С 29
29.05.2017 12740 user621724_Dimav1979 11
Как я доступ на kb.1c.ru получал 91
01.05.2017 22539 ikekoval 33
Улучшение стандарта "Структура модуля" 6
26.03.2017 12331 o.nikolaev 23
"Распределение в запросе" или "избавляемся от перебора" 185
16.12.2016 28640 alexandersh 48
Планы обмена. Квитировать или гарантировать? 24
12.12.2016 14565 zhichkin 9
Некоторые принципы оптимизации запросов 1С (+SQL) 115
17.11.2016 8901 ture 40
Использование git для доработки типовых конфигураций 1С 230
11.10.2016 188495 pumbaE 31
Оптимизация запросов 1С:Предприятие – от теории к практике 116
07.10.2016 32089 bpc222 20
Регистры сведений 1С. Как это устроено. 729
05.08.2016 151074 Sergey.Noskov 155
Переводим расширения на 8.3.8. Памятка. 79
29.07.2016 39730 mrXoxot 12
Подобие Объектно-ориентированного программирования в 1С (ПООПс) 12
24.07.2016 10925 adam26 54
Опыт практического применения методики BDD на 1С. Написание сценариев 121
03.07.2016 20336 oleynik.dv 132
Заметки про запросы. Последовательность. 110
27.05.2016 29635 vasilev2015 31
Оптимизация планирования доставки грузов. Алгоритм кластеризации k-means (метод K-средних). 26
10 стартмани
09.02.2016 26531 mi1man 4
Контур.EDI изнутри, или история командной разработки тиражного продукта на 1С 174
17.11.2015 36057 skif47 88
Порядок записи движений регистров при проведении документа 95
13.11.2015 80536 triton_tver 8
Три способа получить дерево элементов иерархического справочника 52
11.11.2015 63135 32ops 9
Распределение суммы по базе 48
08.11.2015 27743 starik-2005 19
Мультиинструментальный Brute Force 4
30.10.2015 10445 scientes 4
1С с "плюсами" 74
14.10.2015 19975 IntelInside 47
Критерии отбора 83
24.09.2015 49493 niko11s 13
По ссылке или по значению? Ключевое слово Знач и с чем его едят 196
12.08.2015 37194 Evil Beaver 239
Приемы обработки больших данных в 1С 258
07.08.2015 60333 tormozit 27