Разработка и Конфигурация · 11 мин
1С: как прочитать CSV файл
Как прочитать CSV файл в 1С: чтение через ЧтениеТекста и ТекстовыйДокумент, разбор разделителей, кодировки, обработка кавычек и типичные ошибки.
CSV — один из самых распространённых форматов обмена данными: банковские выписки, выгрузки из Excel, прайсы поставщиков, данные касс и весов. В 1С нет встроенного объекта «CSV-парсер», поэтому файл читают как обычный текст и разбирают построчно встроенным языком. Задача сводится к трём шагам: открыть файл с правильной кодировкой, прочитать строки, разбить каждую строку по разделителю.
Стандартный инструмент — объект ЧтениеТекста (или устаревший, но ещё встречающийся ТекстовыйДокумент). Разделитель чаще всего точка с запятой (выгрузки Excel в русской локали) или запятая (классический CSV). Главные подводные камни — неверная кодировка, кавычки вокруг значений и разделитель внутри самих данных.
Что нужно знать о CSV перед чтением
CSV (Comma-Separated Values) — текстовый файл, где каждая строка — запись, а значения внутри строки отделены разделителем. Несмотря на название, реальный разделитель может быть запятой, точкой с запятой, табуляцией или вертикальной чертой. Excel в русской локали при сохранении в CSV по умолчанию использует точку с запятой.
Значения, содержащие разделитель или перенос строки, по стандарту заключаются в двойные кавычки. Например, наименование Кабель, медный; 3х1.5 в файле будет выглядеть как "Кабель, медный; 3х1.5". Простое разбиение по разделителю без учёта кавычек разорвёт такое значение на части — это самая частая причина «кривого» импорта.
Перед написанием кода откройте файл в текстовом редакторе (Notepad++, VS Code) и определите три вещи: кодировку (UTF-8, UTF-8 с BOM, Windows-1251), символ-разделитель и наличие кавычек вокруг значений. Это сэкономит время на отладке.
Базовый способ: чтение через ЧтениеТекста
Объект ЧтениеТекста — основной инструмент для построчного чтения файлов в 1С. Он позволяет явно указать кодировку и читать файл последовательно, не загружая его целиком в память, что важно для больших выгрузок.
ЧтениеТекста = Новый ЧтениеТекста("C:\Data\price.csv", КодировкаТекста.UTF8);
СтрокаФайла = ЧтениеТекста.ПрочитатьСтроку();
Пока СтрокаФайла <> Неопределено Цикл
Если Не ПустаяСтрока(СтрокаФайла) Тогда
Колонки = СтрРазделить(СтрокаФайла, ";");
// Колонки[0] — первая колонка, Колонки[1] — вторая и т.д.
КонецЕсли;
СтрокаФайла = ЧтениеТекста.ПрочитатьСтроку();
КонецЦикла;
ЧтениеТекста.Закрыть();
Функция СтрРазделить возвращает массив подстрок. Обратите внимание: по умолчанию она включает пустые значения, то есть две точки с запятой подряд дадут пустой элемент массива — это правильно для CSV, где пустая колонка должна сохранить свою позицию. Если передать вторым параметром Ложь, пустые элементы будут отброшены и нумерация колонок «поедет».
- 1Откройте файл в редакторе и определите кодировку и разделитель
- 2Создайте объект ЧтениеТекста с нужной кодировкой
- 3Прочитайте и пропустите строку заголовков, если она есть
- 4В цикле читайте строки и разбивайте их функцией СтрРазделить
- 5Проверяйте количество колонок в каждой строке перед обращением по индексу
- 6Закройте файл вызовом Закрыть() после цикла
Как определить и указать кодировку
Неверная кодировка — причина номер один «кракозябр» вместо русского текста. Файлы из Excel обычно сохраняются в ANSI (Windows-1251), файлы из веб-систем и Linux — в UTF-8, иногда с BOM-меткой в начале.
Кодировка задаётся вторым параметром конструктора:
// UTF-8
ЧтениеТекста = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
// Windows-1251 (ANSI)
ЧтениеТекста = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.ANSI);
// Системная кодировка по умолчанию
ЧтениеТекста = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.Системная);
Если кодировка файла заранее неизвестна, надёжный приём — прочитать первые строки в UTF-8 и проверить наличие «кракозябр» (символов замены), а при их обнаружении перечитать файл в ANSI. На практике проще договориться с поставщиком данных о фиксированной кодировке и зафиксировать её в настройках обработки.
Как проверить, что кодировка выбрана верно
Читаемые слова без посторонних символов
Загрузка или ??? — кодировка не совпадает
Сразу начинается значение
Перед текстом невидимый BOM-символ ломает имя первой колонки
Распознаются функциями Число() и Дата()
Лишние пробелы или символы мешают преобразованию
Разбор строки: разделители, кавычки, типы данных
Для простых файлов без кавычек достаточно СтрРазделить(Строка, ";"). Если в данных встречаются значения в кавычках, потребуется либо собственный посимвольный разбор, либо удаление обрамляющих кавычек после разбиения — когда гарантировано, что разделитель внутри значений не встречается:
Колонки = СтрРазделить(СтрокаФайла, ";");
Для Индекс = 0 По Колонки.Количество() - 1 Цикл
Значение = Колонки[Индекс];
Если СтрНачинаетсяС(Значение, """") И СтрЗаканчиваетсяНа(Значение, """") Тогда
Значение = Сред(Значение, 2, СтрДлина(Значение) - 2);
КонецЕсли;
Колонки[Индекс] = Значение;
КонецЦикла;
Все значения из CSV приходят как строки. Числа, даты и булево нужно преобразовывать явно, причём с защитой от ошибок: в данных встречаются пустые ячейки, пробелы-разделители тысяч и даты в разных форматах. Используйте ОписаниеТипа с методом ПривестиЗначение или обёртку в Попытка...Исключение:
Функция СтрокаВЧисло(ЗначениеСтрокой)
Очищенное = СтрЗаменить(ЗначениеСтрокой, " ", "");
Очищенное = СтрЗаменить(Очищенное, ",", ".");
Попытка
Возврат Число(Очищенное);
Исключение
Возврат 0;
КонецПопытки;
КонецФункции
Чтение больших файлов и работа на сервере
Для файлов в сотни тысяч строк построчное чтение через ЧтениеТекста предпочтительнее загрузки всего файла в память через Прочитать(). Потоковое чтение не создаёт пиковой нагрузки на память сервера и позволяет обрабатывать записи порциями — например, записывать в базу каждые 1000 строк с выводом прогресса.
В клиент-серверном режиме важно помнить: код, выполняющийся на сервере, видит файловую систему сервера, а не компьютера пользователя. Поэтому файл с клиента сначала передают на сервер через временное хранилище:
&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
НачатьПомещениеФайла(
Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект),
, , Истина, УникальныйИдентификаторФормы);
КонецПроцедуры
&НаСервере
Процедура ОбработатьФайлНаСервере(АдресХранилища)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("csv");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
// далее чтение через ЧтениеТекста
КонецПроцедуры
Альтернативные способы: ТекстовыйДокумент и табличный документ
Объект ТекстовыйДокумент загружает файл целиком и даёт доступ к строкам по индексу. Он удобен для небольших файлов и когда нужен произвольный доступ к строкам, но проигрывает ЧтениеТекста на больших объёмах:
Текст = Новый ТекстовыйДокумент;
Текст.Прочитать(ИмяФайла, КодировкаТекста.UTF8);
Для НомерСтроки = 2 По Текст.КоличествоСтрок() Цикл
СтрокаФайла = Текст.ПолучитьСтроку(НомерСтроки);
Колонки = СтрРазделить(СтрокаФайла, ";");
КонецЦикла;
Ещё один вариант — открыть CSV как табличный документ через ТабличныйДокумент.Прочитать(). Это работает, но платформа сама решает, как разбивать значения и какие типы им присваивать, поэтому контроль над результатом ниже. Способ приемлем для быстрого просмотра, но не для надёжной загрузки в справочники и документы.
Сравнение способов чтения CSV в 1С
Универсальный выбор: потоковое чтение, контроль кодировки, подходит для больших файлов. Требует ручного разбора строк
Простой доступ к строкам по индексу, удобен для маленьких файлов. Загружает всё в память целиком
Минимум кода для просмотра данных. Платформа сама разбивает и типизирует значения — контроль низкий, для загрузки в базу не рекомендуется
Проверка результата и обработка ошибок
После разбора каждой строки проверяйте количество колонок: если оно отличается от ожидаемого, строка либо повреждена, либо содержит разделитель внутри значения без кавычек. Такие строки нужно пропускать с записью в протокол, а не обрывать всю загрузку.
Полезно вести счётчики: сколько строк прочитано, сколько загружено, сколько отклонено и почему. По завершении выводите пользователю сводку — это позволяет сразу заметить, что файл не соответствует ожидаемому формату, вместо поиска причин «пустого» справочника после загрузки.
Часто задаваемые вопросы
Что делать, если вместо русского текста читаются кракозябры?
Кодировка, указанная при открытии файла, не совпадает с реальной. Попробуйте поочерёдно КодировкаТекста.UTF8 и КодировкаТекста.ANSI. Определить кодировку заранее можно, открыв файл в Notepad++ — она отображается в строке состояния редактора.
Как пропустить строку заголовков?
Просто прочитайте первую строку до начала основного цикла и не обрабатывайте её как данные. Лучше не выбрасывать её, а использовать для построения соответствия имён колонок их индексам.
Разделитель встречается внутри значений — как разобрать строку?
Если значения обрамлены кавычками, нужен посимвольный разбор: идёте по строке, отслеживаете, находитесь ли внутри кавычек, и разбиваете только по разделителям вне кавычек. Готовой функции для этого в платформе нет, приходится писать цикл с флагом «внутри кавычек».
Можно ли читать CSV в тонком клиенте без передачи на сервер?
Да, если у клиента есть доступ к файлу: используйте асинхронные методы НачатьПомещениеФайла или объект ЧтениеТекста на клиенте в модальном/асинхронном режиме. Но для загрузки данных в базу файл всё равно удобнее передать на сервер через временное хранилище.
Колонок в строках разное количество — это нормально?
Нет, для корректного CSV число колонок должно совпадать во всех строках. Расхождение означает либо разделитель внутри данных без кавычек, либо перенос строки внутри значения. Такие строки логируйте и разбирайте отдельно, не пытайтесь загружать «как есть».
Чем CSV отличается от выгрузки Excel (XLSX) для загрузки в 1С?
CSV — простой текст, читается без дополнительных компонентов, но не хранит типы данных и форматирование. XLSX содержит типизированные ячейки, но для его чтения нужен либо Excel на компьютере (COM-объект), либо чтение через табличный документ. Для регулярных обменов CSV надёжнее и быстрее.
Что важно запомнить
CSV в 1С читается объектом ЧтениеТекста с явным указанием кодировки, строки разбираются функцией СтрРазделить по разделителю. Заранее определите кодировку, разделитель и наличие кавычек, проверяйте число колонок в каждой строке и ведите протокол загрузки — это избавит от большинства проблем импорта.