Как настроить дату запрета изменений по разделам в БСП 3.1

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Анализ механизма работы дат запрета в БСП

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

Рассмотрим основной затык: если в системе зарегистрирован только один пользовательский раздел, интерфейс настройки скрывает возможность разделения. Система логично предполагает, что если раздел всего один, то настройка по этому разделу эквивалентна «Общей дате». Чтобы активировать режим «По разделам», необходимо, чтобы в списке было как минимум два элемента.

Шаг 1: Программное добавление разделов

Для регистрации разделов необходимо внести изменения в общий модуль ДатыЗапретаИзмененияПереопределяемый. Нам потребуется процедура ПриЗаполненииРазделовДатЗапретаИзменения (в некоторых версиях БСП название может звучать как ЗаполнитьРазделыДатЗапретаИзменения). Рассмотрим пример кода, который добавляет несколько разделов в систему:


Процедура ЗаполнитьРазделыДатЗапретаИзменения(Разделы) Экспорт

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

КонецПроцедуры

Обратим внимание на использование УникальныйИдентификатор. Это критически важный момент: идентификаторы должны быть фиксированными, чтобы при обновлении конфигурации или переносе данных связь между настройками и разделами не терялась.

Шаг 2: Синхронизация с Планом видов характеристик

Простого описания в коде недостаточно. Разделы дат запрета базируются на элементах ПланаВидовХарактеристик.РазделыДатЗапретаИзменения. Выясним причину, почему разделы могут не отображаться, даже если их в коде два и более:

  1. Проверьте, созданы ли соответствующие элементы в самом ПВХ. В идеале, при первом запуске системы или через обработчик обновления, элементы с указанными в коде UUID должны быть созданы в базе данных.
  2. Если вы создаете конфигурацию «с нуля», убедитесь, что предопределенные элементы или программно созданные узлы ПВХ имеют те же уникальные идентификаторы, что и в коде модуля.

Шаг 3: Настройка связи объектов с разделами

Чтобы система понимала, к какому разделу относится конкретный документ (например, Документ.РеализацияТоваровУслуг), необходимо прописать эту связь. Для этого используется процедура ПриЗаполненииТиповИсточниковДатыЗапретаИзменения в том же переопределяемом модуле.

Проанализируем пример регистрации источника:


Процедура ПриЗаполненииТиповИсточниковДатыЗапретаИзменения(Источники) Экспорт

    Источник = Источники.Добавить();
    Источник.Тип = Тип("ДокументСсылка.МаркшейдерскийЗамер");
    Источник.Раздел = "АиБ_МаркшейдерскийЗамер"; // Имя раздела, указанное ранее
    Источник.Дата = "Дата"; // Поле документа, отвечающее за дату
    Источник.Объект = "Организация"; // Поле документа, отвечающее за разрез (если используется)

КонецПроцедуры

Если вы не укажете источник для раздела, то даже при наличии раздела в интерфейсе, документы не будут «слушаться» установленных дат запрета.

Шаг 4: Магия переменной ПоказыватьРазделы

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

Алгоритм заполнения этого флага следующий: ПоказыватьРазделы = (КоличествоРазделов > 1).

Если вы видите, что в форме настроек нет выбора разделов, проверьте через отладчик значение в функции СвойстваРазделовДатЗапрета. Если БезРазделовИОбъектов = Истина или ПоказыватьРазделы = Ложь, значит, система либо не видит ваши разделы в ПВХ, либо их количество равно одному.

Шаг 5: Обновление кэша и данных

БСП активно использует кэширование метаданных подсистем. Если вы добавили код, но изменения не видны:

  1. Запустите конфигурацию с параметром /С ЗапуститьОбновлениеИнформационнойБазы.
  2. Убедитесь, что сеанс был перезапущен полностью.
  3. Проверьте, что в ПланВидовХарактеристик.РазделыДатЗапретаИзменения нет дублей или пустых элементов, которые могли бы сбить логику подсчета разделов.

Важный совет: Если вам действительно нужен только один раздел, но вы хотите видеть интерфейс выбора, вы можете добавить «фиктивный» или служебный второй раздел. Однако штатным поведением БСП является скрытие сложности интерфейса там, где она не требуется.

Резюме

Для корректной работы даты запрета по разделам в БСП 3.1 необходимо выполнить три условия: программно описать минимум два раздела в ДатыЗапретаИзмененияПереопределяемый, обеспечить наличие соответствующих элементов в ПланВидовХарактеристик.РазделыДатЗапретаИзменения с совпадающими UUID, и зарегистрировать типы документов как источники для этих разделов. Выполнение этих шагов гарантирует появление нужных настроек в интерфейсе администрирования.

← На главную