При выгрузке отчетов и печатных форм из 1С:Предприятия в формат *.xlsx разработчики часто сталкиваются с тем, что данные теряют свое исходное визуальное представление. Логические значения превращаются в сухой текст "Истина" или "Ложь", числа сохраняются как текст, а встроенные формулы отказываются рассчитываться автоматически при открытии файла пользователем. В этой статье мы подробно разберем, как решить эти проблемы, используя как стандартные интерактивные возможности макетов, так и программные методы на встроенном языке 1С.
По умолчанию платформа 1С экспортирует логический тип Булево в Excel как обычную строку со значениями "Истина" или "Ложь" на языке локализации платформы. Чтобы сделать документ более читаемым и профессиональным, мы можем пойти двумя путями: настроить строковое представление или использовать специальные шрифты.
Вариант А: Использование форматной строки ("Да/Нет", "Вкл/Выкл")
Если нам достаточно текстового вывода, отличного от стандартного системного, мы можем использовать встроенный механизм форматирования. Для этого в макете печатной формы или программно задается форматная строка для вывода булевых значений:
В результате конструктор сформирует строку вида БИ=Да; БЛ=Нет. При сохранении в Excel платформа автоматически запишет эти представления в файл.
Вариант Б: Визуальные галочки с помощью шрифтов Wingdings или Webdings
Когда пользователю важно видеть именно графические флажки (галочки), стандартные элементы управления 1С (интерактивные флажки) при экспорте в Excel могут терять свой функционал. Отличной альтернативой является использование шрифтов семейства Wingdings или Webdings, которые установлены по умолчанию на большинстве компьютеров под управлением Windows.
Рассмотрим, как реализовать этот подход программно при формировании табличного документа:
// Создаем область для вывода галочки
ОбластьЯчейки = ТабДок.Область("R1C3");
// Задаем шрифт Wingdings для отображения символов-иконок
ОбластьЯчейки.Шрифт = Новый Шрифт("Wingdings", 10, Истина);
// Выводим символ галочки в зависимости от значения переменной Доступен
Если Выборка.Доступен Тогда
// Код 252 в шрифте Wingdings отображается как классическая галочка
ОбластьЯчейки.Значение = Символ(252);
Иначе
// Код 251 отображается как крестик
ОбластьЯчейки.Значение = Символ(251);
КонецЕсли;
При открытии такого файла в Excel пользователь увидит аккуратные графические галочки и крестики вместо невзрачного текста.
Часто программисты допускают ошибку, передавая в ячейки табличного документа строковое представление данных вместо их реальных значений. Это приводит к тому, что Excel помечает числа предупреждением "Число сохранено как текст", а формулы по этим колонкам перестают работать.
Чтобы избежать подобных проблем, необходимо явно указывать тип значения ячейки и использовать свойство СодержитЗначение. Давайте разберем по шагам правильный алгоритм заполнения числовых ячеек:
// Выбираем область ячейки, куда будет выводиться числовое значение
ОбластьЧисла = Макет.ПолучитьОбласть("Строка");
ЯчейкаКоличества = ОбластьЧисла.Область("Количество");
// Сообщаем платформе, что ячейка должна содержать типизированное значение, а не просто текст
ЯчейкаКоличества.СодержитЗначение = Истина;
ЯчейкаКоличества.ТипЗначения = Новый ОписаниеТипов("Число");
// Записываем реальное числовое значение
ЯчейкаКоличества.Значение = Выборка.Количество;
// Задаем формат вывода числа (например, 2 знака после запятой без разделения групп)
ЯчейкаКоличества.Формат = "ЧДЦ=2; ЧГ=0";
Благодаря этому при сохранении табличного документа методом ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX) в результирующий XML-файл запишется полноценное числовое значение, которое Excel корректно распознает без дополнительных предупреждений.
При выгрузке формул из 1С в Excel разработчики сталкиваются со специфической проблемой: если в ячейку записать формулу (например, через свойство Область.Формула), то при открытии файла в Excel пользователь может увидеть пустое значение или ошибку #ИМЯ?. Расчет формулы происходит только тогда, когда пользователь дважды кликнет по ячейке и нажмет клавишу Enter.
Причина проблемы заключается в том, что формат XLSX хранит в файле как саму формулу, так и её последнее вычисленное значение (кэш). Платформа 1С при записи файла генерирует только текст формулы, но не рассчитывает её результат. Excel при открытии файла считывает кэшированное значение, а так как его нет, отображает пустоту или ошибку.
Выясним, какими способами можно заставить Excel принудительно рассчитать формулы:
Вариант А: Использование COM-соединения (для Windows-клиентов)
Если формирование отчета происходит на стороне клиента под управлением ОС Windows, мы можем использовать фоновое подключение к установленному MS Excel для инициации пересчета всех формул в книге:
Попытка
// Инициализируем COM-объект Excel
ExcelПриложение = Новый COMОбъект("Excel.Application");
ExcelПриложение.Visible = Ложь; // Скрываем окно программы от пользователя
ExcelПриложение.DisplayAlerts = Ложь; // Отключаем системные предупреждения
// Открываем сохраненный файл
РабочаяКнига = ExcelПриложение.Workbooks.Open(ПутьКФайлу);
// Запускаем пересчет формул во всей книге
ExcelПриложение.Calculate();
// Альтернативный надежный способ форсировать расчет во всех ячейках:
// Производим фиктивную замену знака равенства на знак равенства
ExcelПриложение.Cells.Replace("=", "=", 2);
// Сохраняем изменения и закрываем приложение
РабочаяКнига.Save();
РабочаяКнига.Close();
ExcelПриложение.Quit();
Исключение
// В случае ошибки обязательно закрываем процесс Excel, чтобы он не завис в диспетчере задач
Если ЗначениеЗаполнено(ExcelПриложение) Тогда
ExcelПриложение.Quit();
КонецЕсли;
ВызватьИсключение "Не удалось пересчитать формулы в Excel: " + ОписаниеОшибки();
КонецПопытки;
Вариант Б: Серверное решение без использования COM (через распаковку XLSX-архива)
Если генерация отчетов происходит на сервере Linux или на компьютерах пользователей не установлен MS Excel, COM-объекты использовать нельзя. В этом случае мы можем применить продвинутый метод модификации XML-структуры XLSX-файла (так как этот формат представляет собой обычный ZIP-архив):
ЧтениеZipФайла во временную папку на сервере.xl/workbook.xml.forceFullCalculation="1". Этот атрибут является жесткой инструкцией для Excel произвести полный принудительный пересчет всех формул при первом открытии данного файла пользователем.ЗаписьZipФайла и заменим исходный файл XLSX.Этот метод гарантирует работоспособность формул на любых устройствах и операционных системах без зависимости от установленного офисного пакета.
Для создания качественных печатных форм, сохраняемых в Excel, всегда придерживайтесь следующих правил:
СодержитЗначение = Истина и задавайте соответствующий ТипЗначения для чисел и дат.БИ и БЛ в макетах, либо применяйте символьные шрифты для вывода графических флажков.