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

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

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

Различие между элементом формы и объектом ТабличныйДокумент

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

Многие начинающие разработчики пытаются найти методы работы с областями непосредственно у элемента формы. Проанализируем типичную ошибку: попытка вызвать метод Область() у Элементы.ВашаТаблица. Такого метода у элемента управления нет. Для получения данных мы должны обращаться к самому реквизиту, который связан с этим полем.

Определение текущей выделенной области

Чтобы понять, из какой именно ячейки нужно получить расшифровку, мы воспользуемся свойством элемента формы ТекущаяОбласть. Рассмотрим, как программно определить координаты ячейки, на которой стоит курсор пользователя:


// Получаем объект текущей области из элемента формы
ТекущаяОбласть = Элементы.ТаблицаОтчетов.ТекущаяОбласть;

// Определяем координаты (номера строк и колонок)
НомерСтроки = ТекущаяОбласть.Верх;
НомерКолонки = ТекущаяОбласть.Лево;

Здесь важно отметить, что если пользователь выделил диапазон ячеек, свойства Верх и Низ (а также Лево и Право) могут отличаться. Если нам нужна конкретная одиночная ячейка, мы обычно ориентируемся на Верх и Лево.

Расшифровка против ПараметраРасшифровки

Это самый важный технический нюанс, который прояснился в ходе обсуждения темы. Выясним причину, почему обращение к свойству ПараметрРасшифровки часто возвращает пустую строку.

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

Таким образом, для получения «того самого значения» мы должны использовать именно свойство Расшифровка.

Пример программного получения данных из ячейки

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


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

Особенности работы с расшифровкой в отчетах СКД

Проанализируем ситуацию, когда ваш табличный документ сформирован системой компоновки данных (СКД). В этом случае свойство Расшифровка ячейки будет содержать не прямую ссылку (например, на номенклатуру), а целое число. Это индекс в специальном объекте ДанныеРасшифровкиКомпоновкиДанных.

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

  1. Передать числовой индекс расшифровки на сервер.
  2. Использовать объект ДанныеРасшифровкиКомпоновкиДанных (который обычно хранится в реквизите формы или во временном хранилище).
  3. С помощью метода ПолучитьПоля() или через работу с коллекцией Элементы объекта данных расшифровки извлечь фактические значения полей компоновки.

Рассмотрим пример серверного получения данных для СКД:


&НаСервере
Функция ПолучитьДанныеИзСКД(ИндексРасшифровки)
    
    // ДанныеРасшифровкиОбъект - это реквизит формы, куда была помещена расшифровка при компоновке
    Данные = ПолучитьИзВременногоХранилища(ДанныеРасшифровкиАдрес);
    
    Поля = Данные.Элементы[ИндексРасшифровки].ПолучитьПоля();
    
    Для Каждого Поле Из Поля Цикл
        // Здесь можно найти нужное поле по имени
        Если Поле.Поле = "Номенклатура" Тогда
            Возврат Поле.Значение;
        КонецЕсли;
    КонецЦикла;
    
    Возврат Неопределено;
КонецФункции

Дополнительные параметры ячейки

Помимо расшифровки, мы можем программно получить и другие полезные свойства текущей области, которые помогут в автоматизации:

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

← На главную