При работе с платформой 1С:Предприятие 8.3 разработчики часто сталкиваются с загадочным поведением: один и тот же табличный документ выглядит идеально при сохранении на стороне клиента, но при попытке сформировать и сохранить его на сервере (например, для последующей отправки по почте или выгрузки в хранилище) форматирование «плывет». Чаще всего это выражается в непроизвольном расширении строк, изменении высоты ячеек или некорректном переносе текста. Разберем подробно, почему это происходит и как решить данную проблему.
Рассмотрим типичный пример кода, который часто приводит к подобным вопросам. Проанализируем ситуацию, когда на клиенте файл записывается напрямую, а на сервере используется промежуточное временное хранилище.
&НаКлиенте
Процедура Команда1(Команда)
// Простое сохранение на клиенте
ТабличныйДокумент.Записать(Путь + "\Тест1.xlsx", ТипФайлаТабличногоДокумента.XLSX);
КонецПроцедуры
&НаСервере
Процедура Команда2НаСервере(Адрес)
ИмяФайла = ПолучитьИмяВременногоФайла(".xlsx");
// Сохранение во временный файл на сервере
Табл.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
дд = Новый ДвоичныеДанные(ИмяФайла);
Адрес = ПоместитьВоВременноеХранилище(дд);
КонецПроцедуры
&НаКлиенте
Процедура Команда2(Команда)
Адрес = "";
Команда2НаСервере(Адрес);
Файл = ПолучитьИзВременногоХранилища(Адрес);
// Запись полученных данных на диск клиента
Файл.Записать(Путь + "\Тест1.xlsx");
КонецПроцедуры
В данном примере Команда1 отрабатывает корректно, а Команда2 выдает файл с «ломанным» форматированием. Обратите внимание на важный нюанс, отмеченный опытными разработчиками: во втором случае файл записывается дважды. Сначала методом Записать объекта ТабличныйДокумент (с указанием типа файла), а затем методом Записать объекта ДвоичныеДанные. Хотя само по себе двойное сохранение не должно менять внутреннюю структуру XLSX, ключевое различие кроется именно в моменте формирования файла методом ТабличныйДокумент.Записать на стороне сервера.
Выясним основную техническую причину, которая часто скрыта от глаз программиста. 1С:Предприятие при формировании и сохранении табличного документа (особенно при расчете высоты строк и автоподборе высоты) ориентируется на настройки принтера по умолчанию.
USR1CV8) часто не имеет назначенного принтера по умолчанию. В этом случае система использует стандартный системный драйвер, чьи параметры отрисовки отличаются от клиентских. Это приводит к тому, что текст, который на клиенте помещался в одну строку, на сервере требует чуть больше места, что заставляет систему «раздувать» ячейку.Решение: Установите на сервере под учетной записью, от которой работает служба 1С, любой виртуальный принтер (например, PDF-принтер) и назначьте его принтером по умолчанию.
Проанализируем ситуацию со шрифтами. Если в макете печатной формы используются шрифты, отличные от базовых (например, узкие начертания или специфические корпоративные шрифты), они должны быть физически установлены в операционной системе сервера. Если 1cv8 не находит нужный шрифт на сервере, она производит подмену на максимально похожий из имеющихся (например, Microsoft Sans Serif). Поскольку ширина символов у разных шрифтов отличается, итоговое форматирование в Excel будет искажено.
Решение: Скопируйте все шрифты из папки C:\Windows\Fonts с клиентской машины, на которой всё отображается корректно, в аналогичную папку на сервере 1С.
Как показывает практика и обсуждения на форумах, значительная часть проблем с некорректным отображением решается банальной очисткой кэша. Временные файлы сервера или клиентского сеанса могут содержать устаревшие метаданные макетов или настройки компоновки.
Разберем, как правильно выполнить очистку:
%AppData%\1C\1Cv8 и %LocalAppData%\1C\1Cv8.C:\Program Files\1cv8\srvinfo (требуется остановка службы 1С).Также стоит помнить о разрядности. Если клиент 32-битный, а сервер 64-битный, алгоритмы внутреннего конвертера 1С (который используется в методе Записать без участия COM-объекта Excel) могут выдавать микроскопические расхождения в расчете координат ячеек, что в сумме дает видимое искажение.
Чтобы минимизировать ошибки при программном сохранении, придерживайтесь следующих правил:
ТипФайлаТабличногоДокумента.XLSX при вызове метода Записать.АвтоВысотаСтрок() для нужных областей, хотя это не всегда помогает, если проблема в драйвере принтера.Подведем итог: если вы видите разницу в сохранении Excel, первым делом проверьте наличие принтера по умолчанию на сервере и идентичность шрифтов. Если это не помогло — очистите кэш. Эти действия решают проблему в 90% случаев.