Текстовый файл в 1С:Предприятии 8.3: от просмотра до загрузки данных кодом
Содержание
Чтобы просто посмотреть TXT файл в 1С, откройте главное меню (кнопка с тремя полосками в левом верхнем углу окна), выберите Файл → Открыть и укажите файл. Он откроется во встроенном текстовом редакторе 1С, где его можно читать, править и сохранять. Если нужно не смотреть, а загрузить данные из текстового файла в базу, файл читают кодом: построчно через объект ЧтениеТекста или целиком через ТекстовыйДокумент.
Всё описанное ниже работает одинаково в любой конфигурации на платформе 8.3: Бухгалтерии, ЗУП, УТ. Это механизм платформы, а не конкретной программы. Разница только в том, где вы запускаете код: во внешней обработке, в консоли кода или в доработке конфигурации.
Открыть текстовый файл без программирования
Этот способ подходит, когда нужно глянуть выгрузку банка, лог обмена или файл настроек, не выходя из 1С.
- Нажмите кнопку главного меню в левом верхнем углу.
- Выберите
Файл → Открыть(или нажмитеCtrl+O). - В окне выбора при необходимости переключите фильтр типов на все файлы и выберите нужный
.txt. - Файл откроется в отдельной вкладке. Правки сохраняются через
Файл → Сохранить.
Тот же пункт есть в Конфигураторе. Там текстовый редактор удобнее: работает поиск с заменой (Ctrl+H), переход к строке по номеру (Ctrl+G).
Если меню Файл не видно, проверьте права пользователя. Открытие внешних файлов иногда закрывают ролями. В таком случае откройте файл в Конфигураторе или в Блокноте.
Если русские буквы превратились в набор символов вроде Привет, файл сохранён в другой кодировке. Как с этим справиться, разобрано ниже, в разделе про кодировки.
Чтение TXT построчно: объект ЧтениеТекста
ЧтениеТекста — основной инструмент для загрузки данных из текстового файла. Он не загружает файл в память целиком, а отдаёт по одной строке. Поэтому справляется и с файлами на сотни мегабайт.
Конструктор принимает путь и кодировку:
Чтение = Новый ЧтениеТекста("C:\Обмен\остатки.txt", КодировкаТекста.UTF8);
Метод ПрочитатьСтроку() возвращает очередную строку. Когда строки закончились, он возвращает Неопределено. На этом и строится цикл.
Пример: загрузка остатков из файла с разделителем
Допустим, склад прислал файл, где каждая строка выглядит так: А-1024;Бумага А4;15,5. Нужно получить артикул, наименование и количество.
&НаСервере
Процедура ЗагрузитьОстаткиИзФайла(ИмяФайла)
Чтение = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
НомерСтроки = 0;
Строка = Чтение.ПрочитатьСтроку();
Пока Строка <> Неопределено Цикл
НомерСтроки = НомерСтроки + 1;
Части = СтрРазделить(Строка, ";", Истина);
Если Части.Количество() < 3 Тогда
Сообщить(СтрШаблон("Строка %1 пропущена: мало полей", НомерСтроки));
Иначе
Артикул = СокрЛП(Части[0]);
Наименование = СокрЛП(Части[1]);
Попытка
Количество = Число(СтрЗаменить(СокрЛП(Части[2]), ",", "."));
Исключение
Сообщить(СтрШаблон("Строка %1: не число «%2»", НомерСтроки, Части[2]));
Количество = 0;
КонецПопытки;
// Здесь найдите номенклатуру по артикулу и запишите количество
КонецЕсли;
Строка = Чтение.ПрочитатьСтроку();
КонецЦикла;
Чтение.Закрыть();
КонецПроцедуры
Что важно в этом примере:
- 🔹
СтрРазделитьс третьим параметромИстинасохраняет пустые поля. Без него строкаА-1;;5даст два элемента вместо трёх, и колонки съедут. - 🔹 Десятичную запятую меняем на точку перед
Число(), а само преобразование оборачиваем вПопытка. Одна кривая строка не должна ронять всю загрузку. - 🔹
Закрыть()освобождает файл. Пока он открыт, другая программа не сможет его перезаписать.
Если разделитель — табуляция (так часто выгружают из Excel в «Текст с разделителями табуляции»), передайте в СтрРазделить значение Символы.Таб.
Полезные параметры конструктора
| Параметр | Что даёт |
|---|---|
| Кодировка | КодировкаТекста.UTF8, .ANSI, .OEM, .UTF16 или строка, например "windows-1251" |
| Разделитель строк | Нужен, если строки в файле разделены не переводом строки, а другим символом |
| Монопольно | По умолчанию Истина. Поставьте Ложь, если файл одновременно открыт другой программой, например пишется логом |
Метод Прочитать() без параметров вернёт весь оставшийся текст одной строкой. Это удобно для маленьких файлов: JSON-подобных настроек, коротких ответов сервисов.
Открыть текстовый файл целиком: ТекстовыйДокумент
ТекстовыйДокумент загружает файл в память полностью. Зато даёт доступ к любой строке по номеру и умеет показать файл пользователю в окне.
Текст = Новый ТекстовыйДокумент;
Текст.Прочитать("C:\Обмен\журнал.txt", КодировкаТекста.UTF8);
Всего = Текст.КоличествоСтрок();
Для Н = 1 По Всего Цикл
Строка = Текст.ПолучитьСтроку(Н);
Если СтрНайти(Строка, "ОШИБКА") > 0 Тогда
Сообщить(СтрШаблон("Строка %1: %2", Формат(Н, "ЧГ=0"), Строка));
КонецЕсли;
КонецЦикла;
Нумерация строк начинается с 1, а не с 0. Формат(Н, "ЧГ=0") убирает пробел-разделитель групп: без него строка 1500 выведется как «1 500».
Чем ещё полезен объект:
- 📄
ПолучитьТекст()возвращает весь файл одной строкой. - ✏️
ЗаменитьСтроку(Н, НоваяСтрока),ДобавитьСтроку()иУдалитьСтроку(Н)позволяют поправить файл, аЗаписать()— сохранить его обратно. - 👁
Показать("Заголовок окна")открывает документ на экране пользователя. Метод работает на клиенте.
В управляемой форме удобнее завести реквизит формы типа ТекстовыйДокумент и вывести его на форму полем. Тогда содержимое файла видно прямо в обработке, а пользователь может его править перед загрузкой.
Не открывайте через ТекстовыйДокумент файлы в сотни мегабайт. Весь текст ляжет в оперативную память процесса, и на сервере это ударит по всем пользователям. Для больших файлов — только ЧтениеТекста.
Кракозябры вместо русских букв: выбор кодировки
Кодировка — главная причина, по которой «TXT в 1С открывается неправильно». Платформа не угадывает её надёжно, особенно если в начале файла нет метки BOM. Укажите кодировку явно, и проблема уйдёт.
Определить её можно по тому, как выглядит испорченный текст:
| Что видите вместо «Привет» | Файл на самом деле | Что указать |
|---|---|---|
Привет | UTF-8, читаете как Windows-1251 | КодировкаТекста.UTF8 |
ЏаЁўҐв | DOS (cp866), читаете как Windows-1251 | КодировкаТекста.OEM или "cp866" |
Ïðèâåò | Windows-1251, читаете как латиницу | КодировкаТекста.ANSI или "windows-1251" |
� на месте каждой буквы | Windows-1251, читаете как UTF-8 | КодировкаТекста.ANSI |
| Пробелы между всеми буквами или пустота | UTF-16 | КодировкаТекста.UTF16 |
Быстрая проверка без кода: откройте файл в Блокноте Windows. В строке состояния внизу справа он показывает кодировку. «UTF-8 с BOM» и «UTF-8» читаются через UTF8, «ANSI» — через ANSI.
КодировкаТекста.ANSI и .OEM берут кодовую страницу операционной системы, на которой выполняется код. Если сервер 1С стоит на Linux или Windows с английской локалью, надёжнее передавать строку "windows-1251" или "cp866".
Есть и обратная ловушка. Если первая строка начинается с символов п»ї, файл в UTF-8 с BOM, а вы читаете его как ANSI. Метка попала в данные, и первый артикул не найдётся в базе. Лечится той же сменой кодировки на UTF8.
Файл у пользователя, код на сервере
Самая частая засада при работе с TXT в клиент-серверной базе. Путь C:\Обмен\остатки.txt в серверной процедуре означает диск сервера 1С, а не компьютера бухгалтера. Файл «не существует», хотя он лежит на рабочем столе.
Правильная схема: клиент передаёт файл во временное хранилище, сервер забирает его оттуда.
&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);
НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Результат Тогда
ПрочитатьНаСервере(Адрес);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПрочитатьНаСервере(Адрес)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("txt");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
ЗагрузитьОстаткиИзФайла(ИмяВременногоФайла);
УдалитьФайлы(ИмяВременногоФайла);
КонецПроцедуры
Четвёртый параметр Истина в НачатьПомещениеФайла открывает пользователю окно выбора файла. В свежих версиях платформы есть и более новые методы помещения файлов, но этот работает и в тонком клиенте, и в веб-клиенте.
Если файл всё же должен лежать в общей папке и читаться сервером напрямую, указывайте сетевой путь вида \\fileserver\obmen\ostatki.txt. И дайте права на папку учётной записи, под которой работает служба сервера 1С (при стандартной установке — USR1CV8), а не пользователю, который сидит в программе.
Где запускать код: консоль, внешняя обработка, запуск по расписанию
Код выше не вставишь в окно программы просто так. Вариантов три.
Консоль кода
Для разовой задачи — прочитать файл, посмотреть, сколько в нём строк, найти дубли — подходит обработка-консоль, которая выполняет произвольный код в режиме Предприятия. Такие консоли распространяются как внешние обработки (.epf). Открываете через Файл → Открыть, вставляете код, нажимаете выполнить.
Своя внешняя обработка
Для повторяющейся загрузки сделайте внешнюю обработку
в Конфигураторе: Файл → Новый → Внешняя обработка. Добавьте форму, кнопку и код из разделов выше. Пользователь открывает её через Файл → Открыть или подключает в списке дополнительных обработок.
В Бухгалтерии 3.0 список лежит по пути Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки. Обработка, подключённая так, работает в безопасном режиме и при регистрации запрашивает разрешения, в том числе на доступ к файлам. Если разрешение не выдать, чтение упадёт с ошибкой доступа.
Запуск без участия пользователя
Обработку можно запустить из командной строки параметром /Execute:
"C:\Program Files\1cv8\8.3.24.1586\bin\1cv8.exe" ENTERPRISE /F"D:\Bases\Buh" /N"Обмен" /P"пароль" /Execute "D:\Обработки\ЗагрузкаTXT.epf"
Номер версии в пути подставьте свой. Код загрузки при этом ставят в обработчик открытия формы обработки. Такой запуск удобно повесить на планировщик Windows для ночной загрузки файлов.
Запись TXT из 1С
Обратная задача — выгрузить данные в текстовый файл — решается объектом ЗаписьТекста:
Запись = Новый ЗаписьТекста("C:\Обмен\выгрузка.txt", КодировкаТекста.UTF8, , Ложь);
Запись.ЗаписатьСтроку("Артикул;Наименование;Количество");
Запись.ЗаписатьСтроку("А-1024;Бумага А4;15");
Запись.Закрыть();
Четвёртый параметр отвечает за дописывание: Ложь перезаписывает файл, Истина добавляет строки в конец. Для журналов нужен второй вариант.
КодировкаТекста.UTF8 ставит в начало файла метку BOM. Банковские и учётные программы иногда спотыкаются о неё. Если получатель требует UTF-8 без BOM, соберите текст в строку и сохраните двоичными данными: ПолучитьДвоичныеДанныеИзСтроки(Текст, "UTF-8", Ложь).Записать(ИмяФайла). Третий параметр Ложь отключает метку.
Какой способ выбрать
| Способ | Когда подходит | Ограничения |
|---|---|---|
Файл → Открыть | Посмотреть или поправить файл руками | Ничего не загружает в базу |
ЧтениеТекста | Загрузка данных, большие файлы, логи | Только последовательно, вернуться к строке назад нельзя |
ТекстовыйДокумент | Нужен доступ к строке по номеру, показ файла пользователю, правка | Весь файл в памяти |
ЧтениеТекста.Прочитать() | Маленький файл целиком в строку | Тоже держит всё в памяти |
ЗаписьТекста | Выгрузка из 1С в TXT, журналы | Нужно следить за BOM и кодировкой получателя |
Правило простое. Загружаете в базу — ЧтениеТекста. Показываете или правите — ТекстовыйДокумент. Смотрите один раз — меню Файл.
Ошибки при чтении и как не испортить данные
Пара правил, которые берегут базу:
- Сначала прогон без записи. Пусть обработка прочитает файл, сообщит, сколько строк распознано и какие отброшены, и только потом пишет в базу. Пять минут на проверку отчёта о строках дешевле, чем отмена сотни документов.
- Ошибку конкретной строки ловите внутри цикла.
Попыткавокруг всего цикла остановит загрузку на первой же кривой строке. Внутри цикла она пропустит одну строку и сообщит её номер. - Записывайте в транзакции, если данные связаны.
НачатьТранзакцию()перед записью иЗафиксироватьТранзакцию()после. При ошибкеОтменитьТранзакцию()откатит всё, и в базе не останется половины загрузки. - Текст ошибки выводите полностью. В блоке
ИсключениеиспользуйтеПодробноеПредставлениеОшибки(ИнформацияОбОшибке()): так видно и сообщение платформы, и строку модуля. - Удаляйте временные файлы.
ПолучитьИмяВременногоФайлане чистит за собой. БезУдалитьФайлыкаталог временных файлов сервера разрастается месяцами.
Перед первой загрузкой в рабочую базу сделайте резервную копию или проверьте обработку на копии. Ошибку в сопоставлении колонок проще поймать на тестовых данных.
Частые вопросы
Можно ли открыть TXT в 1С как таблицу, с колонками?
Файл → Открыть покажет файл как текст. Чтобы увидеть колонки, переименуйте файл с разделителями в .csv и откройте в табличном редакторе, либо разложите строки в таблицу значений кодом через СтрРазделить.Почему в веб-клиенте не открывается файл по пути с диска?
НачатьПомещениеФайла с интерактивным выбором.Как узнать число строк в большом файле, не загружая его?
ЧтениеТекста и считайте строки в цикле. Память при этом не растёт, в отличие от ТекстовыйДокумент.КоличествоСтрок().Читает ли 1С файлы с переводами строк в формате Linux?
ЧтениеТекста.Можно ли читать TXT из 1С на Linux-сервере?
/srv/obmen/ostatki.txt), а кодировку лучше задавать строкой, а не через ANSI и OEM.