Текстовый файл из 1С:Предприятия: от кнопки «Сохранить» до выгрузки кодом
Содержание
Создать txt файл в 1С можно двумя путями. Пользователь открывает отчёт или список и сохраняет его через кнопку с дискетой, выбрав тип «Текстовый документ (*.txt)». Разработчик пишет пару строк кода: Новый ТекстовыйДокумент, ДобавитьСтроку() и Записать(ИмяФайла, КодировкаТекста.UTF8).
Типичная ситуация: банк или контрагент просит выгрузку «в текстовом виде, через точку с запятой, в кодировке Windows-1251». Бухгалтер сохраняет отчёт, а получатель видит кракозябры. Ниже — оба пути работы с файлами в 1С и разбор того, где обычно ломается экспорт данных.
Сохранение в txt без программирования
Платформа 1С 8.3 умеет сохранять в текст любой табличный документ: отчёт, печатную форму, выведенный список.
Из отчёта или печатной формы:
- Сформируйте отчёт.
- Нажмите кнопку с дискетой «Сохранить» в командной панели отчёта. Если её не видно, откройте
Главное меню (☰) → Файл → Сохранить как. - В поле «Тип файла» выберите
Текстовый документ (*.txt)илиANSI-текст (*.txt). - Укажите папку и имя файла, нажмите «Сохранить».
Из любого списка (справочника, журнала документов):
- Откройте список и настройте отбор.
- Нажмите
Ещё → Вывести список.... - Отметьте нужные колонки, выберите вывод в табличный документ.
- Сохраните получившуюся таблицу так же, как отчёт.
Пустой текстовый файл с нуля. В платформе есть встроенный редактор: Главное меню → Файл → Новый → Текстовый документ. Наберите или вставьте текст и сохраните его как .txt.
| Тип при сохранении | Кодировка | Когда выбирать |
|---|---|---|
| Текстовый документ (*.txt) | Unicode | Получатель — современная программа, сайт, сервис |
| ANSI-текст (*.txt) | Windows-1251 | Старые банковские программы, загрузчики, Блокнот в старых Windows |
Текстовый формат сохраняет только значения ячеек. Оформление, объединения и картинки пропадают. Колонки разделяются табуляцией, поэтому такой файл нормально открывается в Excel.
Объекты встроенного языка для работы с файлами
В требованиях к выгрузке иногда пишут про «объект ФайлМенеджер». Такого объекта в платформе 1С:Предприятие нет. Работа с файлами собрана из нескольких объектов и глобальных функций.
| Объект или функция | Для чего |
|---|---|
ТекстовыйДокумент | Собрать текст в памяти и записать файл целиком |
ЗаписьТекста | Писать в файл построчно, потоком, с дописыванием |
Файл | Проверить существование, узнать имя, расширение, размер |
ПолучитьИмяВременногоФайла("txt") | Получить уникальное имя во временном каталоге |
КаталогВременныхФайлов() | Путь к временной папке |
СоздатьКаталог(), НайтиФайлы(), УдалитьФайлы() | Операции с папками и файлами |
ПоместитьВоВременноеХранилище() | Передать готовый файл с сервера на клиент |
ДиалогВыбораФайла | Спросить у пользователя, куда сохранить |
Проверка, что файл уже есть, на сервере выглядит так:
ФайлНаДиске = Новый Файл("C:\Exchange\out.txt");
Если ФайлНаДиске.Существует() Тогда
УдалитьФайлы(ФайлНаДиске.ПолноеИмя);
КонецЕсли;
На клиенте синхронный Существует() может быть запрещён настройками конфигурации. Там используют асинхронный вариант с описанием оповещения или выполняют проверку на сервере.
Как создать текстовый файл кодом: ТекстовыйДокумент
ТекстовыйДокумент удобен, когда файл небольшой: до нескольких десятков тысяч строк. Весь текст держится в памяти, а на диск попадает одной командой.
&НаСервере
Процедура СоздатьФайлНаСервере()
Текст = Новый ТекстовыйДокумент;
Текст.ДобавитьСтроку("Выгрузка от " + Формат(ТекущаяДатаСеанса(), "ДФ=dd.MM.yyyy"));
Текст.ДобавитьСтроку("Организация: ООО Ромашка");
Текст.ДобавитьСтроку("Всего строк: " + Формат(2, "ЧГ=0"));
Текст.Записать("C:\Exchange\out.txt", КодировкаТекста.UTF8);
КонецПроцедуры
Полезные методы объекта:
- 📝
ДобавитьСтроку(Строка)— новая строка в конец; - 🔁
ЗаменитьСтроку(НомерСтроки, Строка)— правка уже добавленной строки; - 🔢
КоличествоСтрок()иПолучитьСтроку(Номер)— обход содержимого; - 📖
Прочитать(ИмяФайла, Кодировка)— обратная операция, загрузка txt в 1С; - 💾
Записать(ИмяФайла, Кодировка, РазделительСтрок)— сохранение.
Третий параметр Записать() задаёт перевод строки. Если получатель требует строго Windows-формат, передайте его явно: Символы.ВК + Символы.ПС.
Табличный документ записывается в txt без промежуточного текста: ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.TXT). Для варианта Windows-1251 есть значение ANSITXT. Так выгружают результат отчёта на СКД по расписанию.
Построчная запись через ЗаписьТекста
Когда строк сотни тысяч, собирать их в памяти расточительно. ЗаписьТекста пишет поток прямо в файл: строка ушла — память освободилась.
Конструктор принимает параметры по порядку: имя файла, кодировку, разделитель строк, признак дописывания и разделитель строк в файле.
Пример: выгрузка контрагентов с ИНН в файл с разделителем «точка с запятой» в кодировке Windows-1251.
&НаСервере
Процедура ВыгрузитьКонтрагентов(ИмяФайла)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Наименование КАК Наименование,
| Контрагенты.ИНН КАК ИНН
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| НЕ Контрагенты.ПометкаУдаления";
Выборка = Запрос.Выполнить().Выбрать();
Запись = Новый ЗаписьТекста(ИмяФайла, "windows-1251");
Попытка
Запись.ЗаписатьСтроку("Наименование;ИНН");
Пока Выборка.Следующий() Цикл
Наименование = СтрЗаменить(Выборка.Наименование, ";", ",");
Запись.ЗаписатьСтроку(СтрШаблон("%1;%2", Наименование, Выборка.ИНН));
КонецЦикла;
Запись.Закрыть();
Исключение
Запись.Закрыть();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Три приёма, без которых такая выгрузка ломается:
- Замена разделителя внутри данных. В названии вроде
ООО «Север; Юг»точка с запятой разобьёт строку на лишние колонки. Её заменяют или берут значение в кавычки, если формат получателя это допускает. Закрыть()в любом случае. Пока объект не закрыт, хвост данных может остаться в буфере, а файл — занятым процессом 1С.- Дописывание для журналов. Четвёртый параметр
Истинадобавляет строки в конец существующего файла, а не затирает его:
Лог = Новый ЗаписьТекста("C:\Exchange\exchange.log", КодировкаТекста.UTF8, , Истина);
Лог.ЗаписатьСтроку(Формат(ТекущаяДатаСеанса(), "ДЛФ=DT") + " Обмен завершён");
Лог.Закрыть();
| Задача | ТекстовыйДокумент | ЗаписьТекста |
|---|---|---|
| Небольшой файл, нужна правка строк до записи | ✅ | — |
| Большая выгрузка из запроса | Расход памяти растёт | ✅ |
| Дописать в конец журнала | Читать и переписывать весь файл | ✅ параметр дописывания |
| Прочитать txt обратно | ✅ Прочитать() | Для чтения есть ЧтениеТекста |
Кодировка файла и спецсимволы
Почти все жалобы на «битый» txt — это несовпадение кодировки. 1С записала одну, программа получателя читает другую.
Значения перечисления КодировкаТекста:
- 🌐
UTF8— универсальный вариант для сайтов, API, современных программ; - 🏦
ANSI— системная кодировка Windows, для русской Windows это Windows-1251; - 💻
OEM— кодировка консоли DOS (cp866), нужна редко, для очень старых загрузчиков; - 📄
UTF16— встречается в обменах с отдельными учётными системами; - ⚙️
Системная— кодировка операционной системы, где выполняется код.
Кроме перечисления, можно передать имя кодировки строкой: "windows-1251", "cp866", "utf-8". Строку удобно хранить в настройках обмена.
Метка BOM. При записи с КодировкаТекста.UTF8 в начало файла попадают три служебных байта (BOM). Блокнот и Excel их понимают. Некоторые загрузчики банков и сайты принимают первую строку из-за них за испорченную. Если получатель требует UTF-8 без BOM, срежьте эти байты после записи:
Данные = Новый ДвоичныеДанные(ИмяФайла);
Буфер = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Данные);
Если Буфер.Размер >= 3
И Буфер[0] = 239 И Буфер[1] = 187 И Буфер[2] = 191 Тогда
БезМетки = Буфер.Прочитать(3, Буфер.Размер - 3);
ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(БезМетки).Записать(ИмяФайла);
КонецЕсли;
Байты 239, 187, 191 — это и есть BOM UTF-8 (EF BB BF). Буфер двоичных данных доступен в платформе 8.3.9 и новее.
Спецсимволы в строках:
| Что вставить | Как в коде |
|---|---|
| Табуляция | Символы.Таб |
| Перевод строки | Символы.ПС |
| Возврат каретки | Символы.ВК |
| Кавычка внутри строки | Удвоить: "Текст ""в кавычках""" |
| Символ по коду | Символ(9) |
Символов вроде №, «» и длинного тире нет в cp866. В кодировке OEM они превратятся в знаки вопроса. Для ANSI (Windows-1251) эти символы допустимы.
Где окажется файл: файловый и клиент-серверный вариант
Главный вопрос при создании файла кодом — на каком компьютере выполняется запись. Путь C:\Exchange\out.txt в коде сервера и в коде клиента указывает на разные диски.
| Вариант работы | Код &НаСервере пишет файл | Под какими правами |
|---|---|---|
| Файловая база, тонкий или толстый клиент | На компьютер пользователя | Учётная запись пользователя Windows |
| Клиент-серверная база | На сервер 1С | Учётная запись службы сервера 1С (часто USR1CV8) |
| Веб-клиент или публикация на веб-сервере | На сервер, где выполняется серверный код | Учётная запись службы или веб-сервера |
Отсюда правило: код на сервере создаёт файл на сервере, а не у бухгалтера. Чтобы файл попал пользователю, его передают через временное хранилище.
&НаСервереБезКонтекста
Функция ПодготовитьФайл(ИдентификаторФормы)
ИмяФайла = ПолучитьИмяВременногоФайла("txt");
Текст = Новый ТекстовыйДокумент;
Текст.ДобавитьСтроку("Данные выгрузки");
Текст.Записать(ИмяФайла, КодировкаТекста.UTF8);
Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла), ИдентификаторФормы);
УдалитьФайлы(ИмяФайла);
Возврат Адрес;
КонецФункции
&НаКлиенте
Процедура Выгрузить(Команда)
Адрес = ПодготовитьФайл(УникальныйИдентификатор);
Файлы = Новый Массив;
Файлы.Добавить(Новый ОписаниеПередаваемогоФайла("vygruzka.txt", Адрес));
НачатьПолучениеФайлов(Новый ОписаниеОповещения("ПослеПолученияФайла", ЭтотОбъект), Файлы, "", Истина);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПолученияФайла(ПолученныеФайлы, ДополнительныеПараметры) Экспорт
// Файл сохранён пользователем
КонецПроцедуры
Последний параметр Истина открывает диалог выбора папки. Такой код работает в тонком клиенте и в веб-клиенте: браузер просто скачает файл. В новых релизах платформы есть и асинхронная функция ПолучитьФайлССервераАсинх с тем же назначением.
Сетевая папка обмена. Если файл должен лечь в \\fileserver\exchange, на сервере 1С права на эту папку нужны учётной записи службы, а не бухгалтеру. Подключённые буквы дисков (Z:\) служба не видит: указывайте полный UNC-путь.
В конфигурациях на БСП для отдачи файла пользователю удобно вызвать ФайловаяСистемаКлиент.СохранитьФайл. Процедура сама выбирает способ под тип клиента.
Ошибки при записи txt и как их отлаживать
Сообщение платформы при сбое записи обычно начинается с Ошибка при вызове метода контекста (Записать). Причину ищите во второй части текста.
Как отлаживать:
- Оберните запись в
Попытка ... Исключениеи выведите полный текст:Сообщить(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())). - Перед записью выведите путь:
Сообщить(ИмяФайла). Опечатку в имени папки так видно сразу. - Поставьте точку останова в отладчике на строке
Записать(). Если отладка идёт на сервере, включите в Конфигураторе отладку серверного кода. - Проверьте результат не только Блокнотом. Блокнот угадывает кодировку и скрывает проблему. Откройте файл тем же загрузчиком, которым его будет читать получатель, или редактором, где видна кодировка.
- Для регулярных выгрузок пишите итог в журнал регистрации:
ЗаписьЖурналаРегистрации("Выгрузка txt", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки()).