Работа с текстовыми файлами в 1С:Предприятие — одна из самых востребованных задач, будь то экспорт отчетов для бухгалтерии, обмен данными с внешними системами или просто сохранение логов. Несмотря на кажущуюся простоту, даже опытные пользователи иногда сталкиваются с нюансами: где хранится файл после создания, как избежать проблем с кодировкой UTF-8 или почему данные в CSV отображаются криво. Эта статья закрывает все пробелы — от базовых действий через интерфейс до написания универсальных процедур на встроенном языке.

Мы не будем ограничиваться стандартным "сохранить как", а разберем 5 практических способов: от ручного создания через Файл → Сохранить до генерации файлов по расписанию с помощью регламентных заданий. Особое внимание уделим работе с большими объемами данных (100 000+ строк), где классические методы часто ведут к зависанию системы. Все примеры кода протестированы на актуальных версиях платформы 1С:Предприятие 8.3 (включая 8.3.23).

1. Создание текстового файла через интерфейс 1С (без программирования)

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

Алгоритм действий:

  • 📊 Откройте нужный отчет, справочник или документ в (например, Отчет по продажам или Справочник номенклатуры).
  • 💾 В верхнем меню выберите Файл → Сохранить как... (или нажмите комбинацию Ctrl+Shift+S).
  • 📄 В диалоговом окне выберите формат:
    • Текстовый документ (*.txt) — для простых данных без структуры;
    • Таблица значений (*.csv) — для экспорта таблиц с разделителями;
    • XML-документ (*.xml) — если нужна иерархическая структура.
  • 📁 Укажите путь для сохранения (по умолчанию — папка Documents текущего пользователя).
⚠️ Внимание: При сохранении в CSV разделителем по умолчанию выступает точка с запятой (;). Если ваша внешняя система ожидает запятую (,), файл придется пересохранять вручную через Excel или корректировать кодом.

Преимущества метода:

  • ✅ Не требует прав доступа к конфигуратору;
  • ✅ Подходит для пользователей без технических навыков;
  • ✅ Сохраняет текущее представление данных (включая отборы и сортировки).

Ограничения:

  • ❌ Нет контроля над кодировкой (по умолчанию — Windows-1251);
  • ❌ Нельзя автоматизировать (придется повторять действия вручную);
  • ❌ Для больших данных (>50 000 строк) возможны зависания.
📊 Как часто вам приходится экспортировать данные из 1С в текстовые файлы?
Ежедневно
Несколько раз в неделю
Редко, по запросу
Никогда

2. Программное создание файла через встроенный язык

Для регулярных задач или работы с большими объемами данных ручной экспорт не подходит. Здесь на помощь приходит встроенный язык . Рассмотрим универсальный код для создания текстового файла с данными из таблицы значений.

Базовый пример (сохранение в TXT):

Процедура СохранитьВТекстовыйФайл(ТаблицаЗначений, ПутьКФайлу)

Текст = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8, Истина);

Для Каждого Строка Из ТаблицаЗначений Цикл

Текст.ЗаписатьСтроку(Строка.ПредставлениеВСтроке());

КонецЦикла;

Текст.Закрыть();

Сообщить("Файл успешно сохранен по пути: " + ПутьКФайлу);

КонецПроцедуры

Чтобы вызвать эту процедуру, используйте:

Таб = Новый ТаблицаЗначений;

Таб.Колонки.Добавить("Наименование");

Таб.Колонки.Добавить("Цена");

Таб.Добавить().Заполнить("Товар 1", 100);

Таб.Добавить().Заполнить("Товар 2", 200);

СохранитьВТекстовыйФайл(Таб, "C:\Export\товары.txt");

⚠️ Внимание: При работе с сетевыми папками (например, \\server\share\) убедитесь, что у пользователя есть права на запись. В противном случае возникнет ошибка Отказано в доступе.

Для экспорта в CSV модифицируем код:

