К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как загрузить текстовый файл в 1С

Как загрузить текстовый файл в 1С: чтение через ЧтениеТекста, разбор CSV и TXT, загрузка в справочники и документы, типичные ошибки и примеры кода.

Загрузка текстового файла в 1С — типовая задача при обмене данными с банками, поставщиками, кассовым оборудованием и сторонними системами. Текстовый формат (TXT, CSV) используется там, где нет прямой интеграции: выписки, прайсы, списки номенклатуры, результаты инвентаризации с ТСД.

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

Ниже разобраны оба пути: от подготовки файла и выбора кодировки до готового кода чтения и проверки результата. Отдельно рассмотрены ошибки, которые чаще всего приводят к «кракозябрам», пропуску строк и дублям данных.

Какие текстовые форматы встречаются и как их отличить

Под «текстовым файлом» обычно понимают три разновидности. Первый — CSV: строки данных, поля разделены запятой, точкой с запятой или табуляцией, первая строка часто содержит заголовки колонок. Второй — фиксированная ширина колонок: каждое поле занимает строго определённые позиции в строке (так выгружают данные старые банковские и кассовые системы). Третий — произвольный структурированный текст с маркерами секций, например файлы обмена с банком формата «1CClientBankExchange».

Откройте файл в Блокноте или Notepad++ и посмотрите на структуру. Если поля отделены одинаковым символом — это разделитель, и удобнее всего разбирать строку функцией СтрРазделить(). Если данные выровнены пробелами в «столбики» — придётся резать строку функцией Сред() по позициям, которые нужно узнать из описания формата источника.

Отдельно проверьте наличие строки заголовков. Если она есть, первую строку при разборе нужно пропустить, иначе заголовки колонок попадут в данные и вызовут ошибки преобразования типов (например, слово «Сумма» не превратится в число).

Подготовка файла: кодировка, разделители, очистка

До загрузки определите кодировку. В Notepad++ она показана в строке состояния; типовые признаки проблемы — русский текст отображается как «РљРѕР» (UTF-8, прочитанный как 1251) или как «Љ®¤» (1251, прочитанный как OEM). Проще всего пересохранить файл в UTF-8 и при чтении явно указать эту кодировку — тогда поведение будет предсказуемым на любой машине.

Проверьте разделитель: в русской локали Excel при сохранении CSV по умолчанию ставит точку с запятой, а не запятую. Также обратите внимание на десятичный разделитель в числах: «1 234,56» с пробелом-разделителем разрядов не преобразуется в число напрямую — пробелы и неразрывные пробелы нужно предварительно удалить функцией СтрЗаменить().

Уберите из файла служебные строки: итоги, пустые строки в конце, строки-комментарии. Либо заложите в алгоритм их пропуск по признаку (пустая строка, строка начинается с определённого символа). Чем меньше «мусора» доходит до разбора, тем меньше исключений.

Загрузка штатной обработкой без программирования

В конфигурациях на Библиотеке стандартных подсистем (УТ 11, ERP, Бухгалтерия 3.0, УНФ) есть обработка «Загрузка данных из файла». Обычно она доступна из карточки списка справочника по кнопке «Загрузить данные из файла» или через раздел «Администрирование» → «Получение файлов из интернета» / «Обмен данными». Обработка ориентирована на табличные файлы: Excel, CSV, а также файлы, вставленные через буфер обмена.

Порядок работы: выберите файл, укажите, что первая строка — заголовки, сопоставьте колонки файла реквизитам справочника (обработка показывает таблицу соответствия), задайте правила поиска существующих элементов — по коду, наименованию или артикулу. После сопоставления запустите загрузку и изучите протокол: в нём перечислены созданные, обновлённые и пропущенные строки с причинами.

Ограничения штатного пути: обработка загружает в основном табличные части и простые справочники, не умеет сложную логику (например, создать документ и сразу провести его с расчётом цен), а нестандартный формат строки может не распарсить. Если данных много и логика нестандартная — переходите к программному чтению.

Загрузка через типовую обработку
  1. 1
    Сохраните исходные данные как CSV в кодировке UTF-8
  2. 2
    Откройте список нужного справочника и выберите «Загрузить данные из файла»
  3. 3
    Укажите файл и отметьте, что первая строка содержит заголовки
  4. 4
    Сопоставьте колонки файла реквизитам 1С
  5. 5
    Настройте поиск дублей: по наименованию, коду или артикулу
  6. 6
    Запустите загрузку и проверьте протокол: сколько создано, обновлено, пропущено

