Visual2000 · Статьи А.Колесова по "1С"

Цикл "1С:Предприятие" в PC Magazine/RE

Использование COM-технологий в "1С:Предприятии 8.0"

Евгений Марков, Олег Снежков,
компания "Софтека" (www. softeka.ru)

© Евгений Марков, Олег Снежков, 2006
Авторский вариант. Статья была опубликована в журнале PC Magazine/RE № 09/06 (с.137-139).


Механизм COM используется в "1С:Предприятии" еще...

Механизм COM используется в "1С:Предприятии" еще со времен 7.0, и ему отводится ключевая роль в обеспечении взаимодействия прикладный решений на базе этой платформы с внешними приложениями (см. врезку). Об этой технологии можно узнать в специальной литературе [1], а здесь мы приведем ее ключевые понятия.

В начало статьи

Основы COM

В COM приложение предоставляет для использования свои службы, применяя для этого объекты COM. Одно приложение содержит как минимум один объект. Каждый объект имеет один или несколько интерфейсов, которые объединяют методы и свойства объекта (рис. 1). Обычно в интерфейсе объединяются все методы, выполняющие операции одного типа или работающие с однородными свойствами.

Клиент получает доступ к службам объекта только через интерфейс и его методы. Согласно спецификации COM, уже созданный интерфейс не может быть изменен ни при каких обстоятельствах. Это гарантирует постоянную работоспособность приложений на основе COM, невзирая на любые модернизации. Объект всегда работает в составе сервера COM, который может быть динамической библиотекой или исполняемым файлом:

Рис. 1. Схема работы механизма COM

Объект может иметь собственные свойства и методы или использовать данные и службы сервера. Для доступа к методам объекта клиент должен получить указатель на соответствующий интерфейс. Для каждого интерфейса существует собственный указатель. После этого клиент может использовать службы объекта, просто вызывая его методы. Доступ к свойствам объектов осуществляется только через его методы.

Каждый объект COM обязан иметь хотя бы один интерфейс. Это интерфейс Iunknown, и он играет ключевую роль в механизме функционирования объектов COM. Дело в то, что в состав этого интерфейса входит метод QueryInterface, который возвращает указатель на запрашиваемый клиентом интерфейс объекта. Таким образом, при помощи интерфейса IUnknown клиент может обратиться к любому другому интерфейсу, а затем и к нужным методам.

Automation, как технология, основанная на COM, обеспечивает предоставление функций одних приложений другим. Это делается благодаря использованию интерфейсов, инкапсулированных разнообразными объектами Automation, которые, в свою очередь, входят в состав серверов Automation. Основным отличием Automation от родительской технологии — COM -- является способ вызова методов интерфейсов.

В COM указатели на методы интерфейсов содержатся исключительно в специальных виртуальных таблицах. Такой способ доступа называется ранним связыванием. В Automation доступ к методам интерфейсов осуществляется как традиционным способом COM, так и при помощи специального метода, который осуществляет поиск запрошенного метода по специальному идентификатору. Такой способ доступа называется поздним связыванием. В остальном технология Automation подобна технологии COM. Базовым интерфейсом автоматизации является интерфейс IDispatch — вполне обычный интерфейс COM, имеющий тем не менее несколькими очень важными для Automation методами.

В начало статьи

Как разработать клиентское приложение COM

Давайте разберемся, как именно разработчики могут использовать возможности COM в "1С:Предприятии 8.0". Мы выяснили, что для организации взаимодействия приложений при помощи COM необходимо иметь сервер, предоставляющий интерфейсы, и клиенты. В "1С:Предприятии 8.0" реализован внутренний сервер COM, загружаемый в адресное пространство клиента и предоставляющий ему некоторые функции. Разработчики могут использовать возможности этого сервера в своих программах, которые в этом случае выступают как клиенты COM. Клиентским может быть любое приложение, но нас, конечно, в первую очередь интересуют приложения, разрабатываемые в "1С:Предприятии 8.0".

Основное преимущество использования сервера COM -- быстродействие. Сервер реализован как динамическая библиотека, поэтому процесс инициализации и загрузки сервера занимает минимум времени и взаимодействие сервера и клиента осуществляется в адресном пространстве клиента. Набор предоставляемых клиентам функций ограничен, следовательно, сервер невелик и мобилен.

Рассмотрим для начала пример использования сервера COM в клиентском приложении "1С:Предприятие 8.0". Организуем проверку правильности написания адреса электронной почты при помощи COM- объекта из VBScript:

