Как добавить поле выбора документа на обычную форму в 1С:Предприятие 8?

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

При разработке внешних обработок и отчетов на обычных (неуправляемых) формах в конфигурациях вроде «Управление торговлей 10.3» или «Управление производственным предприятием 1.3» начинающие разработчики часто сталкиваются с поведением палитры свойств: при попытке связать созданный элемент с данными свойство ТипЗначения становится недоступным для редактирования (серым). Разберем причины такого поведения платформы и детально рассмотрим два способа реализации выбора документа на форме.

Почему свойство «Тип значения» становится неактивным

В архитектуре обычных форм действует строгое правило наследования типов. Выясним причину блокировки свойства: если у элемента управления ПолеВвода заполнено свойство Данные, поле автоматически перенимает тип из связанного источника. Редактировать состав типов в свойствах самого элемента интерфейса платформа больше не позволяет, делая строку серой.

Кроме того, в платформе 1С не существует единого абстрактного типа «ДокументСсылка». Доступны либо ссылки на конкретные метаданные (например, ДокументСсылка.РеализацияТоваровУслуг), либо составной тип данных, либо общий тип ЛюбаяСсылка (включающий в себя справочники, документы и другие объекты). Если вам требуется предоставить пользователю выбор среди документов, настраивать состав типов необходимо в правильном месте в зависимости от выбранного архитектурного подхода.

Способ 1. Создание поля через реквизит обработки или формы (с привязкой к данным)

Этот способ является классическим и наиболее надежным, так как значение реквизита легко сохраняется встроенными механизмами платформы при закрытии формы или настройке вариантов.

Разберем по шагам правильный алгоритм настройки:

  1. Создаем реквизит. Если требуется использовать значение реквизита в процедурах модуля объекта внешней обработки, создадим его в ветке «Реквизиты» дерева метаданных самой обработки. Если значение нужно только для экранных действий в модуле формы, добавим его на вкладке «Реквизиты» окна редактирования формы.
  2. Настраиваем тип реквизита. Откроем палитру свойств созданного реквизита (а не элемента формы). Нажмем кнопку выбора в строке Тип. В открывшемся окне установим флаг Составной тип данных и отметим галочками ссылки на нужные документы конфигурации (либо один конкретный документ, если выбор ограничен одним видом).
  3. Размещаем поле ввода на форме. Перетащим реквизит мышью на рабочую область формы или вставим элемент управления ПолеВвода через панель инструментов.
  4. Связываем элемент с реквизитом. В свойствах элемента управления в поле Данные укажем имя нашего реквизита. Свойство ТипЗначения станет серым — это нормальное штатное поведение, так как типы уже считаны из реквизита.
  5. Включаем кнопки выбора. Убедимся, что у поля ввода включено свойство КнопкаВыбора (значение Да), а также при необходимости включим свойство КнопкаОчистки, чтобы пользователь мог быстро сбросить значение.

Способ 2. Использование несвязанного элемента управления (без реквизита)

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

  1. Вставим на форму элемент управления ПолеВвода.
  2. Оставим свойство Данные пустым.
  3. Перейдем в свойство ТипЗначения (оно останется доступным для редактирования) и укажем требуемый тип ссылки на документ или составной тип.
  4. Включим флаг КнопкаВыбора.

Обратите внимание на особенности обращения к такому полю в программном коде: чтение и запись осуществляются напрямую через коллекцию элементов формы:


// Получение выбранного значения из несвязанного поля
ВыбранныйДокумент = ЭлементыФормы.ПолеВводаДокумент.Значение;

// Очистка значения поля
ЭлементыФормы.ПолеВводаДокумент.Значение = Неопределено;

Тонкости работы с составными типами документов

Проанализируем ситуацию, когда реквизиту задан составной тип из нескольких видов документов. Если поле изначально не заполнено (содержит Неопределено), то при первом нажатии кнопки выбора платформа откроет окно выбора типа данных, и лишь затем — журнал самого документа. Чтобы сделать интерфейс удобнее, рассмотрим полезные программные приемы.

1. Предустановка типа по умолчанию при открытии формы

Чтобы избежать лишнего диалога выбора типа при первом обращении, в обработчике события ПриОткрытии можно сразу инициализировать поле пустой ссылкой приоритетного документа:


Процедура ПриОткрытии()
    Если НЕ ЗначениеЗаполнено(РеквизитДокумент) Тогда
        РеквизитДокумент = Документы.РеализацияТоваровУслуг.ПустаяСсылка();
    КонецЕсли;
КонецПроцедуры

2. Программное ограничение типов

Если состав типов нужно скорректировать динамически в процессе работы формы без изменения свойств метаданных, воспользуемся свойством поля ОграничениеТипа:


МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("ДокументСсылка.РеализацияТоваровУслуг"));
МассивТипов.Добавить(Тип("ДокументСсылка.ПоступлениеТоваровУслуг"));

ЭлементыФормы.ПолеВводаДокумент.ОграничениеТипа = Новый ОписаниеТипов(МассивТипов);

Открытие формы выбора с отбором

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


Процедура ПолеВводаДокументНачалоВыбора(Элемент, СтандартнаяОбработка)
    
    // Отключаем стандартное открытие списка платформой
    СтандартнаяОбработка = Ложь;
    
    // Получаем форму выбора нужного документа с указанием владельца
    ФормаВыбора = Документы.РеализацияТоваровУслуг.ПолучитьФормуВыбора(, Элемент);
    
    // Настраиваем отбор по проведенным документам
    ФормаВыбора.Отбор.Проведен.Значение = Истина;
    ФормаВыбора.Отбор.Проведен.Использование = Истина;
    
    // Открываем форму выбора
    ФормаВыбора.Открыть();
    
КонецПроцедуры

Передача параметра Элемент в метод ПолучитьФормуВыбора в качестве владельца гарантирует, что выбранный пользователем документ автоматически подставится в поле ввода без написания дополнительного кода обработки оповещений.

← На главную