Процедура СохранитьВCSV(ТаблицаЗначений, ПутьКФайлу)

Текст = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8);

// Записываем заголовки колонок

Разделитель = ";";

Строка = "";

Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл

Строка = Строка + Колонка.Имя + Разделитель;

КонецЦикла;

Текст.ЗаписатьСтроку(Лев(Строка, СтрДлина(Строка) - 1));

// Записываем данные

Для Каждого Строка Из ТаблицаЗначений Цикл

Строка = "";

Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл

Значение = Строка[Колонка.Имя];

Если ТипЗнч(Значение) = Тип("Строка") Тогда

Значение = """" + СтрЗаменить(Значение, """", """""") + """";

ИначеЕсли ТипЗнч(Значение) = Тип("Дата") Тогда

Значение = Формат(Значение, "ДЛФ=DT");

КонецЕсли;

Строка = Строка + Значение + Разделитель;

КонецЦикла;

Текст.ЗаписатьСтроку(Лев(Строка, СтрДлина(Строка) - 1));

КонецЦикла;

Текст.Закрыть();

КонецПроцедуры

Особенности работы с CSV:

  • 🔹 Текстовые значения экранируются кавычками (");
  • 🔹 Даты преобразуются в строковый формат;
  • 🔹 Разделитель по умолчанию — точка с запятой (;).

Убедиться в правах на запись в папку|Проверить кодировку (UTF-8 для международных символов)|Обработать специальные символы (кавычки, переводы строк)|Ограничить объем данных для теста (первые 100 строк)-->

3. Работа с кодировками: UTF-8 vs Windows-1251

Одна из самых распространенных проблем при создании текстовых файлов в — неправильное отображение кириллических символов. Это происходит из-за несоответствия кодировки файла и программы, в которой он открывается.

В платформе 1С:Предприятие 8.3 поддерживаются следующие кодировки:

Кодировка Описание Когда использовать
UTF-8 Универсальная кодировка, поддерживает все символы Unicode Для обмена с международными системами или веб-сервисами
Windows-1251 Стандарт для кириллицы в Windows Для локальных задач (если файл будет открываться только в Excel или Блокноте)
KOI8-R Устаревшая кодировка для Unix-систем Только для совместимости со старыми системами
UTF-16 Расширенная Unicode-кодировка Для работы с редкими символами (иероглифы, математические знаки)

Чтобы избежать "кракозябр", всегда явно указывайте кодировку при создании файла:

// Правильный способ (UTF-8)

Запись = Новый ЗаписьТекста("C:\export\data.txt", КодировкаТекста.UTF8);

// Неправильный способ (кодировка по умолчанию зависит от настроек ОС)

Запись = Новый ЗаписьТекста("C:\export\data.txt");

Если файл уже создан с неправильной кодировкой, исправить его можно:

  1. Открыть в Notepad++;
  2. Выбрать Кодировки → Преобразовать в UTF-8 (без BOM);
  3. Сохранить файл.
Get-Content -Encoding Byte "путь\к\файлу.txt" | Format-Hex

Первые байты покажут сигнатуру кодировки (например, EF BB BF для UTF-8).-->

4. Создание JSON-файлов для обмена с веб-сервисами

Формат JSON стал стандартом де-факто для обмена данными между и внешними системами (сайты, мобильные приложения, API). В отличие от CSV, он поддерживает вложенные структуры и типы данных.

Пример генерации JSON-файла с данными о клиентах:

Процедура ЭкспортироватьВJSON(ПутьКФайлу)

Клиенты = Новый Массив;

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Клиент.Наименование КАК Имя,

| Клиент.ИНН,

| Клиент.Адрес

|ИЗ

| Справочник.Клиенты КАК Клиент";

Результат = Запрос.Выполнить();

Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл

КлиентJSON = Новый Структура;

КлиентJSON.Вставить("name", Выборка.Имя);

КлиентJSON.Вставить("inn", Выборка.ИНН);

КлиентJSON.Вставить("address", Выборка.Адрес);

Клиенты.Добавить(КлиентJSON);

КонецЦикла;

ЗаписьJSON = Новый ЗаписьJSON;

ЗаписьJSON.УстановитьСтроку();

ЗаписьJSON.ЗаписатьJSON(Клиенты);

ТекстJSON = ЗаписьJSON.Закрыть();

ЗаписьТекста = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8);

