К статье
Практический материал

Разработка и Конфигурация · 12 мин

1С: как прочитать файл на клиенте

Как прочитать файл на клиенте в 1С: НачатьПомещениеФайла, ЧтениеТекста, ДвоичныеДанные, асинхронные методы и расширение работы с файлами.

Чтение файла на клиенте в 1С — типовая задача при загрузке прайсов, обмене с банками, импорте данных из Excel и XML. Сложность в том, что код выполняется в браузере или тонком клиенте, где прямой доступ к файловой системе ограничен, а модальные методы давно запрещены. Поэтому правильный подход зависит от типа клиента, размера файла и того, где файл будет обрабатываться — на клиенте или на сервере.

В управляемых формах действует жёсткое разделение контекстов: сервер не видит диск пользователя, а клиент не должен выполнять тяжёлую обработку. Из-за этого схема «прочитать и обработать» почти всегда строится в два этапа: сначала файл помещается во временное хранилище с клиента, затем читается и разбирается на сервере. Локальное чтение на клиенте оправдано только для небольших файлов, когда результат нужен прямо в форме.

Ниже разобраны рабочие способы: асинхронное помещение файла через НачатьПомещениеФайла, чтение текста через ЧтениеТекста и ЧтениеДанных, работа с двоичными данными, особенности веб-клиента и типичные ошибки, из-за которых файл «не читается».

Как устроена работа с файлами в управляемом приложении

В управляемых формах 1С клиент и сервер — это разные процессы, часто на разных компьютерах. Сервер приложений не имеет доступа к диску пользователя, поэтому конструкция вида «прочитать C:\Документы\файл.txt на сервере» физически невозможна: путь существует только на машине клиента.

Стандартная схема обмена выглядит так: клиент выбирает файл, помещает его во временное хранилище (механизм платформы для передачи данных между клиентом и сервером), получает адрес хранилища, а сервер по этому адресу забирает двоичные данные и обрабатывает их. Адрес хранилища — это строка-идентификатор, действительная в рамках сеанса.

Вторая особенность — асинхронность. Методы ПоместитьФайл и модальные диалоги выбора файла в современных версиях платформы запрещены или нежелательны: они блокируют интерфейс. Вместо них используются методы с префиксом Начать, которые принимают описание оповещения — процедуру, вызываемую после завершения операции.

Способ 1: НачатьПомещениеФайла — универсальный вариант

Метод НачатьПомещениеФайла подходит для любых типов клиентов, включая веб-клиент, и для файлов любого типа — текстовых, XML, Excel, картинок. Он не читает содержимое в явном виде, а передаёт файл целиком на сервер, что обычно и требуется.

Минимальный код на клиенте:

&НаКлиенте

Процедура ЗагрузитьФайл(Команда)

ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);

НачатьПомещениеФайла(ОписаниеОповещения, , , Истина, УникальныйИдентификатор);

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

&НаКлиенте

Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, ДопПараметры) Экспорт

Если Не Результат Тогда

Возврат;

КонецЕсли;

ЗагрузитьНаСервере(Адрес);

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

&НаСервере

Процедура ЗагрузитьНаСервере(Адрес)

ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);

ИмяВременногоФайла = ПолучитьИмяВременногоФайла("txt");

ДвоичныеДанные.Записать(ИмяВременногоФайла);

// дальше читаем и разбираем файл на сервере

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

Четвёртый параметр Истина включает интерактивный режим — пользователю показывается диалог выбора файла. Пятый параметр (уникальный идентификатор формы) привязывает данные в хранилище к форме, и они не удалятся до её закрытия. Если идентификатор не передать, хранилище очистится раньше, и сервер получит пустые данные.

Порядок действий
  1. 1
    Вызовите НачатьПомещениеФайла с описанием оповещения и УникальныйИдентификатор формы
  2. 2
    В процедуре оповещения проверьте параметр Результат — он ложь, если пользователь отменил выбор
  3. 3
    Передайте полученный Адрес в серверную процедуру
  4. 4
    На сервере получите данные через ПолучитьИзВременногоХранилища и обработайте их
  5. 5
    Удалите данные из хранилища методом УдалитьИзВременногоХранилища после обработки

Способ 2: чтение файла непосредственно на клиенте