Шаблон = ".+@.+\..+"; // регулярное выражение соответствует произвольному e-mail адресу
СтрокаАдреса = "ivanov@mail.com"; // проверяемый адрес
Процедура КнопкаВыполнитьНажатие(Элемент)
  RegExp = Новый COMОбъект("VBScript.RegExp"); // создаем объект для работы с регулярными выражениями
  RegExp.MultiLine = Ложь; // истина — текст многострочный, ложь — одна строка
  RegExp.Global = Истина; // истина — поиск по всей строке, ложь — до первого совпадения
  RegExp.IgnoreCase = Истина; // истина — игнорировать регистр строки при поиске
  RegExp.Pattern = Шаблон; // шаблон (регулярное выражение) для проверки корректности e-mail
     	
  // метод Test(СтрокаАдреса) проверяет (СтрокаАдреса) на соответствие ее шаблону заданному в RegExp.Pattern
  Если RegExp.Test(СтрокаАдреса) Тогда
  	Сообщить("Корректный адрес");
  Иначе
  	Сообщить("Не корректный адрес");
  КонецЕсли;
КонецПроцедуры

Обратите внимание, что инициализация сервера из клиентского приложения осуществляется при помощи метода COMОбъект, который возвращает ссылку на созданный объект в переменную RegExp. Затем этот объект обеспечивает настройку свойств и вызов метода Test сервера VBScript.RegExp, который собственно и осуществляет проверку [2].

Теперь рассмотрим пример обращения к серверу COM, реализованному в рамках платформы "1С:Предприятие 8.0". Он иллюстрирует способ обмена данными между двумя копиями базы и переносит содержимое справочника номенклатуры. Сначала в модуле внешнего соединения конфигурации, которая выступает сервером COM, необходимо описать экспортную функцию:

     // функция сериализует переданный объект
     Функция ПолучитьОбъектВСтроку(Объект) Экспорт
     	ЗаписьXML = Новый ЗаписьXML;
     	ЗаписьXML.УстановитьСтроку();
     	ЗаписатьXML(ЗаписьXML, Объект);
     	Возврат ЗаписьXML.Закрыть();
     КонецФункции

