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

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

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

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

Ограничение платформы: почему нельзя изменить основной реквизит в коде?

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

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

  1. Стандартные команды: Состав и логика работы кнопок командной панели по умолчанию.
  2. Обработка ключа записи: Автоматическое позиционирование и связь с объектом базы данных.
  3. Системные заголовки: Формирование заголовка формы в зависимости от выбранного элемента.

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

Решение №1: Использование нескольких форм списка

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

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


// Определяем тип клиента и открываем нужную форму
ПараметрыФормы = Новый Структура;
Система = НоваяСистемаИнформации;

Если Система.ТипПлатформы = ТипПлатформы.Android Или Система.ТипПлатформы = ТипПлатформы.iOS Тогда
    // Открываем форму, специально созданную для мобильных устройств
    ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаСпискаМобильная", ПараметрыФормы);
ИначеЕсли Система.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда
    // Открываем стандартную форму для ПК
    ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаСписка", ПараметрыФормы);
КонецЕсли;

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

Решение №2: Программная привязка командной панели

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

Рассмотрим, как настроить таблицу (элемент формы) и ее панель:

  1. В свойствах элемента формы типа Таблица установите флаг Автозаполнение.
  2. Укажите в свойстве ПутьКДанным нужный динамический список.
  3. Для элемента КоманднаяПанель в свойстве ИсточникКоманд выберите именно эту таблицу.

Таким образом, кнопки «Создать» или «Изменить» будут относиться именно к данным этой таблицы. Вы можете просто управлять видимостью разных таблиц (через свойство Видимость), и пользователь будет видеть актуальный набор команд.

Решение №3: Динамическая смена текста запроса и основной таблицы

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

Выясним, как это реализовать в процедуре ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    Если ЭтоМобильныйКлиент() Тогда
        // Настраиваем список для упрощенного отображения
        Список.ОсновнаяТаблица = "Справочник.Номенклатура";
        Список.ТекстЗапроса = 
            "ВЫБРАТЬ
            |    Номенклатура.Ссылка,
            |    Номенклатура.Наименование
            |ИЗ
            |    Справочник.Номенклатура КАК Номенклатура";
    Иначе
        // Настраиваем расширенный список для ПК
        Список.ОсновнаяТаблица = "Справочник.Номенклатура";
        Список.ТекстЗапроса = 
            "ВЫБРАТЬ
            |    Номенклатура.*
            |ИЗ
            |    Справочник.Номенклатура КАК Номенклатура";
    КонецЕсли;

КонецПроцедуры

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

Решение №4: Использование страниц (закладок) и оптимизация

Проанализируем ситуацию, когда на форме все же необходимо иметь несколько списков. Чтобы не «утяжелять» форму при открытии (особенно в браузере или на мобильном), рекомендуется разместить списки на разных страницах группы Страницы.

Для оптимизации используйте свойство динамического списка ОбновлениеПриИзмененииДанных. Установите его в значение Не пользоваться для тех списков, которые находятся на неактивных в данный момент закладках. Активируйте обновление только при переходе пользователя на соответствующую страницу.

Посмотрим на пример управления видимостью:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    
    // Скрываем ненужные элементы в зависимости от контекста
    Если ЭтоБраузер() Тогда
        Элементы.ГруппаСписокДляПК.Видимость = Ложь;
        Элементы.ГруппаСписокДляБраузера.Видимость = Истина;
    КонецЕсли;
    
КонецПроцедуры

Подведем итоги

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

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

← На главную