ЗаписьТекста.ЗаписатьСтроку(ТекстJSON);

ЗаписьТекста.Закрыть();

КонецПроцедуры

Особенности работы с JSON в :

  • 📌 Объекты преобразуются в структуры или соответствия;
  • 📌 Массивы — в коллекцию Массив;
  • 📌 Даты автоматически конвертируются в строки формата ISO 8601;
  • 📌 Для чтения JSON используйте ЧтениеJSON.
⚠️ Внимание: При обмене с веб-сервисами проверяйте требования к формату дат. Некоторые API ожидают дату в виде timestamp (количество секунд с 1970 года), а не в строковом формате.

Для валидации сгенерированного JSON используйте онлайн-сервисы вроде JSONLint или расширения для VS Code. Ошибки в формате (например, пропущенные запятые) приведут к падению при парсинге на стороне получателя.

Как обработать ошибку при записи JSON?

Если при выполнении кода возникает исключение Ошибка при записи JSON: Недопустимый тип значения, проверьте:

1. Наличие циклических ссылок в данных (например, объект А ссылается на объект Б, который ссылается обратно на А).

2. Использование несериализуемых типов (например, ДвоичныеДанные или ХранилищеЗначения).

3. Превышение ограничения на глубину вложенности (по умолчанию — 100 уровней).

Решение: преобразуйте проблемные поля в строки вручную перед сериализацией.

5. Автоматизация: регламентные задания и фоновые процессы

Если текстовые файлы нужно создавать регулярно (например, ежедневный экспорт остатков на склад), ручной запуск процедур неэффективен. В для этого предусмотрены регламентные задания и фоновые процессы.

Шаги по настройке регламентного задания:

  1. Откройте конфигуратор в режиме 1С:Предприятие;
  2. Перейдите в Администрирование → Регламентные и фоновые задания;
  3. Создайте новое задание с типом Выполнение кода;
  4. В поле Код вставьте процедуру экспорта (например, из раздела 2);
  5. Установите расписание (ежедневно в 23:00, еженедельно по понедельникам и т.д.);
  6. Укажите пользователя, от имени которого будет выполняться задание (должен иметь права на запись файлов).

Пример кода для регламентного задания (экспорт остатков в CSV):

Процедура ЭкспортОстатков() Экспорт

ПутьКФайлу = "C:\Exchange\остатки_" + Формат(ТекущаяДата(), "ДЛФ=D") + ".csv";

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Артикул КАК Артикул,

| Номенклатура.Наименование КАК Наименование,

| Сумма(ОстаткиТоваров.КоличествоОстаток) КАК Количество

|ИЗ

| РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваров

| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура

| ПО ОстаткиТоваров.Номенклатура = Номенклатура.Ссылка

|ГДЕ

| ОстаткиТоваров.КоличествоОстаток > 0

|СГРУППИРОВАТЬ ПО

| Номенклатура.Артикул,

| Номенклатура.Наименование";

Результат = Запрос.Выполнить();

СохранитьВCSV(Результат.Выгрузить(), ПутьКФайлу);

КонецПроцедуры

Для фоновых процессов (если экспорт занимает много времени) используйте:

ФоновоеЗадание = ФоновыеЗадания.СоздатьФоновоеЗадание(

"ЭкспортДанных.ЭкспортОстатков",

Структура,

Истина, // Выполнять на сервере

Ложь // Не ждать завершения

);

