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

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

Как прочитать данные из MXL-файла в 1С

Как программно прочитать данные из MXL-файла в 1С: объект ТабличныйДокумент, метод Прочитать, обход ячеек, загрузка в таблицу значений, типичные ошибки и ограничения.

MXL — это родной формат табличного документа 1С. Файлы .mxl сохраняются из любого табличного документа (отчёта, макета) через «Файл → Сохранить» и хранят не только значения ячеек, но и форматирование: шрифты, границы, цвета, объединённые ячейки. Прочитать такой файл можно как интерактивно (просто открыть в режиме 1С:Предприятие), так и программно — объектом «ТабличныйДокумент» с последующим обходом ячеек.

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

Ниже разобраны все рабочие способы: от простого открытия файла до полноценной загрузки в таблицу значений с проверками, а также ограничения формата и типичные ошибки, из-за которых чтение «не видит» данные.

Что такое MXL и когда его читают программно

MXL (от «1С:Таблица») — внутренний формат платформы, в котором сохраняется табличный документ целиком. В отличие от Excel или CSV, файл содержит не только значения, но и оформление, группировки строк, картинки и расшифровки. Поэтому MXL часто используют для обмена отчётами между базами 1С без потери вида документа.

Программное чтение нужно в нескольких сценариях: загрузка данных из выгрузки другой базы, импорт прайсов и реестров, сохранённых пользователями в MXL, автоматическая обработка файлов из каталога, сравнение двух версий отчёта. Во всех этих случаях логика одинакова: сначала файл загружается в объект «ТабличныйДокумент», затем из него извлекаются значения.

Базовое чтение файла: объект ТабличныйДокумент и метод Прочитать

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

ТабДок = Новый ТабличныйДокумент;

ТабДок.Прочитать("C:\Данные\Прайс.mxl", СпособЧтенияЗначенийТабличногоДокумента.Значение);

// Чтение конкретной ячейки (строка 2, колонка 1)

ЗначениеЯчейки = ТабДок.Область(2, 1).Текст;

// Размеры заполненной области

Высота = ТабДок.ВысотаТаблицы;

Ширина = ТабДок.ШиринаТаблицы;

Второй параметр метода — способ чтения значений — определяет, что попадёт в ячейки. СпособЧтенияЗначенийТабличногоДокумента.Значение загружает типизированные значения (числа как числа, даты как даты), а Текст — всё как строки. Для последующей загрузки в базу почти всегда нужен режим «Значение», иначе придётся вручную преобразовывать строки в числа и даты.

После чтения проверьте, что документ не пуст: если ВысотаТаблицы равна нулю, файл либо пустой, либо не является корректным MXL — платформа в этом случае может не выдать исключение, а просто вернуть пустой документ.

Обход ячеек и извлечение данных

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

Для НомСтроки = 2 По ТабДок.ВысотаТаблицы Цикл

Артикул = ТабДок.Область(НомСтроки, 1).Текст;

Наименование = ТабДок.Область(НомСтроки, 2).Текст;

ЦенаСтрокой = ТабДок.Область(НомСтроки, 3).Текст;

Если ПустаяСтрока(Артикул) Тогда

Продолжить; // пропуск пустых строк

КонецЕсли;

Цена = Число(СтрЗаменить(ЦенаСтрокой, " ", ""));

// дальше — запись в таблицу значений или базу

КонецЦикла;

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

Отдельный нюанс — объединённые ячейки. Если шапка или итоги объединены по нескольким строкам, текст хранится только в левой верхней ячейке объединения, остальные вернут пустую строку. Это нужно учитывать при определении, с какой строки начинаются данные.

Загрузка MXL в таблицу значений

Когда структура файла табличная (одна строка — одна запись, колонки фиксированы), удобнее всего преобразовать табличный документ в таблицу значений. Встроенного метода «в один вызов» у объекта нет, но есть два рабочих подхода: через построитель отчёта и ручным переносом.

Первый подход — объект «ПостроительОтчета» с источником «ТабличныйДокумент». Он автоматически создаёт колонки по первой строке области и возвращает результат запросом:

ТабДок = Новый ТабличныйДокумент;

ТабДок.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);

ОбластьДанных = ТабДок.ПолучитьОбласть(1, 1, ТабДок.ВысотаТаблицы, ТабДок.ШиринаТаблицы);

Построитель = Новый ПостроительОтчета;

Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ОбластьДанных);

Построитель.Выполнить();

ТаблицаДанных = Построитель.Результат.Выгрузить();

Второй подход — вручную: прочитать первую строку как заголовки, создать колонки таблицы значений, затем в цикле добавлять строки. Он длиннее, но даёт полный контроль над типами колонок и позволяет сразу отбрасывать служебные строки (шапку из нескольких строк, подвалы, промежуточные итоги).

Порядок загрузки MXL в таблицу значений
  1. 1
    Создайте ТабличныйДокумент и прочитайте файл методом Прочитать() в режиме Значение
  2. 2
    Проверьте ВысотаТаблицы и ШиринаТаблицы — файл не должен быть пустым
  3. 3
    Определите строку начала данных, пропустив шапку
  4. 4
    Получите область данных через ПолучитьОбласть() или обойдите ячейки циклом
  5. 5
    Перенесите значения в таблицу значений с явным указанием типов колонок
  6. 6
    Проверьте количество загруженных строк и типы значений в контрольных колонках