Программное чтение файла через ЧтениеТекста

Основной объект для чтения — ЧтениеТекста. Он открывает файл с указанной кодировкой и позволяет читать построчно или целиком. Для файлов с разделителями также существует объект ЧтениеCSV (появился в свежих версиях платформы), но построчный разбор через ЧтениеТекста универсальнее и работает везде.

Типовой каркас обработки на клиенте выглядит так: поместить файл во временное хранилище (НачатьПомещениеФайлаНаСервер), на сервере записать его во временный файл, открыть ЧтениеТекста и в цикле читать строки. Каждую строку разбивают СтрРазделить(Строка, ";") и обращаются к полям по индексу. Для тонкого клиента и веб-клиента прямой путь к файлу на диске пользователя недоступен — только через помещение в хранилище.

bsl
Чтение = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
Строка = Чтение.ПрочитатьСтроку();
Пока Строка <> Неопределено Цикл
    Если ПустаяСтрока(Строка) Тогда
        Строка = Чтение.ПрочитатьСтроку();
        Продолжить;
    КонецЕсли;
    Поля = СтрРазделить(Строка, ";");
    // Поля[0] — код, Поля[1] — наименование, Поля[2] — цена
    Строка = Чтение.ПрочитатьСтроку();
КонецЦикла;
Чтение.Закрыть();

Числа и даты преобразуйте явно и с защитой от ошибок. Конструкция вида Число(СтрЗаменить(Поля[2], " ", "")) упадёт, если в поле окажется текст. Безопаснее использовать ОписаниеТипов и его метод ПривестиЗначение() — он не выбрасывает исключение, а возвращает значение по умолчанию, что удобно для массового разбора с накоплением списка ошибок.

Запись данных в справочники и документы

Перед созданием элемента ищите существующий: Справочники.Номенклатура.НайтиПоНаименованию() или НайтиПоКоду(). Если элемент найден — обновляйте реквизиты, если нет — создавайте новый через СоздатьЭлемент(). Это защищает от дублей при повторной загрузке того же файла, что на практике случается постоянно.

Массовую загрузку оборачивайте в транзакцию: НачатьТранзакцию() перед циклом, ЗафиксироватьТранзакцию() после. Если на 500-й строке произойдёт ошибка, вы сможете откатить все изменения через ОтменитьТранзакцию() и не получите полузагруженный справочник. Либо, наоборот, фиксируйте пачками по 100–500 строк, если файл огромный и важно не потерять уже обработанное — но тогда ведите журнал обработанных строк.

Для документов логика та же: Документы.ПоступлениеТоваровУслуг.СоздатьДокумент(), заполнение шапки и табличной части, Записать(РежимЗаписиДокумента.Проведение). Проведение в цикле — самое медленное место: на больших объёмах сначала записывайте документы без проведения, а проводите отдельным проходом с обработкой ошибок, чтобы видеть, какие именно документы не провелись и почему.

Тонкий клиент, файловая и клиент-серверная база: нюансы запуска

В файловой базе код может читать файл напрямую с диска, если обработка выполняется на компьютере пользователя. В клиент-серверном варианте сервер 1С не видит диск пользователя: файл нужно сначала передать на сервер через временное хранилище (ПоместитьВоВременноеХранилище с клиента, ПолучитьИзВременногоХранилища на сервере) и записать во временный файл методом ПолучитьИмяВременногоФайла().

Диалог выбора файла в тонком клиенте — асинхронный: НачатьПомещениеФайлаНаСервер() с описанием оповещения. Синхронные вызовы (ВыбратьФайл, старый ПоместитьФайл) в современных режимах запуска заблокированы, и обработки, написанные «по-старому», в них не работают. Если ваша обработка должна работать и в веб-клиенте, используйте только асинхронные методы.

Если загрузка должна выполняться регулярно по расписанию, оформите её как регламентное задание: файл забирается из сетевого каталога, доступного серверу 1С. Учётная запись службы сервера 1С должна иметь права на чтение этого каталога — частая причина «задание не видит файл» именно в правах, а не в коде.

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

