Текстовый файл в 1С:Предприятии 8.3: от просмотра до загрузки данных кодом

· 10 мин

Содержание

Чтобы просто посмотреть TXT файл в 1С, откройте главное меню (кнопка с тремя полосками в левом верхнем углу окна), выберите Файл → Открыть и укажите файл. Он откроется во встроенном текстовом редакторе 1С, где его можно читать, править и сохранять. Если нужно не смотреть, а загрузить данные из текстового файла в базу, файл читают кодом: построчно через объект ЧтениеТекста или целиком через ТекстовыйДокумент.

Всё описанное ниже работает одинаково в любой конфигурации на платформе 8.3: Бухгалтерии, ЗУП, УТ. Это механизм платформы, а не конкретной программы. Разница только в том, где вы запускаете код: во внешней обработке, в консоли кода или в доработке конфигурации.

Открыть текстовый файл без программирования

Этот способ подходит, когда нужно глянуть выгрузку банка, лог обмена или файл настроек, не выходя из 1С.

  1. Нажмите кнопку главного меню в левом верхнем углу.
  2. Выберите Файл → Открыть (или нажмите Ctrl+O).
  3. В окне выбора при необходимости переключите фильтр типов на все файлы и выберите нужный .txt.
  4. Файл откроется в отдельной вкладке. Правки сохраняются через Файл → Сохранить.

Тот же пункт есть в Конфигураторе. Там текстовый редактор удобнее: работает поиск с заменой (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 и кодировкой получателя

Правило простое. Загружаете в базу — ЧтениеТекста. Показываете или правите — ТекстовыйДокумент. Смотрите один раз — меню Файл.

Ошибки при чтении и как не испортить данные

Диагностика: выберите симптом

Пара правил, которые берегут базу:

  1. Сначала прогон без записи. Пусть обработка прочитает файл, сообщит, сколько строк распознано и какие отброшены, и только потом пишет в базу. Пять минут на проверку отчёта о строках дешевле, чем отмена сотни документов.
  2. Ошибку конкретной строки ловите внутри цикла. Попытка вокруг всего цикла остановит загрузку на первой же кривой строке. Внутри цикла она пропустит одну строку и сообщит её номер.
  3. Записывайте в транзакции, если данные связаны. НачатьТранзакцию() перед записью и ЗафиксироватьТранзакцию() после. При ошибке ОтменитьТранзакцию() откатит всё, и в базе не останется половины загрузки.
  4. Текст ошибки выводите полностью. В блоке Исключение используйте ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()): так видно и сообщение платформы, и строку модуля.
  5. Удаляйте временные файлы. ПолучитьИмяВременногоФайла не чистит за собой. Без УдалитьФайлы каталог временных файлов сервера разрастается месяцами.

Перед первой загрузкой в рабочую базу сделайте резервную копию или проверьте обработку на копии. Ошибку в сопоставлении колонок проще поймать на тестовых данных.

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

Можно ли открыть TXT в 1С как таблицу, с колонками?
Напрямую меню Файл → Открыть покажет файл как текст. Чтобы увидеть колонки, переименуйте файл с разделителями в .csv и откройте в табличном редакторе, либо разложите строки в таблицу значений кодом через СтрРазделить.
Почему в веб-клиенте не открывается файл по пути с диска?
Браузер не даёт сайту читать диск по произвольному пути. Файл нужно выбрать в окне выбора, поэтому в веб-клиенте используйте НачатьПомещениеФайла с интерактивным выбором.
Как узнать число строк в большом файле, не загружая его?
Пройдите файл через ЧтениеТекста и считайте строки в цикле. Память при этом не растёт, в отличие от ТекстовыйДокумент.КоличествоСтрок().
Читает ли 1С файлы с переводами строк в формате Linux?
Да. При построчном чтении стандартные переводы строк Windows и Linux распознаются. Если строки разделены нестандартным символом, задайте его третьим параметром конструктора ЧтениеТекста.
Можно ли читать TXT из 1С на Linux-сервере?
Можно, теми же объектами. Пути пишутся в формате Linux (/srv/obmen/ostatki.txt), а кодировку лучше задавать строкой, а не через ANSI и OEM.