Если файл небольшой и результат нужен сразу в форме (например, показать содержимое текстового файла в поле), его можно прочитать локально объектом ЧтениеТекста. Для тонкого и толстого клиента это работает без дополнительных условий.

&НаКлиенте

Процедура ПрочитатьТекст(Команда)

Чтение = Новый ЧтениеТекста("C:\Данные\файл.txt", КодировкаТекста.UTF8);

Текст = Чтение.Прочитать();

Чтение.Закрыть();

Элементы.ПолеТекста.ТекстРедактирования = Текст;

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

Для построчной обработки используйте ПрочитатьСтроку() в цикле — так файл не загружается в память целиком. Для больших файлов это критично: чтение десятков мегабайт одной строкой может заметно подвесить клиент.

Двоичные файлы (картинки, архивы) читаются через Новый ДвоичныеДанные(ИмяФайла), а в асинхронной модели — через ЧтениеДанных с методами НачатьОткрытие и НачатьЧтение. Это единственный вариант для веб-клиента, где синхронные файловые операции недоступны.

Особенности веб-клиента и расширение работы с файлами

Веб-клиент работает внутри браузера, а браузер по соображениям безопасности не даёт произвольного доступа к диску. Поэтому локальное чтение файлов в веб-клиенте возможно только после установки расширения работы с файлами — специального компонента, который платформа предлагает скачать и подключить.

Проверка и подключение расширения выполняется асинхронно:

&НаКлиенте

Процедура ПодключитьРасширение()

Оповещение = Новый ОписаниеОповещения("ПослеПодключенияРасширения", ЭтотОбъект);

НачатьПодключениеРасширенияРаботыСФайлами(Оповещение);

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

&НаКлиенте

Процедура ПослеПодключенияРасширения(Подключено, ДопПараметры) Экспорт

Если Не Подключено Тогда

НачатьУстановкуРасширенияРаботыСФайлами();

КонецЕсли;

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

Если пользователь отказался устанавливать расширение, единственный рабочий путь — НачатьПомещениеФайла, который в веб-клиенте использует стандартный механизм загрузки файла браузера и работает без расширения. Поэтому схема «поместить и обработать на сервере» считается самой совместимой.

Сравнение вариантов

НачатьПомещениеФайла

Работает везде, включая веб-клиент без расширения. Файл уходит на сервер — подходит для любой обработки, но требует серверного вызова.

ЧтениеТекста на клиенте

Простой код, результат сразу в форме. Не работает в веб-клиенте без расширения, не подходит для больших файлов.

ЧтениеДанных (асинхронное)

Полный контроль над чтением кусками, работает с расширением в веб-клиенте. Код заметно сложнее из-за цепочки оповещений.

ДиалогВыбораФайла + НачатьПомещениеФайлов

Удобен для выбора нескольких файлов и фильтров по типу. Помещает массив файлов, требует цикла обработки.

Чтение структурированных файлов: XML, JSON, CSV

После того как файл оказался на сервере (или прочитан на клиенте в виде текста), его разбирают штатными средствами. Для XML используется ЧтениеXML или фабрика XDTO, если есть схема. Для JSON — ЧтениеJSON с методом ПрочитатьJSON, который сразу возвращает структуру или соответствие.

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

Файлы Excel без установленного Excel читают через табличный документ: метод ТабличныйДокумент.Прочитать(ИмяФайла) понимает форматы xlsx и xls на сервере. Это стандартный приём для загрузки прайсов и номенклатуры.

Передавайте в серверную процедуру не только адрес хранилища, но и расширение исходного файла. ПолучитьИмяВременногоФайла с правильным расширением избавит от проблем: например, ТабличныйДокумент.Прочитать определяет формат именно по расширению.
ПЗ
Практическое замечание

Типичные ошибки и ограничения

Самая частая проблема — попытка прочитать клиентский путь на сервере. Код отрабатывает без ошибки на файловой базе разработчика (где клиент и сервер — один процесс), но падает в клиент-серверном режиме с сообщением о недоступности файла. Проверяйте обработку именно в том режиме, в котором работают пользователи.

Вторая группа ошибок связана с временным хранилищем: адрес теряется между вызовами, если не передан уникальный идентификатор формы, либо данные удаляются до того, как сервер успел их забрать. Признак — ПолучитьИзВременногоХранилища возвращает Неопределено.

