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