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

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

Как получить значение из табличного документа 1С

Способы получить значение из табличного документа 1С: метод Область, чтение по координатам, обход ячеек, работа с расшифровкой. Примеры кода и типичные ошибки.

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

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

Важно понимать: табличный документ хранит не «данные» в смысле базы, а текстовое представление ячеек. Число «1 234,56» в ячейке — это строка, и для дальнейших вычислений её нужно приводить к типу. Это главный источник ошибок при чтении табличных документов.

Обращение к ячейке через метод Область()

Основной способ — метод Область(), который принимает адрес ячейки в формате «R{номер строки}C{номер колонки}». Метод возвращает объект «ОбластьЯчеекТабличногоДокумента», у которого есть свойства Текст, Значение (если область содержит значение), ЦветФона и другие.

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

ТабДок.Прочитать("C:\Данные\Отчет.mxl");

ТекстЯчейки = ТабДок.Область("R5C3").Текст;

Сообщить("В ячейке R5C3: " + ТекстЯчейки);

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

ОбластьЯчейки = ТабДок.Область(5, 3, 5, 3);

ЗначениеЯчейки = ОбластьЯчейки.Текст;

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

Чтение данных в цикле по строкам и колонкам

Когда нужно прочитать всю таблицу — например, загрузить прайс из mxl-файла — используют вложенные циклы. Границы данных определяют свойствами ВысотаТаблицы и ШиринаТаблицы: они возвращают номер последней заполненной строки и колонки.

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

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

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

Если Не ЗначениеЗаполнено(Артикул) Тогда

Продолжить;

КонецЕсли;

// обработка строки данных

КонецЦикла;

Типичная структура файла: первая строка — шапка с заголовками, данные начинаются со второй. Перед обходом полезно прочитать заголовки и построить соответствие «имя колонки → номер», чтобы код не зависел от жёстко зашитых номеров колонок: при изменении макета загрузка сломается незаметно.

Колонки = Новый Соответствие;

Для НомерКолонки = 1 По ТабДок.ШиринаТаблицы Цикл

Заголовок = СокрЛП(ТабДок.Область(1, НомерКолонки).Текст);

Если Заголовок <> "" Тогда

Колонки.Вставить(Заголовок, НомерКолонки);

КонецЕсли;

КонецЦикла;

НомерКолонкиЦена = Колонки["Цена"];

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

Приведение типов: почему Текст — это не число

Свойство Текст всегда возвращает строку в том виде, в каком она отображается на экране: с разделителями разрядов, неразрывными пробелами, символом валюты. Попытка сразу выполнить Число(ТекстЯчейки) часто даёт 0 или ошибку, потому что неразрывный пробел (Символ(160)) не считается допустимым символом числа.

Надёжный приём — очистить строку от пробельных символов и заменить десятичный разделитель перед преобразованием:

Функция СтрокаВЧисло(Строка)

Результат = СтрЗаменить(Строка, Символ(160), "");

Результат = СтрЗаменить(Результат, " ", "");

Результат = СтрЗаменить(Результат, ",", ".");

Попытка

Возврат Число(Результат);

Исключение

Возврат 0;

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

КонецФункции

С датами ситуация похожая: строка «31.12.2026» преобразуется через Дата() только в определённых форматах. Надёжнее разобрать строку вручную или использовать СтроковыеФункцииКлиентСервер.СтрокаВДату() из БСП, если она подключена.

Получение данных через расшифровку отчёта СКД

Если табличный документ — результат работы отчёта на СКД, гораздо надёжнее читать не текст ячеек, а данные расшифровки. При выводе отчёта платформа формирует объект «ДанныеРасшифровки», где каждая ячейка связана с реальными значениями полей — с типами, ссылками и исходными данными.

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

ИдентификаторРасшифровки = ТабДок.Область(НомерСтроки, НомерКолонки).Расшифровка;

Если ИдентификаторРасшифровки <> Неопределено Тогда

