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