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

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

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

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

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

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

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

Как устроен табличный документ и почему нет одного метода «ПолучитьТекст»

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

Работа с содержимым строится через объект ОбластьЯчеекТабличногоДокумента. Доступ к области выполняется методом ТабДок.Область() с указанием адреса (например, "R2C3" — строка 2, колонка 3) или имени именованной области. У полученной области доступно свойство Текст, которое возвращает строковое содержимое.

Как прочитать текст конкретной ячейки или области

Самый частый сценарий — получить текст из известной позиции. Адресация ведётся в стиле R1C1: буква R и номер строки, буква C и номер колонки. Нумерация начинается с единицы.

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

// ... заполнение документа ...

ТекстЯчейки = ТабДок.Область("R2C3").Текст; // строка 2, колонка 3

ТекстШапки = ТабДок.Область("R1C1:R1C5").Текст; // диапазон

Если область именованная (например, в макете задано имя «Шапка»), обращение идёт по имени: ТабДок.Область("Шапка").Текст. Для объединённых ячеек текст хранится в левой верхней ячейке объединения — обращение к остальным ячейкам диапазона вернёт пустую строку или то же значение в зависимости от способа адресации.

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

Как получить весь текст документа обходом ячеек

Когда требуется собрать текст всего документа — например, для поиска значения или передачи в строковую переменную, — используют цикл по строкам и колонкам. Границы документа определяют свойства ВысотаТаблицы (количество строк) и ШиринаТаблицы (количество колонок).

Результат = "";

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

СтрокаТекста = "";

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

ТекстЯчейки = ТабДок.Область("R" + НомерСтроки + "C" + НомерКолонки).Текст;

СтрокаТекста = СтрокаТекста + Символы.Таб + СокрЛП(ТекстЯчейки);

КонецЦикла;

Результат = Результат + Сред(СтрокаТекста, 2) + Символы.ПС;

КонецЦикла;

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

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

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

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

ТабДок.Записать("C:\Temp\Выгрузка.txt", ТипФайлаТабличногоДокумента.TXT);

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

Для чтения сохранённого текстового файла обратно в строку используется объект ЧтениеТекста:

Чтение = Новый ЧтениеТекста("C:\Temp\Выгрузка.txt", КодировкаТекста.UTF8);

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

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

Сравнение способов получения текста

Свойство Область().Текст

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

Обход циклом

Даёт полный текст в переменной с гибкой обработкой. Медленно на больших документах, требует аккуратности с разделителями.

Записать() в TXT

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

Записать() в MXL или HTML

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

Как получить текст из макета и из отчёта на СКД

Макет табличного документа — это тоже табличный документ, получаемый методом ПолучитьМакет(). Текст его областей читается тем же свойством Текст, но с оговоркой: ячейки с параметрами вернут шаблон вида [Номенклатура], а не значение. Поэтому макет удобно использовать для анализа структуры печатной формы, но не для извлечения данных.

С результатом отчёта на СКД ситуация иная. После вывода отчёта в табличный документ (через ПроцессорВыводаРезультатаКомпоновкиДанных) все параметры уже подставлены, и обход ячеек даст реальные значения. Однако в выборку попадут служебные элементы: заголовки группировок, итоговые строки, пустые отступы. Если нужны именно данные, а не их визуальное представление, надёжнее получить тот же результат выводом в ТаблицаЗначений через Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений") — тогда не придётся разбирать форматированный текст.

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

Как проверить результат и какие ошибки встречаются чаще всего

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

Типичная ошибка — обращение к области за границами документа. Платформа не всегда вызывает исключение: запрос Область("R100C1") при высоте таблицы 50 строк может молча вернуть пустую область. Перед чтением сверяйте номера с ВысотаТаблицы и ШиринаТаблицы. Вторая частая ошибка — попытка прочитать Текст у ячейки с картинкой или диаграммой: результат будет пустым, что выглядит как «потеря данных», хотя данных в текстовом смысле там и не было.

Ещё один подводный камень — тонкий клиент и веб-клиент. Запись файла на диск (Записать()) требует либо серверного вызова, либо передачи файла пользователю через НачатьПомещениеФайлаНаСервер / диалог сохранения. Код, безупречно работающий в толстом клиенте, на веб-клиенте упадёт или молча ничего не сохранит.

Типичные ошибки
01
Чтение свойства Текст у ячейки с параметром макета — вместо значения получают шаблон вида [Имя]; читать нужно через Параметры или после вывода области.
02
Игнорирование результата НайтиТекст() — при отсутствии совпадений метод возвращает Неопределено, и обращение к .Текст вызывает ошибку.
03
Поячеечный обход большого документа на клиенте — сеанс зависает; обход нужно выполнять на сервере или в фоновом задании.
04
Ожидание типизированных данных из свойства Текст — числа и даты возвращаются отформатированными строками, парсить их обратно ненадёжно.

Как выбрать подходящий способ под свою задачу

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

Маршрут решения

Как выбрать действие

Нужен текст одной известной ячейки или именованной областиИспользуйте ТабДок.Область(адрес).Текст
Нужно найти значение в документеИспользуйте ТабДок.НайтиТекст() с проверкой результата на Неопределено
Нужен весь текст в строковой переменнойВыполните обход циклом по ВысотаТаблицы и ШиринаТаблицы на сервере
Нужен файл для передачи во внешнюю системуИспользуйте ТабДок.Записать() с типом TXT, MXL или HTML
Нужны данные для программной обработкиПолучите их из источника (запрос, СКД в таблицу значений), а не из табличного документа
Итог

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

Текст табличного документа читается через свойство Текст области ячеек; единого метода «весь текст документа» в платформе нет. Для полного извлечения используют серверный обход ячеек или запись в текстовый файл, а для обработки данных правильнее обращаться к источнику, а не к форматированному представлению.

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

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

Одной встроенной команды нет. Ближайший вариант — записать документ в TXT-файл методом Записать() и прочитать его через ЧтениеТекста. Если нужен именно текст в переменной без файла, потребуется цикл обхода ячеек.

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

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

Как получить текст из поля табличного документа на форме?

Обратитесь к реквизиту формы типа ТабличныйДокумент, связанному с полем: например, ЭтаФорма.РеквизитТабДок.Область("R1C1").Текст. Само поле формы текст не хранит — данные находятся в реквизите.

Сохраняется ли форматирование при выгрузке в TXT?

Нет. Текстовый формат сохраняет только содержимое ячеек построчно, без шрифтов, цветов, границ и объединений. Если оформление важно, используйте MXL для внутреннего хранения или HTML/PDF для передачи наружу.

Как прочитать текст табличного документа, сохранённого в файле MXL?

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

Работает ли обход ячеек в веб-клиенте?

Работает, но медленно из-за серверных вызовов при каждом обращении к области. Для веб-клиента переносите обход в серверную процедуру и возвращайте на клиент готовую строку или файл.