Что делать, если возникает ошибка при загрузке файла Excel на 80 000 строк в 1С

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

Загрузка больших объемов данных из внешних файлов — это классическая задача для разработчика 1С, которая часто сопровождается трудностями. При обработке файлов Excel размером 10–11 Мб, содержащих около 80 тысяч строк, система может выдавать неочевидные «непредвиденные ошибки». В этой статье мы детально разберем, как локализовать причину падения системы и какие альтернативные методы загрузки следует использовать для стабильной работы.

Шаг 1. Получение подробной информации об ошибке

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

В окне с ошибкой обычно присутствует гиперссылка или кнопка «Сформировать отчет об ошибке». Нажав на неё, мы увидим дополнительное окно. В нем необходимо найти ссылку на технические подробности (текстовый файл). Именно там скрывается критически важная информация, такая как Access Violation, Out of memory или конкретный сбой в библиотеке combase.dll.

Если стандартный отчет не дает ответа, нам поможет Технологический журнал. Для этого в папке с настройками платформы необходимо создать или отредактировать файл logcfg.xml. Рассмотрим пример минимальной настройки для отслеживания исключительных ситуаций:


<config xmlns="http://v8.1c.ru/7.4/config/logcfg">
  <dump location="C:\Dumps" mode="2" type="0"/>
  <log location="C:\Logs\Errors" history="24">
    <event>
      <eq property="Name" value="EXCP"/>
    </event>
    <event>
      <eq property="Name" value="SCOM"/>
    </event>
  </log>
</config>

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

Шаг 2. Использование нативного чтения вместо COM-объекта

Одной из самых частых причин сбоев является использование Excel.Application через COM-соединение. Этот метод крайне требователен к ресурсам, так как запускает полноценный процесс Excel в фоновом режиме. Если на сервере установлен 32-битный MS Office, он физически не сможет адресовать более 2-4 Гб памяти, что при раздутой структуре файла на 80 000 строк приводит к краху.

Разберем более современный и быстрый способ — метод Прочитать() объекта ТабличныйДокумент. Он работает напрямую с форматом XLSX (который по сути является архивом XML) и не требует установленного Microsoft Excel.


ТабДок = Новый ТабличныйДокумент;
Попытка
    ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
    // Проанализируем количество строк
    ВсегоСтрок = ТабДок.ВысотаТаблицы;
    Для Стр = 1 По ВсегоСтрок Цикл
        // Обработка данных
        Значение = ТабДок.Область(Стр, 1).Текст;
    КонецЦикла;
Исключение
    Сообщить("Ошибка при чтении файла: " + ОписаниеОшибки());
КонецПопытки;

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

Шаг 3. Загрузка через ADODB для сверхбольших файлов

Если файл настолько велик, что даже ТабличныйДокумент вызывает замедление системы, следует рассмотреть технологию ADODB. Она позволяет работать с листом Excel как с таблицей базы данных, считывая строки порционно, не загружая весь файл в память целиком. Выясним, как реализовать такое подключение:


Connection = Новый COMОбъект("ADODB.Connection");
ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ПутьКФайлу + ";Extended Properties=""Excel 12.0 Xml;HDR=YES"";";
Connection.Open(ConnectionString);

Recordset = Новый COMОбъект("ADODB.Recordset");
ТекстЗапроса = "SELECT * FROM [Лист1$]"; // Обратите внимание на имя листа со знаком $
Recordset.Open(ТекстЗапроса, Connection);

Пока НЕ Recordset.EOF() Цикл
    // Читаем данные из полей
    Значение = Recordset.Fields.Item(0).Value;
    Recordset.MoveNext();
КонецЦикла;

Recordset.Close();
Connection.Close();

Использование Microsoft.ACE.OLEDB — это наиболее профессиональный подход для работы с объемами данных 80к+ строк, так как он минимизирует накладные расходы на графическую оболочку и стили оформления.

Шаг 4. Очистка структуры файла и проверка временных папок

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

Рекомендации по подготовке файла:

  1. Откройте файл в Excel и нажмите Ctrl+End. Если курсор улетел далеко ниже ваших реальных данных, удалите все пустые строки ниже таблицы и пересохраните файл.
  2. Попробуйте сохранить файл в формате CSV. Если загрузка из CSV проходит успешно, значит, 1С не справляется именно с парсингом сложной XML-структуры стилей вашего XLSX.
  3. Проверьте наличие прав доступа у пользователя, под которым запущена служба 1С (обычно usr1cv8), к папке Temp. При чтении файлов XLSX система распаковывает их во временные каталоги, и отсутствие прав или квот на диске C: мгновенно вызывает «Непредвиденную ошибку».

Шаг 5. Особенности серверного контекста

Если загрузка выполняется в фоновом задании на сервере, помните, что серверный процесс не имеет доступа к интерактивным ресурсам. Рассмотрим важные моменты для серверного выполнения:

Подводя итог, можно сказать, что для файлов объемом 11 Мб и 80 000 строк оптимальным выбором будет отказ от COM в пользу ТабличныйДокумент.Прочитать() или ADODB. Это обеспечит высокую скорость и стабильность работы вашего решения.

← На главную