Как программно и интерактивно открыть строку динамического списка в 1С

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

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

Способ 1. Использование механизма «Основной таблицы»

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

В этом случае нам не нужно писать ни одной строчки кода для того, чтобы:

  1. Объект открывался по двойному клику мыши или нажатию клавиши Enter.
  2. Работали стандартные кнопки командной панели («Создать», «Изменить», «Копировать»).
  3. Контекстное меню содержало все необходимые действия с объектом.

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

Способ 2. Обработка событий для списков без основной таблицы

Рассмотрим ситуацию, когда динамический список строится на основе произвольного запроса, возможно, с использованием конструкции ОБЪЕДИНИТЬ ВСЕ. В таких списках основную таблицу указать невозможно, и стандартное открытие перестает работать. Выясним, как это исправить вручную.

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

Теперь разберем, на какое событие лучше всего «повесить» код открытия. Традиционно рекомендуют использовать событие ПередНачаломИзменения, но более современным и правильным подходом является использование события Выбор (ОбработкаВыбора). Рассмотрим пример кода для этого события:


&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    // Отменяем стандартное поведение платформы
    СтандартнаяОбработка = Ложь;
    
    // ВыбраннаяСтрока в динамическом списке обычно и есть ссылка на объект
    Если ЗначениеЗаполнено(ВыбраннаяСтрока) Тогда
        ПоказатьЗначение(, ВыбраннаяСтрока);
    КонецЕсли;
КонецПроцедуры

Использование СтандартнаяОбработка = Ложь позволяет нам полностью контролировать процесс и избежать дублирующих действий системы.

Способ 3. Переход от «ОткрытьЗначение» к «ПоказатьЗначение»

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

Вместо него мы должны использовать асинхронный метод ПоказатьЗначение(). Рассмотрим его синтаксис подробнее:


// Первый параметр - ОписаниеОповещения (необязательно, если не нужно ждать закрытия)
// Второй параметр - само значение (ссылка на документ или справочник)
ПоказатьЗначение(, Элементы.Список.ТекущиеДанные.Ссылка);

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


ТекДанные = Элементы.Список.ТекущиеДанные;
Если ТекДанные <> Неопределено Тогда
    ПоказатьЗначение(, ТекДанные.Ссылка);
КонецЕсли;

Способ 4. Программное открытие через «ОткрытьФорму»

Иногда нам нужно не просто открыть объект, а передать в его форму определенные параметры (например, открыть документ в режиме «Только просмотр» или передать признак того, что форма открыта из специфического реестра). В этом случае разберем использование метода ОткрытьФорму().

Для открытия существующего объекта нам необходимо передать структуру с ключом "Ключ", где значением будет ссылка на наш объект. Посмотрим на практический пример:


&НаКлиенте
Процедура ОткрытьДокументПрограммно()
    ТекДанные = Элементы.Список.ТекущиеДанные;
    Если ТекДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("Ключ", ТекДанные.Ссылка);
    // Можно добавить свои параметры
    ПараметрыФормы.Вставить("ТолькоПросмотр", Истина);
    
    // Имя формы составляется как: ПолноеИмяМетаданных + .ФормаОбъекта
    ОткрытьФорму("Документ.МойДокумент.ФормаОбъекта", ПараметрыФормы);
КонецПроцедуры

Способ 5. Универсальное открытие для гетерогенных списков

Если в вашем списке перемешаны разные типы объектов (например, «Заказы клиентов» и «Заказы поставщиков»), мы не можем жестко прописать имя формы в коде. Выясним, как сделать код универсальным, используя метаданные объекта.

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

Проанализируем работу с навигационной ссылкой:


&НаКлиенте
Процедура СписокВыборУниверсальный(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    НавСсылка = ПолучитьНавигационнуюСсылку(ВыбраннаяСтрока);
    ПерейтиПоНавигационнойСсылке(НавСсылка);
КонецПроцедуры

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

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

Мы рассмотрели несколько подходов к решению задачи. Выбор конкретного метода зависит от сложности вашего динамического списка:

  1. Если список простой — всегда используйте Основную таблицу. Это избавит вас от написания и поддержки лишнего кода.
  2. Если список сложный (запрос) — используйте событие Выбор и метод ПоказатьЗначение.
  3. Не забывайте про свойство Использовать всегда для поля ссылки в настройках динамического списка.
  4. Для современных управляемых приложений избегайте устаревшего метода ОткрытьЗначение, чтобы не сталкиваться с проблемами модальности.

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

← На главную