Разработка и Конфигурация · 12 мин
Как обратиться к колонке табличного документа в 1С
Как обратиться к колонке табличного документа в 1С: адресация R1C1, именованные области, перебор ячеек, чтение и запись значений. Примеры кода и ошибки.
Табличный документ в 1С (объект ТабличныйДокумент) не имеет «колонок» в привычном смысле таблицы значений — это сетка ячеек, как в Excel. Поэтому обратиться к колонке напрямую нельзя: работают через адреса ячеек, области и циклы по строкам. Понимание этой модели избавляет от типичной путаницы между табличным документом, табличным полем формы и таблицей значений.
Обращение к ячейкам колонки выполняется либо по абсолютному адресу вида R5C3 (строка 5, колонка 3), либо через именованную область, либо перебором строк с фиксированным номером колонки. Выбор способа зависит от задачи: чтение данных из загруженного файла, заполнение макета при печати или программная правка готового документа.
Ниже разобраны все рабочие способы с примерами кода на встроенном языке 1С, ограничения каждого подхода и типичные ошибки, которые приводят к пустым значениям или исключениям.
Чем табличный документ отличается от таблицы значений и табличного поля
Прежде чем обращаться к «колонке», важно определить, с каким объектом вы работаете. В 1С три разных сущности часто путают: табличный документ (печатная форма, макет, визуальная сетка ячеек), таблица значений (структура данных в памяти с типизированными колонками) и табличное поле (элемент управляемой или обычной формы, отображающий данные).
У таблицы значений колонки — реальные объекты: ТЗ.Колонки.Найти("Номенклатура"), а к значению обращаются как СтрокаТЗ.Номенклатура. У табличного документа таких свойств нет — есть только ячейки с координатами и области. Если ваша задача — обработка данных (поиск, отбор, расчёт), правильнее выгрузить данные в таблицу значений, а не перебирать ячейки табличного документа.
Табличное поле формы обычно связано с таблицей значений или табличной частью, и обращаться к его данным нужно через источник данных, а не через визуальный элемент. Попытка «прочитать колонку» из табличного документа, когда данные живут в реквизите формы — частая причина пустых результатов.
Обращение к ячейке колонки по адресу R1C1
Базовый способ — метод Область() с адресом в формате R1C1. Чтобы пройти по всем ячейкам одной колонки, фиксируют номер колонки и перебирают строки в цикле:
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать("C:\Temp\Данные.mxl");
НомерКолонки = 3;
Для НомерСтроки = 1 По ТабДок.ВысотаТаблицы Цикл
Ячейка = ТабДок.Область("R" + НомерСтроки + "C" + НомерКолонки);
ЗначениеЯчейки = Ячейка.Текст;
// обработка значения
КонецЦикла;
Свойство Текст возвращает отображаемый текст ячейки всегда в виде строки. Если ячейка содержит значение с типом (дата, число, ссылка), используйте свойство Значение — но оно доступно только для ячеек, заполненных программно через параметры или расшифровку, а для прочитанных из файла ячеек чаще всего придётся преобразовывать текст самостоятельно.
Границы данных определяют через ВысотаТаблицы (число строк) и ШиринаТаблицы (число колонок). Обращение за пределы этих границ не вызывает ошибку — просто вернётся пустая область, что затрудняет отладку: проверяйте границы до входа в цикл.
Ячейка = ТабДок.Область("R" + НомерСтроки + "C" + НомерКолонки);
ТекстЯчейки = Ячейка.Текст;Чтение всей колонки через ПолучитьОбласть
Если нужна вся колонка как фрагмент документа (например, для копирования оформления вместе с данными), используют ПолучитьОбласть() с указанием диапазона. Синтаксис с двумя точками задаёт прямоугольную область:
// Колонка 2 целиком, строки с 1 по последнюю
ОбластьКолонки = ТабДок.ПолучитьОбласть("R1C2:R" + ТабДок.ВысотаТаблицы + "C2");
Полученная область — тоже табличный документ, и дальше с ним работают тем же способом: перебором ячеек. Этот вариант оправдан, когда нужно перенести колонку в другой документ методом Вывести() или ВставитьОбласть(), сохранив форматирование. Для простого чтения значений он избыточен — цикл по Область("R..C..") проще и быстрее.
Учтите, что ПолучитьОбласть копирует ячейки с объединениями и оформлением. Если исходная колонка пересекает объединённые ячейки, структура результата может отличаться от ожидаемой — проверяйте результат визуально при отладке.
Работа с именованными областями
В макетах печатных форм ячейкам и диапазонам назначают имена (например, «Шапка», «Строка», «Номенклатура»). Обращение по имени удобнее адресов, потому что код не ломается при добавлении строк или колонок в макет:
Макет = Документы.РеализацияТоваровУслуг.ПолучитьМакет("Печать");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ОбластьСтрока.Параметры.Номенклатура = Выборка.Номенклатура;
ТабДок.Вывести(ОбластьСтрока);
Для именованной ячейки внутри уже выведенного документа обращение выглядит как ТабДок.Область("ИмяОбласти"). Это работает, только если область с таким именем существует в документе — имена задаются в макете или программно через Область.Имя. Если имени нет, платформа выдаст ошибку о несуществующей области.
Параметры макета (Область.Параметры.ИмяПараметра) — отдельный механизм: они заполняются до вывода области в документ. После вывода значения «зашиваются» в текст ячеек, и изменить их через Параметры уже нельзя — только перезаписью текста ячейки.
Поиск нужной колонки по заголовку
При чтении файлов (например, загрузке прайсов из MXL) номер колонки заранее неизвестен. Практичный приём — найти колонку по тексту заголовка в первой строке:
НомерКолонкиЦена = 0;
Для НомерКолонки = 1 По ТабДок.ШиринаТаблицы Цикл
Заголовок = ТабДок.Область("R1C" + НомерКолонки).Текст;
Если СокрЛП(Заголовок) = "Цена" Тогда
НомерКолонкиЦена = НомерКолонки;
Прервать;
КонецЕсли;
КонецЦикла;
Если НомерКолонкиЦена = 0 Тогда
ВызватьИсключение "Колонка ""Цена"" не найдена";
КонецЕсли;
Такой подход делает код устойчивым к перестановке колонок в исходном файле, но требует проверки «не найдено» — иначе последующее обращение к колонке 0 даст пустые значения без явной ошибки. Сравнение заголовков делайте с учётом возможных лишних пробелов и регистра: СокрЛП и ВРег снимают большинство проблем.
- 1Загрузите файл: ТабДок.Прочитать(ИмяФайла)
- 2Найдите номер колонки по заголовку в первой строке
- 3Проверьте, что колонка найдена (номер больше нуля)
- 4Переберите строки циклом от 2 до ТабДок.ВысотаТаблицы
- 5Читайте ТабДок.Область("R"+Строка+"C"+Колонка).Текст и преобразуйте тип
- 6Проверьте результат на нескольких строках до массовой обработки
Запись значений в колонку
Запись выполняется симметрично — через свойство Текст или Значение области. Для заполнения колонки в цикле:
Для НомерСтроки = 2 По ТабДок.ВысотаТаблицы Цикл
Ячейка = ТабДок.Область("R" + НомерСтроки + "C5");
Ячейка.Текст = Формат(СуммаПоСтроке, "ЧДЦ=2");
КонецЦикла;
Свойство Значение позволяет записать типизированное значение (число, дату), которое затем корректно отобразится по формату ячейки. Но оно работает только если ячейка настроена как содержащая значение — в произвольной ячейке табличного документа безопаснее писать через Текст.
Помните, что запись в ячейку не расширяет документ автоматически за пределы разумного: обращение к строке далеко за ВысотаТаблицы фактически создаст пустые промежуточные строки, что раздует документ и замедлит вывод. Добавляйте строки последовательно.
Типичные ошибки и как их избежать
Самая частая ошибка — путаница между Текст и Значение: разработчик читает Значение из ячейки, заполненной текстом, получает пустоту и ищет проблему не там. Правило простое: из файла и с печатной формы читайте Текст, типизированные данные берите из источника данных, а не из табличного документа.
Вторая группа ошибок — работа с несуществующими областями. Обращение ТабДок.Область("НесуществующееИмя") вызывает исключение, а обращение за границы таблицы по адресу R1C1 молча возвращает пустую ячейку. Перед циклом проверяйте ВысотаТаблицы и ШиринаТаблицы, перед обращением по имени — наличие области в макете.
Третья проблема — объединённые ячейки. Если ячейки колонки объединены по вертикали, текст хранится в первой ячейке объединения, а остальные вернут пустую строку. При чтении таких документов учитывайте структуру объединений или нормализуйте файл перед обработкой.
Проверка результата и выбор подхода
После реализации чтения или записи проверьте результат на контрольных примерах: несколько строк с известными значениями, пустые ячейки, ячейки с числами и датами. Для визуальной проверки удобно вывести документ на экран методом ТабДок.Показать() в отладочном коде.
Как проверить результат
Текст ячеек совпадает с отображаемым в файле
Пустые строки при видимых данных — читается Значение вместо Текст
Цикл идёт от 1 (или 2) до ВысотаТаблицы
Пропущены первые строки или лишние пустые итерации
Номер колонки больше нуля, заголовок совпал
Номер 0 — заголовок не найден, дальнейшая обработка бессмысленна
Итоговый выбор подхода сводится к задаче. Для печатных форм — макеты с именованными областями и параметрами. Для чтения файлов — цикл по адресам R1C1 с поиском колонки по заголовку. Для обработки данных — преобразование в таблицу значений и работа с ней. Для копирования оформления — ПолучитьОбласть и Вывести.
Сравнение вариантов
Универсально для чтения файлов и произвольных документов; требует знать или находить номер колонки
Удобно в макетах печатных форм; не работает в документах, прочитанных из файлов
Подходит для копирования колонки с оформлением; избыточен для простого чтения значений
Правильный выбор для обработки данных; требует предварительной выгрузки из документа
Что важно запомнить
Колонки как объекта у табличного документа нет — работайте через адреса R1C1 в цикле по строкам, именованные области в макетах или ПолучитьОбласть для фрагментов. Читайте свойство Текст, проверяйте границы таблицы, а для расчётов используйте таблицу значений.
Частые вопросы
Как узнать номер колонки по её имени в табличном документе?
Переберите ячейки первой строки циклом от 1 до ТабДок.ШиринаТаблицы и сравните текст каждой с искомым заголовком, применяя СокрЛП. Найденный индекс и будет номером колонки. Если совпадения нет, выдайте понятное исключение, а не продолжайте с нулевым номером.
Почему Область("R5C2").Значение возвращает пустоту, хотя в ячейке есть данные?
Свойство Значение заполнено только для ячеек, куда значение записывали программно как типизированное. В ячейках, прочитанных из файла или выведенных через параметры макета, данные хранятся как текст — используйте свойство Текст и при необходимости преобразуйте его функциями Число(), Дата() или собственным парсингом.
Можно ли обратиться к колонке табличного документа по букве, как в Excel (A, B, C)?
Встроенного синтаксиса с буквенными колонками нет — только числовая адресация R1C1. Если нужен excel-стиль, напишите функцию преобразования буквы в номер: A = 1, B = 2 и так далее, учитывая двухбуквенные обозначения после Z.
Как прочитать колонку из табличного документа в таблицу значений?
Создайте таблицу значений с одной колонкой нужного типа, затем в цикле от 1 до ТабДок.ВысотаТаблицы добавляйте строки и присваивайте НоваяСтрока.ИмяКолонки = ТабДок.Область("R" + НомерСтроки + "C" + НомерКолонки).Текст с преобразованием типа. Для нескольких колонок добавьте в таблицу все нужные колонки и заполняйте их в том же цикле.
Что делать, если колонка содержит объединённые ячейки?
Текст объединённого диапазона хранится в его первой ячейке, остальные вернут пустую строку. При чтении запоминайте последнее непустое значение и подставляйте его для пустых ячеек, если логика данных это допускает. Либо нормализуйте файл перед загрузкой, убрав объединения.
Медленно работает перебор ячеек большого документа — как ускорить?
Доступ к каждой ячейке через Область — дорогая операция. Сократите число обращений: читайте сразу несколько колонок в одном проходе, не вызывайте Область дважды для одной ячейки, а при больших объёмах перенесите обработку в таблицу значений или выполняйте её на сервере без промежуточного отображения документа.