При интеграции систем 1С часто возникает задача: подключиться к внешней информационной базе через COM-соединение, найти или создать нужный документ, сформировать его стандартную печатную форму и сохранить результат в файл формата Excel (XLS или XLSX). На практике разработчики сталкиваются с рядом ошибок — от проблем с типами данных и индексацией коллекций через COM до дублирования вызовов процедур печати. Разберем по шагам, как правильно реализовать этот механизм и избежать типичных подводных камней.
Проанализируем основные причины, из-за которых код формирования печатных форм через внешнее подключение падает с ошибками или сохраняет пустой/некорректный файл:
0000-000006 без строковых кавычек, платформа 1С интерпретирует это как операцию вычитания (результат -6). Поиск не находит документ, возвращается пустая ссылка, и печатная форма формируется пустой или некорректной. Номер документа всегда должен передаваться в виде строки: "0000-000006".ТаблицаЗначений или КоллекцияПечатныхФорм) обращение через квадратные скобки вида Коллекция[0] во внешнем COM-соединении не поддерживается и вызывает исключение «получение элемента по индексу не определено». Через COM необходимо использовать метод Получить(0) или выполнять обход циклом Для Каждого.УправлениеПечатью.СформироватьПечатныеФормы(...) уже выполняет полный цикл подготовки макета и вызывает процедуру печати менеджера объекта. Повторный ручной вызов метода Печать поверх полученной структуры является избыточным и может нарушить структуру данных.Базка.ТипФайлаТабличногоДокумента.XLSX), иначе в контексте текущей базы значение перечисления будет неопределено.Рассмотрим правильную реализацию задачи. Сначала мы инициализируем COM-соединение, находим документ, подготавливаем параметры для механизма печати БСП, получаем сформированный ТабличныйДокумент и сохраняем его на диск.
КаталогБазы = Объект.ПутьКБазе;
Попытка
Соединитель = Новый COMОбъект("v83.ComConnector");
Базка = Соединитель.Connect("File=""" + КаталогБазы + """;");
Сообщить("Подключение к базе успешно установлено.");
Исключение
Сообщить("Ошибка подключения: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// 1. Поиск документа по строковому номеру
НомерДокумента = "0000-000006";
СсылкаНаДокумент = Базка.Документы.СчетНаОплатуПокупателю.НайтиПоНомеру(НомерДокумента);
Если Не Базка.ЗначениеЗаполнено(СсылкаНаДокумент) Тогда
Сообщить("Документ с номером " + НомерДокумента + " не найден!");
Возврат;
КонецЕсли;
// 2. Формирование массива объектов для печати в контексте COM
МассивОбъектов = Базка.NewObject("Массив");
МассивОбъектов.Добавить(СсылкаНаДокумент);
// 3. Подготовка параметров печати
ПараметрыПечати = Базка.NewObject("Структура");
ПараметрыПечати.Вставить("ДополнитьКомплектВнешнимиПечатнымиФормами", Ложь);
// 4. Формирование печатных форм через БСП
РезультатПечати = Базка.УправлениеПечатью.СформироватьПечатныеФормы(
"Документ.СчетНаОплатуПокупателю",
"СчетЗаказ",
МассивОбъектов,
ПараметрыПечати,
Неопределено
);
// 5. Извлечение табличного документа из коллекции
Если РезультатПечати.КоллекцияПечатныхФорм.Количество() > 0 Тогда
СтрокаПФ = РезультатПечати.КоллекцияПечатныхФорм.Получить(0);
ТабДок = СтрокаПФ.ТабличныйДокумент;
// 6. Сохранение табличного документа в файл
ПутьКФайлу = "C:\Temp\СчетНаОплату_" + НомерДокумента + ".xlsx";
ТабДок.Записать(ПутьКФайлу, Базка.ТипФайлаТабличногоДокумента.XLSX);
Сообщить("Файл успешно сохранен: " + ПутьКФайлу);
Иначе
Сообщить("Печатная форма не была сформирована.");
КонецЕсли;
Разберем дополнительные нюансы, которые влияют на стабильность работы данного решения:
XLS имеет жесткие ограничения старых версий Excel (не более 256 колонок и 65 536 строк, ограниченная цветовая палитра). Это нередко приводит к искажению сложных макетов при выгрузке. Использование Базка.ТипФайлаТабличногоДокумента.XLSX гарантирует корректную передачу стилей, ширины колонок и разметки.ДвоичныеДанные или сохраняет его по переданному пути.comcntr.dll) и платформозависимо (не работает в Linux-окружении без эмуляторов). Создание простого HTTP-сервиса на стороне 1С, отдающего печатную форму в формате PDF или XLSX по REST-запросу, является более современным и отказоустойчивым стандартом взаимодействия.