Как сделать кнопку на форме доступной, если установлено свойство Только просмотр

Программист 1С v8.3 (Обычные формы)
← На главную

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

Понимание механизма Только просмотр и свойства Изменяет данные

Когда у формы установлено свойство ТолькоПросмотр в значение Истина, платформа включает защитный механизм. Этот механизм анализирует каждый элемент формы и определяет, может ли он повлиять на данные объекта (документа, справочника). Основным индикатором здесь выступает свойство ИзменяетДанные (в англоязычном варианте ModifiesData). Если этот флаг установлен, 1С автоматически делает элемент недоступным.

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

Шаг 1. Программное добавление кнопки с правильными свойствами

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

Рассмотрим следующий фрагмент кода:


Процедура ПриОткрытии()
    // Получаем коллекцию кнопок командной панели
    КнопкиПанели = ЭлементыФормы.ОсновныеДействияФормы.Кнопки;
    
    // Добавляем новую кнопку
    // Имя, ТипКнопки, Текст/Заголовок, Действие
    НоваяКнопка = КнопкиПанели.Добавить("КнДополнительноеДействие", ТипКнопкиКоманднойПанели.Действие, "Выполнить действие", Новый Действие("ОбработкаНажатияКнопки"));
    
    // КРИТИЧЕСКИ ВАЖНЫЙ МОМЕНТ:
    // Устанавливаем Ложь, чтобы кнопка не блокировалась в режиме ТолькоПросмотр
    НоваяКнопка.ИзменяетДанные = Ложь;
КонецПроцедуры

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

Шаг 2. Разница между ТолькоПросмотр и Доступность

Выясним причину, почему кнопка может оставаться недоступной, даже если ИзменяетДанные установлено в Ложь. В 1С существует иерархия свойств, влияющих на визуальное состояние элемента:

  1. ТолькоПросмотр (ReadOnly) — влияет на элементы, связанные с данными или имеющие флаг ИзменяетДанные.
  2. Доступность (Enabled) — полностью отключает элемент, он становится «серым» и не реагирует на события.

Если в коде типовой конфигурации или в других подсистемах управления интерфейсом вызывается принудительная установка ЭлементыФормы.ИмяПанели.Доступность = Ложь, то никакие манипуляции со свойством ИзменяетДанные конкретной кнопки не помогут. В таком случае нужно проверять доступность родительского контейнера (панели или группы).

Шаг 3. Обработка действий при записи из режима просмотра

Иногда возникает специфическая задача: кнопка должна быть доступна в режиме «Только просмотр», но при её нажатии данные все же должны записаться (например, фиксация факта ознакомления с документом). Если мы просто напишем ЭтотОбъект.Записать() внутри процедуры-обработчика, платформа может выдать ошибку прав доступа или режима формы.

В таких случаях проанализируем следующий подход:


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

Важно: Этот метод сработает только в том случае, если у пользователя есть фактические права (роли) на редактирование данного объекта в конфигураторе. Свойство ТолькоПросмотр — это интерфейсное ограничение, а не ограничение прав доступа.

Типичные ошибки при работе с кнопками

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

Рекомендации по проектированию интерфейса

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

Таким образом, для решения задачи доступности кнопки достаточно запомнить простое правило: для кастомных кнопок в Обычных формах 1С всегда устанавливайте свойство ИзменяетДанные в значение Ложь, если вы хотите, чтобы они работали в режиме чтения.

← На главную