Разработка и Конфигурация · 13 мин
Как прочитать табличный документ на клиенте в 1С
Как в 1С прочитать табличный документ на клиенте: методы Прочитать, НачатьЧтение, работа с файлами mxl, Excel и ограничения тонкого и веб-клиента.
Чтение табличного документа на клиенте — типовая задача при загрузке данных из файлов MXL, Excel-подобных форматов или при обработке макетов без обращения к серверу. В управляемых приложениях 1С это не всегда тривиально: часть методов объекта ТабличныйДокумент работает только на толстом клиенте, а в тонком и веб-клиенте действуют ограничения, которые нужно учитывать при проектировании.
Основной инструмент — метод Прочитать() объекта ТабличныйДокумент и его асинхронный аналог НачатьЧтение(). Выбор между ними зависит от режима запуска (синхронные вызовы запрещены в ряде конфигураций), типа клиента и того, откуда берётся файл: с локального диска пользователя или уже помещён во временное хранилище.
Важно понимать: сам по себе табличный документ — это не «читатель данных», а объект представления. Прочитав файл, вы получаете область ячеек, из которой данные извлекают обходом по строкам и колонкам. Поэтому полная схема всегда состоит из трёх шагов: получить файл, прочитать его в табличный документ, обойти области и забрать значения.
Когда чтение на клиенте вообще возможно
Доступность чтения зависит от типа клиента и режима работы. В толстом клиенте обычного приложения метод Прочитать() работает напрямую с локальным файлом без ограничений. В управляемом приложении ситуация строже: платформа ориентирует разработчика на асинхронную модель, а прямой доступ к файловой системе клиента требует явных действий пользователя.
В тонком клиенте чтение табличного документа из локального файла технически возможно, но только после того, как пользователь выбрал файл через диалог или файл был помещён во временное хранилище. В веб-клиенте прямой путь к файлу недоступен в принципе — браузер изолирует файловую систему, поэтому единственный рабочий сценарий: поместить файл в хранилище и обработать его на сервере.
Практический вывод: если решение должно работать во всех клиентах, закладывайте схему «файл → временное хранилище → чтение». Это универсальный маршрут, который не ломается при переходе с тонкого клиента на веб-клиент.
Сравнение вариантов чтения
Подходит для толстого клиента и тонкого клиента с выбранным файлом. Ограничение — синхронный вызов, запрещён при режиме использования модальности «Не использовать».
Универсальный вариант для тонкого и веб-клиента. Требует передачи файла на сервер и обработки в серверной процедуре.
Асинхронное чтение на клиенте без блокировки интерфейса. Подходит для больших файлов, но требует описания оповещения о завершении.
Чтение файла методом Прочитать() на клиенте
Самый простой сценарий — толстый клиент или тонкий клиент, где синхронные вызовы разрешены. Создаёте объект, вызываете Прочитать() с полным именем файла и при необходимости указываете способ чтения.
&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
ТабДок = Новый ТабличныйДокумент;
Попытка
ТабДок.Прочитать("C:\Данные\Загрузка.mxl",
СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
Сообщить("Не удалось прочитать файл: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Сообщить("Строк: " + ТабДок.ВысотаТаблицы
+ ", колонок: " + ТабДок.ШиринаТаблицы);
КонецПроцедуры
Параметр СпособЧтенияЗначенийТабличногоДокумента определяет, что вы получите в ячейках: Значение — типизированные значения (числа, даты), Текст — всё как строки. Для последующей загрузки в справочники или документы обычно удобнее Значение, для разбора нестандартных форматов — Текст.
После чтения проверьте размеры области через свойства ВысотаТаблицы и ШиринаТаблицы. Если они равны нулю, файл либо пуст, либо формат не распознан — например, вы пытаетесь прочитать «настоящий» XLSX старой версии платформы, которая такой формат не поддерживает.
Асинхронная схема: помещение файла и чтение
В современных конфигурациях стандартный путь — асинхронный. Пользователь выбирает файл, платформа помещает его во временное хранилище, а дальше файл либо читается на клиенте методом НачатьЧтение(), либо передаётся на сервер для обработки.
- 1Вызовите НачатьПомещениеФайла() с описанием оповещения, адресом хранилища и интерактивным режимом для выбора файла пользователем.
- 2В обработчике оповещения проверьте, что файл помещён (результат не равен Неопределено).
- 3Передайте адрес хранилища в серверную процедуру: там получите двоичные данные через ПолучитьИзВременногоХранилища(), запишите во временный файл и вызовите ТабличныйДокумент.Прочитать().
- 4Обойдите область данных и перенесите значения в структуры или таблицу значений.
- 5Удалите данные из хранилища через УдалитьИзВременногоХранилища() после обработки.
На клиенте асинхронное чтение выглядит так:
&НаКлиенте
Процедура ПрочитатьАсинхронно(ИмяФайла)
ТабДок = Новый ТабличныйДокумент;
Оповещение = Новый ОписаниеОповещения("ПослеЧтения", ЭтотОбъект, ТабДок);
ТабДок.НачатьЧтение(Оповещение, ИмяФайла,
СпособЧтенияЗначенийТабличногоДокумента.Значение);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЧтения(ТабДок) Экспорт
Сообщить("Прочитано строк: " + ТабДок.ВысотаТаблицы);
КонецПроцедуры
Обратите внимание: НачатьЧтение() не блокирует интерфейс, поэтому пользователь может продолжать работу, пока большой файл загружается. Но до завершения чтения нельзя обращаться к содержимому документа — данные появятся только в момент вызова оповещения.
Чтение файлов Excel через табличный документ
Платформа умеет читать файлы форматов MXL, а также XLS и XLSX (поддержка зависит от версии платформы) напрямую через тот же Прочитать() — расширение файла определяет формат автоматически. Это самый простой способ забрать данные из Excel без COM-объектов и внешних компонент.
Однако есть нюансы. Формулы Excel при чтении заменяются вычисленными значениями — исходные формулы вы не получите. Объединённые ячейки, скрытые строки и несколько листов тоже требуют внимания: табличный документ прочитает только первый лист книги. Если данные лежат на другом листе, потребуется либо договорённость с пользователями о структуре файла, либо другой инструмент чтения.
Также помните про производительность: файлы Excel на десятки тысяч строк читаются заметно медленнее, чем MXL того же объёма, потому что платформа выполняет полный разбор формата. Для регулярных больших загрузок имеет смысл просить пользователей сохранять файл в MXL или CSV.
Обход ячеек и извлечение данных
Прочитанный табличный документ — это сетка ячеек. Данные извлекают обходом: внешний цикл по строкам, внутренний по колонкам, обращение через Область(Строка, Колонка) и чтение свойств Текст или Значение (в зависимости от способа чтения доступно то или иное).
Для НомерСтроки = 2 По ТабДок.ВысотаТаблицы Цикл
Наименование = ТабДок.Область(НомерСтроки, 1).Текст;
Артикул = ТабДок.Область(НомерСтроки, 2).Текст;
Если ПустаяСтрока(Наименование) Тогда
Продолжить;
КонецЕсли;
// дальнейшая обработка строки
КонецЦикла;
Первая строка обычно содержит заголовки, поэтому обход начинают со второй. Перед циклом полезно проверить соответствие заголовков ожидаемым — это защищает от загрузки «не того» файла, где колонки переставлены местами.
Если файл большой, не выводите прочитанный документ в элемент формы «Поле табличного документа» — отрисовка десятков тысяч ячеек заметно нагружает клиент. Достаточно прочитать данные в структуры и показать пользователю только итоговую таблицу значений.
Проверка результата и контроль качества загрузки
После чтения и обхода данных убедитесь, что результат соответствует ожиданиям. Минимальный набор проверок: ненулевые размеры области, корректные заголовки, отсутствие полностью пустых строк в середине данных, корректность типов в числовых колонках.
Как проверить результат чтения
Больше нуля и соответствуют размеру файла
Равны нулю — файл не прочитан или формат не поддержан
Совпадают с ожидаемыми названиями колонок
Пустые или чужие заголовки — выбран не тот файл
Содержат значения типа Число при способе чтения Значение
Всё прочитано как текст — числа потребуют преобразования
Совпадает с количеством строк в файле минус заголовок
Часть строк пропущена — ищите скрытые или объединённые ячейки
Если загрузка идёт в базу (справочники, документы), выполняйте запись на сервере, а на клиенте только собирайте данные. Передача всего табличного документа на сервер — плохая практика: передавайте массив структур или таблицу значений с уже извлечёнными данными.
Удобный приём для отладки: после Прочитать() выведите табличный документ в отдельную форму и визуально сравните с исходным файлом. Половина проблем загрузки — смещённые колонки, объединённые ячейки и скрытые строки — видна сразу, но не видна в коде.
Ограничения и альтернативные подходы
Чтение табличного документа на клиенте — не единственный и не всегда лучший способ загрузки табличных данных. Если файл большой, формат сложный (несколько листов, формулы, которые нужно читать как формулы) или загрузка регулярная, рассмотрите альтернативы: чтение CSV через ЧтениеТекста, обработку на сервере через временные файлы, типовые механизмы загрузки из табличного документа в БСП-подобных конфигурациях.
Граница безопасной самостоятельной работы: изменения в общих модулях загрузки и в коде, который пишет данные в базу, делайте только на копии. Ошибка в цикле обхода — например, неверное преобразование даты или числа — может молча испортить тысячи записей, и откат потребует восстановления из резервной копии.
Как выбрать действие
Что важно запомнить
Чтение табличного документа на клиенте выполняется методом Прочитать() или асинхронным НачатьЧтение(). В тонком и веб-клиенте файл сначала помещают во временное хранилище, а обработку часто переносят на сервер. Всегда проверяйте размеры прочитанной области и помните: читается только первый лист Excel-файла.
Частые вопросы
Можно ли прочитать табличный документ на клиенте без выбора файла пользователем?
Только если файл уже существует по известному пути на машине клиента и синхронные вызовы разрешены. В веб-клиенте доступ к произвольному локальному файлу без участия пользователя невозможен — это ограничение браузерной безопасности, которое нельзя обойти средствами платформы.
Почему после Прочитать() табличный документ пустой?
Чаще всего причины три: файл имеет неподдерживаемый формат (например, старая версия платформы и XLSX), файл заблокирован другой программой, либо путь указан неверно. Проверьте свойства ВысотаТаблицы и ШиринаТаблицы и оберните вызов в попытку с выводом текста ошибки.
Как получить значения, а не текст из ячеек?
Передайте в метод Прочитать() второй параметр — СпособЧтенияЗначенийТабличногоДокумента.Значение. Тогда числа и даты будут доступны в типизированном виде. Учтите, что это работает только для форматов, где типы сохранены (MXL, Excel); при чтении текстовых данных типизация невозможна.
Что делать, если Excel-файл содержит несколько листов?
Табличный документ прочитает только первый лист. Варианты: договориться с пользователями о размещении данных на первом листе, попросить сохранить нужный лист отдельным файлом, конвертировать файл в MXL или CSV, либо читать книгу на сервере другими средствами.
Безопасно ли обрабатывать файлы от пользователей через табличный документ?
Само чтение безопасно — платформа не выполняет макросы и внешние ссылки из Excel-файлов. Риск в другом: данные из файла записываются в базу. Валидируйте каждую строку перед записью (обязательные поля, типы, диапазоны значений) и выполняйте загрузку в транзакции с возможностью отката.
Почему чтение большого файла подвешивает клиент?
Синхронный Прочитать() блокирует интерфейс на всё время разбора файла. Для больших файлов используйте НачатьЧтение() с оповещением или переносите чтение на сервер, показывая пользователю индикатор длительной операции через механизм длительных операций.