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