Автоматизация · 12 мин
Как прочитать CSV-файл в 1С: способы, код и разбор ошибок
Как прочитать CSV в 1С: ТекстовыйДокумент, ЧтениеТекста, разбор строк с разделителями, кодировка, типичные ошибки и готовые примеры кода.
CSV — самый частый формат обмена данными между 1С и внешними системами: банковские выписки, выгрузки из сайтов, прайсы поставщиков, данные из Excel. Платформа 1С не имеет встроенного объекта «чтение CSV», поэтому файл разбирают как обычный текст: построчно, с последующим разделением на колонки по символу-разделителю. Задача решается штатными средствами встроенного языка без внешних компонент.
Основная сложность не в самом чтении, а в деталях: кодировка файла, разделитель (запятая, точка с запятой, табуляция), кавычки вокруг значений, переносы строк внутри полей. Если не учесть эти моменты, данные загрузятся со «сдвигом» колонок или в виде иероглифов. Ниже разобраны рабочие способы чтения CSV на встроенном языке 1С, проверка результата и типичные ошибки.
Что проверить в файле перед чтением
Прежде чем писать код, откройте CSV в любом текстовом редакторе (например, Notepad++ или Блокнот) и определите три вещи: разделитель колонок, наличие строки заголовков и кодировку. Разделителем может быть запятая, точка с запятой, табуляция или вертикальная черта — от этого зависит параметр разбора строки.
Кодировку проще всего увидеть в строке состояния редактора: чаще всего встречаются UTF-8 (с BOM или без) и Windows-1251 (ANSI). Excel при сохранении «CSV (разделители — запятые)» в русской локали обычно пишет точку с запятой и кодировку ANSI. Если кодировку указать неверно, кириллица превратится в нечитаемые символы.
Также проверьте, нет ли в данных кавычек и переносов строк внутри значений. Если поле содержит запятую или перевод строки, корректный CSV оборачивает его в двойные кавычки. Простой разбор через СтрРазделить() такие файлы испортит — для них нужен более аккуратный алгоритм или загрузка через табличный документ.
Разбивать строку функцией СтрРазделить(Строка, ";")
Проверить, нет ли запятых внутри значений в кавычках
Попробовать UTF-8, затем Windows-1251
Простой разбор не подойдёт, нужен учёт кавычек
Способ 1: чтение через ЧтениеТекста
Объект ЧтениеТекста — основной инструмент для больших файлов: он читает файл последовательно и не загружает его целиком в память. Подходит для выгрузок на десятки и сотни тысяч строк. Кодировка задаётся при открытии.
Чтение = Новый ЧтениеТекста("C:\Обмен\price.csv", КодировкаТекста.UTF8);
СтрокаФайла = Чтение.ПрочитатьСтроку(); // первая строка — заголовки, пропускаем
СтрокаФайла = Чтение.ПрочитатьСтроку();
Пока СтрокаФайла <> Неопределено Цикл
Если СокрЛП(СтрокаФайла) = "" Тогда
СтрокаФайла = Чтение.ПрочитатьСтроку();
Продолжить;
КонецЕсли;
Колонки = СтрРазделить(СтрокаФайла, ";");
Артикул = СокрЛП(Колонки[0]);
Наименование = СокрЛП(Колонки[1]);
Цена = Число(СтрЗаменить(Колонки[2], ",", "."));
// здесь — запись в справочник или регистр
СтрокаФайла = Чтение.ПрочитатьСтроку();
КонецЦикла;
Чтение.Закрыть();
Обратите внимание на три детали. Во-первых, первую строку с заголовками читают и отбрасывают до цикла — иначе заголовки попадут в данные. Во-вторых, пустые строки в конце файла нужно пропускать, иначе получите пустые записи. В-третьих, числа с запятой в качестве десятичного разделителя перед преобразованием заменяют на точку: функция Число() ожидает точку.
Доступ к элементам массива Колонки[0] безопасен только если вы уверены в числе колонок. Если файл формирует внешняя система и структура может «плыть», проверяйте Колонки.Количество() перед обращением по индексу — иначе получите ошибку «Индекс находится за границами массива».
Способ 2: чтение через ТекстовыйДокумент
ТекстовыйДокумент загружает файл целиком и даёт доступ к строкам по номеру. Способ удобен для небольших файлов (до нескольких десятков тысяч строк) и когда нужно обращаться к строкам произвольно, а не последовательно.
Текст = Новый ТекстовыйДокумент;
Текст.Прочитать("C:\Обмен\price.csv", КодировкаТекста.UTF8);
Для НомерСтроки = 2 По Текст.КоличествоСтрок() Цикл
СтрокаФайла = Текст.ПолучитьСтроку(НомерСтроки);
Если СокрЛП(СтрокаФайла) = "" Тогда
Продолжить;
КонецЕсли;
Колонки = СтрРазделить(СтрокаФайла, ";");
// обработка колонок
КонецЦикла;
Нумерация строк в ТекстовыйДокумент начинается с 1, поэтому цикл с пропуском заголовка начинается со второй строки. Метод КоличествоСтрок() возвращает общее число строк, включая пустые в конце файла.
Главное ограничение способа — память: весь файл загружается сразу. Для файлов в сотни мегабайт это приведёт к замедлению или аварийному завершению сеанса. Для таких объёмов используйте ЧтениеТекста или потоковые объекты.
Сравнение способов чтения
Потоковое чтение, минимальный расход памяти. Подходит для больших файлов, но строки доступны только последовательно.
Файл целиком в памяти, произвольный доступ к строкам. Удобен для малых файлов, рискован для больших.
1С сама разбирает CSV по колонкам при Прочитать(). Учитывает кавычки, но медленнее и капризнее к формату.
Способ 3: загрузка через ТабличныйДокумент
Малоизвестный, но рабочий вариант: ТабличныйДокумент умеет открывать CSV напрямую и сам раскладывает значения по ячейкам, корректно обрабатывая кавычки. Это избавляет от ручного разбора строк.
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать("C:\Обмен\price.csv", СпособЧтенияЗначенийТабличногоДокумента.Значение);
Для НомерСтроки = 2 По ТабДок.ВысотаТаблицы Цикл
Артикул = ТабДок.Область(НомерСтроки, 1).Текст;
Наименование = ТабДок.Область(НомерСтроки, 2).Текст;
// ...
КонецЦикла;
Способ хорош, когда в данных есть кавычки и разделители внутри значений: платформа разберёт такие поля правильно. Обратная сторона — скорость: табличный документ строит полноценную структуру с оформлением, поэтому на больших файлах работает заметно медленнее текстовых способов. Используйте его для файлов умеренного размера со сложной структурой полей.
Обработка кавычек и разделителей внутри полей
Если файл содержит значения вида "Петров, Иван";35;"Москва, ул. Ленина", функция СтрРазделить() разорвёт такие поля по запятым внутри кавычек, и колонки «поедут». Признак проблемы — сдвиг данных: в колонке цены оказываются фрагменты текста, количество колонок различается от строки к строке.
Для таких файлов есть три пути. Первый — использовать ТабличныйДокумент, который понимает кавычки сам. Второй — написать посимвольный разбор: идти по строке и игнорировать разделители внутри кавычек. Третий — договориться с источником данных о другом разделителе (табуляция встречается в тексте крайне редко) или об удалении кавычек из выгрузки.
// Упрощённый посимвольный разбор с учётом кавычек
Функция РазобратьСтрокуCSV(Строка, Разделитель)
Результат = Новый Массив;
Текущее = "";
ВнутриКавычек = Ложь;
ДлинаСтроки = СтрДлина(Строка);
Для Поз = 1 По ДлинаСтроки Цикл
Символ = Сред(Строка, Поз, 1);
Если Символ = """" Тогда
ВнутриКавычек = Не ВнутриКавычек;
ИначеЕсли Символ = Разделитель И Не ВнутриКавычек Тогда
Результат.Добавить(Текущее);
Текущее = "";
Иначе
Текущее = Текущее + Символ;
КонецЕсли;
КонецЦикла;
Результат.Добавить(Текущее);
Возврат Результат;
КонецФункции
Типичные ошибки и как их избежать
Самая частая ошибка — неверная кодировка. Если после чтения вместо русских букв видны «РљСѓРїР» или «????», смените параметр кодировки: UTF-8 ↔ Windows-1251 решают подавляющее большинство случаев. Файлы из старых DOS-программ могут быть в OEM (CP866) — для них есть КодировкаТекста.OEM.
Вторая группа ошибок — преобразование типов. Числа с пробелами-разделителями тысяч («1 250,50») не преобразуются функцией Число() напрямую: сначала уберите пробелы через СтрЗаменить(). Даты из внешних систем часто идут в формате «ГГГГ-ММ-ДД» или «ДД.ММ.ГГГГ» — их разбирают вручную через Дата() с извлечением частей строки, а не полагаются на автоматику.
Третья типичная ситуация — файл заблокирован другой программой (чаще всего открыт в Excel). Чтение завершится ошибкой «Процесс не может получить доступ к файлу». Закройте файл в Excel или копируйте его во временный каталог перед чтением.
Запись прочитанных данных и проверка результата
Прочитанные колонки обычно превращают в элементы справочников, строки документов или записи регистров сведений. Перед записью ищите существующий объект по ключевому полю (артикул, ИНН, код), чтобы не плодить дубли: при повторной загрузке того же файла элементы должны обновляться, а не создаваться заново.
Для больших файлов оборачивайте запись порциями в транзакции (например, каждые 1000 строк) и ведите счётчики: прочитано строк, создано, обновлено, пропущено с ошибкой. Эти счётчики выводите пользователю по завершении — это простейший способ убедиться, что загрузилось именно то количество строк, что было в файле.
Как проверить результат загрузки
Загружено столько строк, сколько данных в файле (минус заголовок и пустые)
Число меньше или больше — есть пропуски или дубли
Названия и ФИО читаются нормально
Иероглифы или знаки вопроса — неверная кодировка
Суммы совпадают с исходным файлом, десятичная часть на месте
Нули, округление до целых, потеря копеек
Каждое значение в своём поле
Сдвиг данных — разделитель или кавычки разобраны неверно
Если загрузка выполняется регулярно, оформите её внешней обработкой или регламентным заданием с записью ошибок в журнал регистрации. Строки, которые не удалось разобрать, не должны прерывать всю загрузку — оборачивайте обработку одной строки в Попытка/Исключение и собирайте проблемные строки в отдельный список для ручного разбора.
Что важно запомнить
CSV в 1С читается как текст: ЧтениеТекста для больших файлов, ТекстовыйДокумент для малых, ТабличныйДокумент — когда есть кавычки. Ключ к успеху — правильные кодировка и разделитель, пропуск заголовков, аккуратное преобразование чисел и дат, а также проверка количества загруженных строк до записи данных в рабочую базу.
Частые вопросы
Чем отличается CSV с запятой от CSV с точкой с запятой?
Формально стандарт CSV предполагает запятую, но Excel в русской и европейской локалях сохраняет файлы с точкой с запятой, потому что запятая там — десятичный разделитель чисел. Для 1С разницы нет: просто передайте в СтрРазделить() тот символ, который реально используется в вашем файле.
Как прочитать CSV, если неизвестна кодировка?
Откройте файл в редакторе, который показывает кодировку (Notepad++, VS Code), — она отображается в строке состояния. Если редактора нет, попробуйте прочитать первые строки с КодировкаТекста.UTF8: если кириллица не читается, смените на ANSI (Windows-1251). Эти два варианта покрывают почти все практические случаи.
Можно ли прочитать CSV без записи кода, штатными средствами?
Да, частично. Табличный документ 1С открывает CSV через меню «Файл — Открыть», а дальше данные можно скопировать или обработать. Для загрузки в справочники и документы в типовых конфигурациях есть обработки загрузки данных из табличного документа (например, «Загрузка данных из файла» в БСП) — они принимают CSV, открытый как табличный документ, и сопоставляют колонки с реквизитами без программирования.
Файл очень большой, 1С зависает при чтении. Что делать?
Используйте ЧтениеТекста вместо ТекстовыйДокумент — он не держит весь файл в памяти. Записывайте данные порциями с транзакциями и периодически выводите прогресс через Состояние() или обработку ожидания. Если файл всё равно не поднимается, разбейте его на части внешними средствами и загружайте по очереди.
Как загрузить CSV на клиенте в веб-клиенте или тонком клиенте?
Сначала поместите файл во временное хранилище через НачатьПомещениеФайла(), затем передайте адрес хранилища на сервер, извлеките данные через ПолучитьИзВременногоХранилища() во временный файл и читайте его описанными способами. Прямое чтение с диска клиента на сервере невозможно — сервер не видит файловую систему пользователя.
Числа из CSV загружаются как текст и не суммируются. В чём причина?
Строка из файла — всегда строка, её нужно явно преобразовать: Число(СтрЗаменить(Значение, ",", ".")). Предварительно уберите пробелы-разделители тысяч и неразрывные пробелы (Символ(160)). Если в поле может быть пусто или текст, оборачивайте преобразование в Попытка/Исключение, чтобы одна плохая строка не остановила всю загрузку.