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