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