Как реализовать редактирование реквизитов объекта через таблицу значений на форме

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

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

Постановка задачи и выбор подхода

Основная сложность заключается в том, что стандартная ТаблицаЗначений на форме требует определения типов для своих колонок. Если мы создаем колонку "Значение", она должна уметь принимать данные любого типа: от строки и числа до ссылок на справочники и документы. Кроме того, нам необходимо обеспечить двустороннюю связь: изменение данных в таблице должно отражаться в реквизитах самого Объекта, и наоборот.

Разберем три основных способа решения этой задачи:

  1. Использование таблицы значений с программной синхронизацией.
  2. Динамическое создание элементов формы (реквизиты "на лету").
  3. Использование готовых инструментов из типовых конфигураций и библиотек (БСП).

Способ 1: Таблица значений с программной синхронизацией

Этот метод считается классическим. Мы создаем на форме коллекцию (реквизит формы с типом ТаблицаЗначений), добавляем в нее две колонки: ИмяРеквизита (тип Строка) и Значение (составной тип, включающий все возможные типы метаданных).

Проанализируем процесс заполнения такой таблицы при открытии формы. Для этого нам понадобится обратиться к метаданным объекта. Рассмотрим пример кода, который можно разместить в процедуре ПриСозданииНаСервере:


// Заполняем таблицу реквизитами объекта
МетаДанныеОбъекта = Объект.Ссылка.Метаданные();
Для Каждого ТекущийРеквизит Из МетаДанныеОбъекта.Реквизиты Цикл
    НоваяСтрока = ТаблицаРеквизитов.Добавить();
    НоваяСтрока.ИмяРеквизита = ТекущийРеквизит.Имя;
    НоваяСтрока.Значение = Объект[ТекущийРеквизит.Имя];
КонецЦикла;

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

Рассмотрим пример обработчика:


&НаКлиенте
Процедура ТаблицаРеквизитовЗначениеПриИзменении(Элемент)
    ТекущиеДанные = Элементы.ТаблицаРеквизитов.ТекущиеДанные;
    Если ТекущиеДанные <> Неопределено Тогда
        // Записываем измененное значение обратно в объект
        Объект[ТекущиеДанные.ИмяРеквизита] = ТекущиеДанные.Значение;
    КонецЕсли;
КонецПроцедуры

Способ 2: Управление типами в ячейке таблицы

Чтобы пользователь мог выбирать значения правильно (например, открывать список нужного справочника), ячейка должна "знать" свой тип. Выясним, как ограничить доступные типы в конкретной строке таблицы. Для этого используем событие ПередНачаломИзменения или ПриАктивизацииЯчейки.

Нам необходимо получить ОписаниеТипов из метаданных для конкретного реквизита и назначить его элементу управления. Посмотрим, как это реализуется программно:


&НаСервере
Функция ПолучитьОписаниеТипаРеквизита(ИмяРеквизита)
    Возврат Объект.Ссылка.Метаданные().Реквизиты[ИмяРеквизита].Тип;
КонецФункции

&НаКлиенте
Процедура ТаблицаРеквизитовПередНачаломИзменения(Элемент, Отмена)
    ТекущиеДанные = Элементы.ТаблицаРеквизитов.ТекущиеДанные;
    // Устанавливаем ограничение типа для текущей ячейки
    Элементы.ТаблицаРеквизитовЗначение.ОграничениеТипа = ПолучитьОписаниеТипаРеквизита(ТекущиеДанные.ИмяРеквизита);
КонецПроцедуры

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

Способ 3: Динамическое создание элементов формы

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

Разберем преимущества этого метода:

Использование готовых решений

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

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

Оптимизация и важные нюансы

При работе с таблицей значений стоит помнить о производительности. Если объект содержит много данных (например, огромная табличная часть), постоянная синхронизация ТЗ -> Объект может замедлить работу интерфейса. В таких случаях мы рекомендуем использовать стратегию "отложенной записи": синхронизировать данные не ПриИзменении каждой строки, а один раз перед записью всего объекта (в событии ПередЗаписьюНаСервере).

Выясним причину, по которой иногда типы в таблице могут "слетать". Это происходит, если у колонки таблицы на форме не задан составной тип, включающий Строка, Число, Дата, Булево и необходимые ссылочные типы. Всегда проверяйте свойство ТипЗначения у колонки РеквизитФормы, к которой привязана таблица.

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

← На главную