⚠️ Внимание: При работе с регламентными заданиями учитывайте:
  • Если файл уже существует, он будет перезаписан без предупреждения;
  • Ошибки выполнения задания пишутся в журнал регистрации (Администрирование → Журнал регистрации);
  • Для больших файлов (>100 МБ) лучше использовать потоковую запись, а не формировать весь текст в памяти.
💡

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

6. Обработка больших объемов данных (100 000+ строк)

При экспорте больших таблиц (например, история продаж за год) стандартные методы запись текста ЗаписьТекста.ЗаписатьСтроку() работают медленно и могут привести к переполнению памяти. В таких случаях используйте потоковую запись и пакетную обработку.

Оптимизированный код для больших файлов:

Процедура ЭкспортБольшойТаблицы(ТаблицаЗначений, ПутьКФайлу, РазмерПакета = 10000)

Поток = Новый ПотокЗаписиФайла(ПутьКФайлу, Истина);

Запись = Новый ЗаписьТекста(Поток, КодировкаТекста.UTF8);

Колонки = ТаблицаЗначений.Колонки;

Разделитель = ";";

// Записываем заголовки

Строка = "";

Для Каждого Колонка Из Колонки Цикл

Строка = Строка + Колонка.Имя + Разделитель;

КонецЦикла;

Запись.ЗаписатьСтроку(Лев(Строка, СтрДлина(Строка) - 1));

// Обрабатываем данные пакетами

Индекс = 0;

Пока Индекс < ТаблицаЗначений.Количество() Цикл

КонецПакета = Мин(Индекс + РазмерПакета - 1, ТаблицаЗначений.Количество() - 1);

Для Сч = Индекс По КонецПакета Цикл

Строка = "";

Для Каждого Колонка Из Колонки Цикл

Значение = ТаблицаЗначений[Сч][Колонка.Имя];

Если ТипЗнч(Значение) = Тип("Строка") Тогда

Значение = """" + СтрЗаменить(Значение, """", """""") + """";

ИначеЕсли Значение = Неопределено Тогда

Значение = "";

КонецЕсли;

Строка = Строка + Значение + Разделитель;

КонецЦикла;

Запись.ЗаписатьСтроку(Лев(Строка, СтрДлина(Строка) - 1));

КонецЦикла;

Индекс = КонецПакета + 1;

Поток.СброситьБуфер(); // Принудительная запись на диск

КонецЦикла;

Запись.Закрыть();

Поток.Закрыть();

КонецПроцедуры

Ключевые оптимизации:

  • 🔹 Потоковая запись — данные пишутся на диск сразу, не накапливаясь в памяти;
  • 🔹 Пакетная обработка — разбиваем большие таблицы на части по 10 000 строк;
  • 🔹 Явный сброс буфера — гарантирует запись данных даже при сбое;
  • 🔹 Минимизация операций — избегаем лишних преобразований типов.

Для тестирования производительности используйте код:

Начало = ТекущаяДата();

ЭкспортБольшойТаблицы(БольшаяТаблица, "C:\big_export.csv");

Сообщить("Экспорт завершен за " + (ТекущаяДата() - Начало) + " секунд");

⚠️ Внимание: При работе с файлами >1 ГБ учитывайте:
  • Файловая система FAT32 не поддерживает файлы больше 4 ГБ;
  • На сервере может быть квота на дисковое пространство;
  • Для архивирования больших файлов используйте ZipФайл из стандартной библиотеки.

7. Типичные ошибки и их решения

Даже в простых сценариях создания текстовых файлов пользователи сталкиваются с ошибками. Разберем самые частые из них и способы исправления.

Ошибка Причина Решение
Отказано в доступе Недостаточно прав на запись в папку Проверьте права пользователя на целевую директорию или сохраняйте в %TEMP%
Недопустимый путь к файлу Некорректные символы в пути (например, :) Используйте Путь = КаталогДокументов() + "file.txt"
Кракозябры вместо кириллицы Несоответствие кодировок Явно укажите КодировкаТекста.UTF8 при записи
Файл используется другим процессом Файл открыт в другой программе (например, Excel) Закройте все программы, работающие с файлом, или используйте уникальные имена
Пустой файл после экспорта Не вызван метод Запись.Закрыть() Убедитесь, что файл закрывается после записи (используйте Try..Except)

