Почему Excel-файлы из 1С сохраняются с разным форматированием на клиенте и на сервере?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Торговля и дистрибуция
← На главную

При работе с платформой 1С:Предприятие 8.3 разработчики часто сталкиваются с загадочным поведением: один и тот же табличный документ выглядит идеально при сохранении на стороне клиента, но при попытке сформировать и сохранить его на сервере (например, для последующей отправки по почте или выгрузки в хранилище) форматирование «плывет». Чаще всего это выражается в непроизвольном расширении строк, изменении высоты ячеек или некорректном переносе текста. Разберем подробно, почему это происходит и как решить данную проблему.

Анализ программного кода и логики сохранения

Рассмотрим типичный пример кода, который часто приводит к подобным вопросам. Проанализируем ситуацию, когда на клиенте файл записывается напрямую, а на сервере используется промежуточное временное хранилище.


&НаКлиенте
Процедура Команда1(Команда)
    // Простое сохранение на клиенте
    ТабличныйДокумент.Записать(Путь + "\Тест1.xlsx", ТипФайлаТабличногоДокумента.XLSX);
КонецПроцедуры

&НаСервере
Процедура Команда2НаСервере(Адрес)
    ИмяФайла = ПолучитьИмяВременногоФайла(".xlsx");
    // Сохранение во временный файл на сервере
    Табл.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
    дд = Новый ДвоичныеДанные(ИмяФайла);
    Адрес = ПоместитьВоВременноеХранилище(дд);
КонецПроцедуры

&НаКлиенте
Процедура Команда2(Команда)
    Адрес = "";
    Команда2НаСервере(Адрес);
    Файл = ПолучитьИзВременногоХранилища(Адрес);
    // Запись полученных данных на диск клиента
    Файл.Записать(Путь + "\Тест1.xlsx");
КонецПроцедуры

В данном примере Команда1 отрабатывает корректно, а Команда2 выдает файл с «ломанным» форматированием. Обратите внимание на важный нюанс, отмеченный опытными разработчиками: во втором случае файл записывается дважды. Сначала методом Записать объекта ТабличныйДокумент (с указанием типа файла), а затем методом Записать объекта ДвоичныеДанные. Хотя само по себе двойное сохранение не должно менять внутреннюю структуру XLSX, ключевое различие кроется именно в моменте формирования файла методом ТабличныйДокумент.Записать на стороне сервера.

Причина №1: Зависимость от драйвера принтера

Выясним основную техническую причину, которая часто скрыта от глаз программиста. 1С:Предприятие при формировании и сохранении табличного документа (особенно при расчете высоты строк и автоподборе высоты) ориентируется на настройки принтера по умолчанию.

  1. На клиенте: У пользователя практически всегда установлен какой-либо принтер. 1С использует его метрики (разрешение DPI, границы печати) для отрисовки документа.
  2. На сервере: Серверная служба 1С (обычно работающая под учетной записью USR1CV8) часто не имеет назначенного принтера по умолчанию. В этом случае система использует стандартный системный драйвер, чьи параметры отрисовки отличаются от клиентских. Это приводит к тому, что текст, который на клиенте помещался в одну строку, на сервере требует чуть больше места, что заставляет систему «раздувать» ячейку.

Решение: Установите на сервере под учетной записью, от которой работает служба 1С, любой виртуальный принтер (например, PDF-принтер) и назначьте его принтером по умолчанию.

Причина №2: Отсутствие шрифтов на сервере

Проанализируем ситуацию со шрифтами. Если в макете печатной формы используются шрифты, отличные от базовых (например, узкие начертания или специфические корпоративные шрифты), они должны быть физически установлены в операционной системе сервера. Если 1cv8 не находит нужный шрифт на сервере, она производит подмену на максимально похожий из имеющихся (например, Microsoft Sans Serif). Поскольку ширина символов у разных шрифтов отличается, итоговое форматирование в Excel будет искажено.

Решение: Скопируйте все шрифты из папки C:\Windows\Fonts с клиентской машины, на которой всё отображается корректно, в аналогичную папку на сервере 1С.

Причина №3: Платформенные особенности и кэширование

Как показывает практика и обсуждения на форумах, значительная часть проблем с некорректным отображением решается банальной очисткой кэша. Временные файлы сервера или клиентского сеанса могут содержать устаревшие метаданные макетов или настройки компоновки.

Разберем, как правильно выполнить очистку:

  1. Для клиента: удаление папок в %AppData%\1C\1Cv8 и %LocalAppData%\1C\1Cv8.
  2. Для сервера: очистка сеансовых данных и временных файлов службы в C:\Program Files\1cv8\srvinfo (требуется остановка службы 1С).

Также стоит помнить о разрядности. Если клиент 32-битный, а сервер 64-битный, алгоритмы внутреннего конвертера 1С (который используется в методе Записать без участия COM-объекта Excel) могут выдавать микроскопические расхождения в расчете координат ячеек, что в сумме дает видимое искажение.

Рекомендации по написанию кода для сохранения Excel

Чтобы минимизировать ошибки при программном сохранении, придерживайтесь следующих правил:

  1. Всегда явно указывайте ТипФайлаТабличногоДокумента.XLSX при вызове метода Записать.
  2. Перед сохранением на сервере попробуйте принудительно вызвать метод АвтоВысотаСтрок() для нужных областей, хотя это не всегда помогает, если проблема в драйвере принтера.
  3. По возможности используйте современные версии платформы (выше 8.3.17), так как механизмы выгрузки в XLSX постоянно совершенствуются и исправляются.

Подведем итог: если вы видите разницу в сохранении Excel, первым делом проверьте наличие принтера по умолчанию на сервере и идентичность шрифтов. Если это не помогло — очистите кэш. Эти действия решают проблему в 90% случаев.

← На главную