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

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

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

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

Табличный документ в 1С — один из самых востребованных объектов: через него строятся печатные формы, отчёты, макеты для выгрузки данных. Чтобы заполнить документ программно или прочитать из него данные, нужно уметь обращаться к конкретной ячейке или диапазону. Основной инструмент для этого — метод Область() объекта ТабличныйДокумент, который возвращает объект ОбластьЯчеекТабличногоДокумента.

Адресовать ячейку можно несколькими способами: по координатам вида «R1C1», по имени области, заданному в макете, или по номерам строк и колонок через четыре числовых параметра. Выбор способа зависит от задачи: для макетов удобнее именованные области, для программного обхода — числовые координаты.

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

Метод Область(): основные способы адресации

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

  • ТабДок.Область("R5C3") — одна ячейка на пересечении строки 5 и колонки 3;
  • ТабДок.Область("R2C1:R10C4") — прямоугольный диапазон;
  • ТабДок.Область("R5") — вся пятая строка;
  • ТабДок.Область("C3") — вся третья колонка;
  • ТабДок.Область("ШапкаДата") — именованная область из макета;
  • ТабДок.Область(5, 3, 5, 3) — то же, что R5C3, но числовыми параметрами.

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

bsl
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МакетОтчета");
ТабДок.Вывести(Макет.ПолучитьОбласть("Шапка"));

// Обращение по адресу R1C1
Ячейка = ТабДок.Область("R3C2");
Ячейка.Текст = "Итого";

// Обращение по координатам
Ячейка2 = ТабДок.Область(4, 2, 4, 2);
Ячейка2.Текст = Формат(СуммаДокумента, "ЧДЦ=2");

Обращение к ячейке по имени области из макета

Если табличный документ строится из макета, правильнее работать через именованные области. Имя ячейке или диапазону задают в редакторе макета: выделяют ячейки и в поле имени (слева от строки формул) вводят название, например «НомерДокумента» или «ИтогоСумма».

После вывода макета в табличный документ именованные области сохраняются, и к ним можно обратиться по имени:

ОбластьИтого = ТабДок.Область("ИтогоСумма");

ОбластьИтого.Текст = Формат(Итог, "ЧДЦ=2");

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

Важный нюанс: именованные области существуют только в тех частях документа, которые выведены из макета, где имя было задано. Если область макета ещё не выводилась, обращение по имени вернёт пустую область без ошибки — это частый источник скрытых дефектов.

Чтение и запись значений ячейки

Получив область, вы работаете с её свойствами. Ключевые из них:

  • Текст — строка, отображаемая в ячейке. Доступна для чтения и записи;
  • Значение — типизированное значение ячейки, если в макете для ячейки установлено свойство «Содержит значение»;
  • Параметр — доступ к параметру ячейки, если она объявлена как параметр макета;
  • ТипЗначения — описание типов, допустимых для ячейки.

Разница между Текст и Значение принципиальна. Текст — это просто строка: записали «1 250,50» — получили строку. Значение хранит реальный тип (число, дату, ссылку), что важно при выгрузке в Excel или при дальнейших вычислениях. Чтобы свойство Значение работало, в макете у ячейки должен быть включён флаг «Содержит значение» и задан тип.

// Запись текста

ТабДок.Область("R2C1").Текст = "Покупатель";

// Запись типизированного значения

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

ЯчейкаСумма.Значение = 1250.50;

// Чтение значения

Сумма = ТабДок.Область(10, 3, 10, 3).Значение;

Если ТипЗнч(Сумма) = Тип("Число") Тогда

Итог = Итог + Сумма;

КонецЕсли;

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

Типичные ошибки
01
Записывают число в свойство Текст и затем не могут выполнить расчёты с прочитанным значением — нужно свойство Значение с включённым флагом «Содержит значение» в макете
02
Обращаются к именованной области до вывода соответствующей секции макета — область пуста, запись теряется без ошибки
03
Путают порядок индексов: первым идёт номер строки, вторым — колонки, а не наоборот
04
Используют адрес вида A1 (Excel-стиль) вместо R1C1 — метод Область() такой формат не понимает

Перебор ячеек и работа с диапазонами

Для обхода табличного документа построчно используют цикл с числовой адресацией. Границы документа определяют через свойства ВысотаТаблицы и ШиринаТаблицы:

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

