Разработка и Конфигурация · 11 мин
Как загрузить TXT-файл в 1С: пошаговая инструкция
Как загрузить txt файл в 1С: чтение через ТекстовыйДокумент и ЧтениеТекста, разбор строк, кодировки, обработка ошибок и готовые примеры кода на встроенном языке.
Загрузка данных из текстового файла — одна из самых частых задач при работе с 1С: так переносят прайсы поставщиков, выписки банков, списки номенклатуры и результаты выгрузки из сторонних систем. TXT-формат прост, но именно из-за его простоты легко столкнуться с проблемами кодировки, разделителей и структуры строк.
В 1С есть несколько способов прочитать текстовый файл: штатные объекты встроенного языка (ТекстовыйДокумент, ЧтениеТекста), универсальные обработки загрузки табличных данных и типовые механизмы обмена в конфигурациях. Выбор зависит от того, разовая это задача или регулярная загрузка, и есть ли у вас доступ к конфигуратору.
Ниже разобраны все рабочие варианты: от простого чтения файла построчно до полноценной загрузки данных в справочники и документы с проверкой результата.
Определите структуру файла перед загрузкой
Прежде чем писать код или запускать обработку, откройте TXT-файл в обычном блокноте и ответьте на три вопроса: какой разделитель используется между полями (табуляция, точка с запятой, запятая, вертикальная черта), есть ли строка заголовков и в какой кодировке сохранён файл. От этого зависят все дальнейшие настройки.
Кодировку проще всего проверить в Notepad++ или аналогичном редакторе — она отображается в строке состояния. Самые распространённые варианты: UTF-8, Windows-1251 (ANSI) и OEM-866 для старых DOS-выгрузок. Если открыть файл не в той кодировке, кириллица превратится в «кракозябры» — тот же эффект будет и при загрузке в 1С с неверно указанной кодировкой.
Обратите внимание на строки, которые не являются данными: заголовки, пустые строки в конце файла, итоговые строки вида «Всего записей: 150». Их нужно либо пропускать в коде, либо удалить из файла заранее, иначе в базу попадёт мусор.
Откройте файл и посмотрите, чем отделены колонки друг от друга
Проверьте в редакторе; неверная кодировка даёт нечитаемый текст
Их нужно пропускать или удалить, иначе загрузятся лишние записи
Способ 1. Чтение файла через ТекстовыйДокумент
Объект ТекстовыйДокумент — самый простой способ прочитать небольшой файл целиком. Он загружает весь текст в память и позволяет обращаться к строкам по номеру. Подходит для файлов размером до нескольких десятков тысяч строк.
Текст = Новый ТекстовыйДокумент;
Текст.Прочитать("C:\Данные\прайс.txt", КодировкаТекста.UTF8);
Для НомерСтроки = 2 По Текст.КоличествоСтрок() Цикл
Строка = Текст.ПолучитьСтроку(НомерСтроки);
Если ПустаяСтрока(Строка) Тогда
Продолжить;
КонецЕсли;
Поля = СтрРазделить(Строка, ";");
// Поля[0] — наименование, Поля[1] — цена и т.д.
КонецЦикла;
Обратите внимание: цикл начинается со второй строки, если первая строка файла — заголовок. Функция СтрРазделить разбивает строку по разделителю в массив; перед обращением к элементам массива убедитесь, что их количество соответствует ожидаемому, иначе получите ошибку «Индекс находится за границами массива».
Способ 2. Построчное чтение через ЧтениеТекста
Для больших файлов правильнее использовать объект ЧтениеТекста — он читает файл последовательно и не загружает его целиком в память. Это безопаснее для файлов в сотни тысяч строк и снижает риск нехватки памяти на сервере.
Чтение = Новый ЧтениеТекста;
Чтение.Открыть("C:\Данные\выписка.txt", КодировкаТекста.ANSI);
Строка = Чтение.ПрочитатьСтроку();
Пока Строка <> Неопределено Цикл
Если Не ПустаяСтрока(Строка) Тогда
Поля = СтрРазделить(Строка, Символы.Таб);
// обработка полей
КонецЕсли;
Строка = Чтение.ПрочитатьСтроку();
КонецЦикла;
Чтение.Закрыть();
Обязательно закрывайте объект методом Закрыть() после завершения чтения: пока файл открыт, он может быть заблокирован для других программ, а при аварийном прерывании кода блокировка иногда сохраняется до перезапуска сеанса.
Запись данных в справочники и документы
Чтение строк — только половина задачи. Дальше данные нужно преобразовать в объекты 1С. Типовой сценарий для справочника: сначала поиск существующего элемента по ключевому полю (код, артикул, наименование), затем либо обновление найденного, либо создание нового.
Найденный = Справочники.Номенклатура.НайтиПоНаименованию(Поля[0]);
Если Найденный.Пустая() Тогда
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.Наименование = Поля[0];
Иначе
НовыйЭлемент = Найденный.ПолучитьОбъект();
КонецЕсли;
НовыйЭлемент.Записать();
При загрузке больших объёмов оборачивайте запись в транзакцию с разумным размером порции — например, фиксируйте транзакцию каждые 500–1000 записей. Одна гигантская транзакция на весь файл при ошибке в конце откатит всю работу, а запись каждого элемента в отдельной транзакции замедлит процесс в разы.
Числа и даты из текстового файла всегда приходят строками. Преобразуйте их явно: Число(СтрЗаменить(Поля[1], ",", ".")) для цен с учётом десятичного разделителя, для дат — разбор по шаблону. Строка «не число» при прямом присвоении в числовой реквизит вызовет ошибку преобразования.
Загрузка без программирования: типовые обработки
Если нет доступа к конфигуратору или задача разовая, используйте готовые механизмы. Во многих типовых конфигурациях (Управление торговлей, ERP, Комплексная автоматизация) есть обработка «Загрузка данных из табличного документа» — она находится в разделе администрирования или подключается из дополнительных обработок.
Порядок работы с ней такой: TXT-файл сначала открывают в Excel или LibreOffice (при открытии указывают разделитель), затем копируют таблицу в табличный документ обработки, сопоставляют колонки с реквизитами объекта и запускают загрузку. Обработка умеет искать существующие элементы и создавать новые.
У этого пути есть ограничения: сложную логику (проверки, вычисляемые поля, загрузка в несколько связанных объектов) такая обработка не реализует. Для регулярных загрузок с бизнес-правилами всё равно потребуется доработка.
Сравнение способов загрузки
Полный контроль над логикой, подходит для регулярных загрузок; требует доступа к конфигуратору и навыков программирования
Не требует программирования, быстро для разовых задач; ограничена простыми сценариями без сложных проверок
Подходит, если в конфигурации есть штатная загрузка из Excel; лишний шаг преобразования и риск потери форматирования
Типичные ошибки и их устранение
Большинство проблем при загрузке TXT сводится к нескольким повторяющимся ситуациям. Понимание их причин экономит часы отладки.
Отдельного внимания заслуживают файлы с «плавающей» структурой: когда поставщик иногда добавляет или убирает колонки. Для таких случаев разбирайте данные не по индексам, а по заголовкам — прочитайте первую строку, найдите в ней позиции нужных колонок и используйте эти позиции при разборе остальных строк.
Проверка результата загрузки
После завершения загрузки обязательно сверьте результат с исходным файлом. Минимальный контроль: количество обработанных строк должно совпадать с количеством строк данных в файле (за вычетом заголовков и пропущенных пустых). Выводите в сообщения счётчики: сколько создано, сколько обновлено, сколько пропущено с ошибками.
Дополнительно откройте несколько случайных элементов в базе и сравните значения с файлом вручную — особенно числа с дробной частью и даты. Именно на них чаще всего проявляются ошибки преобразования, которые не вызывают исключений, но искажают данные.
Как проверить результат
Создано + обновлено + пропущено = числу строк данных в файле
Сумма не сходится — часть строк потеряна или обработана дважды
Наименования читаемы, соответствуют файлу
«Кракозябры» — файл прочитан в неверной кодировке
Значения совпадают с файлом, дробная часть на месте
Цены округлены, даты сдвинуты или пустые — ошибка преобразования
Повторный запуск не создаёт новых элементов
Каждый запуск плодит копии — нет поиска существующих
Что важно запомнить
Перед загрузкой определите разделитель, кодировку и служебные строки файла. Читайте файл через ЧтениеТекста или ТекстовыйДокумент, разбивайте строки функцией СтрРазделить, преобразуйте числа и даты явно. Перед записью ищите существующие элементы, работайте на копии базы и проверяйте результат по счётчикам и выборочным записям.
Частые вопросы
Какую кодировку указывать, если неизвестно, в какой сохранён файл?
Начните с UTF-8 — это самый распространённый вариант для современных выгрузок. Если кириллица отображается нечитаемо, попробуйте КодировкаТекста.ANSI (Windows-1251), затем OEM. Практический приём: откройте файл в Notepad++ — он показывает кодировку в строке состояния и позволяет пересохранить файл в нужной.
Как загрузить TXT, если поля имеют фиксированную ширину, а разделителя нет?
Используйте функции работы со строками: Сред(Строка, НачПозиция, Длина) для извлечения каждого поля по позициям. Позиции определите по документации на формат выгрузки или вручную, посчитав символы в образце строки. Учитывайте, что пробелы-заполнители в конце полей нужно обрезать функцией СокрЛП.
Файл очень большой, 1С зависает при загрузке. Что делать?
Читайте файл через ЧтениеТекста построчно, а не целиком. Запись ведите порциями с фиксацией транзакции каждые 500–1000 элементов. Если загрузка выполняется на клиенте, перенесите её на сервер. Для файлов в миллионы строк рассмотрите предварительную разбивку файла на части.
Можно ли загрузить TXT в 1С:Бухгалтерию без доработок?
Да, частично. В 1С:Бухгалтерии есть штатная загрузка банковских выписок (клиент-банк часто выгружает именно текстовые файлы специального формата) и загрузка номенклатуры из табличных документов. Произвольный TXT собственной структуры без обработки или доработки загрузить не получится.
Как пропустить первую строку файла с заголовками?
При чтении через ЧтениеТекста просто выполните ПрочитатьСтроку() один раз до начала цикла — первая строка будет считана и проигнорирована. При работе с ТекстовыйДокумент начните цикл со второй строки: Для Номер = 2 По Текст.КоличествоСтрок().
Что делать, если в данных встречается сам символ-разделитель?
Стандартное решение — поля с разделителем внутри заключаются в кавычки (так работает CSV). Простая функция СтрРазделить такой формат корректно не разберёт: потребуется либо собственный парсер с учётом кавычек, либо договориться с источником данных о другом разделителе, который гарантированно не встречается в значениях, например вертикальной черте.