При разработке конфигураций на базе Библиотеки стандартных подсистем (БСП) версии 3.1 и выше часто возникает задача разграничения прав на редактирование данных не только по времени, но и по функциональным областям. Однако начинающие разработчики часто сталкиваются с проблемой: после программного добавления нового раздела в настройках даты запрета по-прежнему доступны только варианты «Общая дата» и «По объектам», а переключатель «По разделам» отсутствует. В этой статье мы разберем, почему так происходит, и как правильно настроить этот механизм.
Для начала проанализируем ситуацию. В БСП логика отображения элементов управления в форме настройки (ДатыЗапретаИзменения) напрямую зависит от данных, которые возвращает подсистема при инициализации. Если мы заглянем внутрь программного кода, то увидим, что решение о показе разделов принимается на основе их количества.
Рассмотрим основной затык: если в системе зарегистрирован только один пользовательский раздел, интерфейс настройки скрывает возможность разделения. Система логично предполагает, что если раздел всего один, то настройка по этому разделу эквивалентна «Общей дате». Чтобы активировать режим «По разделам», необходимо, чтобы в списке было как минимум два элемента.
Для регистрации разделов необходимо внести изменения в общий модуль ДатыЗапретаИзмененияПереопределяемый. Нам потребуется процедура ПриЗаполненииРазделовДатЗапретаИзменения (в некоторых версиях БСП название может звучать как ЗаполнитьРазделыДатЗапретаИзменения). Рассмотрим пример кода, который добавляет несколько разделов в систему:
Процедура ЗаполнитьРазделыДатЗапретаИзменения(Разделы) Экспорт
// Добавляем первый раздел для производственных документов
Раздел = Разделы.Добавить();
Раздел.Имя = "АиБ_МаркшейдерскийЗамер";
Раздел.Идентификатор = Новый УникальныйИдентификатор("ef8e67ef-dbb9-4d6a-a1f1-ae345af4e231");
Раздел.Представление = НСтр("ru = 'Маркшейдерский замер (производственные документы)'");
// Указываем тип объекта, по которому можно будет детализировать запрет (например, по Организациям)
Раздел.ТипыОбъектов.Добавить(Тип("СправочникСсылка.СтруктураПредприятия"));
// Добавляем второй раздел для путевых листов
Раздел = Разделы.Добавить();
Раздел.Имя = "АиБ_МаркшейдерскийЗамер_ПутевыеЛисты";
Раздел.Идентификатор = Новый УникальныйИдентификатор("849a80d2-91fa-4217-ab39-c4571965d240");
Раздел.Представление = НСтр("ru = 'Маркшейдерский замер (путевые листы)'");
Раздел.ТипыОбъектов.Добавить(Тип("СправочникСсылка.СтруктураПредприятия"));
КонецПроцедуры
Обратим внимание на использование УникальныйИдентификатор. Это критически важный момент: идентификаторы должны быть фиксированными, чтобы при обновлении конфигурации или переносе данных связь между настройками и разделами не терялась.
Простого описания в коде недостаточно. Разделы дат запрета базируются на элементах ПланаВидовХарактеристик.РазделыДатЗапретаИзменения. Выясним причину, почему разделы могут не отображаться, даже если их в коде два и более:
UUID должны быть созданы в базе данных.Чтобы система понимала, к какому разделу относится конкретный документ (например, Документ.РеализацияТоваровУслуг), необходимо прописать эту связь. Для этого используется процедура ПриЗаполненииТиповИсточниковДатыЗапретаИзменения в том же переопределяемом модуле.
Проанализируем пример регистрации источника:
Процедура ПриЗаполненииТиповИсточниковДатыЗапретаИзменения(Источники) Экспорт
Источник = Источники.Добавить();
Источник.Тип = Тип("ДокументСсылка.МаркшейдерскийЗамер");
Источник.Раздел = "АиБ_МаркшейдерскийЗамер"; // Имя раздела, указанное ранее
Источник.Дата = "Дата"; // Поле документа, отвечающее за дату
Источник.Объект = "Организация"; // Поле документа, отвечающее за разрез (если используется)
КонецПроцедуры
Если вы не укажете источник для раздела, то даже при наличии раздела в интерфейсе, документы не будут «слушаться» установленных дат запрета.
Как было отмечено в ходе обсуждения, в БСП существует внутренняя функция СвойстваРазделовДатЗапрета(), которая возвращает структуру настроек. В этой структуре есть флаг ПоказыватьРазделы.
Алгоритм заполнения этого флага следующий: ПоказыватьРазделы = (КоличествоРазделов > 1).
Если вы видите, что в форме настроек нет выбора разделов, проверьте через отладчик значение в функции СвойстваРазделовДатЗапрета. Если БезРазделовИОбъектов = Истина или ПоказыватьРазделы = Ложь, значит, система либо не видит ваши разделы в ПВХ, либо их количество равно одному.
БСП активно использует кэширование метаданных подсистем. Если вы добавили код, но изменения не видны:
/С ЗапуститьОбновлениеИнформационнойБазы.ПланВидовХарактеристик.РазделыДатЗапретаИзменения нет дублей или пустых элементов, которые могли бы сбить логику подсчета разделов.Важный совет: Если вам действительно нужен только один раздел, но вы хотите видеть интерфейс выбора, вы можете добавить «фиктивный» или служебный второй раздел. Однако штатным поведением БСП является скрытие сложности интерфейса там, где она не требуется.
Для корректной работы даты запрета по разделам в БСП 3.1 необходимо выполнить три условия: программно описать минимум два раздела в ДатыЗапретаИзмененияПереопределяемый, обеспечить наличие соответствующих элементов в ПланВидовХарактеристик.РазделыДатЗапретаИзменения с совпадающими UUID, и зарегистрировать типы документов как источники для этих разделов. Выполнение этих шагов гарантирует появление нужных настроек в интерфейсе администрирования.