Наименование = ТабДок.Область(НомерСтроки, 1, НомерСтроки, 1).Текст;

КоличествоСтрокой = ТабДок.Область(НомерСтроки, 3, НомерСтроки, 3).Текст;

Если Не ПустаяСтрока(Наименование) Тогда

// обработка строки

КонецЕсли;

КонецЦикла;

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

Для диапазонов доступны операции оформления: через область можно задать ЦветФона, Шрифт, Границы, ГоризонтальноеПоложение. Например, подсветка итоговой строки:

ОбластьИтог = ТабДок.Область(НомерСтрокиИтог, 1, НомерСтрокиИтог, 5);

ОбластьИтог.Шрифт = Новый Шрифт(,, Истина);

ОбластьИтог.ЦветФона = WebЦвета.СветлоСерый;

Порядок действий при заполнении ячейки
  1. 1
    Получите или создайте табличный документ и выведите нужные области макета
  2. 2
    Определите способ адресации: имя области для макета, координаты для программного обхода
  3. 3
    Получите область методом Область() и сохраните в переменную
  4. 4
    Запишите Текст или Значение, при необходимости настройте оформление
  5. 5
    Проверьте результат: выведите документ на экран или прочитайте ячейку обратно

Обращение к ячейкам в макете до вывода

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

Макет = ПолучитьМакет("ПечатнаяФорма");

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

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

ОбластьСтрока.Область(1, 4, 1, 4).Текст = "шт.";

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

Заполнение через Параметры — предпочтительный способ для макетов: он прозрачнее и не ломается при перестановке колонок. Прямую запись в ячейки фрагмента используют, когда параметра в макете нет, а править макет нежелательно.

Сравнение способов заполнения

Параметры макета

Рекомендуемый путь: устойчив к изменениям макета, код читаем. Ограничение — параметр должен быть объявлен в макете

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

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

Адресация R1C1 / координаты

Подходит для циклов и загрузки из файлов. Хрупко при изменении структуры макета

Проверка результата и отладка

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

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

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

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

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

Область получена по имени
Норма

Чтение Текст возвращает содержимое ячейки

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

Возвращается пустая строка — область не выведена или имя неверно

Запись значения
Норма

После записи чтение возвращает то же значение

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

Значение пустое — не включён флаг «Содержит значение» в макете

Координаты в цикле
Норма

Номер строки не превышает ВысотаТаблицы

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

Обращение за границы документа — пустые области

Ограничения и риски

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

Нумерация строк и колонок начинается с единицы. Обращение к нулевой строке вернёт пустую область. Формат адреса — только R1C1: привычная запись «B5» из Excel не поддерживается и тоже приведёт к пустой области без сообщения об ошибке.

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

Как обратиться к ячейке, если известны только номер строки и номер колонки?

Используйте числовую форму метода: ТабДок.Область(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки). Первый и третий параметры — строки начала и конца диапазона, второй и четвёртый — колонки.

Почему Область("МояОбласть") возвращает пустоту без ошибки?

Метод не генерирует исключение при отсутствии области. Проверьте, что секция макета с этим именем уже выведена в документ и имя в макете написано без опечаток и лишних пробелов.

Чем отличается Текст от Значения у ячейки?

Текст — строковое представление, Значение — типизированные данные (число, дата, ссылка). Свойство Значение работает, только если в макете для ячейки включён признак «Содержит значение» и задан тип.

Можно ли использовать адрес в формате A1, как в Excel?

Нет, метод Область() понимает только формат R1C1 (например, R5C3) или имена областей. Адрес «B5» нужно преобразовать: колонка B — это номер 2, то есть R5C2.

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

Получите диапазон методом Область() и установите свойства: ЦветФона, Шрифт, Границы, ГоризонтальноеПоложение. Изменения применяются ко всем ячейкам диапазона сразу.

Как прочитать данные из табличного документа, загруженного из файла Excel?

Переберите строки в цикле от 1 (или со строки после шапки) до ТабДок.ВысотаТаблицы, читая ячейки через Область(Строка, Колонка, Строка, Колонка).Текст. Типизированные значения в таких документах обычно отсутствуют, поэтому числа и даты придётся преобразовывать из строк самостоятельно.

Итог

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

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