Третья группа — размер и производительность. Передача большого файла через хранилище грузит канал между клиентом и сервером, а чтение целиком в память — оперативную память. Для файлов в десятки и сотни мегабайт используйте потоковое чтение (ЧтениеДанных, построчное чтение) и обработку порциями.

Типичные ошибки
01
Чтение файла по локальному пути в серверной процедуре — работает у разработчика и падает у пользователей
02
Синхронные методы ПоместитьФайл и модальные диалоги — запрещены конфигурацией или не работают в веб-клиенте
03
Отсутствие УникальныйИдентификатор при помещении — хранилище очищается до серверного вызова
04
Чтение без указания кодировки — кириллица превращается в кракозябры
05
Отсутствие проверки параметра Результат в оповещении — при отмене выбора файла код падает с ошибкой

Как проверить, что файл прочитан корректно

Минимальная проверка — размер и содержимое. После получения двоичных данных сравните их размер с размером исходного файла: нулевой размер означает, что помещение не выполнилось. Для текстовых файлов полезно вывести первые строки в сообщение или журнал — так сразу видно проблемы с кодировкой.

При разборе структурированных форматов оборачивайте чтение в попытку-исключение и фиксируйте номер строки или позицию, на которой произошла ошибка. Пользователю показывайте понятное сообщение («в строке 15 отсутствует обязательная колонка»), а не системный текст исключения.

Контрольные точки

Как проверить результат

Результат в оповещении о помещении
Норма

Результат = Истина, адрес не пустой

Тревожный признак

Результат = Ложь — пользователь отменил выбор или файл недоступен

Данные на сервере
Норма

ПолучитьИзВременногоХранилища вернуло ДвоичныеДанные с ненулевым размером

Тревожный признак

Возвращено Неопределено — хранилище очищено или адрес неверный

Текстовое содержимое
Норма

Кириллица читается, структура строк соответствует ожиданиям

Тревожный признак

Кракозябры (неверная кодировка) или сбитые колонки (неверный разделитель)

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

Можно ли прочитать файл на клиенте без диалога выбора, по известному пути?

Да, в тонком и толстом клиенте — через ЧтениеТекста или ДвоичныеДанные с указанием полного пути. В веб-клиенте это возможно только с установленным расширением работы с файлами и при наличии у пользователя прав на этот файл.

Почему НачатьПомещениеФайла не открывает диалог выбора?

Проверьте четвёртый параметр метода: интерактивный режим включается значением Истина. Если передано Ложь, платформа ожидает готовое имя файла во втором параметре и молча пытается поместить его.

Как передать на сервер несколько файлов сразу?

Используйте НачатьПомещениеФайлов — метод принимает массив описаний передаваемых файлов и возвращает массив адресов в хранилище. Альтернатива — вызов НачатьПомещениеФайла в цикле с сохранением адресов в массив формы.

Чем читать файл Excel на клиенте без установленного Excel?

Напрямую на клиенте — никак. Правильный путь: поместить файл в хранилище, на сервере записать во временный файл с расширением xlsx и прочитать его в табличный документ методом ТабличныйДокумент.Прочитать — Excel на сервере для этого не требуется.

Файл большой, клиент зависает при чтении. Что делать?

Не читайте файл целиком: используйте построчное чтение через ЧтениеТекста.ПрочитатьСтроку или потоковое чтение через ЧтениеДанных. Тяжёлую обработку переносите на сервер и при необходимости разбивайте на порции с выводом прогресса пользователю.

Работает ли этот код в мобильном клиенте?

НачатьПомещениеФайла поддерживается, но диалоги и доступ к файловой системе зависят от платформы устройства. Надёжнее использовать штатные механизмы выбора файлов мобильной платформы и тестировать сценарий на реальном устройстве, а не только в эмуляторе.

Итог

Что важно запомнить

Универсальный способ прочитать файл на клиенте в 1С — асинхронный НачатьПомещениеФайла с передачей адреса на сервер. Локальное чтение через ЧтениеТекста годится для небольших файлов в тонком клиенте, а веб-клиент требует расширения работы с файлами. Всегда проверяйте результат помещения, указывайте кодировку и не пытайтесь читать клиентский путь на сервере.