При программной работе с табличными документами в 1С часто возникает задача прочитать данные из конкретной ячейки, зная ее координаты — номер строки и номер колонки. Начинающие разработчики могут столкнуться с ошибкой, пытаясь обратиться к ячейке по адресу в формате "R1C1" через метод Область(), что неверно. Чтобы избежать подобных проблем в крупных проектах, важно понимать базовый механизм работы платформы. Рассмотрим, как правильно получить доступ к ячейке и извлечь из нее необходимые данные.
Проанализируем ситуацию: у нас есть сформированный объект ТабличныйДокумент, и нам нужно получить значение, которое находится, например, в 5-й строке и 3-й колонке. Попытка использовать конструкцию вида ТабДок.Область("R5C3") приведет к ошибке, так как этот метод предназначен для работы с именованными областями, заранее определенными в макете.
Для обращения к ячейке или диапазону ячеек по их координатам (адресу) в платформе 1С предназначен специальный метод ПолучитьОбласть(). Этот метод возвращает объект типа ОбластьЯчеекТабличногоДокумента, у которого, в свою очередь, можно получить различные свойства: текст, значение, расшифровку и другие параметры форматирования.
Синтаксис метода прост:
ТабДок.ПолучитьОбласть(<НомерСтроки>, <НомерКолонки>)ТабДок.ПолучитьОбласть(<НомерВерхнейСтроки>, <НомерЛевойКолонки>, <НомерНижнейСтроки>, <НомерПравойКолонки>)Рассмотрим по шагам, как решить нашу исходную задачу.
Предположим, у нас есть переменная ТабДок, содержащая табличный документ. Мы хотим прочитать текстовое значение из ячейки, находящейся на пересечении строки с номером НомерСтроки и колонки с номером НомерКолонки.
Для этого выполним следующие действия:
ПолучитьОбласть() получим объект, соответствующий нашей ячейке.Текст этого объекта, чтобы получить строковое представление содержимого ячейки, то есть то, что видит пользователь.Посмотрим на пример кода, который решает эту задачу.
Перем ТабДок; // Предполагается, что эта переменная уже заполнена
Перем НомерСтроки;
Перем НомерКолонки;
Перем ОбластьЯчейки;
Перем ТекстЯчейки;
// Инициализируем переменные для примера
НомерСтроки = 5;
НомерКолонки = 3;
// 1. Получаем область, соответствующую одной ячейке
ОбластьЯчейки = ТабДок.ПолучитьОбласть(НомерСтроки, НомерКолонки);
// 2. Получаем текст из этой ячейки
ТекстЯчейки = ОбластьЯчейки.Текст;
// Теперь в переменной ТекстЯчейки содержится видимый текст из ячейки (5, 3)
Сообщить("Текст в ячейке: " + ТекстЯчейки);
Важно понимать, что ячейка табличного документа может хранить данные разного типа. Глубокое понимание того, как устроена объектная модель печатной формы, помогает правильно выбирать свойства объекта ОбластьЯчеекТабличногоДокумента для доступа к данным. Выбор зависит от вашей дальнейшей цели.
.Текст — это строковое, отформатированное представление данных. Например, если в ячейке хранится дата "20.10.2023", то свойство Текст вернет именно строку "20.10.2023". Если число 1000 отформатировано с разделителями разрядов, то свойство вернет "1 000,00". Это свойство полезно, когда нужно просто отобразить данные, как они есть.
.Значение — это исходное, неформатированное значение, которое хранится в ячейке. Для даты "20.10.2023" свойство Значение вернет переменную типа Дата. Для числа "1 000,00" — переменную типа Число со значением 1000. Это свойство критически важно использовать, если вы собираетесь проводить с полученными данными вычисления, сравнения или сохранять их в базу данных.
.Расшифровка — это значение, используемое для детализации (drill-down) в отчетах. Часто сюда помещают ссылку на документ или элемент справочника. Если вам нужно быстро разобраться в логике чужого отчета и понять, откуда берется расшифровка, может пригодиться AI-Анализатор 1С. Если расшифровка для ячейки не задана, это свойство будет равно Неопределено.
Давайте дополним наш код, чтобы получить все три типа данных:
НомерСтроки = 5;
НомерКолонки = 3;
ОбластьЯчейки = ТабДок.ПолучитьОбласть(НомерСтроки, НомерКолонки);
// Получаем разные представления данных из одной и той же ячейки
ТекстовоеПредставление = ОбластьЯчейки.Текст;
ИсходноеЗначение = ОбластьЯчейки.Значение;
ДанныеДляРасшифровки = ОбластьЯчейки.Расшифровка;
Сообщить("Текст: " + ТекстовоеПредставление);
Сообщить("Значение: " + ИсходноеЗначение + ", тип: " + ТипЗнч(ИсходноеЗначение));
Если ДанныеДляРасшифровки <> Неопределено Тогда
Сообщить("Расшифровка: " + ДанныеДляРасшифровки);
КонецЕсли;
Важный момент: всегда старайтесь работать со свойством .Значение, если планируете дальнейшую обработку данных. Использование свойства .Текст для вычислений может привести к ошибкам преобразования типов, особенно при работе с датами и числами с разным форматом отображения.
Метод ПолучитьОбласть() особенно полезен, когда нужно организовать программный обход и чтение данных из таблицы. Например, прочитать все данные из колонок со 2-й по 5-ю, начиная с 10-й строки и до конца таблицы.
Для определения общего количества строк в табличном документе используется свойство ВысотаТаблицы. При отладке таких циклов и анализе данных в режиме предприятия очень помогают инструменты разработчика, включающие консоли кода и редактор объектов — для этого подойдет готовый набор инструментов разработчика для отладки.
// Определяем границы обхода
НачальнаяСтрока = 10;
КонечнаяСтрока = ТабДок.ВысотаТаблицы;
НачальнаяКолонка = 2;
КонечнаяКолонка = 5;
// Обходим строки
Для НомерСтр = НачальнаяСтрока По КонечнаяСтрока Цикл
// Обходим нужные колонки в текущей строке
Для НомерКол = НачальнаяКолонка По КонечнаяКолонка Цикл
// Получаем ячейку и ее значение
ОбластьЯчейки = ТабДок.ПолучитьОбласть(НомерСтр, НомерКол);
ПрочитанноеЗначение = ОбластьЯчейки.Значение;
// Здесь можно выполнять какую-либо обработку полученного значения
// Например, выводить в окно сообщений
Сообщить("Стр: " + НомерСтр + ", Кол: " + НомерКол + ", Значение: " + ПрочитанноеЗначение);
КонецЦикла;
КонецЦикла;
Таким образом, используя метод ПолучитьОбласть() в сочетании с циклами, можно эффективно считывать и анализировать любые данные из программно сформированных или загруженных табличных документов — поможет в этом отладчик кода в режиме предприятия.