При разработке внешних печатных форм в среде 1С:ERP или других конфигурациях на базе БСП (Библиотеки стандартных подсистем), разработчики часто сталкиваются с ошибкой при попытке записи файла в формате Excel на серверной стороне. Давайте разберемся, почему использование COM-объект("Excel.Application") приводит к сбоям и как правильно организовать процесс вывода данных.
Основная причина заключается в архитектуре платформы 1С. Когда вы пишете Новый COMОбъект("Excel.Application"), сервер 1С пытается запустить полноценное приложение Microsoft Excel. Однако серверные процессы (агент сервера) работают в фоновом режиме, часто под системной учетной записью, которая:
Excel.exe.Следовательно, использование COM допустимо только на клиенте, где у пользователя установлена соответствующая программа.
Чтобы избежать ошибок, необходимо следовать стандартам БСП. Ваша логика должна быть разделена на два этапа: формирование данных на сервере и сохранение/обработка файла на клиенте.
Для корректной работы внешней печатной формы в БСП необходимо правильно заполнить функцию СведенияОВнешнейОбработке. Важно указать параметр ВызовСерверногоМетода, который позволит системе правильно инициировать процесс печати.
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
МассивНазначений = Новый Массив;
МассивНазначений.Добавить("Документ.ЗаказКлиента");
ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
// ... прочие параметры регистрации
ДобавитьКоманду(ТаблицаКоманд, "Печать в Excel", "ИмяКоманды", "ВызовСерверногоМетода", Истина, "ПечатьMXL");
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Серверная процедура должна возвращать только объект ТабличныйДокумент. Не пытайтесь здесь выполнять сохранение или манипуляции через Excel. Сервер — это фабрика данных, а не средство визуализации.
Функция ПечатьДокумента(МассивОбъектов, ОбъектыПечати) Экспорт
ТабДок = Новый ТабличныйДокумент;
// ... здесь формируем отчет
Возврат ТабДок;
КонецФункции
Когда ТабличныйДокумент получен на клиенте, именно там вы можете применить методы сохранения. Если вам критически важно форматирование, которое не поддерживает нативный метод Записать, именно на клиенте вы создаете COMОбъект.
Для сохранения файла используйте следующую структуру:
&НаКлиенте
Процедура Печать(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
// Получаем табличный документ с сервера
ТабДок = ПолучитьТабличныйДокументНаСервере(ОбъектыНазначенияМассив);
// Сохраняем файл на клиенте
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Если Диалог.Выбрать() Тогда
ТабДок.Записать(Диалог.ПолноеИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
КонецЕсли;
КонецПроцедуры
Если после формирования файла вам нужно защитить лист от правок, вы можете сделать это программно через COM, но помните — это работает только на клиенте. После открытия книги через Workbooks.Open(Путь) используйте свойства объекта Sheet:
Алгоритм защиты:
Лист.Range("A1:B10").Locked = False.Лист.Protect("Пароль").Обратите внимание: для сложных задач рекомендуем рассматривать библиотеки для работы с XLSX напрямую через XML-структуру. Это позволит вам работать с файлами на сервере без установки Excel, что значительно ускорит процесс и повысит стабильность вашей системы.
Подводя итог, проанализируем ситуацию: перенос сохранения на клиент и использование стандартных функций ТабличныйДокумент — это самый надежный путь решения, который соответствует архитектуре 1С:Предприятия.