ЭлементРасшифровки = ДанныеРасшифровки.Элементы[ИдентификаторРасшифровки];

Поля = ЭлементРасшифровки.ПолучитьПоля();

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

Сообщить(Поле.Поле + " = " + Поле.Значение);

КонецЦикла;

КонецЕсли;

Такой подход возвращает настоящие ссылки на номенклатуру, контрагентов и документы, а не их строковые представления. Это единственный корректный способ «вытащить» из отчёта объекты базы для дальнейшей обработки.

Альтернативы: когда табличный документ читать не стоит

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

Если данные приходят из файла Excel — используйте чтение через COM-объект Excel, ADO или пакетное чтение табличного документа с последующим разбором, но лучше попросить источник в формате CSV или через механизм обмена. Если нужен результат отчёта — выполните тот же запрос или схему СКД с выводом в таблицу значений вместо табличного документа. Если проверяется печатная форма — тестируйте данные до вывода, а не итоговый макет.

Сравнение способов получения данных

Область().Текст

Подходит для разового чтения известных ячеек и загрузки mxl-файлов. Ограничение: только строки, нужно приведение типов

Обход в цикле

Для массового чтения всей таблицы. Ограничение: зависимость от структуры макета, медленно на больших документах

Расшифровка СКД

Для отчётов на СКД: возвращает типизированные значения и ссылки. Ограничение: работает только при программном формировании отчёта

Вывод СКД в таблицу значений

Лучший вариант, если цель — данные, а не внешний вид. Ограничение: нужен доступ к схеме компоновки

Производительность и ограничения

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

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

Типичные ошибки
01
Число(ТекстЯчейки) без очистки от неразрывных пробелов — получается 0 или ошибка преобразования
02
Жёстко зашитые номера колонок — загрузка ломается при любом изменении макета
03
Разбор табличного документа вместо запроса к исходным данным — хрупкое и медленное решение
04
Попытка прочитать расшифровку из документа, загруженного из файла — расшифровка не сохраняется в mxl
05
Обход ячеек на тонком клиенте в цикле — тысячи серверных вызовов и зависание интерфейса

Проверка результата чтения

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

Полезно вывести журнал: сколько строк прочитано, сколько пропущено как пустые, сколько дало ошибки преобразования типов. Тихое пропускание ошибок — главная причина того, что «загрузилось не всё» обнаруживается спустя недели.

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

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

Количество загруженных строк
Норма

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

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

Строк меньше — часть потерялась при преобразовании или фильтрации

Числовые значения
Норма

Контрольная сумма по колонке совпадает с итогом в макете

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

Сумма расходится — проблема с разделителями или неразрывными пробелами

Ссылки на объекты
Норма

Получены через расшифровку и открываются в базе

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

Вместо ссылок строки с наименованиями — поиск по имени даст дубли

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

Как получить значение ячейки, если известно её имя, а не координаты?

Именованные области доступны через коллекцию: ТабДок.Области.Найти("ИмяОбласти"). Если область найдена, у неё читают свойство Текст. Имена задаются в макете при создании, поэтому способ работает только для макетов с заранее определёнными именованными областями.

Можно ли прочитать число напрямую, минуя текст?

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

Почему Область() возвращает пустой текст, хотя ячейка на экране заполнена?

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

Как прочитать табличный документ, открытый у пользователя на форме?

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

Сохраняется ли расшифровка при сохранении документа в файл mxl?

Нет. Файл mxl хранит только внешний вид: тексты, оформление, объединения ячеек. Данные расшифровки существуют в памяти только в момент работы отчёта. Если расшифровка понадобится позже, её нужно сохранять отдельно, например через хранилище значения.

Что быстрее: разбор табличного документа или запрос к базе?

Запрос к базе быстрее и надёжнее практически всегда. Разбор табличного документа оправдан только когда исходные данные недоступны: файл получен извне, документ сформирован чужим кодом или нужно проверить именно то, что увидел пользователь.

Итог

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

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