Как решить проблему падения 1С при загрузке больших файлов MXL и зачем нужна 64-разрядная платформа?

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

Разберем проблему: молчаливое закрытие 1С без ошибки

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

Основная причина такого поведения кроется в архитектурных ограничениях 32-разрядных операционных систем и приложений. Любой 32-битный процесс в среде Windows по умолчанию может использовать не более 2 ГБ оперативной памяти. При чтении файла MXL платформа 1С загружает его в память не потоково (как это делается с XML или текстовыми документами), а полностью, формируя сложный объект ТабличныйДокумент в оперативной памяти.

В этот объект помещается не только сам текст, но и всё форматирование ячеек, картинки, стили и структура документа. Поэтому файл весом в 300 Мб на жестком диске в оперативной памяти легко «раздувается» до объемов, превышающих лимит в 2 ГБ. Как только процесс достигает этого потолка, операционная система принудительно завершает его работу по ошибке «Out of memory» (нехватка памяти).

Выясним причину путаницы: разрядность конфигурации и платформы

Среди пользователей и даже начинающих программистов часто возникает вопрос: существует ли отдельный 64-разрядный дистрибутив для конкретной конфигурации (например, «1С:Деньги», «1С:Бухгалтерия» или «1С:Управление торговлей»)?

Запомним важное правило: конфигурация не имеет собственной разрядности (битности). Конфигурация — это набор метаданных и программного кода, написанного на встроенном языке 1С. Разрядность — 32 или 64 бита — относится исключительно к самой платформе «1С:Предприятие» (клиентскому приложению или серверу).

Решение 1: Переход на 64-разрядную платформу (клиент)

Разберем самое правильное и надежное решение нашей проблемы — установку 64-разрядного клиента платформы 1С. Переход на архитектуру x64 полностью снимает ограничение в 2 ГБ оперативной памяти на процесс, позволяя платформе использовать всю доступную оперативную память компьютера (8 ГБ, 16 ГБ и более).

  1. Скачиваем дистрибутив 64-разрядного клиента (обычно в названии архива присутствует windows64full) с официального портала 1С.
  2. Устанавливаем его на компьютер пользователя вместо или параллельно с 32-разрядной версией.
  3. Запускаем нашу конфигурацию через 64-разрядный исполняемый файл. База успешно прочитает тяжелый файл, так как лимит оперативной памяти больше не будет превышен.

Важный нюанс по лицензированию: Согласно политике фирмы «1С», пользователь имеет право использовать как 32-разрядную, так и 64-разрядную версию клиентского приложения в рамках уже имеющейся у него клиентской лицензии. Это правило работает в том числе и для базовых версий (например, базовой версии «1С:Деньги»). Отдельная лицензия для 64 бит требуется только при использовании Сервера 1С:Предприятия.

Решение 2: Использование ключа /3GB (для 32-битных ОС)

Рассмотрим альтернативный вариант, если на рабочем месте используется устаревшая 32-битная версия Windows, и установка 64-разрядной платформы физически невозможна. В операционных системах Windows предусмотрен специальный ключ, расширяющий лимит оперативной памяти для пользовательских процессов с 2 ГБ до 3 ГБ.

Для активации этого режима на современных версиях Windows (начиная с Vista/7) необходимо запустить командную строку от имени администратора и выполнить команду, увеличивающую пользовательское виртуальное адресное пространство. Это даст приложению 1С дополнительный гигабайт памяти, чего часто бывает достаточно для успешного парсинга документа MXL.

Проверим разрядность платформы программно

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


СистемнаяИнформация = Новый СистемнаяИнформация();

Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 Тогда
    Сообщить("Вы используете 32-разрядную версию платформы. Чтение больших файлов может привести к нехватке памяти!");
ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда
    Сообщить("Установлена 64-разрядная платформа. Ограничений по памяти нет.");
ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86_64 Тогда
    Сообщить("Используется 64-разрядная платформа на базе Linux.");
КонецЕсли;

Оптимизация обмена: как не доводить MXL до 300 МБ

Проанализируем ситуацию на архитектурном уровне. Почему файл табличного документа вообще весит так много? Зачастую это связано с передачей графической информации.

Например, некоторые поставщики рассылают коды маркировки («Честный ЗНАК») не в виде текстовых последовательностей, а встраивают сгенерированные картинки (DataMatrix) непосредственно в ячейки документа MXL. Сотни тысяч таких картинок моментально увеличивают вес файла до сотен мегабайт.

Вместо того чтобы бороться с нехваткой памяти при чтении картинок, правильным решением будет пересмотреть формат обмена данными. Рекомендуем переходить на передачу кодов (КИЗов) в виде обычного текста через файлы CSV или структурированные XML файлы (в форматах ЭДО). Обработка текста происходит через потоковое чтение, работает моментально и потребляет минимум оперативной памяти, независимо от разрядности используемой платформы.

← На главную