При разработке механизмов интеграции часто приходится сталкиваться с чтением внешних файлов в формате CSV. Одной из самых коварных проблем является ошибка «Метод объекта не обнаружен (ПолучитьСтроку)», даже если синтаксически код кажется абсолютно верным. В этой статье мы разберем причину возникновения такой ситуации, а также рассмотрим современные и надежные способы парсинга CSV-файлов в платформе 1С:Предприятие.
Проанализируем ситуацию: программист использует объект ТекстовыйДокумент, загружает в него файл методом Прочитать(), но при попытке обращения к строке через ПолучитьСтроку() система выдает ошибку. Выясним причину: чаще всего это происходит из-за копирования кода из интернета. В тексте метода могут содержаться символы из другой раскладки (например, латинская «C» вместо кириллической «С» или некорректно закодированная буква «о»).
Для решения этой проблемы достаточно удалить название метода и набрать его вручную непосредственно в конфигураторе, дождавшись всплывающей подсказки (IntelliSense). Это гарантирует использование правильных символов, распознаваемых платформой.
Рассмотрим базовый пример кода, который часто используется для небольших файлов. Этот метод прост, но имеет свои ограничения, о которых мы поговорим ниже.
ИмяФайла = "C:\ВыгрузкаНаСайт\data.csv";
ЗагружаемыйФайл = Новый ТекстовыйДокумент;
Попытка
ЗагружаемыйФайл.Прочитать(ИмяФайла, КодировкаТекста.UTF8);
Исключение
Сообщить("Ошибка при чтении файла: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
КоличествоСтрок = ЗагружаемыйФайл.КоличествоСтрок();
Для НомерСтроки = 1 По КоличествоСтрок Цикл
ТекущаяСтрока = ЗагружаемыйФайл.ПолучитьСтроку(НомерСтроки);
// Обработка строки...
КонецЦикла;
Важное замечание: использование ТекстовыйДокумент полностью загружает файл в оперативную память. Если ваш CSV-файл весит несколько сотен мегабайт, это может привести к значительному потреблению ресурсов или аварийному завершению сеанса.
Для более стабильной работы, особенно с большими объемами данных, проанализируем использование объекта ЧтениеТекста. Он позволяет читать файл построчно, не загружая его целиком.
Разберем по шагам алгоритм эффективной обработки:
ЧтениеТекста для последовательного доступа к строкам.СтрРазделить (доступна с версии 8.3.6).СокрЛП.
Разделитель = ";";
Чтение = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
СтрокаДанных = Чтение.ПрочитатьСтроку(); // Читаем шапку, если нужно
СтрокаДанных = Чтение.ПрочитатьСтроку();
Пока СтрокаДанных <> Неопределено Цикл
МассивКолонок = СтрРазделить(СтрокаДанных, Разделитель, Истина);
Если МассивКолонок.Количество() > 0 Тогда
Значение1 = СокрЛП(МассивКолонок[0]);
// Обработка данных...
КонецЕсли;
СтрокаДанных = Чтение.ПрочитатьСтроку();
КонецЦикла;
Чтение.Закрыть();
Посмотрим на еще один быстрый способ — использование ТабличныйДокумент. Платформа 1С умеет автоматически разбирать структуру CSV, если указать правильный тип файла при чтении. Это избавляет от необходимости вручную парсить строки и разделители.
ТабДок = Новый ТабличныйДокумент;
Попытка
ТабДок.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
Сообщить("Не удалось прочитать файл как таблицу.");
Возврат;
КонецПопытки;
Для Сч = 1 По ТабДок.ВысотаТаблицы Цикл
Артикул = ТабДок.Область(Сч, 1).Текст;
Цена = ТабДок.Область(Сч, 2).Текст;
КонецЦикла;
Проанализируем дополнительные сложности, которые могут возникнуть при работе с CSV:
ПрочитатьСтроку() воспримет это как две разные записи. В таких случаях требуется более сложный алгоритм обработки или использование внешних компонент.СтрРазделить просто разбивает строку по символу, поэтому логику обработки кавычек придется реализовывать самостоятельно.Для максимально надежной работы в современных версиях платформы (8.3.9+) рекомендуется также обратить внимание на ЧтениеДанных (Stream API), которое обеспечивает наиболее высокую производительность при работе с потоками данных.