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