Как сформировать и сохранить печатную форму документа в Excel через COM-соединение в 1С

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

При интеграции систем 1С часто возникает задача: подключиться к внешней информационной базе через COM-соединение, найти или создать нужный документ, сформировать его стандартную печатную форму и сохранить результат в файл формата Excel (XLS или XLSX). На практике разработчики сталкиваются с рядом ошибок — от проблем с типами данных и индексацией коллекций через COM до дублирования вызовов процедур печати. Разберем по шагам, как правильно реализовать этот механизм и избежать типичных подводных камней.

Типичные ошибки при работе с печатными формами через COM

Проанализируем основные причины, из-за которых код формирования печатных форм через внешнее подключение падает с ошибками или сохраняет пустой/некорректный файл:

  1. Передача номера документа числовым выражением: если при вызове поиска передать номер вида 0000-000006 без строковых кавычек, платформа 1С интерпретирует это как операцию вычитания (результат -6). Поиск не находит документ, возвращается пустая ссылка, и печатная форма формируется пустой или некорректной. Номер документа всегда должен передаваться в виде строки: "0000-000006".
  2. Прямое обращение по индексу в квадратных скобках: для коллекций (например, ТаблицаЗначений или КоллекцияПечатныхФорм) обращение через квадратные скобки вида Коллекция[0] во внешнем COM-соединении не поддерживается и вызывает исключение «получение элемента по индексу не определено». Через COM необходимо использовать метод Получить(0) или выполнять обход циклом Для Каждого.
  3. Дублирование вызова печати: функция подсистемы БСП УправлениеПечатью.СформироватьПечатныеФормы(...) уже выполняет полный цикл подготовки макета и вызывает процедуру печати менеджера объекта. Повторный ручной вызов метода Печать поверх полученной структуры является избыточным и может нарушить структуру данных.
  4. Область видимости системных перечислений: обращение к системным перечислениям платформы должно производиться через объект внешнего подключения (например, Базка.ТипФайлаТабличногоДокумента.XLSX), иначе в контексте текущей базы значение перечисления будет неопределено.

Пошаговый алгоритм и пример рабочего кода

Рассмотрим правильную реализацию задачи. Сначала мы инициализируем COM-соединение, находим документ, подготавливаем параметры для механизма печати БСП, получаем сформированный ТабличныйДокумент и сохраняем его на диск.


КаталогБазы = Объект.ПутьКБазе;
Попытка
    Соединитель = Новый COMОбъект("v83.ComConnector");
    Базка = Соединитель.Connect("File=""" + КаталогБазы + """;");
    Сообщить("Подключение к базе успешно установлено.");
Исключение
    Сообщить("Ошибка подключения: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

// 1. Поиск документа по строковому номеру
НомерДокумента = "0000-000006";
СсылкаНаДокумент = Базка.Документы.СчетНаОплатуПокупателю.НайтиПоНомеру(НомерДокумента);

Если Не Базка.ЗначениеЗаполнено(СсылкаНаДокумент) Тогда
    Сообщить("Документ с номером " + НомерДокумента + " не найден!");
    Возврат;
КонецЕсли;

// 2. Формирование массива объектов для печати в контексте COM
МассивОбъектов = Базка.NewObject("Массив");
МассивОбъектов.Добавить(СсылкаНаДокумент);

// 3. Подготовка параметров печати
ПараметрыПечати = Базка.NewObject("Структура");
ПараметрыПечати.Вставить("ДополнитьКомплектВнешнимиПечатнымиФормами", Ложь);

// 4. Формирование печатных форм через БСП
РезультатПечати = Базка.УправлениеПечатью.СформироватьПечатныеФормы(
    "Документ.СчетНаОплатуПокупателю",
    "СчетЗаказ",
    МассивОбъектов,
    ПараметрыПечати,
    Неопределено
);

// 5. Извлечение табличного документа из коллекции
Если РезультатПечати.КоллекцияПечатныхФорм.Количество() > 0 Тогда
    СтрокаПФ = РезультатПечати.КоллекцияПечатныхФорм.Получить(0);
    ТабДок = СтрокаПФ.ТабличныйДокумент;
    
    // 6. Сохранение табличного документа в файл
    ПутьКФайлу = "C:\Temp\СчетНаОплату_" + НомерДокумента + ".xlsx";
    ТабДок.Записать(ПутьКФайлу, Базка.ТипФайлаТабличногоДокумента.XLSX);
    Сообщить("Файл успешно сохранен: " + ПутьКФайлу);
Иначе
    Сообщить("Печатная форма не была сформирована.");
КонецЕсли;

Рекомендации по выбору формата и архитектуре интеграции

Разберем дополнительные нюансы, которые влияют на стабильность работы данного решения:

  1. Выбор формата XLSX вместо устаревшего XLS: формат XLS имеет жесткие ограничения старых версий Excel (не более 256 колонок и 65 536 строк, ограниченная цветовая палитра). Это нередко приводит к искажению сложных макетов при выгрузке. Использование Базка.ТипФайлаТабличногоДокумента.XLSX гарантирует корректную передачу стилей, ширины колонок и разметки.
  2. Вынос логики в общий модуль базы-приемника: для снижения нагрузки и исключения проблем с маршалингом сложных объектов через COM рекомендуется создать в целевой базе функцию в общем модуле (с флагами «Сервер» и «Внешнее соединение»). Такая функция принимает ссылку на документ и сразу возвращает сформированный файл в виде ДвоичныеДанные или сохраняет его по переданному пути.
  3. Альтернатива в виде HTTP-сервисов: COM-соединение чувствительно к разрядности платформы (32-бит и 64-бит библиотеки comcntr.dll) и платформозависимо (не работает в Linux-окружении без эмуляторов). Создание простого HTTP-сервиса на стороне 1С, отдающего печатную форму в формате PDF или XLSX по REST-запросу, является более современным и отказоустойчивым стандартом взаимодействия.
← На главную