Как запретить интерактивное создание элементов справочника в 1С и оставить только программный способ

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

В процессе разработки сложных корпоративных систем на базе 1С:ERP или 1С:Комплексная автоматизация часто возникает задача жесткого контроля над составом справочников. Например, когда элементы должны загружаться строго из внешних систем (MDM, исторические базы) или создаваться только на основании определенных документов. В таких ситуациях мы сталкиваемся с необходимостью полностью запретить пользователю нажимать кнопку «Создать» или «Копировать», сохранив при этом возможность записи объектов через программный код — для этого подойдёт гибкая настройка прав и контроля действий.

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

Метод 1. Настройка прав доступа (Роли)

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

Выполним быструю проверку прав доступа и проанализируем список прав для справочника в конфигураторе:

  1. Интерактивное добавление: если снять эту галочку, у пользователя исчезнет кнопка «Создать» (Ins) в формах списка и выбора.
  2. Интерактивное копирование: крайне важный пункт. Если его оставить, пользователь сможет обойти запрет создания, просто скопировав существующий элемент. Эту галочку также необходимо снять.

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

Метод 2. Программный запрет в модуле объекта

Иногда настройки ролей бывает недостаточно (например, когда запрет должен действовать только при определенных условиях). В этом случае мы используем обработчик ПередЗаписью в модуле объекта. Однако здесь возникает вопрос: если мы просто напишем Отказ = Истина, то и программное создание станет невозможным.

Рассмотрим изящное решение с использованием коллекции ДополнительныеСвойства. Идея заключается в том, чтобы передавать в объект специальный «флаг-пароль» при программном вызове.

Разберем пример кода, который нужно разместить в модуле объекта справочника:


Процедура ПередЗаписью(Отказ)
    
    // 1. Всегда пропускаем запись, если идет обмен данными
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;

    // 2. Проверяем наличие флага программного создания
    Если НЕ ДополнительныеСвойства.Свойство("РазрешитьПрограммнуюЗапись") Тогда
        ТекстСообщения = "Создание и редактирование элементов этого справочника вручную запрещено. 
                         |Данные обновляются автоматически из внешней системы.";
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
        Отказ = Истина;
    КонецЕсли;

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

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


НовыйЭлемент = Справочники.ИмяВашегоСправочника.СоздатьЭлемент();
НовыйЭлемент.Наименование = "Новый объект";
// Устанавливаем флаг разрешения
НовыйЭлемент.ДополнительныеСвойства.Вставить("РазрешитьПрограммнуюЗапись", Истина);
НовыйЭлемент.Записать();

Таким образом, любая попытка интерактивной записи (через форму) приведет к Отказ = Истина, так как форма не передает это дополнительное свойство.

Метод 3. Использование подписок на события

Если вы хотите избежать внесения изменений в модуль объекта (чтобы сохранить конфигурацию на поддержке и упростить обновление), мы рекомендуем использовать Подписки на события. Рассмотрим этот путь подробнее:

  1. Создаем новую подписку на событие ПередЗаписью для нужного справочника.
  2. В качестве обработчика выбираем процедуру в общем модуле.
  3. Внутри процедуры реализуем ту же логику с проверкой ДополнительныеСвойства или проверкой текущей роли пользователя.

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

Метод 4. Тонкая настройка интерфейса (Управляемые формы)

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

Рассмотрим шаги по настройке формы списка:

Важно: помните, что пользователь может добавить эти кнопки самостоятельно через «Изменить форму». Чтобы исключить это, в свойствах таблицы (Списка) установите свойство ИзменениеСоставаСтрок в значение Ложь. Это полностью заблокирует добавление новых строк через интерфейс списка.

Метод 5. Свойство «Создание при вводе»

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

Зайдем в конфигуратор, выберем нужный справочник, перейдем на вкладку «Формы» и найдем параметр «Создание при вводе». Установим его в значение Не использовать. Теперь система не будет предлагать интерактивное создание даже при быстром вводе из других объектов.

Метод 6. Обработка загрузки данных

При реализации любых запретов на запись критически важно не «сломать» автоматические процессы. Разберем свойство ОбменДанными.Загрузка. В 1С:ERP активно используются механизмы синхронизации и загрузки из файлов — для этого есть загрузка и трансформация данных из внешних источников. Когда данные приходят через эти механизмы, платформа устанавливает флаг Загрузка = Истина.

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

Резюме и рекомендации

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

  1. Для безопасности: используйте роли (отключение интерактивного добавления) или подписку на события с проверкой ДополнительныеСвойства.
  2. Для юзабилити: скрывайте кнопки в формах через свойства командного интерфейса, чтобы не вводить пользователя в заблуждение доступностью функций, которые в итоге выдадут ошибку.
  3. Для стабильности: всегда проверяйте ОбменДанными.Загрузка и используйте Расширения для модификации логики типовых конфигураций.

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

← На главную