Проверка результата и типичные ошибки

После загрузки сверьте контрольные цифры: количество строк в файле (минус заголовок) должно совпадать с суммой созданных и обновлённых элементов плюс осознанно пропущенных. Для суммовых данных посчитайте итог по колонке в исходном файле (тот же Excel) и сравните с итогом по загруженным объектам в 1С — расхождение сразу укажет на пропущенные или задвоенные строки.

Контрольные точки

Как проверить результат загрузки

Количество строк
Норма

Совпадает с числом обработанных записей в протоколе

Тревожный признак

В протоколе меньше строк, чем в файле, и нет списка пропущенных

Кириллица в данных
Норма

Наименования читаемы

Тревожный признак

Кракозябры — неверно указана кодировка при чтении

Числа и суммы
Норма

Итог по колонке файла равен итогу в 1С

Тревожный признак

Расхождение — проблема с разделителем разрядов или десятичной точкой

Дубли
Норма

Повторная загрузка того же файла создаёт 0 новых элементов

Тревожный признак

Повторная загрузка снова создаёт элементы — не работает поиск существующих

Типичные ошибки
01
Чтение без указания кодировки — платформа берёт кодировку по умолчанию, и на другом компьютере русский текст ломается
02
Разбор CSV только по запятой, хотя Excel в русской локали пишет точку с запятой — вся строка попадает в одно поле
03
Число() без очистки строки — неразрывный пробел из Excel вызывает ошибку преобразования, загрузка падает
04
Отсутствие пропуска строки заголовков — заголовки превращаются в элемент справочника или ломают преобразование типов
05
Создание элементов без поиска дублей — каждая повторная загрузка плодит копии
06
Загрузка сразу в рабочую базу без копии — ошибка в логике требует ручной чистки тысяч объектов

Частые вопросы

Чем открыть файл на сервере, если обработка работает в тонком клиенте?

Напрямую по пути с диска пользователя — никак. Поместите файл во временное хранилище асинхронным методом НачатьПомещениеФайлаНаСервер, на сервере получите двоичные данные из хранилища, запишите их во временный файл (ПолучитьИмяВременногоФайла с расширением) и уже его откройте через ЧтениеТекста.

Русские буквы загружаются кракозябрами. Что делать?

Указана неверная кодировка при создании ЧтениеТекста. Определите реальную кодировку файла в Notepad++ и передайте её явно: КодировкаТекста.UTF8, КодировкаТекста.ANSI (Windows-1251) или КодировкаТекста.OEM. Надёжнее всего заранее пересохранить файл в UTF-8.

Как загрузить CSV, если внутри полей есть разделитель в кавычках?

Простой СтрРазделить такой случай не разберёт: поле «Иванов, Иван» в кавычках развалится на два. Используйте объект ЧтениеCSV, который корректно обрабатывает кавычки, либо пишите посимвольный разбор с учётом состояния «внутри кавычек».

Можно ли загрузить данные в документ и сразу провести его?

Да: после заполнения вызовите Записать(РежимЗаписиДокумента.Проведение). Но при массовой загрузке лучше сначала записать все документы без проведения, а затем проводить отдельным циклом с перехватом исключений — так вы получите список непроведённых документов с причинами, а не остановку на первой же ошибке.

Файл очень большой, обработка зависает. Как ускорить?

Выводите прогресс через ДлительныеОперации, чтобы сеанс не выглядел зависшим. Не ищите дубли запросом к базе на каждой строке — выгрузите существующие коды в соответствие один раз до цикла. Фиксируйте транзакцию пачками по несколько сотен строк, а не на каждой записи.

Есть ли альтернатива самописной обработке для регулярных загрузок?

Да. Для обменов по стандартным форматам подойдёт «Конвертация данных» или готовые планы обмена. Для загрузки из табличных файлов без разработки — типовая обработка «Загрузка данных из файла». Самописный код оправдан, когда формат нестандартный или нужна специфическая бизнес-логика при записи.

Итог

Что важно запомнить

Определите структуру файла и кодировку до начала работы. Простые табличные данные грузите типовой обработкой, нестандартные — через ЧтениеТекста с явной кодировкой и разбором по разделителю. Всегда ищите существующие элементы перед созданием, работайте в транзакции, тестируйте на копии базы и сверяйте итоги после загрузки.