Почему не работает метод Доступность(0) для реквизита в форме списка 1С 7.7 и как это исправить

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Причина поведения платформы 1С 7.7

Проанализируем механику работы табличной части формы списка. В платформе 1С 7.7 для колонок табличного поля, включенных в режим интерактивного редактирования прямо в списке, программное отключение доступности отдельного элемента диалога через Форма.Реквизит.Доступность(0) игнорируется движком формы. Аналогично себя ведет и флаг Сделать недоступным в настройках колонки в Конфигураторе.

Метод Доступность(0) рассчитан на обычные поля ввода и кнопки, находящиеся на диалоге вне таблицы. В случае списка справочника платформа считает ячейки редактируемыми, пока открыта возможность менять данные всей таблицы.

Вариант 1. Управление через режим «Только просмотр»

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


Процедура ПриОткрытии()
    Если ПустоеЗначение(Форма.Параметр) = 1 Тогда
        СтатусВозврата(0);
        Возврат;
    КонецЕсли; 

    // Скрываем и отключаем реквизит по умолчанию
    Форма.СкидкаРетро.Видимость(0);
    Форма.СкидкаРетро.Доступность(0);

    // Проверяем права пользователя
    Если (ИмяПользователя() = "Ира") Или (ИмяПользователя() = "Вася") Тогда
        Форма.СкидкаРетро.Видимость(1); 
        // Блокируем редактирование формы для пользователей без полных прав
        Форма.ТолькоПросмотр(1); 
    Иначе
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;

    // Разрешаем редактирование конкретному пользователю
    Если ИмяПользователя() = "Вася" Тогда
        Форма.ТолькоПросмотр(0);
        Форма.СкидкаРетро.Доступность(1);
    КонецЕсли;
КонецПроцедуры

Вариант 2. Запрет редактирования через событие ПриНачалеРедактированияСтроки

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

  1. Открываем модуль формы списка справочника.
  2. Добавляем предопределенную процедуру ПриНачалеРедактированияСтроки().
  3. Проверяем условие доступа и вызываем СтатусВозврата(0) при отсутствии прав.

Процедура ПриНачалеРедактированияСтроки()
    Если ИмяПользователя() = "Ира" Тогда
        Предупреждение("У вас нет прав на редактирование данных в этом списке!");
        СтатусВозврата(0); // Отменяет вход в режим редактирования строки
    КонецЕсли;
КонецПроцедуры

Вариант 3. Отключение редактирования в списке

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

  1. В Конфигураторе открываем свойства справочника или свойства формы списка.
  2. Снимаем флаг Редактировать в списке.
  3. Настраиваем форму элемента справочника (диалог ввода).

При отключенном редактировании в списке переход к изменению реквизитов осуществляется через форму элемента. На диалоге отдельного элемента справочника метод Форма.ИмяРеквизита.Доступность(0) работает в штатном режиме и надежно блокирует редактирование нужного поля.

← На главную