Эта функция позволяет сохранить состояние прикладных объектов в строке, используя механизм сериализации, поддерживаемый платформой. Затем, уже в конфигурации клиента, создаем метод- обработчик нажатия кнопки:

     Процедура КнопкаВыполнитьНажатие(Кнопка)
     	// Подключаемся к другой базе
     	V8 = Новый COMОбъект("V8.ComConnector");
     	Попытка
     	  Соединение = V8.Connect("File="""+ Путь + """;Usr=""" + 
                       Пользователь +""";Pwd=""" + Пароль + """;");
     	Исключение
     		Предупреждение("Не удалось подключиться к базе !");
     		Возврат;
     	КонецПопытки;
     	
     	// Откроем выборку по справочнику
     	Выборка = Соединение.Справочники.Номенклатура.Выбрать();
     	Пока Выборка.Следующий() Цикл
     		// сохраним элемент справочника в строку
     		СтрОбъект = Соединение.ПолучитьОбъектВСтроку(Выборка.ПолучитьОбъект());
     		ЧтениеXML = Новый ЧтениеXML;
     		ЧтениеXML.УстановитьСтроку(СтрОбъект);
     		// сериализуем из строки
     		Объект = ПрочитатьXML(ЧтениеXML);
     		// организуем уникальность кодов
     		Объект.установитьНовыйКод();
     		Объект.записать();
     	КонецЦикла;
     	
     КонецПроцедуры

Здесь, как и в прошлом примере, сначала создается экземпляр объекта, обеспечивающего связь с сервером COM, а затем при посредстве метода Connect делается попытка подключиться к базе. Каталог базы, пользователь и пароль задаются в одноименных переменных. Затем формируется строка инициализации базы, причем обратите внимание, что она различна для файлового и клиент- серверного варианта поставки! После успешного подключения метод Соединение.Справочники.Номенклатура.Выбрать() открывает выборку по справочнику номенклатуры. Следующий ниже цикл по выборке обеспечивает получение очередного элемента справочника, сериализацию и запись. При этом необходимо следить за уникальностью кодов.

В начало статьи

Использование Automation

В предыдущем пункте мы рассмотрели, как разработчики в "1С:Предприятии 8.0" могут подключаться к серверам COM. Однако сервер COM "1С:Предприятия" предназначен для организации взаимодействия с клиентскими приложениями в простых случаях. Когда же требуется использовать все возможности "1С:Предприятия", разработчики могут воспользоваться сервером Automation, который также имеется в стандартной поставке продукта [3]. Сервер Automation реализован как внешний сервер в виде исполняемого файла. Как вы увидите, с программной точки зрения его использование идентично использованию сервера COM. Удивительного здесь нет ничего — технология Automation – это ближайший родственник COM.

Рассмотрим небольшой пример. Известно, что текстовый процессор Microsoft Word обладает мощным механизмом проверки орфографии. При помощи Automation можно использовать этот механизм в приложении "1С:Предпряитие 8.0". При вводе произвольного текста в элементе управления ПолеВвода и нажатии кнопки срабатывает следующий программный код:

  ТекстДляПроверки = "Данный текст садержит как минемум три ошипки !";
  Процедура КнопкаВыполнитьНажатие(Кнопка)
    // Создадим объект MS Word, он должен быть установлен
    Попытка
    	Word = Новый COMОбъект("Word.Application");
    Исключение
    	Предупреждение("Microsoft Word не установлен!",,"Ошибка!");
    	Возврат;
    КонецПопытки;
    НетОшибок = Word.CheckSpelling(ТекстДляПроверки);
    Если НетОшибок Тогда // Все правильно
    	Сообщить("Нет ошибок");	
    Иначе  // текст содержит ошибки. Проверим каждое слово и выведем ошибочные.
     	Док = Word.Documents.Add();	 // Создадим новый документ
     	Область = Док.Range(0,0); // Получим пустую область в начале документа
     	Область.InsertBefore(ТекстДляПроверки); // Добавим в документ текст
     		
     	Для каждого Слово Из Область.Words Цикл
        	СловоДляПроверки = СокрЛП(Слово.Text);
     		НетОшибок = Word.CheckSpelling(СловоДляПроверки);
     		Если НЕ НетОшибок Тогда // Слово ошибочно
     			// покажем возможные замены неправильного слова
     			СтрокаВариантов = "";
     			// Получим варианты правописания
     			Варианты = Слово.GetSpellingSuggestions( ,1, ,0);
     			Для каждого Вариант Из Варианты Цикл
     				СтрокаВариантов = СтрокаВариантов + ", " + Вариант.Name;
     			КонецЦикла;
     			СтрокаВариантов = ". Варианты замены: " + Сред(СтрокаВариантов, 2);
     			Сообщить("Ошибка в слове: " + СловоДляПроверки + СтрокаВариантов);	
     		КонецЕсли;
     	КонецЦикла;	
     КонецЕсли;	
     Док.Close(0,,); // закроем документ без сохранения wdDoNotSaveChanges
     Word.Quit(); // закроем Word
  КонецПроцедуры

В приведенном примере стандартным способом инициализируется объект, отвечающий за соединение COM. Причем сервер Word.Application является сервером Automation. Затем при помощи метода сервера Word.CheckSpelling осуществляется проверка правописания заданного текста. В случае обнаружения ошибок средствами сервера создается новый документ, в котором проверяются слова и сообщаются варианты замены.

И последний пример описывает обращение к серверу Automation 1С:Предприятия 8.0.


Процедура КнопкаВыполнитьНажатие(Кнопка)
  // интерактивное заполнение документа одной базы 1С:Предприятие 8.0 в другой базе,
  V8 = Новый COMОбъект("V8.Application");
  Попытка
     Открытие = V8.Connect("File=""" + КаталогБазы + """;Usr=""" + Пользователь + """;");
     Исключение
       Предупреждение("База данных не открыта!!!");
     Возврат;
  КонецПопытки;
  // создаем экземпляр документа другой базы и открываем его форму
  Документ = V8.Документы.Расходная.СоздатьДокумент();
  ФормаДокумента = Документ.ПолучитьФорму();
  ФормаДокумента.ОткрытьМодально();
КонецПроцедуры

Здесь также осуществляется подключение к серверу V8.Application, который является сервером Automation. Затем на сервере создается новый документ Расходная и открывается форма этого документа для заполнения.

В начало статьи

Резюме

В начало статьи

Литература

1. Д. Чеппел. "Технологии ActiveX и OLE". — М: Microsoft Press, Русская редакция, 1997. 2. А. В. Михайлов. 1С:Предприятие 7.7/8.0 системное программирование. — СПб.: БХВ-Петербург, 2005. 3. А. П. Габец, Д. И. Гончаров, Д. Б. Козырев, Д. С. Кухлевский, М. Г. Радченко. Профессиональная разработка в системе 1С:Предприятие 8 — М.: "1С-Паблишинг" -- СПб.: Питер, 2006.

В начало статьи

ВРЕЗКА: COM-соединения и Automation в "1С:Предприятии"

Механизм COM представлен в "1С:Предприятии " в двух вариантах — COM-соединения и Automation, между которыми имеются важные различия:

В то же время COM-соединения имеют следующие преимущества по сравнению с Automation-сервером:

Основное назначение Automation-сервера "1С:Предприятия" — управление прикладными решениями этой платформы из других приложений и выполнение действий, аналогичных интерактивным. Он предоставляет доступ ко всем свойствам и методам своего глобального контекста, имеет дополнительные свойства и методы для выполнения действий, специфичных для работы в режиме Automation. Как и многие современные программные продукты, "1С:Предприятие" может выступать в роли клиента Automation. Поэтому предусмотрена возможность, например, взаимодействия двух копий "1С:Предприятия" для обмена данными.

В начало статьи