Разработка и Конфигурация · 12 мин
Как прочитать файл в 1С: способы, примеры кода и типичные ошибки
Как прочитать файл в 1С: ЧтениеТекста, ЧтениеXML, двоичные данные, работа на клиенте и сервере. Примеры кода, кодировки, типичные ошибки и проверка результата.
Чтение файлов — одна из самых частых задач при доработке конфигураций 1С: загрузка выписок из банка, импорт прайсов поставщиков, обмен данными с сайтом, разбор ответов веб-сервисов. Встроенный язык предоставляет несколько объектов для этой задачи, и выбор конкретного зависит от формата файла, места выполнения кода (клиент или сервер) и режима работы (тонкий клиент, веб-клиент, толстый клиент).
Основные инструменты — объекты ЧтениеТекста, ЧтениеXML, ЧтениеJSON, ЧтениеДанных и универсальный метод ПолучитьДвоичныеДанныеИзФайла (в старых версиях — ДвоичныеДанные из файла через помещение во временное хранилище). Каждый из них имеет свои ограничения: например, ЧтениеТекста требует знания кодировки, а работа с файловой системой на клиенте в веб-клиенте требует расширения работы с файлами.
Ниже разобраны рабочие сценарии с примерами кода: чтение текстового файла построчно и целиком, разбор XML и JSON, получение двоичных данных, безопасная передача файла с клиента на сервер и диагностика типичных ошибок вроде «Файл не обнаружен» и кракозябр вместо кириллицы.
Как выбрать способ чтения по типу файла
Формат файла определяет объект чтения. Попытка прочитать XML через ЧтениеТекста и разобрать его строковыми функциями — частая причина хрупкого кода, который ломается при первом изменении структуры файла. И наоборот, для простого CSV с разделителями достаточно построчного чтения текста.
| Формат файла | Объект платформы | Когда применять |
|---|---|---|
| TXT, CSV, лог | ЧтениеТекста | Построчный или целостный разбор, нужна кодировка |
| XML | ЧтениеXML | Структурированные данные, выгрузки, веб-сервисы |
| JSON | ЧтениеJSON | Ответы API, обмен с сайтом |
| Любой бинарный (картинка, Excel, архив) | Двоичные данные / ЧтениеДанных | Передача, хранение, потоковая обработка больших файлов |
| XLSX без внешних компонентов | ТабличныйДокумент.Прочитать | Чтение таблиц Excel средствами платформы |
Отдельно учитывайте место выполнения. Код с директивой &НаСервере видит только файловую систему сервера 1С, а не компьютер пользователя. Поэтому файл, выбранный пользователем, сначала помещается во временное хранилище на клиенте, а уже на сервере извлекается и обрабатывается.
Чтение текстового файла через ЧтениеТекста
Объект ЧтениеТекста — основной инструмент для TXT и CSV. Конструктор принимает путь к файлу и кодировку. Если кодировку не указать, платформа попробует определить её автоматически, что нередко приводит к нечитаемым символам вместо кириллицы.
Чтение = Новый ЧтениеТекста("D:\Обмен\price.csv", КодировкаТекста.UTF8);
Строка = Чтение.ПрочитатьСтроку();
Пока Строка <> Неопределено Цикл
Части = СтрРазделить(Строка, ";");
// обработка колонок строки
Строка = Чтение.ПрочитатьСтроку();
КонецЦикла;
Чтение.Закрыть();
Если файл небольшой, можно прочитать его целиком методом Прочитать() и дальше работать со строкой через СтрРазделить по символу перевода строки. Для больших файлов (сотни мегабайт) предпочтительно построчное чтение: оно не загружает весь файл в память разом.
Кодировка: как не получить кракозябры
Файлы из Windows-приложений чаще всего в ANSI (windows-1251), выгрузки из Linux-систем и веб-сервисов — в UTF-8, старые банковские форматы иногда в DOS (cp866). Признак неверной кодировки — символы вида «РџСЂРёРІРµС‚» или квадратики вместо букв. Решение — явно перебрать варианты: КодировкаТекста.UTF8, КодировкаТекста.ANSI, КодировкаТекста.OEM. Уточнить кодировку можно, открыв файл в редакторе вроде Notepad++, который показывает её в строке состояния.
Чтение XML и JSON
Для XML используется объект ЧтениеXML с последовательным обходом узлов. Он читает документ как поток, не загружая его целиком в память, что важно для больших выгрузок.
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл("D:\Обмен\catalog.xml");
Пока Чтение.Прочитать() Цикл
Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента
И Чтение.Имя = "Товар" Тогда
// читаем атрибуты и вложенные узлы товара
КонецЕсли;
КонецЦикла;
Чтение.Закрыть();
Для JSON аналогичная логика: объект ЧтениеJSON открывает файл методом ОткрытьФайл, а функция ПрочитатьJSON преобразует содержимое в структуру или соответствие. Второй параметр ПрочитатьВСоответствие удобен, когда имена ключей могут содержать символы, недопустимые для ключей структуры.
Чтение = Новый ЧтениеJSON;
Чтение.ОткрытьФайл("D:\Обмен\response.json");
Данные = ПрочитатьJSON(Чтение, Истина);
Чтение.Закрыть();
Если XML соответствует известной схеме (например, формат EnterpriseData или XDTO-пакеты обмена между конфигурациями), правильнее использовать не ручной обход узлов, а XDTO-механизмы: они проверяют типы и дают осмысленные ошибки при нарушении структуры.
Чтение файла, выбранного пользователем: клиент и сервер
Самый частый сценарий в прикладных решениях: пользователь указывает файл на своём компьютере, а обработка выполняется на сервере. Прямой путь вида "C:\Users\...\файл.csv" в серверной процедуре не сработает — сервер этой папки не видит. Правильная схема асинхронная:
- 1На клиенте вызовите НачатьПомещениеФайлаВоВременноеХранилище с указанием пути к файлу
- 2В оповещении получите адрес временного хранилища
- 3Передайте адрес в серверную процедуру
- 4На сервере вызовите ПолучитьИзВременногоХранилища — получите двоичные данные
- 5Сохраните данные во временный файл на сервере или обработайте потоком
- 6После обработки удалите данные из хранилища через УдалитьИзВременногоХранилища
&НаКлиенте
Процедура Загрузить(Команда)
Описание = Новый ОписаниеОповещения("ПослеПомещения", ЭтотОбъект);
НачатьПомещениеФайлаВоВременноеХранилище(Описание, , , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПомещения(Адрес, ДопПараметры) Экспорт
Если Адрес = Неопределено Тогда
Возврат; // пользователь отменил выбор
КонецЕсли;
ОбработатьНаСервере(Адрес);
КонецПроцедуры
&НаСервере
Процедура ОбработатьНаСервере(Адрес)
Двоичные = ПолучитьИзВременногоХранилища(Адрес);
ИмяВременного = ПолучитьИмяВременногоФайла("csv");
Двоичные.Записать(ИмяВременного);
Чтение = Новый ЧтениеТекста(ИмяВременного, КодировкаТекста.UTF8);
// ... разбор ...
Чтение.Закрыть();
УдалитьФайлы(ИмяВременного);
УдалитьИзВременногоХранилища(Адрес);
КонецПроцедуры
В толстом клиенте обычного приложения допустим прямой доступ к файлу без хранилища, но в управляемых формах, тонком и веб-клиенте — только асинхронная схема. В веб-клиенте пользователю может потребоваться установить расширение работы с файлами, иначе помещение файла завершится ошибкой.
Двоичные данные и большие файлы
Когда формат файла не текстовый — изображение, PDF, архив, Excel в бинарном виде — используются двоичные данные. Из хранилища они получаются одним вызовом ПолучитьИзВременногоХранилища, дальше их можно записать в файл, передать в HTTP-запрос или сохранить в реквизит объекта с типом «ХранилищеЗначения».
Для очень больших файлов платформа предлагает потоковый объект ЧтениеДанных: он читает файл блоками заданного размера и не расходует память на весь объём сразу. Это актуально при обработке архивов обмена или выгрузок весом в сотни мегабайт на серверах с ограниченной памятью рабочих процессов.
Табличные документы Excel (xlsx, ods, mxl) можно читать без установленного Excel: создайте ТабличныйДокумент и вызовите метод Прочитать с путём к файлу. Ограничение — теряются формулы (остаются значения) и сложное форматирование, а очень большие книги читаются медленно.
Сравнение вариантов
Простой и быстрый для TXT/CSV. Ограничение — нужна кодировка, нет понимания структуры
Надёжный разбор структурированных данных. Требует обхода узлов или знания схемы
Читает Excel без Excel. Не подходит для очень больших книг и сложных формул
Контроль памяти на больших файлах. Код сложнее, разбор формата — на разработчике
Типичные ошибки и их диагностика
Большинство проблем при чтении файлов сводится к четырём причинам: неверный путь, неверная кодировка, отсутствие прав и попытка читать клиентский файл на сервере. Текст исключения обычно прямо указывает на причину — читайте его полностью, включая вложенное описание ошибки.
Перед чтением полезно проверить существование файла объектом Файл и его свойством Существует(), а также обернуть разбор в попытку с понятным сообщением пользователю: «Не удалось прочитать файл: причина». Это избавит от голых дампов исключений на экране бухгалтера.
Как проверить результат
Строки/узлы соответствуют файлу, кириллица читается
Кракозябры, пустые данные, обрезанная первая строка
Файл можно удалить или перезаписать после обработки
Ошибка «файл занят другим процессом»
Количество загруженных записей совпадает с количеством строк в файле
Расхождения, дубли, пропущенные строки
Временные файлы удалены, хранилище очищено
Накопление файлов в каталоге временных файлов сервера
Часто задаваемые вопросы
Как прочитать файл в веб-клиенте?
Только через асинхронные методы: НачатьПомещениеФайлаВоВременноеХранилище с диалогом выбора. У пользователя должно быть установлено расширение работы с файлами для браузера — платформа сама предложит его установить. Прямой доступ к диску пользователя из веб-клиента невозможен по соображениям безопасности браузера.
Чем отличается ЧтениеТекста от ПолучитьФайл?
ЧтениеТекста разбирает содержимое файла как текст с учётом кодировки. ПолучитьФайл (и его асинхронный аналог НачатьПолучениеФайла) передаёт файл между клиентом и сервером, не разбирая содержимое. Обычно они работают вместе: сначала файл передаётся, затем читается.
Можно ли прочитать файл с сетевого диска?
Да, если у той стороны, где выполняется код, есть доступ к ресурсу. Для серверного кода важно, чтобы сетевой диск был доступен под учётной записью службы агента сервера 1С — диски, подключённые в сеансе пользователя, служба обычно не видит. Надёжнее использовать UNC-путь вида \\сервер\ресурс\файл.
Как прочитать только часть большого текстового файла?
Используйте построчное чтение через ЧтениеТекста и прерывайте цикл по нужному условию, либо потоковый объект ЧтениеДанных с чтением блоков фиксированного размера. Загружать файл целиком методом Прочитать() для файлов в сотни мегабайт не стоит — это лишняя нагрузка на память сервера.
Почему после чтения файл нельзя удалить?
Объект чтения держит файловый дескриптор открытым, пока не вызван метод Закрыть(). Проверьте, что Закрыть() вызывается во всех ветках кода, включая выход по исключению — для этого разбор помещают в Попытка/Исключение с закрытием в обработчике или после блока.
Как определить кодировку файла программно?
Надёжного универсального способа нет: платформа умеет распознавать UTF-8 с BOM, но ANSI и OEM без BOM неотличимы автоматически. Практический подход — читать в ожидаемой кодировке и проверять результат на наличие «мусорных» символов, при обнаружении перечитывать в альтернативной кодировке.
Что важно запомнить
Формат файла определяет объект чтения: ЧтениеТекста для TXT/CSV, ЧтениеXML и ЧтениеJSON для структурированных данных, двоичные данные для остального. Файл пользователя всегда передаётся на сервер через временное хранилище асинхронными методами. Кодировку указывайте явно, чтение закрывайте, а загрузку в боевую базу сначала проверяйте на копии.