При работе с системой 1С:Предприятие часто возникает необходимость обмениваться данными между различными информационными базами. Ситуация усложняется, когда эти базы развернуты на разных виртуальных машинах, используют разные версии платформы и сервера 1С. В таких условиях прямое COM-соединение, которое требует идентичности версий, становится проблематичным. Давайте рассмотрим, какие существуют подходы и инструменты, позволяющие обойти эти ограничения и организовать надежный обмен данными.
Прежде всего, выясним основную сложность. Прямое COM-соединение в 1С подразумевает, что на машине-инициаторе соединения должен быть зарегистрирован COM-объект той же версии платформы 1С, что и целевая база. Если версии различаются, стандартный подход к созданию COMОбъект (например, COMОбъект("V83.Application")) не будет работать корректно или вовсе вызовет ошибку. Однако существуют эффективные методы, которые позволяют преодолеть это препятствие.
Веб-сервисы — это один из наиболее современных, гибких и универсальных способов организации обмена данными между различными системами, включая 1С, независимо от версий платформы, операционных систем или языков программирования. Давайте подробнее разберем этот подход.
Реализация обмена через веб-сервисы включает в себя два основных этапа: публикацию веб-сервиса в одной из баз 1С и его потребление в другой базе.
Для публикации веб-сервиса необходимо создать в конфигурации 1С объект "Веб-сервис" (или "HTTP-сервис", если вы предпочитаете REST-подобный подход). В нем мы описываем методы, которые будут доступны для внешнего вызова, и их параметры.
http://ваш_сервер/ваша_база/ws/ВашВебСервис.1cws?wsdl).После того как веб-сервис опубликован и доступен, другая база 1С может к нему подключаться и вызывать его методы.
WSОпределения, передавая ему адрес WSDL.
WSDL = "http://ваш_сервер/ваша_база/ws/ВашВебСервис.1cws?wsdl";
WSОпределения = Новый WSОпределения(WSDL);
WSПрокси = Новый WSПрокси(WSОпределения, "http://www.пример.com/", "ВашВебСервис", "ВашВебСервисSoap");
// Параметры "http://www.пример.com/", "ВашВебСервис", "ВашВебСервисSoap" берутся из WSDL
Попытка
Результат = WSПрокси.МетодВебСервиса(Параметр1, Параметр2);
// Обрабатываем полученный результат
Исключение
Сообщить("Ошибка вызова веб-сервиса: " + ОписаниеОшибки());
КонецПопытки;
Веб-сервисы предоставляют мощный и надежный механизм для обмена данными, особенно когда дело доходит до интеграции разнородных систем и различных версий 1С.
DCOM (Distributed Component Object Model) — это расширение технологии COM, которое позволяет компонентам взаимодействовать не только на одном компьютере, но и между различными компьютерами в сети. Это позволяет обойти ограничение на идентичность версий, если правильно настроить окружение. Давайте разберем, как DCOM может помочь в нашей ситуации.
Основная идея DCOM заключается в том, что вместо прямого создания COMОбъект на локальной машине, мы указываем, что COM-объект должен быть создан и запущен на удаленном компьютере. На удаленном компьютере, где находится целевая база 1С, должна быть установлена и зарегистрирована соответствующая версия платформы 1С с COM-объектом. Таким образом, запрос на создание COM-объекта от одной ВМ будет перенаправлен на другую ВМ, где он будет обработан версией 1С, соответствующей целевой базе.
Настройка DCOM является более сложной задачей, требующей внимательной работы с системными настройками Windows на обеих виртуальных машинах.
На виртуальной машине, к которой будет осуществляться подключение (где находится "принимающая" или "отдающая" база), необходимо установить платформу 1С той же версии, что и целевая информационная база. После установки важно убедиться, что COM-сервер 1С зарегистрирован.
cd "C:\Program Files\1cv8\X.X.X.X\bin" // Замените X.X.X.X на номер вашей версии платформы
regsvr32 comcntr.dll
Эта команда регистрирует библиотеку comcntr.dll, которая содержит COM-объект V83.Application (или V82.Application и т.д.).
Этот шаг требует настройки службы DCOM через утилиту dcomcnfg.
Win + R, введите dcomcnfg и нажмите Enter. Откроется "Службы компонентов".V83.Application (или соответствующую версию, например, V82.Application).V83.Application и выберите "Свойства".На ВМ, с которой вы будете инициировать COM-соединение, необходимо выполнить аналогичные настройки для V83.Application, но с учетом удаленного доступа.
dcomcnfg.V83.Application.В коде 1С на ВМ-инициаторе подключение к удаленной базе будет выглядеть почти так же, как и к локальной, благодаря настройкам DCOM:
Попытка
// Создаем COM-объект, который благодаря DCOM будет запущен на удаленной ВМ
// Указывать явно удаленный сервер в конструкторе COMОбъект не нужно,
// это настраивается через dcomcnfg
V8_COM = Новый COMОбъект("V83.Application");
// Параметры для подключения к информационной базе на удаленной ВМ
ПараметрыПодключения = "Srvr='ИмяСервера1СЦелевойВМ';Ref='ИмяБазыНаСервере';Usr='ПользовательБазы1С';Pwd='ПарольПользователя1С';";
// Подключаемся к информационной базе
Соединение = V8_COM.Connect(ПараметрыПодключения);
Если Соединение <> Неопределено Тогда
Сообщить("Успешное подключение к базе данных через DCOM!");
// Далее работаем с Соединение, как с обычной COM-сессией 1С
// Например:
// СправочникНоменклатура = Соединение.Справочники.Номенклатура;
// Элемент = СправочникНоменклатура.НайтиПоКоду("00001");
Иначе
Сообщить("Не удалось подключиться к базе данных через DCOM.");
КонецЕсли;
Исключение
Сообщить("Ошибка при создании или подключении через COM-объект: " + ОписаниеОшибки());
КонецПопытки;
Важно отметить, что DCOM требует тщательной настройки сетевых разрешений и прав пользователей Windows. Любая неточность в этих настройках может привести к ошибкам "Отказано в доступе" или "Невозможно запустить COM-сервер".
Несмотря на то, что автор темы предпочитает COM-соединения, обмен через файлы является универсальным и надежным способом, который полностью независим от версий платформы 1С и расположения баз. Давайте рассмотрим его подробнее как запасной или даже основной вариант, когда другие методы кажутся слишком сложными или избыточными.
Суть метода заключается в том, что данные из одной базы выгружаются в файл определенного формата, затем этот файл передается в другую базу и загружается. Для автоматизации процесса используются регламентные задания.
Мы можем использовать различные форматы для файлов обмена:
ЗаписьXML, ЧтениеXML, ЗаписьДокументаXML, ЧтениеДокументаXML).ЗаписьJSON, ЧтениеJSON).Выбор формата зависит от сложности передаваемых данных и требований к гибкости.
В базе-источнике мы пишем код, который будет формировать нужные данные и выгружать их в файл.
ИмяФайла = "C:\Обмен\ДанныеДляОбмена.xml";
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьФайл(ИмяФайла);
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("ДанныеОбмена");
// Пример выгрузки данных справочника
ВыборкаНоменклатура = Справочники.Номенклатура.Выбрать();
Пока ВыборкаНоменклатура.Следующий() Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("Номенклатура");
ЗаписьXML.ЗаписатьАтрибут("Код", ВыборкаНоменклатура.Код);
ЗаписьXML.ЗаписатьАтрибут("Наименование", ВыборкаНоменклатура.Наименование);
// ... другие реквизиты
ЗаписьXML.ЗаписатьКонецЭлемента(); // Номенклатура
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента(); // ДанныеОбмена
ЗаписьXML.Закрыть();
После выгрузки файл необходимо передать на другую ВМ. Это можно сделать различными способами:
Во второй базе мы пишем код, который будет считывать данные из файла и записывать их в информационную базу.
ИмяФайла = "C:\Обмен\ДанныеДляОбмена.xml";
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьФайл(ИмяФайла);
// Переходим к нужному элементу
ЧтениеXML.Прочитать(); // Пропускаем объявление
ЧтениеXML.Прочитать(); // Переходим к ДанныеОбмена
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "Номенклатура" Тогда
Код = ЧтениеXML.ПолучитьАтрибут("Код");
Наименование = ЧтениеXML.ПолучитьАтрибут("Наименование");
// Ищем или создаем элемент справочника
СсылкаНоменклатура = Справочники.Номенклатура.НайтиПоКоду(Код);
Если СсылкаНоменклатура = Неопределено Тогда
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.Код = Код;
НовыйЭлемент.Наименование = Наименование;
// ... другие реквизиты
НовыйЭлемент.Записать();
Иначе
// Обновляем существующий элемент, если нужно
ОбъектНоменклатура = СсылкаНоменклатура.ПолучитьОбъект();
ОбъектНоменклатура.Наименование = Наименование;
ОбъектНоменклатура.Записать();
КонецЕсли;
КонецЕсли;
КонецЦикла;
ЧтениеXML.Закрыть();
Для регулярного обмена можно использовать РегламентныеЗадания в 1С. Создаем регламентное задание, которое будет запускать обработку выгрузки в первой базе и обработку загрузки во второй базе с заданным расписанием.
Хотя файловый обмен менее интерактивен, он очень надежен и универсален, особенно когда требуется высокая отказоустойчивость или нет возможности настроить прямое сетевое взаимодействие.
V82.Application, V83.Application). Однако это работает только для локального создания COM-объекта, а не для удаленного между ВМ без DCOM.Таким образом, хотя прямое COM-соединение между разными версиями 1С на разных виртуальных машинах невозможно без дополнительных шагов, веб-сервисы и DCOM предоставляют эффективные и проверенные решения. Файловый обмен остается универсальным запасным вариантом, который всегда сработает, независимо от сложности инфраструктуры.