Почему 1С зависает намертво при сохранении табличного документа в XLS и как это исправить

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

В процессе работы с платформой 1С:Предприятие (особенно на релизах ветки 8.3.15, например, 8.3.15.1830) пользователи могут столкнуться с крайне неприятной проблемой: при попытке сохранить любой табличный документ через стандартное меню "Файл" — "Сохранить как" в формате XLS (Excel 97-2003) программа зависает намертво. При этом часто «вешается» и сам системный проводник Windows, а в диспетчере задач наблюдается лавинообразный рост потребления оперативной памяти процессом 1С. Единственным выходом остается принудительное завершение процесса.

Очистка локального кэша программных файлов в данном случае не приносит никаких результатов. Примечательно, что сохранение в другие форматы, например в PDF или современный XLSX, при этом проходит абсолютно штатно и без задержек. Давайте подробно разберем, почему возникает этот сбой, проанализируем внутренние механизмы платформы и операционной системы, а также рассмотрим пошаговые методы решения этой проблемы.

Причина 1. Проблема с принтером по умолчанию (расчет параметров страницы)

Рассмотрим скрытый механизм работы табличного документа 1С. Перед тем как записать файл в устаревший формат XLS, движок отображения Moxel в обязательном порядке выполняет виртуальную разметку документа на печатные страницы. Для этого платформа 1С обращается к установленному в операционной системе Windows принтеру по умолчанию, чтобы считать параметры его драйвера (границы печати, поддерживаемые форматы бумаги и физические поля).

Выясним, почему это приводит к зависанию. Если принтер по умолчанию является сетевым, а в данный момент он выключен, находится в недоступной подсети, подключен по медленному VPN-каналу или просто завис, системная служба печати Windows (Spooler) уходит в бесконечный режим ожидания ответа. Поток 1С блокируется, ожидая данные от драйвера принтера, что внешне выглядит как полное и глухое зависание интерфейса программы.

Для решения этой проблемы выполним следующие шаги:

  1. Откроем настройки принтеров в панели управления Windows.
  2. Временно назначим принтером по умолчанию любой локальный виртуальный принтер, который не требует физического подключения к сети. Отличным выбором будут Microsoft Print to PDF или Microsoft XPS Document Writer.
  3. Попробуем повторить операцию сохранения в 1С. Если сохранение прошло успешно, проблему следует искать в сетевой инфраструктуре печати или драйвере проблемного принтера.
  4. Также рекомендуется очистить сохраненные настройки параметров печати для этого пользователя внутри базы 1С. Для этого можно воспользоваться стандартной обработкой очистки настроек пользователей.

Причина 2. Специфический баг макета: свойство «Вместе со следующим»

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

Если в макете формируемого отчета у определенных строк включено это свойство, и при этом объем данных таков, что таблица по ширине или высоте переносится на следующую страницу, алгоритм расчета страниц в формате XLS уходит в бесконечный цикл. Программа начинает бесконтрольно выделять оперативную память (происходит утечка), заполняя все доступное пространство ОЗУ, пока процесс не завершится аварийно или не заблокирует систему.

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

Для предотвращения подобных зависаний при программном выводе отчетов разработчикам рекомендуется принудительно устанавливать автомасшабирование в коде:


ТабДок = Новый ТабличныйДокумент;
// Заполняем табличный документ данными...
ТабДок.АвтоМасштаб = Истина; 
// Это предотвратит некорректный расчет страниц при конвертации

Причина 3. Зависание проводника из-за недоступных сетевых ресурсов

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

В этот момент проводник пытается просканировать все подключенные сетевые диски, а также папки, добавленные в панель "Быстрого доступа". Если в системе числятся старые неактивные сетевые папки или недоступные сетевые диски, диалоговое окно блокируется. Поскольку процесс 1С является родительским для этого окна, он зависает вместе с ним.

Выполним очистку сетевого окружения:

  1. Откроем проводник Windows и проверим статус всех подключенных сетевых дисков. Отключим все диски, помеченные красным крестиком (недоступные).
  2. Очистим журнал проводника Windows. Для этого перейдем в "Параметры папок" -> вкладка "Общие" -> нажмем кнопку "Очистить" в разделе "Конфиденциальность".
  3. Отключим отображение недавно использовавшихся файлов и папок на панели быстрого доступа.
  4. Попробуем выполнить сохранение файла непосредственно в локальный каталог, например, создав папку C:\Temp, чтобы исключить влияние сетевых путей.

Причина 4. Системные ограничения формата XLS и утечка памяти в x64-клиенте

Основная техническая деталь кроется в разнице алгоритмов экспорта. Для формирования старого формата XLS (Excel 97-2003) платформа использует устаревшую библиотеку конвертации. Этот формат имеет жесткие архитектурные ограничения: не более 65 536 строк и 255 колонок на одном листе.

Если пользователь пытается выгрузить крупный отчет, превышающий эти лимиты, или содержащий множество сложных объединенных ячеек, картинок и условного оформления, алгоритм конвертации в x64-клиенте 1С начинает лавинообразно потреблять память. Происходит классическая утечка ресурсов, приводящая к зависанию сессии.

Решением в данной ситуации является переход на современный и оптимизированный формат XLSX (Excel 2007 и выше). Для него платформа 1С использует совершенно другой, современный и быстрый программный код трансляции метаданных. Он практически не имеет ограничений по объему данных и работает в разы быстрее.

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


// Вместо ТипФайлаТабличногоДокумента.XLS используем XLSX
ИмяПути = "C:\Temp\ВыгрузкаОтчета.xlsx";
ТабДок.Записать(ИмяПути, ТипФайлаТабличногоДокумента.XLSX);

Этот простой шаг навсегда избавит пользователей от зависаний, связанных со старыми ограничениями XLS-формата.

Причина 5. Блокировка временных файлов антивирусным ПО

При экспорте табличного документа платформа 1С сначала создает временный файл структуры во временной папке пользователя Windows (%TEMP% в каталоге AppData\Local\Temp). Только после успешного формирования структуры этот файл переименовывается и перемещается в целевой каталог, выбранный пользователем.

Некоторые антивирусные программы с жесткими эвристическими правилами или включенным сканированием "на лету" могут расценить создание динамического бинарного файла процессом 1С как потенциальную угрозу. Антивирус блокирует доступ к файлу в папке Temp для проведения глубокого анализа. Платформа 1С, потеряв доступ к своему же временному файлу, зависает в бесконечном цикле ожидания снятия блокировки.

Для исправления этой ситуации выполним настройку исключений:

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

← На главную