При разработке внешних обработок на платформе 1С:Предприятие 8.3 (Управляемые формы) начинающие разработчики часто сталкиваются с концептуальной сложностью: как разграничить процесс выбора объекта (для записи в реквизит) и процесс его открытия (для просмотра). Рассмотрим ситуацию, когда пользователь хочет выбрать тип документа, увидеть список и по клику открыть конкретный экземпляр, не перенося его в таблицу на форме. Разберем по шагам, как это реализовать правильно, избегая типичных ошибок производительности.
Первоначальная ошибка часто заключается в использовании элемента ТаблицаФормы, связанного с реквизитом типа СписокЗначений или ТаблицаЗначений. Когда мы нажимаем кнопку "Добавить" в такой таблице, платформа по умолчанию запускает стандартную обработку выбора. В этом режиме форма списка открывается с флагом РежимВыбора = Истина, и при двойном клике по документу система просто возвращает ссылку в таблицу, закрывая список. Наша задача — изменить это поведение.
Наиболее правильным и "нативным" способом для отображения документов в 1С является использование реквизита типа ДинамическийСписок. Рассмотрим, как его настроить:
СписокДокументов) и установим ему тип ДинамическийСписок.Документ.РеализацияТоваровУслуг.Важный нюанс: Если мы хотим, чтобы список открывался не сразу, а после выбора пользователем типа документа, мы можем программно менять текст запроса динамического списка. Проанализируем пример кода:
&НаСервере
Процедура ОбновитьСписокНаСервере(ИмяТаблицы)
СписокДокументов.ТекстЗапроса = "ВЫБРАТЬ * ИЗ " + ИмяТаблицы;
СписокДокументов.ОсновнаяТаблица = ИмяТаблицы;
КонецПроцедуры
Если нам всё же необходимо использовать таблицу или специфический интерфейс выбора, мы можем перехватить событие ОбработкаВыбора или Выбор у элемента формы. Разберем, как это работает. Когда пользователь выбирает документ в открывшемся окне, срабатывает обработчик оповещения. Вместо того чтобы записывать ссылку в таблицу, мы принудительно открываем форму этого объекта.
Рассмотрим пример использования метода ПоказатьЗначение(). Это универсальный метод, который открывает карточку любого объекта:
&НаКлиенте
Процедура ТаблицаДокументовВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
// Отменяем стандартное поведение (добавление в строку/редактирование)
СтандартнаяОбработка = Ложь;
// Получаем ссылку на документ из данных строки
ТекущиеДанные = Элементы.ТаблицаДокументов.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
// Открываем форму документа
ПоказатьЗначение(, ТекущиеДанные.Ссылка);
КонецЕсли;
КонецПроцедуры
В обсуждениях часто предлагают использовать "Произвольный запрос" в динамическом списке, объединяя все документы через ОБЪЕДИНИТЬ ВСЕ. Проанализируем, почему это плохо. Каждый UNION ALL заставляет СУБД сканировать разные физические таблицы. Если в базе десятки видов документов и миллионы записей, такая обработка будет "вешать" сеанс пользователя.
Если нам действительно нужно видеть "все документы сразу", правильнее использовать Журналы документов. Выясним причину: журналы создают в базе данных специальную таблицу-индекс, которая уже содержит ссылки на разные типы документов, что делает выборку мгновенной.
Иногда разработчики забывают о стандартном функционале. Выясним, как использовать навигационные ссылки. Если у нас есть ссылка на документ (ДокументСсылка), мы можем открыть её командой ПерейтиПоНавигационнойСсылке(). Это имитирует поведение системы, когда пользователь кликает по ссылке в отчете или чате.
&НаКлиенте
Процедура ОткрытьДокументПоСсылке(СсылкаНаОбъект)
НавСсылка = ПолучитьНавигационнуюСсылку(СсылкаНаОбъект);
ПерейтиПоНавигационнойСсылке(НавСсылка);
КонецПроцедуры
Этот метод удобен тем, что он абсолютно игнорирует контекст "выбора" и всегда работает в режиме "открытия".
Рассмотрим алгоритм реализации задачи "как в стандартном журнале", но внутри вашей обработки:
ПоказатьВыборТипа(). Это откроет системное окно со списком всех метаданных.ОткрытьФорму() для списка выбранного документа.РежимВыбора. В этом случае форма откроется как обычное окно просмотра, и двойной клик по строке будет открывать документ, а не возвращать его в вашу обработку.Проанализируем пример кода для реализации этой логики:
&НаКлиенте
Процедура ВыбратьИОткрытьДокумент(Команда)
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВыбораТипа", ЭтотОбъект);
ПоказатьВыборТипа(ОписаниеОповещения, Новый ОписаниеТипов("ДокументСсылка"));
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораТипа(ВыбранныйТип, ДополнительныеПараметры) Экспорт
Если ВыбранныйТип <> Неопределено Тогда
// Формируем имя формы списка, например "Документ.РеализацияТоваровУслуг.ФормаСписка"
ИмяМетаданных = Метаданные.НайтиПоТипу(ВыбранныйТип).Имя;
ПолноеИмяФормы = "Документ." + ИмяМетаданных + ".ФормаСписка";
// Открываем форму без режима выбора
ОткрытьФорму(ПолноеИмяФормы);
КонецЕсли;
КонецПроцедуры
Резюме: Если ваша цель — просто дать пользователю возможность найти и посмотреть документ, не используйте промежуточные таблицы (ТаблицаЗначений). Используйте Динамические списки с настроенной Основной таблицей или программный вызов ОткрытьФорму. Это обеспечит высокую скорость работы интерфейса и сохранит стандартный "пользовательский опыт" работы с системой 1С.