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