Как передать файл и создать документ в 1С:Документообороте из 1С:Бухгалтерии через COM-соединение

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Интеграция между различными конфигурациями «1С:Предприятие 8» — одна из наиболее частых задач, с которыми сталкиваются разработчики. Несмотря на активное развитие веб-сервисов (HTTP и SOAP), технология COM-соединения остается востребованной благодаря высокой скорости работы при локальном размещении баз данных и отсутствию необходимости поднимать веб-сервер. В этой статье мы подробно разберем, как передать сформированный файл печатной формы (в формате XLS/XLSX) из базы-источника «1С:Бухгалтерия предприятия 3.0» в базу-приемник «1С:Документооборот 1.4/2.1/3.0», программно создать карточку исходящего документа, прикрепить к ней этот файл и запустить бизнес-процесс.

Мы рассмотрим технические нюансы взаимодействия через COM, разницу между OLE и COM-соединением, методы сериализации двоичных данных, а также способы решения проблем совместимости платформ разной разрядности.

---

Анализ технологий: COM-соединение против OLE-соединения

Прежде чем перейти к реализации обмена, проанализируем разницу между двумя ключевыми механизмами COM-интеграции в платформе «1С:Предприятие 8». Разработчики часто путают эти понятия, что приводит к некорректному расходу ресурсов сервера приложений.

  1. OLE-соединение (V83.Application). При создании этого объекта запускается полноценное клиентское приложение «1С:Предприятие» со всеми сопутствующими процессами. Инициализируется интерфейсная часть, загружаются настройки пользователя, отрабатывают модули управляемого приложения. Этот метод крайне ресурсоемкий. Его использование оправдано только в том случае, если вам необходимо показать пользователю интерфейс вызываемой базы (например, открыть форму документа непосредственно на экране).
  2. COM-соединение (V83.COMConnector). Этот объект устанавливает легкое внутрипроцессное соединение с базой данных. Он не запускает клиентское приложение и работает гораздо быстрее, потребляя минимум оперативной памяти сервера. Вся работа происходит в неинтерактивном режиме на стороне сервера. Для фоновых обменов и программной интеграции следует использовать именно этот вариант.

Частой ошибкой при переходе с OLE на COM является неверный вызов метода создания объектов в подчиненной базе. Разберем типичную ситуацию, когда разработчик пытается вызвать метод NewObject непосредственно у менеджера соединений:


// ОШИБОЧНЫЙ КОД
Коннектор = Новый COMОбъект("V83.COMConnector");
Запрос = Коннектор.NewObject("Запрос"); // Вызовет ошибку: "Метод объекта не обнаружен"

Выясним причину этой ошибки. Менеджер соединений V83.COMConnector предназначен только для установки связи. Сам по себе он не содержит методов работы с прикладными объектами базы данных. Чтобы получить доступ к метаданным и объектам подчиненной базы, мы сначала должны вызвать метод Connect, который вернет нам **объект соединения**:


// КОРРЕКТНЫЙ КОД
Коннектор = Новый COMОбъект("V83.COMConnector");
// ПараметрыПодключения — строка соединения с базой-приемником
Соединение = Коннектор.Connect(ПараметрыПодключения); 

// Теперь мы работаем через полученный объект соединения
Запрос = Соединение.NewObject("Запрос"); // Работает корректно!

---

Способ 1. Передача файла через сериализацию в Base64

Если базы данных работают в клиент-серверном режиме и физически могут находиться на разных серверах (или у сервера приложений источника нет прямого доступа к файловой системе сервера приемника), наиболее надежным и универсальным способом передачи файла является его сериализация в текстовую строку формата Base64.

Рассмотрим пошагово алгоритм реализации этого процесса:

  1. На стороне «1С:Бухгалтерии» формируем табличный документ (печатную форму).
  2. Сохраняем табличный документ во временный файл на диске сервера в формате XLS или XLSX.
  3. Считываем этот файл в объект ДвоичныеДанные.
  4. Кодируем двоичные данные в Base64-строку, которая может быть без проблем передана через COM-соединение в виде обычного текстового параметра.
  5. На стороне «1С:Документооборота» (через COM-вызов) принимаем строку Base64, преобразуем ее обратно в двоичные данные, сохраняем во временный файл и прикрепляем к документу.

Проанализируем программный код, реализующий этот алгоритм в модуле формы или в общем модуле «1С:Бухгалтерии»:


&НаСервере
Функция СформироватьИПолучитьСтрокуФайла(ДокументСсылка)
    
    // 1. Формируем табличный документ печатной формы
    ТабДок = СформироватьПечатнуюФорму(ДокументСсылка);
    
    // 2. Получаем имя временного файла на сервере БП
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
    ТабДок.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLSX);
    
    // 3. Считываем данные в объект ДвоичныеДанные
    ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ИмяВременногоФайла);
    
    // Удаляем временный файл с диска БП за ненадобностью
    Попытка
        УдалитьФайлы(ИмяВременногоФайла);
    Исключение
        ЗаписьЖурналаРегистрации("Обмен через COM", УровеньЖурналаРегистрации.Предупреждение, , , 
            "Не удалось удалить временный файл: " + ОписаниеОшибки());
    КонецПопытки;
    
    // 4. Кодируем двоичные данные в строку Base64
    СтрокаBase64 = ДвоичныеДанныеФайла.ПолучитьСтрокуBase64();
    
    Возврат СтрокаBase64;
    
