Как реализовать открытие формы документа из списка вместо его добавления в таблицу

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

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

Анализ проблемы: Выбор vs Открытие

Первоначальная ошибка часто заключается в использовании элемента ТаблицаФормы, связанного с реквизитом типа СписокЗначений или ТаблицаЗначений. Когда мы нажимаем кнопку "Добавить" в такой таблице, платформа по умолчанию запускает стандартную обработку выбора. В этом режиме форма списка открывается с флагом РежимВыбора = Истина, и при двойном клике по документу система просто возвращает ссылку в таблицу, закрывая список. Наша задача — изменить это поведение.

Решение 1: Использование динамического списка

Наиболее правильным и "нативным" способом для отображения документов в 1С является использование реквизита типа ДинамическийСписок. Рассмотрим, как его настроить:

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

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


&НаСервере
Процедура ОбновитьСписокНаСервере(ИмяТаблицы)
    СписокДокументов.ТекстЗапроса = "ВЫБРАТЬ * ИЗ " + ИмяТаблицы;
    СписокДокументов.ОсновнаяТаблица = ИмяТаблицы;
КонецПроцедуры

Решение 2: Программное открытие через событие выбора

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

Рассмотрим пример использования метода ПоказатьЗначение(). Это универсальный метод, который открывает карточку любого объекта:


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

Решение 3: Динамический список с произвольным запросом (Опасный путь)

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

Если нам действительно нужно видеть "все документы сразу", правильнее использовать Журналы документов. Выясним причину: журналы создают в базе данных специальную таблицу-индекс, которая уже содержит ссылки на разные типы документов, что делает выборку мгновенной.

Решение 4: Использование стандартных команд платформы

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


&НаКлиенте
Процедура ОткрытьДокументПоСсылке(СсылкаНаОбъект)
    НавСсылка = ПолучитьНавигационнуюСсылку(СсылкаНаОбъект);
    ПерейтиПоНавигационнойСсылке(НавСсылка);
КонецПроцедуры

Этот метод удобен тем, что он абсолютно игнорирует контекст "выбора" и всегда работает в режиме "открытия".

Разбор по шагам: как сделать "Выбор типа -> Список -> Открытие"

Рассмотрим алгоритм реализации задачи "как в стандартном журнале", но внутри вашей обработки:

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

Проанализируем пример кода для реализации этой логики:


&НаКлиенте
Процедура ВыбратьИОткрытьДокумент(Команда)
    ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВыбораТипа", ЭтотОбъект);
    ПоказатьВыборТипа(ОписаниеОповещения, Новый ОписаниеТипов("ДокументСсылка"));
КонецПроцедуры

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

Резюме: Если ваша цель — просто дать пользователю возможность найти и посмотреть документ, не используйте промежуточные таблицы (ТаблицаЗначений). Используйте Динамические списки с настроенной Основной таблицей или программный вызов ОткрытьФорму. Это обеспечит высокую скорость работы интерфейса и сохранит стандартный "пользовательский опыт" работы с системой 1С.

← На главную