Разработка и Конфигурация · 11 мин
Как установить формат ячейки Excel в 1С
Способы задать формат ячейки Excel в 1С: через табличный документ, COM-объект Excel и при загрузке данных. Примеры кода, ошибки и проверка результата.
Задача установить формат ячейки Excel возникает в 1С в двух типовых сценариях: когда из конфигурации выгружаются данные в файл Excel и нужно, чтобы числа, даты и текст отображались корректно, и когда данные, наоборот, загружаются из Excel и их нужно правильно интерпретировать. В обоих случаях работа ведётся либо через встроенный объект ТабличныйДокумент, либо напрямую через COM-объект Excel.Application.
Выбор способа зависит от условий. Табличный документ проще, не требует установленного Excel на компьютере или сервере, но его возможности по форматированию ограничены возможностями самого табличного документа 1С. COM-подключение даёт полный доступ к форматам Excel (NumberFormat, условное форматирование, типы данных), однако требует установленного Microsoft Excel и работает медленнее на больших объёмах.
Ниже разобраны оба подхода с примерами кода, типичными ошибками и способами проверки результата. Примеры написаны на встроенном языке 1С и подходят для управляемых и обычных форм.
Какие способы задания формата существуют и когда какой выбирать
Первый способ — формирование ТабличногоДокумента с последующим сохранением его в формате XLSX или XLS методом Записать(). У области табличного документа есть свойство Формат, которое принимает строку формата 1С (например, ЧДЦ=2 для чисел или ДФ=dd.MM.yyyy для дат). При сохранении платформа конвертирует формат в ближайший аналог Excel.
Второй способ — прямое управление Excel через COM: создаётся объект Excel.Application, открывается книга, и для нужных ячеек задаётся свойство NumberFormat со строкой формата в нотации Excel (например, "0.00", "DD.MM.YYYY", "@" для текста). Этот способ даёт точный контроль, но требует установленного Excel и прав на запуск COM-сервера.
Третий, частный случай — установка формата при чтении файла Excel: здесь формат не задаётся, а учитывается, потому что от него зависит, как 1С интерпретирует значение ячейки (число, дату или строку).
Сравнение вариантов
Подходит для сервера и тонкого клиента, Excel не нужен. Ограничение: только те форматы, которые умеет конвертировать платформа.
Полный контроль над форматами, условным форматированием, шириной столбцов. Ограничение: нужен установленный Excel, медленно на больших таблицах, риск зависших процессов.
Формат не задаётся, а анализируется. Подходит для загрузки прайсов и выгрузок из сторонних систем.
Установка формата через табличный документ
Табличный документ — основной инструмент выгрузки в Excel в типовых и самописных конфигурациях. Формат задаётся для области ячеек до записи значений или после, порядок не критичен, но область должна существовать.
Пример: выводится отчёт, в котором колонка суммы должна отображаться с двумя знаками после запятой, а колонка даты — в формате «дд.мм.гггг».
ТабДок = Новый ТабличныйДокумент;
// Заголовки
ТабДок.Область("R1C1").Текст = "Дата";
ТабДок.Область("R1C2").Текст = "Сумма";
// Данные
ТабДок.Область("R2C1").Текст = Формат(ТекущаяДатаСеанса(), "ДЛФ=D");
ТабДок.Область("R2C2").Текст = 1234.5;
// Форматы областей
ТабДок.Область("R2C1").Формат = "ДФ=dd.MM.yyyy";
ТабДок.Область("R2C2").Формат = "ЧДЦ=2; ЧРД=.";
ТабДок.Записать("C:\Temp\Выгрузка.xlsx", ТипФайлаТабличногоДокумента.XLSX);
Чтобы число попало в Excel именно как число, а не как текст, в ячейку нужно записывать значение числового типа, а не строку. Если присвоить свойству Текст строку "1234,5", Excel воспримет её как текст, и формат числа не сработает. Для числовых значений корректнее использовать свойство области через ТабДок.Область(...).Текст с числом — платформа сама сериализует значение.
Строка формата строится по правилам функции Формат() встроенного языка: ЧЦ — общая длина, ЧДЦ — число десятичных знаков, ЧРД — разделитель дробной части, ЧН — представление нуля, ДФ — формат даты. Платформа при записи в XLSX подбирает ближайший формат Excel, поэтому экзотические конструкции могут быть преобразованы с потерями.
- 1Создайте объект ТабличныйДокумент и заполните данными, записывая числа как числа, а не как строки
- 2Задайте свойство Формат для нужных областей в синтаксисе функции Формат() 1С
- 3Сохраните документ методом Записать с типом XLSX или XLS
- 4Откройте файл в Excel и проверьте формат ячеек через Ctrl+1
Установка формата через COM-объект Excel
Когда нужен точный формат Excel — например, денежный с символом валюты, процентный или текстовый для кодов с ведущими нулями — используется прямое подключение к Excel. Свойство ячейки называется NumberFormat и принимает строку формата в нотации Excel.
Попытка
Excel = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Excel не установлен: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Excel.Visible = Ложь;
Excel.DisplayAlerts = Ложь;
Книга = Excel.Workbooks.Add();
Лист = Книга.Sheets(1);
// Текстовый формат для кода с ведущими нулями
Лист.Cells(1, 1).NumberFormat = "@";
Лист.Cells(1, 1).Value = "00123";
// Число с двумя знаками и разделителем тысяч
Лист.Cells(2, 1).NumberFormat = "#,##0.00";
Лист.Cells(2, 1).Value = 1234567.89;
// Дата
Лист.Cells(3, 1).NumberFormat = "DD.MM.YYYY";
Лист.Cells(3, 1).Value = ТекущаяДатаСеанса();
Книга.SaveAs("C:\Temp\Выгрузка.xlsx");
Книга.Close(Ложь);
Excel.Quit();
Excel = Неопределено;
Важный нюанс: формат ячейки нужно устанавливать до записи значения, если речь идёт о текстовом формате. Если сначала записать строку "00123" в ячейку общего формата, Excel преобразует её в число 123, и последующая смена формата на текстовый ведущие нули не вернёт. Для чисел и дат порядок менее критичен.
Строки формата Excel регистрозависимы в части кодов даты и локали: DD.MM.YYYY корректно работает в русской локали, в английской может потребоваться DD/MM/YYYY с учётом региональных настроек. Для переносимых решений даты надёжнее записывать как значения даты и задавать только отображение.
Учёт формата ячейки при загрузке данных из Excel
При чтении файла формат влияет на то, что вернёт 1С. Ячейка с датой в Excel хранится как число (количество дней от базовой даты), и при чтении через ТабличныйДокумент.Прочитать() или через COM можно получить либо дату, либо число вроде 45000 — в зависимости от того, как распознан формат.
Через COM доступно свойство NumberFormat для чтения: по нему можно определить, что ячейка содержит дату, и сконвертировать значение. Надёжный приём — читать Cells.Value2 (сырое значение) и при необходимости преобразовывать число в дату встроенными средствами 1С, зная базовую дату Excel.
Другая частая ситуация — коды и артикулы с ведущими нулями. Если в файле ячейка имеет числовой формат, нули уже потеряны на стороне Excel, и никакая обработка в 1С их не восстановит. В таком случае источник данных нужно исправлять: просить поставщика выгружать код как текст или использовать формат CSV с явным указанием типов.
Типичные ошибки и как их избежать
Первая ошибка — запись чисел строками. В табличном документе это приводит к тому, что в Excel значение становится текстом: с ним нельзя строить формулы и итоги, а в углу ячейки появляется зелёный маркер «число сохранено как текст». Решение — передавать значения соответствующих типов.
Вторая ошибка — установка текстового формата после записи значения через COM. Excel не переинтерпретирует уже записанное значение при смене формата, поэтому NumberFormat = "@" нужно ставить заранее для всего диапазона, куда пойдут коды и артикулы.
Третья ошибка — незавершённые COM-процессы. Если код падает с исключением между Workbooks.Add() и Quit(), процесс EXCEL.EXE остаётся в памяти и держит файл. Оборачивайте работу с книгой в попытку-исключение с гарантированным закрытием в блоке исключения.
Проверка результата
После выгрузки откройте файл в Excel и выделите контрольные ячейки. Нажмите Ctrl+1 — в диалоге «Формат ячеек» виден фактический формат. Для чисел проверьте, что в строке формул отображается значение без кавычек, а в статусной строке при выделении диапазона считается сумма — это признак того, что значения числовые.
Для кодов с ведущими нулями проверьте, что формат ячейки — «Текстовый», а значение отображается полностью. Для дат — что ячейка имеет формат даты, а не число, и сортировка по столбцу работает хронологически, а не по алфавиту.
Как проверить результат
Сумма и среднее считаются
Показывается только количество — значения сохранены как текст
Формат «Текстовый», ведущие нули на месте
Формат «Числовой», нули потеряны
Сортировка идёт по хронологии, формат — дата
Сортировка алфавитная или отображаются числа вида 45000
EXCEL.EXE завершён после Quit()
Процесс висит в диспетчере задач, файл заблокирован
FAQ
Как выгрузить число, чтобы Excel не считал его текстом?
Записывайте в ячейку табличного документа значение числового типа, а не строку. Если данные приходят строкой (например, из запроса с преобразованием), используйте функцию Число() перед записью. Признаком проблемы в Excel служит зелёный треугольник в углу ячейки и отсутствие суммы в статусной строке.
Можно ли задать формат ячейки Excel на сервере 1С без установленного Excel?
Да, через табличный документ: свойство Формат области и сохранение методом Записать в XLSX. Возможности ограничены форматами, которые умеет конвертировать платформа, но для чисел, дат и базового оформления этого достаточно. COM-объект Excel без установленного приложения работать не будет.
Почему после выгрузки артикул «00123» превратился в 123?
Ячейка имела общий или числовой формат, и Excel преобразовал строку в число. При выгрузке через COM задайте NumberFormat = "@" до записи значения. При выгрузке через табличный документ записывайте значение как текст и убедитесь, что область не имеет числового формата.
Какой формат указать для даты, чтобы она отображалась как дд.мм.гггг?
В табличном документе — строка ДФ=dd.MM.yyyy в свойстве Формат области. Через COM — NumberFormat = "DD.MM.YYYY" для русской локали Excel. Значение в ячейку записывайте как дату, а не как строку, иначе сортировка и фильтры по датам работать не будут.
Что делать, если процесс EXCEL.EXE остаётся в памяти после выгрузки?
Убедитесь, что вызываются Книга.Close(Ложь), Excel.Quit() и обнуление переменной Excel. Оберните код в попытку-исключение и выполняйте закрытие в обеих ветках. Если процессы накопились, завершите их вручную через диспетчер задач, предварительно убедившись, что пользователи не работают с Excel на этом компьютере.
Можно ли применить условное форматирование Excel из 1С?
Через табличный документ — нет, сохраняются только статичные формат, цвет и шрифт областей. Через COM — да, объектная модель Excel предоставляет коллекцию FormatConditions у диапазона, но такой код требует установленного Excel и тщательного завершения работы с приложением.
Что важно запомнить
На сервере и без Excel используйте табличный документ со свойством Формат области, для точного контроля — COM-объект со свойством NumberFormat, задаваемым до записи значения. Числа записывайте числами, коды с нулями — в текстовый формат заранее, COM-процессы всегда завершайте через Quit().