Интеграция между различными конфигурациями «1С:Предприятие 8» — одна из наиболее частых задач, с которыми сталкиваются разработчики. Несмотря на активное развитие веб-сервисов (HTTP и SOAP), технология COM-соединения остается востребованной благодаря высокой скорости работы при локальном размещении баз данных и отсутствию необходимости поднимать веб-сервер. В этой статье мы подробно разберем, как передать сформированный файл печатной формы (в формате XLS/XLSX) из базы-источника «1С:Бухгалтерия предприятия 3.0» в базу-приемник «1С:Документооборот 1.4/2.1/3.0», программно создать карточку исходящего документа, прикрепить к ней этот файл и запустить бизнес-процесс.
Мы рассмотрим технические нюансы взаимодействия через COM, разницу между OLE и COM-соединением, методы сериализации двоичных данных, а также способы решения проблем совместимости платформ разной разрядности.
---
Прежде чем перейти к реализации обмена, проанализируем разницу между двумя ключевыми механизмами COM-интеграции в платформе «1С:Предприятие 8». Разработчики часто путают эти понятия, что приводит к некорректному расходу ресурсов сервера приложений.
Частой ошибкой при переходе с OLE на COM является неверный вызов метода создания объектов в подчиненной базе. Разберем типичную ситуацию, когда разработчик пытается вызвать метод NewObject непосредственно у менеджера соединений:
// ОШИБОЧНЫЙ КОД
Коннектор = Новый COMОбъект("V83.COMConnector");
Запрос = Коннектор.NewObject("Запрос"); // Вызовет ошибку: "Метод объекта не обнаружен"
Выясним причину этой ошибки. Менеджер соединений V83.COMConnector предназначен только для установки связи. Сам по себе он не содержит методов работы с прикладными объектами базы данных. Чтобы получить доступ к метаданным и объектам подчиненной базы, мы сначала должны вызвать метод Connect, который вернет нам **объект соединения**:
// КОРРЕКТНЫЙ КОД
Коннектор = Новый COMОбъект("V83.COMConnector");
// ПараметрыПодключения — строка соединения с базой-приемником
Соединение = Коннектор.Connect(ПараметрыПодключения);
// Теперь мы работаем через полученный объект соединения
Запрос = Соединение.NewObject("Запрос"); // Работает корректно!
---
Если базы данных работают в клиент-серверном режиме и физически могут находиться на разных серверах (или у сервера приложений источника нет прямого доступа к файловой системе сервера приемника), наиболее надежным и универсальным способом передачи файла является его сериализация в текстовую строку формата Base64.
Рассмотрим пошагово алгоритм реализации этого процесса:
ДвоичныеДанные.Проанализируем программный код, реализующий этот алгоритм в модуле формы или в общем модуле «1С:Бухгалтерии»:
&НаСервере
Функция СформироватьИПолучитьСтрокуФайла(ДокументСсылка)
// 1. Формируем табличный документ печатной формы
ТабДок = СформироватьПечатнуюФорму(ДокументСсылка);
// 2. Получаем имя временного файла на сервере БП
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ТабДок.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLSX);
// 3. Считываем данные в объект ДвоичныеДанные
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ИмяВременногоФайла);
// Удаляем временный файл с диска БП за ненадобностью
Попытка
УдалитьФайлы(ИмяВременногоФайла);
Исключение
ЗаписьЖурналаРегистрации("Обмен через COM", УровеньЖурналаРегистрации.Предупреждение, , ,
"Не удалось удалить временный файл: " + ОписаниеОшибки());
КонецПопытки;
// 4. Кодируем двоичные данные в строку Base64
СтрокаBase64 = ДвоичныеДанныеФайла.ПолучитьСтрокуBase64();
Возврат СтрокаBase64;
КонецФункции
Теперь рассмотрим, как принять эти данные на стороне «1С:Документооборота» через COM-соединение, декодировать их и связать с новым объектом информационной базы.
---
Если обе базы данных (и «1С:Бухгалтерия», и «1С:Документооборот») развернуты на одном физическом сервере (или в рамках одной локальной сети с доступным общим сетевым ресурсом), передавать огромные строки Base64 через COM-соединение нецелесообразно. Это приводит к лишней нагрузке на процессоры серверов при кодировании/декодировании и перерасходу оперативной памяти.
В этой ситуации гораздо эффективнее использовать промежуточную директорию обмена на сервере. Схема работы будет выглядеть следующим образом:
D:\ExchangeCOM\).Этот подход гарантирует максимальную производительность обмена даже при передаче тяжелых сканов документов или архивов.
---
Перейдем к самой ответственной части — написанию кода, управляющего интеграцией. Нам необходимо программно подключиться к базе «1С:Документооборот», создать элемент справочника ИсходящиеДокументы, загрузить туда файл и запустить по нему комплексный бизнес-процесс.
Обратите внимание: вся работа с объектами «1С:Документооборота» происходит через COM-соединение. Любые прикладные объекты базы-приемника мы должны создавать с помощью метода Соединение.NewObject() или получать через менеджеры справочников подчиненной базы.
Давайте разберем по шагам полную процедуру интеграции на стороне «1С:Бухгалтерии»:
&НаСервере
Процедура ВыгрузитьФайлВДиграммно(ДокументСсылка, СтрокаBase64)
// 1. Настройка параметров подключения к 1С:Документообороту
// Для клиент-серверной базы строка подключения выглядит следующим образом:
СтрокаПодключения = "Srvr=""ИмяСервера1С"";Ref=""ИмяБазыДО"";Usr=""ИмяПользователя"";Pwd=""Пароль"";";
// Инициализируем COM-соединение
Попытка
Коннектор = Новый COMОбъект("V83.COMConnector");
СоединениеДО = Коннектор.Connect(СтрокаПодключения);
Исключение
ВызватьИсключение "Не удалось установить COM-соединение с 1С:Документооборот: " + ОписаниеОшибки();
КонецПопытки;
Попытка
// 2. Создаем новый элемент справочника "Исходящие документы" в базе ДО
НовыйДокумент = СоединениеДО.Справочники.ИсходящиеДокументы.СоздатьЭлемент();
НовыйДокумент.Наименование = "Уведомление по документу " + Строка(ДокументСсылка);
НовыйДокумент.ДатаРегистрации = ТекущаяДата();
// Заполняем другие обязательные реквизиты (в зависимости от настроек вашей базы ДО)
// Например, организацию, корреспондента, признак подготовлен и т.д.
// Обратите внимание: ссылки на предопределенные элементы или объекты ДО
// нужно получать также через COM-соединение.
НовыйДокумент.Записать();
СсылкаНаНовыйДокумент = НовыйДокумент.Ссылка;
// 3. Создаем файл во временной папке на сервере ДО из переданной Base64-строки
// Для этого мы воспользуемся возможностями файловой системы сервера, выполнив код в контексте COM
ИмяВременногоФайлаДО = СоединениеДО.ПолучитьИмяВременногоФайла("xlsx");
// Преобразуем Base64 обратно в файл на стороне ДО.
// Так как напрямую передать ДвоичныеДанные через COM-границу платформы бывает затруднительно,
// мы можем использовать объекты работы со строками или временные хранилища.
// Самый простой способ — использовать объект "ДвоичныеДанные" внутри COM-сессии:
ДвоичныеДанныеCOM = СоединениеДО.NewObject("ДвоичныеДанные");
// Чтобы избежать проблем передачи больших двоичных объектов, запишем файл через XML-сериализатор
// или воспользуемся временным хранилищем.
// Ниже приведен пример создания файла через декодирование строки Base64 в COM:
// Используем встроенную функцию ДО для сохранения двоичных данных из строки
СоединениеДО.РаботаСФайлами.ЗаписатьФайлИзСтрокиBase64(ИмяВременногоФайлаДО, СтрокаBase64);
// 4. Прикрепляем файл к созданному исходящему документу
// В 1С:Документооборот файлы хранятся в специальном справочнике "Файлы"
// и привязываются к владельцу (в нашем случае - ИсходящийДокумент).
// Для корректного создания файлов в ДО используется стандартный механизм интеграции:
ПараметрыФайла = СоединениеДО.НовыйСтруктура();
ПараметрыФайла.Вставить("Автор", СоединениеДО.ПараметрыСеанса.ТекущийПользователь);
ПараметрыФайла.Вставить("ВладелецФайла", СсылкаНаНовыйДокумент);
ПараметрыФайла.Вставить("ИмяФайлаНаДиске", ИмяВременногоФайлаДО);
ПараметрыФайла.Вставить("Наименование", "Печатная_форма_Уведомление.xlsx");
// Вызываем стандартный метод библиотеки интеграции ДО для добавления файла
НовыйФайлСсылка = СоединениеДО.РаботаСФайлами.ДобавитьФайл(ПараметрыФайла);
// Удаляем временный файл на сервере ДО
Попытка
СоединениеДО.УдалитьФайлы(ИмяВременногоФайлаДО);
Исключение
// Ошибка удаления временного файла не является критичной для завершения процесса
КонецПопытки;
// 5. Запуск бизнес-процесса по шаблону
// Если для данного вида документов настроен автоматический запуск или есть шаблон процесса:
ШаблонПроцесса = СоединениеДО.Справочники.ШаблоныСогласования.НайтиПоНаименованию("Согласование исходящих документов");
Если НЕ СоединениеДО.ЗначениеЗаполнено(ШаблонПроцесса) Тогда
// Если шаблон не найден, можно запустить комплексный процесс
ШаблонПроцесса = СоединениеДО.Справочники.ШаблоныКомплексныхБизнесПроцессов.НайтиПоРеквизиту("Наименование", "Комплексный процесс");
КонецЕсли;
Если СоединениеДО.ЗначениеЗаполнено(ШаблонПроцесса) Тогда
// Создаем и запускаем бизнес-процесс на основании нашего документа
НовыйПроцесс = СоединениеДО.БизнесПроцессы.КомплексныйПроцесс.СоздатьБизнесПроцесс();
НовыйПроцесс.Дата = ТекущаяДата();
НовыйПроцесс.Наименование = "Согласование: " + НовыйДокумент.Наименование;
НовыйПроцесс.Шаблон = ШаблонПроцесса;
НовыйПроцесс.Записать();
// Добавляем предмет процесса (наш созданный документ)
СтрокаПредмета = НовыйПроцесс.Предметы.Добавить();
СтрокаПредмета.Предмет = СсылкаНаНовыйДокумент;
СтрокаПредмета.ИмяПредмета = "ИсходящийДокумент";
НовыйПроцесс.Записать();
// Стартуем бизнес-процесс
НовыйПроцесс.Старт();
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
"Документ успешно передан в 1С:Документооборот. Запущен процесс согласования.");
Иначе
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
"Документ передан в 1С:Документооборот, но шаблон бизнес-процесса не найден. Процесс не запущен.");
EndIf;
Исключение
// Обеспечиваем корректное закрытие транзакций и логирование ошибок
ЗаписьЖурналаРегистрации("Обмен через COM", УровеньЖурналаРегистрации.Ошибка, , ,
"Произошла ошибка при выполнении COM-операций: " + ОписаниеОшибки());
ВызватьИсключение "Ошибка интеграции с 1С:Документооборот. Подробности в Журнале Регистрации.";
КонецПопытки;
// Освобождаем COM-объект соединения для очистки памяти сеанса
СоединениеДО = Неопределено;
КонецПроцедуры
---
Очень часто при настройке COM-интеграции разработчики и системные администраторы сталкиваются с техническими ограничениями операционной системы Windows и платформы «1С:Предприятие». Проанализируем наиболее распространенные сценарии сбоев:
comcntr.dll в свое адресное пространство.comcntr.dll одной версии может конфликтовать со службами сервера 1С другой версии.Рассмотрим по шагам универсальное системное решение этих проблем с помощью настройки служб компонентов COM+ в Windows. Этот метод позволяет запустить библиотеку COM-соединения в изолированном процессе dllhost.exe, выступающем в роли моста между разной разрядностью и версиями систем.
dcomcnfg в строке запуска Windows).Службы компонентов -> Компьютеры -> Мой компьютер -> Приложения COM+.Создать -> Приложение. Откроется мастер установки приложений COM+.V83_COMConnector. В области «Способ активации» обязательно выберите переключатель «Серверное приложение» (это заставит библиотеку запускаться в выделенном процессе dllhost.exe). Нажмите «Далее».USR1CV8 или доменная учетная запись). Это критически важно для обеспечения прав доступа к временным папкам сервера. Завершите работу мастера.Компоненты. Нажмите Создать -> Компонент.comcntr.dll нужной вам версии платформы 1С. Обычно она располагается по пути вида: C:\Program Files\1cv8\8.3.XX.XXXX\bin\comcntr.dll (или в папке Program Files (x86) для 32-разрядной версии).Свойства). На вкладке Безопасность снимите флажок «Принудительная проверка доступа для приложений» и выберите уровень ограничений «Пакетный».Данная настройка гарантирует стабильную и бесперебойную работу COM-соединений между любыми конфигурациями 1С независимо от разрядности сервера приложений и версий используемых платформ.
---
В заключение проанализируем архитектурное развитие механизмов обмена данными в экосистеме «1С:Предприятие 8». Несмотря на то, что COM-соединение решает поставленную задачу, у него есть существенные недостатки: привязка к операционной системе Windows (серверы 1С на Linux не поддерживают COM) и потенциальные утечки памяти при некорректном закрытии сессий.
Если перед вами стоит задача долгосрочного развития ИТ-архитектуры предприятия, мы рекомендуем рассмотреть следующие альтернативные варианты интеграции «1С:Бухгалтерии» и «1С:Документооборота»:
DMService. Обращение к методам этого сервиса со стороны БП 3.0 происходит по стандартным протоколам HTTP/HTTPS. Это решение кроссплатформенно, работает на любой операционной системе и не зависит от версий платформы.Тем не менее, если проектные ограничения требуют работы исключительно через COM-соединение, предложенные в данной статье методы сериализации данных и системной настройки служб COM+ обеспечат стабильную, быструю и корректную интеграцию ваших прикладных решений.