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