Как правильно настроить выпадающий список в 1С и ограничить выбор для определенных пользователей?

Программист 1С v8.3 (Управляемые формы) Бухгалтерский учет Сфера услуг, туризм и социальный сектор
← На главную

При разработке в среде «1С:Предприятие 8.3» на управляемых формах часто возникает задача динамического изменения состава доступных значений в выпадающем списке. Особенно это актуально для таких реквизитов, как КФО (Код финансового обеспечения) в конфигурациях для государственных учреждений, где выбор должен зависеть от прав пользователя или специфики текущей операции. В этой статье мы подробно разберем, как программно управлять списком выбора, почему значения могут «пропадать» после выбора и как правильно реализовать проверку прав доступа.

Разбор основной проблемы: почему выбранное значение не сохраняется?

Проанализируем ситуацию, с которой часто сталкиваются начинающие разработчики. При программном заполнении списка выбора через объект СписокВыбора данные вроде бы появляются в интерфейсе, но после нажатия на нужный пункт поле ввода остается пустым или очищается. Выясним причину этого поведения.

Основная ошибка заключается в несоответствии типов данных. Если ваш реквизит имеет тип ПеречислениеСсылка.КФО, то и в список выбора вы должны добавлять именно объекты типа Ссылка, а не строковые представления этих значений. Когда вы добавляете в список строку "1", система пытается записать строку в поле, ожидающее ссылку на перечисление. Происходит конфликт типов, и платформа сбрасывает значение в Неопределено или пустое значение.

Рассмотрим правильный подход к заполнению списка для перечислений:


// Правильное добавление значений перечисления в список выбора
МассивЭлементов = Новый Массив;
МассивЭлементов.Добавить(Перечисления.КФО.БюджетнаяДеятельность);
МассивЭлементов.Добавить(Перечисления.КФО.ПриносящаяДоходДеятельность);

// Загрузка в элемент формы
Элементы.КФО.СписокВыбора.ЗагрузитьЗначения(МассивЭлементов);

Где лучше писать код: ПриСозданииНаСервере или ПриОткрытии?

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

  1. Минимизация клиент-серверных вызовов: На сервере у нас уже есть доступ к базе данных и метаданным. Нам не нужно делать лишний вызов &НаСервере, чтобы получить ссылки на перечисления или проверить роли пользователя.
  2. Скорость отрисовки: Пользователь увидит уже готовую форму с настроенным списком. Если делать это в ПриОткрытии, форма может сначала отобразиться в стандартном виде, а затем «моргнуть» при изменении состава элементов.

Разберем пример реализации в серверной процедуре:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверим права пользователя (упрощенно)
    Если РольДоступна("ПолныеПрава") Тогда
        // Оставляем стандартный список или расширяем его
    Иначе
        // Ограничиваем список для обычного пользователя
        Элементы.КФО.СписокВыбора.Очистить();
        Элементы.КФО.СписокВыбора.Добавить(Перечисления.КФО.СредстваВоВременномРаспоряжении, "Только 3-й КФО");
    КонецЕсли;
    
    // Важная настройка для корректной работы списка
    Элементы.КФО.РежимВыбораИзСписка = Истина;
    
КонецПроцедуры

Настройка свойства «Режим выбора из списка»

Важно помнить про свойство элемента формы РежимВыбораИзСписка. Если оно установлено в значение Ложь, платформа воспринимает поле как обычное поле ввода с возможностью выбора из справочника или перечисления целиком. Чтобы заставить поле работать строго как выпадающее меню с вашим набором значений, установите это свойство в Истина либо в конфигураторе, либо программно, как показано в примере выше.

Ограничение доступа по группам пользователей

Рассмотрим вопрос разграничения прав. В типовых решениях (БП, ЗУП, БГУ) для этого лучше использовать механизмы Библиотеки стандартных подсистем (БСП). Вместо ручного поиска пользователя в справочниках групп, используйте функции общего модуля Пользователи.

Проанализируем ситуацию: если вам нужно скрыть определенные элементы КФО для всех, кроме бухгалтеров по внебюджету, используйте проверку ролей. Это более гибкий подход, чем привязка к конкретным именам групп пользователей.


&НаСервере
Функция ПользовательИмеетДоступКВнебюджету()
    // Пример использования БСП для проверки роли
    Возврат РольДоступна("ЧтениеВнебюджетныхОпераций");
КонецФункции

Динамическое управление списком через «НачалоВыбора»

Иногда состав списка должен меняться не при открытии формы, а в зависимости от того, что введено в других полях. В таком случае рассмотрим использование события НачалоВыбора. Это позволяет сформировать список в самый последний момент — перед тем, как пользователь увидит выпадающее меню.

Разберем алгоритм действий в этом обработчике:

  1. Устанавливаем СтандартнаяОбработка = Ложь, чтобы отменить стандартное открытие формы выбора.
  2. Очищаем текущий СписокВыбора элемента.
  3. Наполняем список актуальными данными (обязательно ссылками!).
  4. Вызываем метод ВыбратьИзСписка() для отображения результата.

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

Важные нюансы работы с КФО в бюджетных конфигурациях

Проанализируем последствия ограничения списка КФО. В конфигурациях типа БГУ (Бухгалтерия государственного учреждения) код финансового обеспечения — это не просто аналитика, а ключевой параметр, определяющий счета учета и структуру проводок.

Важный момент: если вы программно скроете КФО "4" из списка выбора для пользователя, но по правилам учета документ должен быть оформлен именно по этому коду, пользователь не сможет провести документ или создаст ошибочную запись по другому КФО. Помните, что ограничение интерфейсного списка не заменяет проверку логики в модуле объекта. Рекомендуется дополнять визуальные ограничения проверкой в событии ПередЗаписью или ОбработкаПроведения, чтобы исключить ввод некорректных данных.

Резюме для реализации

Подведем итог нашему разбору. Для успешного приведения выпадающего списка к нужному виду необходимо соблюсти четыре условия:

Следуя этим шагам, вы создадите надежный и удобный интерфейс, который будет корректно работать во всех режимах работы платформы.

← На главную