Как отключить или обойти блокировку редактирования реквизитов в 1С:Управление торговлей 11

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

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

Разберем, как устроена данная подсистема, и рассмотрим способы решения этой задачи без снятия конфигурации с поддержки.

Как работает подсистема запрета редактирования реквизитов

Проанализируем архитектуру этого механизма. В основе функционала лежит подсистема Библиотеки стандартных подсистем (БСП) — «Запрет редактирования реквизитов объектов». Важно понимать: блокировка срабатывает исключительно на уровне интерфейса управляемой формы через свойства элементов Доступность или ТолькоПросмотр. На уровне базы данных и объектной модели платформа 1С не запрещает запись.

Список защищаемых полей определяется в модуле менеджера конкретного справочника с помощью специальной экспортной функции:


Функция ПолучитьБлокируемыеРеквизитыОбъекта() Экспорт
    
    БлокируемыеРеквизиты = Новый Массив;
    БлокируемыеРеквизиты.Добавить("ВидНоменклатуры");
    БлокируемыеРеквизиты.Добавить("ТипНоменклатуры");
    БлокируемыеРеквизиты.Добавить("СтавкаНДС");
    
    Возврат БлокируемыеРеквизиты;
    
КонецФункции

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

Решение 1. Использование расширения конфигурации

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

Разберем реализацию через переопределение функции менеджера по шагам:

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

&Вместо("ПолучитьБлокируемыеРеквизитыОбъекта")
Функция Расш1_ПолучитьБлокируемыеРеквизитыОбъекта()
    // Возвращаем пустой массив, чтобы подсистема БСП не блокировала поля
    Возврат Новый Массив;
КонецФункции

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

Также через расширение можно автоматически снимать защиту при открытии формы элемента. Для этого заимствуем форму и в обработчике ПриСозданииНаСервере добавляем код:


&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Разрешаем редактирование конкретных кнопок или элементов
    Если Элементы.Найти("НастройкиОтбора") <> Неопределено Тогда
        Элементы.НастройкиОтбора.Доступность = Истина;
    КонецЕсли;
КонецПроцедуры

Решение 2. Программное открытие формы и нажатие кнопок

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

Посмотрим на пример, когда форма открывается программно, а целевое действие эмулируется вызовом соответствующей команды формы:


ПараметрыОткрытия = Новый Структура("Ключ", СсылкаНаЭлемент);
ФормаЭлемента = ПолучитьФорму("Справочник.СегментыНоменклатуры.ФормаОбъекта", ПараметрыОткрытия);

// Открываем форму для пользователя
ФормаЭлемента.Открыть();

// Выполняем команду разблокировки или вызова настроек
// Обратите внимание: метод Выполнить() команды формы доступен на клиенте
ФормаЭлемента.ВыполнитьКоманду("РазрешитьРедактированиеРеквизитов");

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

Решение 3. Внешняя обработка с прямым изменением объекта

Выясним причину, почему групповое переопределение реквизитов часто не решает проблему для сложных справочников. Стандартная обработка Групповое изменение реквизитов отлично справляется со скалярными полями (строки, числа, простые ссылки), но не предоставляет интерфейса для редактирования схем и настроек компоновщика данных, которые хранятся в ХранилищеЗначения.

Поскольку блокировки БСП действуют только в пользовательском интерфейсе, в коде внешней обработки можно менять любые поля напрямую через объектную модель:


ЭлементОбъект = ВыбраннаяСсылка.ПолучитьОбъект();

// При необходимости обхода сложных валидаций в модуле объекта:
ЭлементОбъект.ОбменДанными.Загрузка = Истина;

// Изменяем требуемые параметры напрямую
ЭлементОбъект.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;

// Записываем объект без вызова интерактивных блокировок
ЭлементОбъект.Записать();

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

← На главную