Разработка и Конфигурация · 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);
ВесьТекст = Чтение.Прочитать();
Чтение.Закрыть();
Сравнение способов получения текста
Подходит для точечного чтения известных ячеек. Ограничение — нужно знать адрес или имя области.
Даёт полный текст в переменной с гибкой обработкой. Медленно на больших документах, требует аккуратности с разделителями.
Быстрый способ выгрузить всё содержимое в файл. Теряется оформление, результат доступен только как файл.
Сохраняет структуру для обратного чтения или обмена. Требует дополнительного разбора, если нужен чистый текст.
Как получить текст из макета и из отчёта на СКД
Макет табличного документа — это тоже табличный документ, получаемый методом ПолучитьМакет(). Текст его областей читается тем же свойством Текст, но с оговоркой: ячейки с параметрами вернут шаблон вида [Номенклатура], а не значение. Поэтому макет удобно использовать для анализа структуры печатной формы, но не для извлечения данных.
С результатом отчёта на СКД ситуация иная. После вывода отчёта в табличный документ (через ПроцессорВыводаРезультатаКомпоновкиДанных) все параметры уже подставлены, и обход ячеек даст реальные значения. Однако в выборку попадут служебные элементы: заголовки группировок, итоговые строки, пустые отступы. Если нужны именно данные, а не их визуальное представление, надёжнее получить тот же результат выводом в ТаблицаЗначений через Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений") — тогда не придётся разбирать форматированный текст.
Частая задача «найти строку в табличном документе» решается методом НайтиТекст() — он возвращает область с первым вхождением искомой строки и работает быстрее ручного перебора. Проверяйте результат на Неопределено: если текст не найден, метод вернёт именно его, а не пустую область.
Как проверить результат и какие ошибки встречаются чаще всего
После чтения текста проверяйте три вещи: не пустая ли строка получена (обращение к несуществующей или пустой ячейке вернёт пустую строку без ошибки), не обрезан ли текст форматированием (число с форматом может отображаться сокращённо), не попали ли служебные символы из объединённых ячеек.
Типичная ошибка — обращение к области за границами документа. Платформа не всегда вызывает исключение: запрос Область("R100C1") при высоте таблицы 50 строк может молча вернуть пустую область. Перед чтением сверяйте номера с ВысотаТаблицы и ШиринаТаблицы. Вторая частая ошибка — попытка прочитать Текст у ячейки с картинкой или диаграммой: результат будет пустым, что выглядит как «потеря данных», хотя данных в текстовом смысле там и не было.
Ещё один подводный камень — тонкий клиент и веб-клиент. Запись файла на диск (Записать()) требует либо серверного вызова, либо передачи файла пользователю через НачатьПомещениеФайлаНаСервер / диалог сохранения. Код, безупречно работающий в толстом клиенте, на веб-клиенте упадёт или молча ничего не сохранит.
Как выбрать подходящий способ под свою задачу
Критерий выбора прост: определите, что является конечным результатом. Если нужна одна ячейка из известной позиции — прямое обращение через Область().Текст. Если нужен весь текст в переменной для анализа — серверный обход циклом. Если нужен файл для обмена — Записать() в TXT или MXL. Если нужны данные для дальнейшей обработки — не трогайте табличный документ вовсе, а получите их из источника (запрос, СКД с выводом в таблицу значений): текст табличного документа — это представление, а не данные.
Как выбрать действие
Что важно запомнить
Текст табличного документа читается через свойство Текст области ячеек; единого метода «весь текст документа» в платформе нет. Для полного извлечения используют серверный обход ячеек или запись в текстовый файл, а для обработки данных правильнее обращаться к источнику, а не к форматированному представлению.
Частые вопросы
Можно ли получить текст табличного документа одной строкой кода?
Одной встроенной команды нет. Ближайший вариант — записать документ в TXT-файл методом Записать() и прочитать его через ЧтениеТекста. Если нужен именно текст в переменной без файла, потребуется цикл обхода ячеек.
Почему Область("R1C1").Текст возвращает пустую строку, хотя на экране ячейка заполнена?
Наиболее вероятные причины: документ ещё не был заполнен или отображён (вы читаете другой экземпляр объекта), ячейка входит в объединение и текст хранится в другой ячейке диапазона, либо в ячейке находится картинка, а не текст. Проверьте, что читаете именно тот объект ТабличныйДокумент, который выведен пользователю.
Как получить текст из поля табличного документа на форме?
Обратитесь к реквизиту формы типа ТабличныйДокумент, связанному с полем: например, ЭтаФорма.РеквизитТабДок.Область("R1C1").Текст. Само поле формы текст не хранит — данные находятся в реквизите.
Сохраняется ли форматирование при выгрузке в TXT?
Нет. Текстовый формат сохраняет только содержимое ячеек построчно, без шрифтов, цветов, границ и объединений. Если оформление важно, используйте MXL для внутреннего хранения или HTML/PDF для передачи наружу.
Как прочитать текст табличного документа, сохранённого в файле MXL?
Создайте новый объект ТабличныйДокумент, вызовите метод Прочитать() с путём к файлу, после чего работайте с ячейками обычным способом через Область().Текст или обходом циклом.
Работает ли обход ячеек в веб-клиенте?
Работает, но медленно из-за серверных вызовов при каждом обращении к области. Для веб-клиента переносите обход в серверную процедуру и возвращайте на клиент готовую строку или файл.