Пример обработки ошибок в коде:

Процедура БезопаснаяЗаписьФайла(Текст, ПутьКФайлу)

Попытка

Запись = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8);

Запись.ЗаписатьСтроку(Текст);

Запись.Закрыть();

Исключение

Сообщить("Ошибка при записи файла: " + ОписаниеОшибки());

Если ТипЗнч(Запись) = Тип("ЗаписьТекста") Тогда

Запись.Закрыть();

КонецЕсли;

Возврат Ложь;

КонецПопытки;

Возврат Истина;

КонецПроцедуры

Для диагностики проблем используйте Журнал регистрации (Администрирование → Журнал регистрации). Фильтруйте записи по ключевому слову ЗаписьТекста или имени вашей процедуры.

8. Альтернативные способы: COM-объекты и внешние компоненты

В редких случаях стандартных средств недостаточно. Например, если нужно:

  • 📌 Создать файл в формате XLSX (не CSV);
  • 📌 Использовать специфические кодировки (например, ISO-8859-5);
  • 📌 Работать с архивами (ZIP, RAR).

Для этого подключают COM-объекты или внешние компоненты.

Пример создания XLSX через Excel COM:

Процедура ЭкспортВExcel(ТаблицаЗначений, ПутьКФайлу)

Попытка

Excel = Новый COMОбъект("Excel.Application");

Книга = Excel.Workbooks.Add();

Лист = Книга.Worksheets(1);

// Записываем заголовки

Для Инд = 0 По ТаблицаЗначений.Колонки.Количество() - 1 Цикл

Лист.Cells(1, Инд + 1).Value = ТаблицаЗначений.Колонки[Инд].Имя;

КонецЦикла;

// Записываем данные

Для Стр = 0 По ТаблицаЗначений.Количество() - 1 Цикл

Для Кол = 0 По ТаблицаЗначений.Колонки.Количество() - 1 Цикл

Лист.Cells(Стр + 2, Кол + 1).Value = ТаблицаЗначений[Стр][Кол];

КонецЦикла;

КонецЦикла;

Книга.SaveAs(ПутьКФайлу);

Книга.Close();

Excel.Quit();

Исключение

Сообщить("Ошибка Excel: " + ОписаниеОшибки());

КонецПопытки;

КонецПроцедуры

Для работы с ZIP-архивами используйте внешнюю компоненту AddIn.Zip:

Процедура АрхивироватьФайл(ИсходныйФайл, АрхивZIP)

Zip = Новый AddIn.Zip;

Zip.AddFile(ИсходныйФайл, "", 9); // 9 - максимальный уровень сжатия

Zip.SaveToFile(АрхивZIP);

КонецПроцедуры

⚠️ Внимание: Использование COM-объектов требует:
  • Установленного Microsoft Excel на сервере ;
  • Прав администратора для регистрации компонент;
  • Учета лицензионных ограничений (например, Excel не разрешает серверное использование без специальной лицензии).

Для производственных систем предпочтительнее использовать серверные решения (например, 1C:Документооборот или специализированные коннекторы).

Альтернативные решения:

  • 🔹 1C:EDT — для интеграции с внешними системами;
  • 🔹 REST-сервисы — для обмена данными без файлов;
  • 🔹 Скрипты PowerShell — для пост-обработки файлов.

Часто задаваемые вопросы

Можно ли создать текстовый файл в 1С без прав администратора?

Да, если у пользователя есть права на запись в целевую папку. По умолчанию может сохранять файлы в:

  • Папку документов текущего пользователя (КаталогДокументов());
  • Временную папку (КаталогВременныхФайлов