В процессе разработки в среде «1С:Предприятие» часто возникает задача автоматической выгрузки отчетов, печатных форм или счетов в формат Excel. На первый взгляд задача кажется простой — достаточно вызвать один метод, но на практике программисты сталкиваются с нюансами: от ошибок доступа к файловой системе до некорректных имен файлов. В этой статье мы подробно разберем, как правильно реализовать сохранение табличного документа, обеспечив стабильную работу кода.
Для сохранения объекта типа ТабличныйДокумент в платформе предусмотрен стандартный метод Записать(). Рассмотрим простейший пример, который часто используют начинающие разработчики:
ТабДокумент = Новый ТабличныйДокумент;
// Здесь происходит формирование документа (заполнение областей)
ТабДокумент.Записать("мойфайл.xls", ТипФайлаТабличногоДокумента.XLS);
Важное замечание: если указать только имя файла без полного пути, система попытается сохранить его в рабочую директорию по умолчанию, что часто приводит к ошибкам прав доступа или потере файла. Поэтому первым правилом качественного кода является использование абсолютных путей.
Для того чтобы гарантированно иметь права на создание файла, лучше всего использовать временные каталоги системы или документы пользователя. Разберем, как сохранить файл во временную папку:
ИмяФайла = "Отчет_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd") + ".xlsx";
ПолныйПуть = КаталогВременныхФайлов() + ИмяФайла;
ТабДокумент = Новый ТабличныйДокумент;
// Код формирования...
ТабДокумент.Записать(ПолныйПуть, ТипФайлаТабличногоДокумента.XLSX);
Обратите внимание на использование перечисления ТипФайлаТабличногоДокумента.XLSX. Мы рекомендуем использовать современный формат XLSX вместо устаревшего XLS. Формат XLSX поддерживает более 65 тысяч строк, лучше сохраняет стили оформления и занимает меньше места на диске.
Если задача требует, чтобы пользователь сам выбрал, куда сохранить документ, мы должны использовать объект ДиалогВыбораФайла. Проанализируем пример кода, который позволяет выбрать папку для сохранения группы документов (например, при массовой печати счетов):
Режим = РежимДиалогаВыбораФайла.ВыборКаталога;
ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытия.Заголовок = "Выберите каталог для сохранения счетов";
Если ДиалогОткрытия.Выбрать() Тогда
ПутьККаталогу = ДиалогОткрытия.Каталог;
Для Каждого Стр из СозданныеДокументы Цикл
// Допустим, мы получаем объект и формируем печатную форму
ТекТабДокумент = СформироватьПечатнуюФорму(Стр.Ссылка);
// Формируем имя файла на основании данных документа
ИмяФайла = Строка(Стр.Ссылка.Номер) + "_" + Строка(Стр.Ссылка.Контрагент.Наименование) + ".xlsx";
ПолныйПуть = ПутьККаталогу + "\" + ИмяФайла;
ТекТабДокумент.Записать(ПолныйПуть, ТипФайлаТабличногоДокумента.XLSX);
КонецЦикла;
КонецЕсли;
Одной из самых частых причин возникновения ошибки «Ошибка доступа к файлу» или «Неверный путь» является наличие спецсимволов в названии документа или контрагента, которые мы включаем в имя файла. В операционной системе Windows запрещено использование символов / \ : * ? " < > |.
Рассмотрим функцию, которая поможет нам «очистить» строку перед формированием пути:
Функция ОчиститьИмяФайла(ИсходноеИмя)
ЗапрещенныеСимволы = "/\:*?""<>|";
Результат = ИсходноеИмя;
Для Индекс = 1 По СтрДлина(ЗапрещенныеСимволы) Цикл
Символ = Сред(ЗапрещенныеСимволы, Индекс, 1);
Результат = СтрЗаменить(Результат, Символ, "_");
КонецЦикла;
Возврат Результат;
КонецФункции
Используя эту функцию, мы застрахуем наш код от падения, если в наименовании контрагента встретятся кавычки (например, ООО "Ромашка") или слеши.
Выясним важную деталь: если ваш код выполняется в серверном модуле (например, в регламентном задании), использование ДиалогВыбораФайла невозможно, так как сервер «не видит» экран пользователя. В таких случаях алгоритм должен быть следующим:
ПолучитьИмяВременногоФайла("xlsx").ПоместитьВоВременноеХранилище().ПолучитьФайл(), чтобы браузер или тонкий клиент предложили пользователю сохранить результат.Чтобы итоговый Excel-файл выглядел профессионально, проанализируем настройки самого объекта ТабличныйДокумент перед вызовом записи:
1. Автомасштаб. Если вы хотите, чтобы при печати из Excel документ автоматически вписывался в ширину страницы, установите свойство: ТабДокумент.АвтоМасштаб = Истина;.
2. Ориентация страницы. Можно задать ландшафтную или портретную ориентацию: ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;.
3. Имя листа. По умолчанию имя листа в Excel будет совпадать с именем файла. Если требуется более тонкая настройка имен листов при объединении файлов, может потребоваться использование COM-объектов, но для простых задач достаточно стандартного метода Записать().
4. Область печати. Чтобы в Excel не попадали пустые области за пределами ваших данных, явно укажите область печати: ТабДокумент.ОбластьПечати = ТабДокумент.Область(1, 1, ПоследняяСтрока, ПоследняяКолонка);.
Мы рассмотрели основной механизм сохранения табличных документов в формат Excel. Главные правила успеха: всегда использовать полный путь к файлу, очищать имена файлов от запрещенных символов и выбирать современный формат XLSX. Применение этих подходов позволит вам создавать надежные механизмы выгрузки данных, которые будут корректно работать у всех пользователей системы.