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