При работе в 1С:Управление производственным предприятием (УПП) версии 1.3.147.1, а также в других конфигурациях на платформе 1С:Предприятие 8.2/8.3 в режиме обычных форм, пользователи часто сталкиваются с ситуацией, когда вместо привычной формы выбора элемента справочника (например, организации) открывается выпадающий список. Это может быть неудобно, особенно когда требуется применить сложный отбор или работать с большим количеством элементов. Рассмотрим подробно, как мы можем изменить этот механизм, вернуть обычную форму выбора и что делать, если свойство «Быстрый выбор» заблокировано.
Для начала давайте разберем, что такое свойство «Быстрый выбор» и для чего оно предназначено в системе 1С. Это свойство объектов метаданных, таких как справочники или перечисления, которое позволяет системе выбирать элементы не из отдельной, полноценной формы выбора, а из компактного выпадающего списка прямо в поле ввода. Такой подход призван повысить удобство и скорость работы, особенно для справочников с небольшим количеством элементов, где нет сложной иерархии или большого объема данных для отбора. В выпадающем списке обычно отображаются только основные поля, такие как наименование или код.
Однако удобство быстрого выбора превращается в препятствие, когда нам требуется:
В таких случаях нам необходима полноценная форма выбора, с которой мы привыкли работать.
Мы выясним, почему свойство «Быстрый выбор» может быть заблокировано для редактирования в конфигураторе, как это часто происходит со справочником «Организации». Синтаксис-помощник 1С нам подсказывает, что свойство «Быстрый выбор» является ТолькоЧтение и доступно для изменения только в том случае, если другой ключевой параметр объекта метаданных – «Способ выбора» – установлен в значение «Обоими способами».
Рассмотрим возможные состояния свойства «Способ выбора»:
Таким образом, если свойство «Быстрый выбор» для справочника «Организации» заблокировано, скорее всего, его «Способ выбора» установлен в «Быстрый выбор» или «Из формы». Кроме того, существует ещё одна распространенная причина блокировки – это настройки поддержки конфигурации. Если конфигурация находится на поддержке поставщика, а объект «Справочник.Организации» не снят с поддержки или правила поддержки не позволяют его изменять, то все его свойства, включая «Способ выбора» и «Быстрый выбор», будут недоступны для редактирования.
Мы рассмотрим несколько подходов к решению проблемы с выпадающим списком выбора организации. Эти методы могут быть применены как по отдельности, так и в комбинации, в зависимости от конкретной ситуации и уровня необходимых изменений.
Первым делом мы должны проверить, какое значение имеет свойство «Способ выбора» для справочника «Организации». Для этого нам необходимо:
Если значение этого свойства установлено в «Быстрый выбор» или «Из формы», то это напрямую объясняет блокировку свойства «Быстрый выбор». Если же оно установлено в «Обоими способами», то свойство «Быстрый выбор» должно быть доступно для редактирования, и мы можем просто снять с него флажок, чтобы система по умолчанию открывала форму выбора. Однако, как мы уже говорили, часто это свойство также заблокировано.
Если свойства объекта метаданных заблокированы (доступна только возможность просмотра), мы должны проанализировать настройки поддержки конфигурации. Это очень распространенная ситуация для типовых конфигураций, находящихся на поддержке поставщика.
Если для этого объекта установлен режим, который запрещает изменения (например, «Объект редактируется с сохранением поддержки», но с ограничениями на свойства), то мы не сможем изменить свойства «Способ выбора» или «Быстрый выбор». В этом случае у нас есть несколько вариантов:
Мы всегда должны помнить, что любое изменение типовой конфигурации, особенно связанное с снятием с поддержки, требует тщательного тестирования и резервного копирования базы данных.
Даже если на уровне объекта метаданных свойства заблокированы, мы все еще можем повлиять на поведение выбора, используя принцип переопределения на более низких уровнях. Система 1С позволяет управлять режимом выбора на трех уровнях приоритета: элемент формы -> реквизит объекта -> объект метаданных. Мы рассмотрим, как использовать это.
Если свойство «Способ выбора» у справочника «Организации» установлено в «Обоими способами» (что делает «Быстрый выбор» редактируемым), но мы хотим изменить его поведение только для определенного реквизита документа, мы можем это сделать. Например, в документе «Реализация товаров и услуг» есть реквизит «Организация». Мы можем настроить его свойство:
Это заставит именно этот реквизит всегда открывать форму выбора, даже если для самого справочника «Организации» по умолчанию установлен быстрый выбор.
Этот способ имеет самый высокий приоритет и является наиболее точечным. Мы можем переопределить поведение выбора непосредственно для элемента формы в конкретном документе или отчете. Это очень полезно, когда нам нужно изменить поведение только в одной конкретной форме, не затрагивая другие места использования реквизита.
После этого, при попытке выбора организации через этот конкретный элемент формы, система всегда будет открывать стандартную форму выбора, игнорируя настройки на уровне реквизита и объекта метаданных.
Если вышеописанные методы не приносят желаемого результата или нам требуется более тонкий контроль над процессом выбора (например, сложный отбор, особый вид отображения), мы можем создать свою собственную форму выбора для справочника «Организации» и назначить ее как основную.
В конфигураторе, для справочника «Организации», мы создадим новую форму списка. Для этого:
ФормаВыбораПользовательская.После создания и настройки формы, нам необходимо указать системе, что именно она должна использоваться в качестве основной формы выбора для справочника «Организации»:
ФормаВыбораПользовательская.В этой пользовательской форме мы можем реализовать любую необходимую логику отбора и отображения. Например, в модуле формы мы можем в обработчике события ПриСозданииНаСервере установить стандартные отборы, которые будут действовать при открытии этой формы.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Установим отбор, чтобы видеть только действующие организации
Список.Отбор.ПометкаУдаления.Установить(Ложь);
// Можем добавить более сложные отборы, например, по виду деятельности
// Список.Отбор.ВидДеятельности.ВидСравнения = ВидСравнения.Равно;
// Список.Отбор.ВидДеятельности.Значение = Перечисления.ВидыДеятельности.Производство;
// Список.Отбор.ВидДеятельности.Использование = Истина;
// Если нужно передать параметры извне
Если Параметры.Свойство("НачальныйОтбор") Тогда
// Пример обработки параметра начального отбора
// Для каждого ЭлементОтбора Из Параметры.НачальныйОтбор Цикл
// Список.Отбор[ЭлементОтбора.Ключ].Установить(ЭлементОтбора.Значение);
// КонецЦикла;
КонецЕсли;
КонецПроцедуры
Этот метод дает нам полный контроль над поведением выбора и позволяет адаптировать его под самые специфические требования.
Если по каким-то причинам нам все же приходится оставить выпадающий список (например, это требование бизнеса, или мы не можем изменить настройки метаданных), но мы хотим повлиять на его содержимое, мы можем использовать программные средства. Это позволит нам динамически формировать список или применять к нему отборы.
Событие ОбработкаПолученияДанныхВыбора в модуле менеджера справочника «Организации» – это мощный инструмент для динамического формирования списка значений, которые будут предложены пользователю при быстром выборе. Мы можем полностью перехватить этот процесс и предоставить свой собственный список.
Процедура ОбработкаПолученияДанныхВыбора(ЭлементОтбора, СтандартнаяОбработка, ДанныеВыбора) Экспорт
// Отменяем стандартную обработку, чтобы полностью контролировать список
СтандартнаяОбработка = Ложь;
// Очищаем стандартный список, если он был сформирован до этого
ДанныеВыбора.Очистить();
// Мы формируем свой запрос для получения нужных организаций.
// Например, только не помеченные на удаление и не "Неактивная".
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Организации.Ссылка КАК Организация
|ИЗ
| Справочник.Организации КАК Организации
|ГДЕ
| Организации.ПометкаУдаления = ЛОЖЬ
| И Организации.Наименование <> ""Неактивная""
|УПОРЯДОЧИТЬ ПО
| Организации.Наименование"; // Добавим сортировку для удобства
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ДанныеВыбора.Добавить(Выборка.Организация);
КонецЦикла;
// Мы также можем добавить дополнительные элементы или значения, не существующие в базе
// ДанныеВыбора.Добавить(Справочники.Организации.НайтиПоНаименованию("ООО Рога и Копыта"), "Рога и Копыта (дополнительный)");
// Или даже простой текст
// ДанныеВыбора.Добавить("Другая организация", "Пользовательский ввод");
КонецПроцедуры
В этом обработчике мы полностью контролируем список, который увидит пользователь, и можем применять любую логику отбора и сортировки.
Если мы хотим перехватить событие выбора организации на конкретной форме и принудительно открыть свою форму выбора, мы можем использовать обработчики событий поля ввода на этой форме.
НачалоВыбора (или НачалоВыбораИзСписка, если хотим перехватить именно быстрый выбор) и добавим следующий код:
Процедура ОрганизацияНачалоВыбора(Элемент, СтандартнаяОбработка)
// Мы отменяем стандартный механизм выбора, чтобы система не открывала выпадающий список
СтандартнаяОбработка = Ложь;
// Мы открываем свою форму списка для выбора организации.
// Если у нас есть пользовательская форма, указываем ее имя:
// Справочник.Организации.Форма.ФормаВыбораПользовательская
// В противном случае, мы можем открыть стандартную форму списка:
// Справочник.Организации.ФормаСписка
// Допустим, мы создали свою форму с именем ФормаВыбораПользовательская
// Можно передать параметры в открываемую форму, если это необходимо
ПараметрыОткрытия = Новый Структура("НачальныйОтбор", Новый Структура("ГоловнаяОрганизация", СсылкаНаТекущуюОрганизацию));
ФормаВыбора = ОткрытьФорму("Справочник.Организации.Форма.ФормаВыбораПользовательская", ПараметрыОткрытия, Элемент);
// Если нам нужно дождаться выбора и обработать его
// Если ФормаВыбора.Открыта() Тогда
// ФормаВыбора.ПоместитьВременныйОтбор("МойОтбор", ЗначениеОтбора);
// КонецЕсли;
КонецПроцедуры
Этот метод позволяет нам гибко управлять процессом выбора, открывая нужную форму с нужными параметрами, независимо от настроек метаданных.
Для более точного контроля над выбором, даже при использовании стандартных форм выбора, мы можем использовать свойство «ПараметрыВыбора» для элементов формы. Это позволяет нам устанавливать динамические отборы, которые будут применены при открытии стандартной формы выбора.
ПриСозданииНаСервере, мы можем установить параметры выбора для элемента формы, связанного с организацией.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// ...
// Установим параметры выбора для элемента формы "Организация"
// Например, покажем только организации, которые не помечены на удаление
Элементы.Организация.ПараметрыВыбора.Установить("Отбор.ПометкаУдаления", Ложь);
// Мы можем добавить более сложные отборы, например, по пользовательскому свойству "Действует"
// Или по виду деятельности, если он есть в справочнике
// Элементы.Организация.ПараметрыВыбора.Установить("Отбор.Действует", Истина);
// Элементы.Организация.ПараметрыВыбора.Установить("Отбор.ВидДеятельности", Перечисления.ВидыДеятельности.Производство);
// Если нужно отбирать по какому-то свойству, которое не является реквизитом,
// но есть в форме выбора (например, виртуальные реквизиты или параметры)
// Элементы.Организация.ПараметрыВыбора.Установить("НашПользовательскийОтбор", ТекущийПользователь);
// ...
КонецПроцедуры
Эти параметры будут автоматически применены к форме выбора, когда она будет открыта. Это удобный способ фильтрации, не требующий создания собственной формы, но он работает только со стандартными формами выбора.
Мы видим, что проблема с выпадающим списком выбора организации в 1С УПП имеет несколько решений, от простых до более сложных программных. Выбор конкретного метода зависит от уровня доступа к конфигурации, требований к функциональности и готовности к внесению изменений. Мы всегда рекомендуем тщательно тестировать любые изменения на тестовой базе перед внедрением их в рабочую.