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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При программной работе с табличными документами в 1С часто возникает задача прочитать данные из конкретной ячейки, зная ее координаты — номер строки и номер колонки. Начинающие разработчики могут столкнуться с ошибкой, пытаясь обратиться к ячейке по адресу в формате "R1C1" через метод Область(), что неверно. Чтобы избежать подобных проблем в крупных проектах, часто используется анализ конфигураций на наличие ошибок, однако важно понимать базовый механизм работы платформы. Рассмотрим, как правильно получить доступ к ячейке и извлечь из нее необходимые данные.

Проанализируем ситуацию: у нас есть сформированный объект ТабличныйДокумент, и нам нужно получить значение, которое находится, например, в 5-й строке и 3-й колонке. Попытка использовать конструкцию вида ТабДок.Область("R5C3") приведет к ошибке, так как этот метод предназначен для работы с именованными областями, заранее определенными в макете.

Правильный способ: метод ПолучитьОбласть()

Для обращения к ячейке или диапазону ячеек по их координатам (адресу) в платформе 1С предназначен специальный метод ПолучитьОбласть(). Этот метод возвращает объект типа ОбластьЯчеекТабличногоДокумента, у которого, в свою очередь, можно получить различные свойства: текст, значение, расшифровку и другие параметры форматирования. Если вы стремитесь к чистоте кода при вызове подобных методов, полезно применять Code formatter 1C для автоматического анализа и редактирования модулей.

Синтаксис метода прост:

  1. Для получения одной ячейки: ТабДок.ПолучитьОбласть(<НомерСтроки>, <НомерКолонки>)
  2. Для получения прямоугольной области ячеек: ТабДок.ПолучитьОбласть(<НомерВерхнейСтроки>, <НомерЛевойКолонки>, <НомерНижнейСтроки>, <НомерПравойКолонки>)

Рассмотрим по шагам, как решить нашу исходную задачу.

Практический пример получения текста из ячейки

Предположим, у нас есть переменная ТабДок, содержащая табличный документ. Мы хотим прочитать текстовое значение из ячейки, находящейся на пересечении строки с номером НомерСтроки и колонки с номером НомерКолонки.

Для этого выполним следующие действия:

  1. С помощью метода ПолучитьОбласть() получим объект, соответствующий нашей ячейке.
  2. Обратимся к свойству Текст этого объекта, чтобы получить строковое представление содержимого ячейки, то есть то, что видит пользователь.

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


Перем ТабДок; // Предполагается, что эта переменная уже заполнена
Перем НомерСтроки;
Перем НомерКолонки;
Перем ОбластьЯчейки;
Перем ТекстЯчейки;

// Инициализируем переменные для примера
НомерСтроки = 5;
НомерКолонки = 3;

// 1. Получаем область, соответствующую одной ячейке
ОбластьЯчейки = ТабДок.ПолучитьОбласть(НомерСтроки, НомерКолонки);

// 2. Получаем текст из этой ячейки
ТекстЯчейки = ОбластьЯчейки.Текст;

// Теперь в переменной ТекстЯчейки содержится видимый текст из ячейки (5, 3)
Сообщить("Текст в ячейке: " + ТекстЯчейки);

Текст, Значение или Расшифровка: что выбирать?

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

Давайте дополним наш код, чтобы получить все три типа данных:


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

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

// Получаем разные представления данных из одной и той же ячейки
ТекстовоеПредставление = ОбластьЯчейки.Текст;
ИсходноеЗначение = ОбластьЯчейки.Значение;
ДанныеДляРасшифровки = ОбластьЯчейки.Расшифровка;

Сообщить("Текст: " + ТекстовоеПредставление);
Сообщить("Значение: " + ИсходноеЗначение + ", тип: " + ТипЗнч(ИсходноеЗначение));

Если ДанныеДляРасшифровки <> Неопределено Тогда
    Сообщить("Расшифровка: " + ДанныеДляРасшифровки);
КонецЕсли;

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

Пример обхода части таблицы

Метод ПолучитьОбласть() особенно полезен, когда нужно организовать программный обход и чтение данных из таблицы. Например, прочитать все данные из колонок со 2-й по 5-ю, начиная с 10-й строки и до конца таблицы.

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


// Определяем границы обхода
НачальнаяСтрока = 10;
КонечнаяСтрока = ТабДок.ВысотаТаблицы;
НачальнаяКолонка = 2;
КонечнаяКолонка = 5;

// Обходим строки
Для НомерСтр = НачальнаяСтрока По КонечнаяСтрока Цикл

    // Обходим нужные колонки в текущей строке
    Для НомерКол = НачальнаяКолонка По КонечнаяКолонка Цикл

        // Получаем ячейку и ее значение
        ОбластьЯчейки = ТабДок.ПолучитьОбласть(НомерСтр, НомерКол);
        ПрочитанноеЗначение = ОбластьЯчейки.Значение;

        // Здесь можно выполнять какую-либо обработку полученного значения
        // Например, выводить в окно сообщений
        Сообщить("Стр: " + НомерСтр + ", Кол: " + НомерКол + ", Значение: " + ПрочитанноеЗначение);

    КонецЦикла;

КонецЦикла;

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

← На главную