В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает необходимость получить данные из ячейки табличного документа не в момент двойного клика (который перехватывается стандартным обработчиком ОбработкаРасшифровки), а при нажатии на произвольную кнопку командной панели или при выполнении определенного алгоритма. Рассмотрим подробно, как это реализовать в управляемых формах, какие подводные камни существуют и в чем разница между ключевыми свойствами ячейки.
Первое, что нам необходимо уяснить: в управляемых формах мы работаем с двумя разными сущностями. Первая — это элемент формы (тип ПолеФормы с видом ПолеТабличногоДокумента), который отвечает за отображение на экране. Вторая — это сам реквизит формы (тип ТабличныйДокумент), который содержит данные, макет и оформление.
Многие начинающие разработчики пытаются найти методы работы с областями непосредственно у элемента формы. Проанализируем типичную ошибку: попытка вызвать метод Область() у Элементы.ВашаТаблица. Такого метода у элемента управления нет. Для получения данных мы должны обращаться к самому реквизиту, который связан с этим полем.
Чтобы понять, из какой именно ячейки нужно получить расшифровку, мы воспользуемся свойством элемента формы ТекущаяОбласть. Рассмотрим, как программно определить координаты ячейки, на которой стоит курсор пользователя:
// Получаем объект текущей области из элемента формы
ТекущаяОбласть = Элементы.ТаблицаОтчетов.ТекущаяОбласть;
// Определяем координаты (номера строк и колонок)
НомерСтроки = ТекущаяОбласть.Верх;
НомерКолонки = ТекущаяОбласть.Лево;
Здесь важно отметить, что если пользователь выделил диапазон ячеек, свойства Верх и Низ (а также Лево и Право) могут отличаться. Если нам нужна конкретная одиночная ячейка, мы обычно ориентируемся на Верх и Лево.
Это самый важный технический нюанс, который прояснился в ходе обсуждения темы. Выясним причину, почему обращение к свойству ПараметрРасшифровки часто возвращает пустую строку.
Таким образом, для получения «того самого значения» мы должны использовать именно свойство Расшифровка.
Рассмотрим по шагам полный код функции, которая позволит нам вытащить данные расшифровки, зная имя элемента формы и имя реквизита табличного документа. Предположим, что Результат — это реквизит формы типа ТабличныйДокумент.
&НаКлиенте
Процедура УзнатьДанныеЯчейки(Команда)
// 1. Получаем текущую область из визуального элемента
ВыделеннаяОбласть = Элементы.ТаблицаОтчетов.ТекущаяОбласть;
// 2. Формируем адрес ячейки или используем координаты
// Можно обратиться через метод Область по номерам строк/колонок
Ячейка = Результат.Область(ВыделеннаяОбласть.Верх, ВыделеннаяОбласть.Лево);
// 3. Получаем данные
ЗначениеРасшифровки = Ячейка.Расшифровка;
ТекстЯчейки = Ячейка.Текст;
// Выведем результат для проверки
Сообщить("Текст: " + ТекстЯчейки);
Сообщить("Тип расшифровки: " + ТипЗнч(ЗначениеРасшифровки));
КонецПроцедуры
Проанализируем ситуацию, когда ваш табличный документ сформирован системой компоновки данных (СКД). В этом случае свойство Расшифровка ячейки будет содержать не прямую ссылку (например, на номенклатуру), а целое число. Это индекс в специальном объекте ДанныеРасшифровкиКомпоновкиДанных.
Если вы столкнулись с тем, что вместо объекта получаете число, вам необходимо выполнить следующие действия на сервере:
ДанныеРасшифровкиКомпоновкиДанных (который обычно хранится в реквизите формы или во временном хранилище).ПолучитьПоля() или через работу с коллекцией Элементы объекта данных расшифровки извлечь фактические значения полей компоновки.Рассмотрим пример серверного получения данных для СКД:
&НаСервере
Функция ПолучитьДанныеИзСКД(ИндексРасшифровки)
// ДанныеРасшифровкиОбъект - это реквизит формы, куда была помещена расшифровка при компоновке
Данные = ПолучитьИзВременногоХранилища(ДанныеРасшифровкиАдрес);
Поля = Данные.Элементы[ИндексРасшифровки].ПолучитьПоля();
Для Каждого Поле Из Поля Цикл
// Здесь можно найти нужное поле по имени
Если Поле.Поле = "Номенклатура" Тогда
Возврат Поле.Значение;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
Помимо расшифровки, мы можем программно получить и другие полезные свойства текущей области, которые помогут в автоматизации:
Примечание — позволяет прочитать текст комментария, прикрепленного к ячейке.СодержитЗначение — булево свойство, указывающее, хранится ли в ячейке типизированное значение помимо текста.Значение — собственно само значение ячейки (актуально для ячеек с типом Число, Дата и т.д., если включено хранение значений).Имя — если в макете области было присвоено имя, мы можем его идентифицировать.Проанализировав все вышеперечисленные методы, мы видим, что работа с расшифровкой «вручную» дает разработчику гораздо больше гибкости, чем стандартный двойной клик, позволяя создавать сложные интерфейсные решения в управляемых формах 1С.