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

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

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

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

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

Обращение к ячейкам колонки выполняется либо по абсолютному адресу вида R5C3 (строка 5, колонка 3), либо через именованную область, либо перебором строк с фиксированным номером колонки. Выбор способа зависит от задачи: чтение данных из загруженного файла, заполнение макета при печати или программная правка готового документа.

Ниже разобраны все рабочие способы с примерами кода на встроенном языке 1С, ограничения каждого подхода и типичные ошибки, которые приводят к пустым значениям или исключениям.

Чем табличный документ отличается от таблицы значений и табличного поля

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

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

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

Обращение к ячейке колонки по адресу R1C1

Базовый способ — метод Область() с адресом в формате R1C1. Чтобы пройти по всем ячейкам одной колонки, фиксируют номер колонки и перебирают строки в цикле:

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

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

НомерКолонки = 3;

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

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

ЗначениеЯчейки = Ячейка.Текст;

// обработка значения

КонецЦикла;

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

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

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

Чтение всей колонки через ПолучитьОбласть

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

// Колонка 2 целиком, строки с 1 по последнюю

ОбластьКолонки = ТабДок.ПолучитьОбласть("R1C2:R" + ТабДок.ВысотаТаблицы + "C2");

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

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

Работа с именованными областями

В макетах печатных форм ячейкам и диапазонам назначают имена (например, «Шапка», «Строка», «Номенклатура»). Обращение по имени удобнее адресов, потому что код не ломается при добавлении строк или колонок в макет:

Макет = Документы.РеализацияТоваровУслуг.ПолучитьМакет("Печать");

ОбластьСтрока = Макет.ПолучитьОбласть("Строка");

ОбластьСтрока.Параметры.Номенклатура = Выборка.Номенклатура;

ТабДок.Вывести(ОбластьСтрока);

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

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

Поиск нужной колонки по заголовку

При чтении файлов (например, загрузке прайсов из MXL) номер колонки заранее неизвестен. Практичный приём — найти колонку по тексту заголовка в первой строке:

НомерКолонкиЦена = 0;

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

Заголовок = ТабДок.Область("R1C" + НомерКолонки).Текст;

Если СокрЛП(Заголовок) = "Цена" Тогда

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

Прервать;

КонецЕсли;

КонецЦикла;

Если НомерКолонкиЦена = 0 Тогда

ВызватьИсключение "Колонка ""Цена"" не найдена";

КонецЕсли;

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

Порядок чтения колонки из файла
  1. 1
    Загрузите файл: ТабДок.Прочитать(ИмяФайла)
  2. 2
    Найдите номер колонки по заголовку в первой строке
  3. 3
    Проверьте, что колонка найдена (номер больше нуля)
  4. 4
    Переберите строки циклом от 2 до ТабДок.ВысотаТаблицы
  5. 5
    Читайте ТабДок.Область("R"+Строка+"C"+Колонка).Текст и преобразуйте тип
  6. 6
    Проверьте результат на нескольких строках до массовой обработки

Запись значений в колонку

Запись выполняется симметрично — через свойство Текст или Значение области. Для заполнения колонки в цикле:

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

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

Ячейка.Текст = Формат(СуммаПоСтроке, "ЧДЦ=2");

КонецЦикла;

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

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

Типичные ошибки и как их избежать

Самая частая ошибка — путаница между Текст и Значение: разработчик читает Значение из ячейки, заполненной текстом, получает пустоту и ищет проблему не там. Правило простое: из файла и с печатной формы читайте Текст, типизированные данные берите из источника данных, а не из табличного документа.

Вторая группа ошибок — работа с несуществующими областями. Обращение ТабДок.Область("НесуществующееИмя") вызывает исключение, а обращение за границы таблицы по адресу R1C1 молча возвращает пустую ячейку. Перед циклом проверяйте ВысотаТаблицы и ШиринаТаблицы, перед обращением по имени — наличие области в макете.

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

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

Проверка результата и выбор подхода

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

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

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

Значения прочитанной колонки
Норма

Текст ячеек совпадает с отображаемым в файле

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

Пустые строки при видимых данных — читается Значение вместо Текст

Границы перебора
Норма

Цикл идёт от 1 (или 2) до ВысотаТаблицы

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

Пропущены первые строки или лишние пустые итерации

Найденная колонка
Норма

Номер колонки больше нуля, заголовок совпал

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

Номер 0 — заголовок не найден, дальнейшая обработка бессмысленна

Итоговый выбор подхода сводится к задаче. Для печатных форм — макеты с именованными областями и параметрами. Для чтения файлов — цикл по адресам R1C1 с поиском колонки по заголовку. Для обработки данных — преобразование в таблицу значений и работа с ней. Для копирования оформления — ПолучитьОбласть и Вывести.

Сравнение вариантов

Адреса R1C1 в цикле

Универсально для чтения файлов и произвольных документов; требует знать или находить номер колонки

Именованные области

Удобно в макетах печатных форм; не работает в документах, прочитанных из файлов

ПолучитьОбласть

Подходит для копирования колонки с оформлением; избыточен для простого чтения значений

Таблица значений

Правильный выбор для обработки данных; требует предварительной выгрузки из документа

Итог

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

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

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

Как узнать номер колонки по её имени в табличном документе?

Переберите ячейки первой строки циклом от 1 до ТабДок.ШиринаТаблицы и сравните текст каждой с искомым заголовком, применяя СокрЛП. Найденный индекс и будет номером колонки. Если совпадения нет, выдайте понятное исключение, а не продолжайте с нулевым номером.

Почему Область("R5C2").Значение возвращает пустоту, хотя в ячейке есть данные?

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

Можно ли обратиться к колонке табличного документа по букве, как в Excel (A, B, C)?

Встроенного синтаксиса с буквенными колонками нет — только числовая адресация R1C1. Если нужен excel-стиль, напишите функцию преобразования буквы в номер: A = 1, B = 2 и так далее, учитывая двухбуквенные обозначения после Z.

Как прочитать колонку из табличного документа в таблицу значений?

Создайте таблицу значений с одной колонкой нужного типа, затем в цикле от 1 до ТабДок.ВысотаТаблицы добавляйте строки и присваивайте НоваяСтрока.ИмяКолонки = ТабДок.Область("R" + НомерСтроки + "C" + НомерКолонки).Текст с преобразованием типа. Для нескольких колонок добавьте в таблицу все нужные колонки и заполняйте их в том же цикле.

Что делать, если колонка содержит объединённые ячейки?

Текст объединённого диапазона хранится в его первой ячейке, остальные вернут пустую строку. При чтении запоминайте последнее непустое значение и подставляйте его для пустых ячеек, если логика данных это допускает. Либо нормализуйте файл перед загрузкой, убрав объединения.

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

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