Чтение MXL в управляемом приложении и на сервере

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

&НаКлиенте

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

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

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

, , Истина, УникальныйИдентификатор);

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

&НаСервере

Процедура ПрочитатьНаСервере(АдресХранилища)

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

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

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

ТабДок = Новый ТабличныйДокумент;

ТабДок.Прочитать(ИмяВременногоФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);

// ... обработка ...

УдалитьФайлы(ИмяВременногоФайла);

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

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

Ограничения формата и альтернативы

MXL — закрытый формат платформы: его не откроют ни Excel, ни сторонние программы. Если обмен идёт с внешними системами или контрагентами, практичнее использовать Excel (через COM-объект или пакетное чтение), CSV или XML. MXL оправдан только тогда, когда оба участника обмена работают в 1С.

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

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

Чем читать табличные данные в 1С

MXL + ТабличныйДокумент.Прочитать

Обмен между базами 1С с сохранением оформления. Не подходит для внешних систем и очень больших файлов

Excel (COM или ТабличныйДокумент.Прочитать)

Файлы от контрагентов. ТабличныйДокумент умеет читать xlsx без установленного Excel, но медленно на больших объёмах

CSV / текстовый формат

Быстрая массовая загрузка десятков тысяч строк. Нет форматирования и типов, нужен разбор разделителей

XML / EnterpriseData

Регулярный обмен между базами 1С по правилам. Требует настройки, но надёжен и типизирован

Частые ошибки при чтении MXL

Самая распространённая проблема — «файл прочитался, но данных нет». Причины: файл сохранён не как MXL (например, переименованный xlsx), чтение выполнено в режиме «Текст» и проверка идёт по типизированным значениям, либо данные находятся в именованной области, а обход идёт по координатам с неверным смещением. Начинайте диагностику с проверки ВысотаТаблицы и вывода первых строк в сообщения.

Вторая группа ошибок — типы данных. Числа с разделителем групп («1 234,56») при чтении как текст не преобразуются функцией Число() без предварительного удаления пробелов. Даты в произвольном формате тоже требуют ручного разбора. Решение — читать в режиме «Значение» и проверять ТипЗнч() результата.

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

Типичные ошибки
01
Чтение на сервере по клиентскому пути — файл не найден, данные не загружаются
02
Режим чтения Текст вместо Значение — числа и даты приходят строками и ломают загрузку
03
Обход ячеек по координатам без учёта объединённых ячеек — часть значений читается пустыми
04
Отсутствие проверки ВысотаТаблицы — пустой или битый файл обрабатывается как корректный
05
Повторное чтение в тот же ТабличныйДокумент — данные предыдущего файла затираются

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

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

Полезно вывести первые и последние две строки результата в окно сообщений или журнал регистрации — это быстрый способ убедиться, что границы данных определены верно и «хвост» файла (итоги, подписи) не попал в загрузку.

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

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

Количество строк
Норма

Совпадает с числом строк данных в файле

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

Меньше — пропуски из-за объединений или пустых ячеек; больше — попала шапка или итоги

Типы значений
Норма

Числа и даты имеют соответствующие типы (ТипЗнч)

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

Всё строки — файл прочитан в режиме Текст

Контрольная сумма по колонке
Норма

Сумма совпадает с итогом в файле

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

Расхождение — ошибки преобразования чисел с разделителями

Первая и последняя строки
Норма

Содержат реальные данные

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

В первой — заголовки, в последней — подписи или итоги

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

Можно ли открыть MXL-файл без программирования?

Да. В режиме 1С:Предприятие выберите «Файл → Открыть» и укажите файл .mxl — он откроется как табличный документ, который можно просмотреть, отредактировать и пересохранить в Excel. Это удобно для разового просмотра, но не для автоматической загрузки данных.

Чем отличаются режимы чтения Значение и Текст?

Режим «Значение» загружает типизированные значения ячеек: числа остаются числами, даты — датами. Режим «Текст» приводит всё к строкам в том виде, как они отображаются. Для загрузки данных в базу почти всегда нужен режим «Значение», иначе потребуется ручное преобразование типов.

Почему Прочитать() не выдаёт ошибку, но документ пустой?

Чаще всего файл не является корректным MXL (например, переименованный файл другого формата) или путь указывает на недоступное место. Всегда проверяйте ВысотаТаблицы после чтения: нулевое значение — признак того, что данные не загрузились.

Как прочитать MXL на сервере, если файл выбрал пользователь?

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

Подходит ли MXL для загрузки больших прайсов?

Нет, это не лучший выбор. Табличный документ хранит форматирование каждой ячейки, поэтому большие файлы читаются медленно и потребляют много памяти. Для объёмов в десятки тысяч строк используйте CSV или XML, а MXL оставьте для обмена отчётами и небольшими выгрузками между базами 1С.

Можно ли прочитать только часть MXL-файла?

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

Итог

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

MXL читается объектом ТабличныйДокумент методом Прочитать() в режиме Значение. Данные извлекаются через Область(строка, колонка) или построитель отчёта. На сервере файл сначала передают через временное хранилище. Обязательно проверяйте ВысотаТаблицы, типы значений и контрольные суммы, а для больших объёмов выбирайте CSV или XML вместо MXL.