Организация обмена Excel/CSV в 1С с использованием табличных документов
При загрузке/выгрузке прайс-листов и каталогов в Excel/CSV возникают ошибки:
- Падение операций на Linux-серверах из-за попыток вызова COM-объектов
Excel.Application. - Ошибки чтения ячеек с формулами, пробелами и сложными форматами дат.
- Критическое замедление работы при парсинге файлов с количеством строк более 50 000.
- Искажение кодировок (кракозябры) при чтении CSV-файлов из сторонних систем.
1. Нативный метод чтения XLSX через ТабличныйДокумент 1С
Платформа 1С умеет нативно открывать файлы .xlsx на всех операционных системах (включая Linux) без внешних библиотек и офисных пакетов с помощью объекта ТабличныйДокумент.
2. Программный код быстрой загрузки XLSX
&НаСервере
Функция ПрочитатьПрайсЛистXLSX(ИмяФайлаXLSX)
ТабДок = Новый ТабличныйДокумент;
Попытка
// Нативное чтение файла Excel платформой
ТабДок.Прочитать(ИмяФайлаXLSX, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
ВызватьИсключение "Не удалось прочитать файл Excel: " + ОписаниеОшибки();
КонецПопытки;
ВсегоСтрок = ТабДок.ВысотаТаблицы;
ВсегоКолонок = ТабДок.ШиринаТаблицы;
ТаблицаРезультат = Новый ТаблицаЗначений;
ТаблицаРезультат.Колонки.Добавить("Артикул", Новый ОписаниеТипов("Строка"));
ТаблицаРезультат.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
ТаблицаРезультат.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
// Быстрый обход строк (начиная со строки 2, пропуская шапку)
Для НомерСтроки = 2 По ВсегоСтрок Цикл
Артикул = СокрЛП(ТабДок.ПолучитьОбласть(НомерСтроки, 1).Текст);
Если ПустаяСтрока(Артикул) Тогда
Продолжить;
КонецЕсли;
Наименование = СокрЛП(ТабДок.ПолучитьОбласть(НомерСтроки, 2).Текст);
Цена = ТабДок.ПолучитьОбласть(НомерСтроки, 3).ТекущийОбъект; // Извлечение чистого числа
НоваяСтрока = ТаблицаРезультат.Добавить();
НоваяСтрока.Артикул = Артикул;
НоваяСтрока.Наименование = Наименование;
НоваяСтрока.Цена = ?(ТипЗнч(Цена) = Тип("Число"), Цена, 0);
КонецЦикла;
Возврат ТаблицаРезультат;
КонецФункции3. Высокопроизводительное потоковое чтение больших файлов CSV
&НаСервере
Функция ПрочитатьБольшойCSV(ИмяФайлаCSV, РазделительКолонок = ";")
ЧтениеТекста = Новый ЧтениеТекста(ИмяФайлаCSV, КодировкаТекста.UTF8);
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Код");
Таблица.Колонки.Добавить("Количество");
СтрокаТекста = ЧтениеТекста.ПрочитатьСтроку(); // Пропуск шапки
СтрокаТекста = ЧтениеТекста.ПрочитатьСтроку();
Пока СтрокаТекста <> Неопределено Цикл
МассивЗначений = СтрРазделить(СтрокаТекста, РазделительКолонок, Истина);
Если МассивЗначений.Количество() >= 2 Тогда
СтрТаблицы = Таблица.Добавить();
СтрТаблицы.Код = СокрЛП(МассивЗначений[0]);
СтрТаблицы.Количество = Число(СтрЗаменить(МассивЗначений[1], " ", ""));
КонецЕсли;
СтрокаТекста = ЧтениеТекста.ПрочитатьСтроку();
КонецЦикла;
ЧтениеТекста.Закрыть();
Возврат Таблица;
КонецФункции Частые вопросы (FAQ)
Почему ТабличныйДокумент лучше, чем COMОбъект('Excel.Application')?
ТабличныйДокумент работает нативно без необходимости лицензирования и установки MS Excel, функционирует в среде Linux и обрабатывает файлы в разы быстрее без риска зависания фоновых процессов excel.exe.
Как выгрузить данные в формат XLSX из ТабличногоДокумента?
Используйте метод: ТабличныйДокумент.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX).
Что делать, если в CSV файле разделителем является запятая внутри текста?
Используйте объект ЧтениеCSV с настройкой параметров разделителей и экранирования кавычек вместо простого метода СтрРазделить().
Как определить кодировку CSV-файла (ANSI vs UTF-8)?
Проверьте наличие сигнатуры BOM (Byte Order Mark) в первых 3 байтах файла или используйте автоматическое определение через объект ЧтениеТекста без указания жесткой кодировки.