КонецФункции

Теперь рассмотрим, как принять эти данные на стороне «1С:Документооборота» через COM-соединение, декодировать их и связать с новым объектом информационной базы.

---

Способ 2. Оптимальная передача файлов при размещении баз на одном сервере

Если обе базы данных (и «1С:Бухгалтерия», и «1С:Документооборот») развернуты на одном физическом сервере (или в рамках одной локальной сети с доступным общим сетевым ресурсом), передавать огромные строки Base64 через COM-соединение нецелесообразно. Это приводит к лишней нагрузке на процессоры серверов при кодировании/декодировании и перерасходу оперативной памяти.

В этой ситуации гораздо эффективнее использовать промежуточную директорию обмена на сервере. Схема работы будет выглядеть следующим образом:

  1. База-источник сохраняет файл на диск в общую сетевую папку или локальный каталог сервера (например, D:\ExchangeCOM\).
  2. Через COM-соединение передается только строковый путь к созданному файлу на диске.
  3. База-приемник в контексте COM-вызова считывает этот файл непосредственно с диска сервера, выполняет необходимые привязки, после чего временный файл удаляется.

Этот подход гарантирует максимальную производительность обмена даже при передаче тяжелых сканов документов или архивов.

---

Программное создание карточки документа и прикрепление файла в «1С:Документообороте»

Перейдем к самой ответственной части — написанию кода, управляющего интеграцией. Нам необходимо программно подключиться к базе «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С:Предприятие». Проанализируем наиболее распространенные сценарии сбоев:

Рассмотрим по шагам универсальное системное решение этих проблем с помощью настройки служб компонентов COM+ в Windows. Этот метод позволяет запустить библиотеку COM-соединения в изолированном процессе dllhost.exe, выступающем в роли моста между разной разрядностью и версиями систем.

  1. Откройте утилиту администрирования «Службы компонентов» (выполните команду dcomcnfg в строке запуска Windows).
  2. Перейдите по дереву: Службы компонентов -> Компьютеры -> Мой компьютер -> Приложения COM+.
  3. В контекстном меню папки «Приложения COM+» выберите пункт Создать -> Приложение. Откроется мастер установки приложений COM+.
  4. Нажмите кнопку «Далее», выберите «Создать новое приложение».
  5. Введите понятное имя для приложения, например, V83_COMConnector. В области «Способ активации» обязательно выберите переключатель «Серверное приложение» (это заставит библиотеку запускаться в выделенном процессе dllhost.exe). Нажмите «Далее».
  6. На шаге выбора учетной записи выберите «Указанный пользователь» и введите данные системной учетной записи Windows, под которой запускается служба сервера приложений «1С:Предприятие» (обычно это локальный пользователь USR1CV8 или доменная учетная запись). Это критически важно для обеспечения прав доступа к временным папкам сервера. Завершите работу мастера.
  7. Внутри созданного приложения перейдите к ветке Компоненты. Нажмите Создать -> Компонент.
  8. Выберите пункт «Установка новых компонентов» и укажите путь к файлу библиотеки comcntr.dll нужной вам версии платформы 1С. Обычно она располагается по пути вида: C:\Program Files\1cv8\8.3.XX.XXXX\bin\comcntr.dll (или в папке Program Files (x86) для 32-разрядной версии).
  9. После успешного добавления компонента откройте свойства созданного приложения COM+ (клик правой кнопкой мыши по имени приложения -> Свойства). На вкладке Безопасность снимите флажок «Принудительная проверка доступа для приложений» и выберите уровень ограничений «Пакетный».

Данная настройка гарантирует стабильную и бесперебойную работу COM-соединений между любыми конфигурациями 1С независимо от разрядности сервера приложений и версий используемых платформ.

---

Современные альтернативы технологии COM

В заключение проанализируем архитектурное развитие механизмов обмена данными в экосистеме «1С:Предприятие 8». Несмотря на то, что COM-соединение решает поставленную задачу, у него есть существенные недостатки: привязка к операционной системе Windows (серверы 1С на Linux не поддерживают COM) и потенциальные утечки памяти при некорректном закрытии сессий.

Если перед вами стоит задача долгосрочного развития ИТ-архитектуры предприятия, мы рекомендуем рассмотреть следующие альтернативные варианты интеграции «1С:Бухгалтерии» и «1С:Документооборота»:

  1. Библиотека интеграции с Документооборотом (БИД). Это готовое решение от компании «1С», встраиваемое в конфигурацию «1С:Бухгалтерия». БИД позволяет пользователям работать с файлами и задачами «1С:Документооборота» прямо из интерфейса бухгалтерии в режиме "одного окна" без настройки сложных COM-подключений.
  2. Веб-сервисы интеграции (SOAP / REST API). «1С:Документооборот» содержит мощный встроенный веб-сервис DMService. Обращение к методам этого сервиса со стороны БП 3.0 происходит по стандартным протоколам HTTP/HTTPS. Это решение кроссплатформенно, работает на любой операционной системе и не зависит от версий платформы.

Тем не менее, если проектные ограничения требуют работы исключительно через COM-соединение, предложенные в данной статье методы сериализации данных и системной настройки служб COM+ обеспечат стабильную, быструю и корректную интеграцию ваших прикладных решений.

← На главную