Разработка и Конфигурация · 11 мин
Как получить значение из табличного документа 1С
Способы получить значение из табличного документа 1С: метод Область, чтение по координатам, обход ячеек, работа с расшифровкой. Примеры кода и типичные ошибки.
Табличный документ в 1С — это объект типа «ТабличныйДокумент», который используется для вывода печатных форм, отчётов и макетов. Часто возникает обратная задача: не вывести данные, а прочитать содержимое уже сформированного табличного документа — например, при загрузке данных из файла, при разборе результата отчёта или при программной проверке печатной формы.
Получить значение можно несколькими способами: через метод Область() по адресу ячейки, через прямое обращение к коллекции Области, через обход строк и колонок в цикле, а также через расшифровку, если документ сформирован СКД. Выбор зависит от того, известны ли вам координаты ячеек и как документ был создан.
Важно понимать: табличный документ хранит не «данные» в смысле базы, а текстовое представление ячеек. Число «1 234,56» в ячейке — это строка, и для дальнейших вычислений её нужно приводить к типу. Это главный источник ошибок при чтении табличных документов.
Обращение к ячейке через метод Область()
Основной способ — метод Область(), который принимает адрес ячейки в формате «R{номер строки}C{номер колонки}». Метод возвращает объект «ОбластьЯчеекТабличногоДокумента», у которого есть свойства Текст, Значение (если область содержит значение), ЦветФона и другие.
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать("C:\Данные\Отчет.mxl");
ТекстЯчейки = ТабДок.Область("R5C3").Текст;
Сообщить("В ячейке R5C3: " + ТекстЯчейки);
Также метод Область() принимает четыре числовых параметра: верхнюю строку, левую колонку, нижнюю строку и правую колонку — так задаётся прямоугольный диапазон. Если указать одну ячейку, все четыре параметра совпадают попарно.
ОбластьЯчейки = ТабДок.Область(5, 3, 5, 3);
ЗначениеЯчейки = ОбластьЯчейки.Текст;
Если ячейка входит в объединённую область, обращение к любой из составляющих ячеек вернёт текст всей объединённой области. Это удобно, но может привести к дублированию данных при построчном обходе — проверяйте свойство области на объединение, если это критично.
Чтение данных в цикле по строкам и колонкам
Когда нужно прочитать всю таблицу — например, загрузить прайс из mxl-файла — используют вложенные циклы. Границы данных определяют свойствами ВысотаТаблицы и ШиринаТаблицы: они возвращают номер последней заполненной строки и колонки.
Для НомерСтроки = 2 По ТабДок.ВысотаТаблицы Цикл
Артикул = ТабДок.Область(НомерСтроки, 1).Текст;
ЦенаСтрокой = ТабДок.Область(НомерСтроки, 3).Текст;
Если Не ЗначениеЗаполнено(Артикул) Тогда
Продолжить;
КонецЕсли;
// обработка строки данных
КонецЦикла;
Типичная структура файла: первая строка — шапка с заголовками, данные начинаются со второй. Перед обходом полезно прочитать заголовки и построить соответствие «имя колонки → номер», чтобы код не зависел от жёстко зашитых номеров колонок: при изменении макета загрузка сломается незаметно.
Колонки = Новый Соответствие;
Для НомерКолонки = 1 По ТабДок.ШиринаТаблицы Цикл
Заголовок = СокрЛП(ТабДок.Область(1, НомерКолонки).Текст);
Если Заголовок <> "" Тогда
Колонки.Вставить(Заголовок, НомерКолонки);
КонецЕсли;
КонецЦикла;
НомерКолонкиЦена = Колонки["Цена"];
- 1Создайте объект ТабличныйДокумент и загрузите данные методом Прочитать() или сформируйте документ программно
- 2Определите границы данных через ВысотаТаблицы и ШиринаТаблицы
- 3Прочитайте строку заголовков и постройте соответствие имён колонок их номерам
- 4Обойдите строки в цикле, читая ячейки через Область(строка, колонка).Текст
- 5Приведите строковые значения к нужным типам и проверьте результат на контрольном примере
Приведение типов: почему Текст — это не число
Свойство Текст всегда возвращает строку в том виде, в каком она отображается на экране: с разделителями разрядов, неразрывными пробелами, символом валюты. Попытка сразу выполнить Число(ТекстЯчейки) часто даёт 0 или ошибку, потому что неразрывный пробел (Символ(160)) не считается допустимым символом числа.
Надёжный приём — очистить строку от пробельных символов и заменить десятичный разделитель перед преобразованием:
Функция СтрокаВЧисло(Строка)
Результат = СтрЗаменить(Строка, Символ(160), "");
Результат = СтрЗаменить(Результат, " ", "");
Результат = СтрЗаменить(Результат, ",", ".");
Попытка
Возврат Число(Результат);
Исключение
Возврат 0;
КонецПопытки;
КонецФункции
С датами ситуация похожая: строка «31.12.2026» преобразуется через Дата() только в определённых форматах. Надёжнее разобрать строку вручную или использовать СтроковыеФункцииКлиентСервер.СтрокаВДату() из БСП, если она подключена.
Получение данных через расшифровку отчёта СКД
Если табличный документ — результат работы отчёта на СКД, гораздо надёжнее читать не текст ячеек, а данные расшифровки. При выводе отчёта платформа формирует объект «ДанныеРасшифровки», где каждая ячейка связана с реальными значениями полей — с типами, ссылками и исходными данными.
Расшифровка хранится в свойстве ячейки Расшифровка — это идентификатор элемента расшифровки. По нему из объекта ДанныеРасшифровки.Элементы получают элемент, а из него — значения полей через метод ПолучитьПоля().
ИдентификаторРасшифровки = ТабДок.Область(НомерСтроки, НомерКолонки).Расшифровка;
Если ИдентификаторРасшифровки <> Неопределено Тогда
ЭлементРасшифровки = ДанныеРасшифровки.Элементы[ИдентификаторРасшифровки];
Поля = ЭлементРасшифровки.ПолучитьПоля();
Для Каждого Поле Из Поля Цикл
Сообщить(Поле.Поле + " = " + Поле.Значение);
КонецЦикла;
КонецЕсли;
Такой подход возвращает настоящие ссылки на номенклатуру, контрагентов и документы, а не их строковые представления. Это единственный корректный способ «вытащить» из отчёта объекты базы для дальнейшей обработки.
Альтернативы: когда табличный документ читать не стоит
Прежде чем писать разбор табличного документа, проверьте, нет ли более прямого пути к данным. Чтение текста ячеек — это обходной манёвр, и почти всегда существует основной маршрут.
Если данные приходят из файла Excel — используйте чтение через COM-объект Excel, ADO или пакетное чтение табличного документа с последующим разбором, но лучше попросить источник в формате CSV или через механизм обмена. Если нужен результат отчёта — выполните тот же запрос или схему СКД с выводом в таблицу значений вместо табличного документа. Если проверяется печатная форма — тестируйте данные до вывода, а не итоговый макет.
Сравнение способов получения данных
Подходит для разового чтения известных ячеек и загрузки mxl-файлов. Ограничение: только строки, нужно приведение типов
Для массового чтения всей таблицы. Ограничение: зависимость от структуры макета, медленно на больших документах
Для отчётов на СКД: возвращает типизированные значения и ссылки. Ограничение: работает только при программном формировании отчёта
Лучший вариант, если цель — данные, а не внешний вид. Ограничение: нужен доступ к схеме компоновки
Производительность и ограничения
Обращение к каждой ячейке через Область() — относительно дорогая операция. На документах в десятки тысяч строк построчный разбор может занимать заметное время, особенно на клиенте в тонком клиенте: каждое обращение к свойству табличного документа — это серверный вызов.
Практические рекомендации: выполняйте разбор на сервере, выносите чтение в фоновое задание при больших объёмах, кешируйте номера колонок вместо повторного поиска. Если документ формируете вы сами и потом его же разбираете — остановитесь и сохраните данные в момент формирования, это устранит проблему в корне.
Проверка результата чтения
После разбора табличного документа обязательно сверьте результат с ожиданиями. Минимальный контроль — количество прочитанных строк против количества строк в документе и контрольная сумма по числовой колонке, если она есть в итоговой строке макета.
Полезно вывести журнал: сколько строк прочитано, сколько пропущено как пустые, сколько дало ошибки преобразования типов. Тихое пропускание ошибок — главная причина того, что «загрузилось не всё» обнаруживается спустя недели.
Как проверить результат
Совпадает с числом строк данных в документе минус шапка
Строк меньше — часть потерялась при преобразовании или фильтрации
Контрольная сумма по колонке совпадает с итогом в макете
Сумма расходится — проблема с разделителями или неразрывными пробелами
Получены через расшифровку и открываются в базе
Вместо ссылок строки с наименованиями — поиск по имени даст дубли
Часто задаваемые вопросы
Как получить значение ячейки, если известно её имя, а не координаты?
Именованные области доступны через коллекцию: ТабДок.Области.Найти("ИмяОбласти"). Если область найдена, у неё читают свойство Текст. Имена задаются в макете при создании, поэтому способ работает только для макетов с заранее определёнными именованными областями.
Можно ли прочитать число напрямую, минуя текст?
Если в ячейку выводилось значение через параметр макета с сохранением типа, у области доступно свойство, содержащее исходное значение. Однако при обычном выводе через Заполнить значения в ячейках остаётся отформатированный текст, поэтому в большинстве случаев приведение строки к числу неизбежно.
Почему Область() возвращает пустой текст, хотя ячейка на экране заполнена?
Частые причины: перепутаны строка и колонка (сначала идёт строка), ячейка входит в объединённую область и текст хранится в её левой верхней ячейке, либо данные выведены в присоединённую область за пределами проверяемого диапазона. Проверьте ВысотаТаблицы и ШиринаТаблицы — возможно, документ шире или выше ожидаемого.
Как прочитать табличный документ, открытый у пользователя на форме?
Обратитесь к реквизиту формы типа ТабличныйДокумент по имени — дальше работают те же методы Область() и свойства ячеек. Учтите, что на клиенте доступен ограниченный набор операций; массовый разбор лучше передать на сервер через вызов серверной процедуры.
Сохраняется ли расшифровка при сохранении документа в файл mxl?
Нет. Файл mxl хранит только внешний вид: тексты, оформление, объединения ячеек. Данные расшифровки существуют в памяти только в момент работы отчёта. Если расшифровка понадобится позже, её нужно сохранять отдельно, например через хранилище значения.
Что быстрее: разбор табличного документа или запрос к базе?
Запрос к базе быстрее и надёжнее практически всегда. Разбор табличного документа оправдан только когда исходные данные недоступны: файл получен извне, документ сформирован чужим кодом или нужно проверить именно то, что увидел пользователь.
Что важно запомнить
Значение ячейки читают через Область(строка, колонка).Текст, массовое чтение — циклом с картой заголовков, из отчётов СКД данные берут через расшифровку. Содержимое ячеек — всегда строка, требующая очистки и приведения типов. Если есть доступ к исходным данным, используйте запрос вместо разбора табличного документа.