При выгрузке отчетов, печатных форм или табличных частей из 1С в формат Excel разработчики часто сталкиваются с забавным, но назойливым нюансом. Файл успешно создается, данные в него записываются, но в проводнике Windows при наведении курсора или в колонке «Тип» операционная система упорно пишет «Лист Microsoft Excel» вместо ожидаемого «Книга Microsoft Excel». Попытки изменить код сохранения, поиски в настройках VBA и даже ручное пересохранение файла часто не приносят желаемого результата.
В этой статье мы подробно разберем технические причины такого поведения операционной системы Windows, выясним, почему так происходит, и рассмотрим два практических способа решения этой проблемы: классический (через COM-объект) и современный (штатными средствами платформы 1С:Предприятие без использования стороннего софта).
Для начала давайте разберемся с физикой процесса. Поведение операционной системы при отображении подсказок и типов файлов в проводнике никак не связано с тем, насколько правильно написан ваш код в 1С. Все дело в том, как Windows работает с ассоциациями файлов и реестром.
Когда вы наводите курсор на файл, проводник обращается к системному реестру по ветке HKEY_CLASSES_ROOT, чтобы определить дружественное имя типа файла (ProgID) на основе его расширения:
Excel.Sheet.8. В русскоязычной локализации пакета Microsoft Office для этого класса жестко зашито текстовое описание «Лист Microsoft Excel 97-2003» (или просто «Лист Microsoft Excel»). Именно поэтому любой файл с расширением .xls, как бы вы его ни создавали, операционная система всегда будет называть «Листом».Excel.Sheet.12. Для него в реестре Windows задано описание «Книга Microsoft Excel».Таким образом, единственным способом заставить операционную систему отображать тип файла как «Книга» является использование современного расширения .xlsx вместо устаревшего .xls.
Однако просто изменить три буквы в имени файла при сохранении недостаточно. Если вы попытаетесь сохранить файл как .xlsx, не изменив внутренний формат сохранения в самом Excel, файл либо запишется с ошибкой, либо окажется поврежденным. Давайте рассмотрим, как сделать это правильно.
Если в вашей конфигурации уже написан и отлажен механизм выгрузки через COM-соединение, и вы хотите точечно исправить только формат сохранения, нам потребуется обратиться к методу SaveAs объекта Workbook (Книга).
При вызове метода SaveAs критически важно передавать второй параметр — числовой код формата файла (XlFileFormat). Если этого не сделать, Excel попытается сохранить файл в формате по умолчанию (которым для старых версий или определенных настроек может оставаться тот самый .xls), независимо от того, какое расширение вы написали в строке пути.
Рассмотрим основные коды форматов Excel:
.xls (Книга Excel 97-2003). При его использовании файл в системе всегда будет отображаться как «Лист»..xlsx без поддержки макросов. Именно этот код нам нужен, чтобы файл распознавался операционной системой как «Книга»..xlsm (книга с поддержкой макросов VBA).Давайте проанализируем пример кода на языке 1С, который решает эту задачу через COM-соединение:
// Определяем пути и имена файлов
ПутьККаталогу = "C:\Выгрузка";
ИмяФайла = "Накладная_" + НомерДокумента + ".xlsx"; // Указываем правильное расширение
ПолныйПуть = ПутьККаталогу + "\" + ИмяФайла;
// Создаем COM-объект для работы с Excel
Попытка
ExcelApp = Новый COMObject("Excel.Application");
Исключение
Сообщить("Не удалось запустить Excel. Возможно, программа не установлена на компьютере.", СтатусСообщения.Важное);
Возврат;
КонецПопытки;
// Отключаем предупреждения и визуальное отображение для ускорения работы
ExcelApp.Visible = Ложь;
ExcelApp.DisplayAlerts = Ложь;
// Добавляем новую книгу
НоваяКнига = ExcelApp.Workbooks.Add();
НовыйЛист = НоваяКнига.ActiveSheet;
// ... Здесь происходит заполнение листа данными (ячейка за ячейкой) ...
НовыйЛист.Cells(1, 1).Value = "Номер документа";
НовыйЛист.Cells(1, 2).Value = "Сумма";
// Сохраняем файл с явным указанием формата 51 (xlOpenXMLWorkbook)
Попытка
НоваяКнига.SaveAs(ПолныйПуть, 51);
Сообщить("Файл успешно сохранен как Книга Excel!");
Исключение
Сообщить("Ошибка при сохранении файла: " + ОписаниеОшибки(), СтатусСообщения.Важное);
КонецПопытки;
// Обязательно закрываем книгу и освобождаем ресурсы в памяти!
НоваяКнига.Close(Ложь);
ExcelApp.Quit();
ExcelApp = Неопределено;
При использовании этого кода файл будет создан в полноценном формате OpenXML, и операционная система Windows сразу же определит его тип как «Книга Microsoft Excel».
Хотя первый способ полностью решает проблему, использование COM-соединения (COMObject("Excel.Application")) в современной разработке на платформе 1С:Предприятие 8 считается устаревшим и нерекомендуемым подходом. Проанализируем, почему это так:
EXCEL.EXE остается «висеть» в оперативной памяти сервера или рабочей станции, что со временем приводит к утечкам ресурсов.Платформа 1С предлагает великолепную альтернативу — прямую запись табличных документов в формат .xlsx. Этот метод работает на уровне платформы, не требует наличия установленного Excel и функционирует на любых операционных системах (включая Linux).
Давайте разберем по шагам, как переписать выгрузку данных с использованием объекта ТабличныйДокумент:
// Создаем объект ТабличныйДокумент
ТабДок = Новый ТабличныйДокумент;
// Макет или ручное заполнение областей табличного документа
// Для примера создадим простую строку заголовков и выгрузим данные
ТекущаяСтрока = 1;
// Заполняем шапку
ОбластьШапка = ТабДок.Область(ТекущаяСтрока, 1, ТекущаяСтрока, 2);
ТабДок.Область(ТекущаяСтрока, 1).Текст = "Номер документа";
ТабДок.Область(ТекущаяСтрока, 2).Текст = "Дата";
// Зададим оформление
ОбластьШапка.Шрифт = Новый Шрифт(ТабДок.Область(ТекущаяСтрока, 1).Шрифт, , , Истина); // Жирный
// Заполняем строки данными из нашей выборки или табличной части
Для Каждого СтрокаДанных Из ТекСтрока.ТабличнаяЧасть Цикл
ТекущаяСтрока = ТекущаяСтрока + 1;
ТабДок.Область(ТекущаяСтрока, 1).Текст = СтрокаДанных.Номер;
ТабДок.Область(ТекущаяСтрока, 2).Текст = Формат(СтрокаДанных.Дата, "ДФ=yyyy-MM-dd");
КонецЦикла;
// Формируем путь для сохранения файла в формате XLSX
ПутьККаталогу = "C:\Выгрузка";
ИмяФайла = "ПН-" + ТекСтрока.Ссылка.Номер + "-" + Формат(ТекСтрока.Ссылка.Дата, "ДФ=yyyy-MM-dd") + ".xlsx";
ПолныйПуть = ПутьККаталогу + "\" + ИмяФайла;
// Сохраняем табличный документ напрямую в формат XLSX
Попытка
ТабДок.Записать(ПолныйПуть, ТипФайлаТабличногоДокумента.XLSX);
ПоказатьПредупреждение(, "Файл успешно сохранен как Книга Excel!");
Исключение
Сообщить("Не удалось записать файл. Причина: " + ОписаниеОшибки(), СтатусСообщения.Важное);
КонецПопытки;
Этот способ не только решает проблему с визуальным типом файла в проводнике Windows, но и выполняется в десятки раз быстрее, чем выгрузка через COM-соединение, гарантируя стабильную работу системы без зависших процессов в диспетчере задач.
Помимо эстетической стороны вопроса (отображения слова «Книга» вместо «Лист»), выбор формата сохранения критически влияет на стабильность работы ваших бизнес-процессов. Давайте сравним ограничения устаревшего формата .xls и современного .xlsx:
.xls (код формата 56) физически не может содержать более 65 536 строк на одном листе. Если из 1С попытаются выгрузить крупный отчет или массив данных, превышающий этот лимит, система выдаст ошибку записи, либо данные будут безвозвратно обрезаны. Формат .xlsx (код формата 51) поддерживает до 1 048 576 строк на одном листе..xls вы ограничены 256 колонками, в то время как .xlsx позволяет выгружать до 16 384 колонок.Поэтому переход на современный формат — это не просто погоня за красивым описанием во всплывающей подсказке Windows, но и насущная необходимость при работе с большими объемами данных.
Мы выяснили, что надпись «Лист Microsoft Excel» во всплывающей подсказке — это стандартное поведение операционной системы Windows для устаревшего расширения .xls, прописанное в системном реестре.
Для того чтобы файлы отображались как «Книга», переводите выгрузки на современный формат .xlsx. Сделать это можно как через классический COM-объект, передав во второй параметр метода SaveAs код формата 51, так и (что гораздо предпочтительнее) с помощью встроенного метода 1С ТабличныйДокумент.Записать() с указанием типа файла ТипФайлаТабличногоДокумента.XLSX.