Влияние свойства "Изменяет данные" на поведение команды объекта

Многие начинающие разработчики игнорируют свойство команды объекта "Изменяет данные"то ли не замечают его, то ли не хотят разбираться с ним. Давайте выясним, каким образом данное свойство влияет на поведение команды и почему не стоит его игнорировать.

Создадим для справочника две команды, одна с установленным свойством "Изменяет данные", другая без (см. рисунок 1).

Рисунок 1. Команды объекта

Команды выполняют одинаковое действие - запись случайного числа в реквизит СлучайноеЧисло элемента справочника.

	
    -== МОДУЛЬ КОМАНДЫ ==-
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)	
    УстановитьСлучайноеЧисло(ПараметрКоманды);	
КонецПроцедуры

&НаСервере
Процедура УстановитьСлучайноеЧисло(Ссылка)	
    Справочники.СправочникА.УстановитьСлучайноеЧисло(Ссылка);	
КонецПроцедуры

    -== МОДУЛЬ МЕНЕДЖЕРА СПРАВОЧНИКА ==-
Процедура УстановитьСлучайноеЧисло(СсылкаНаОбъект) Экспорт 

    ГСЧ = Новый ГенераторСлучайныхЧисел;
    СлучайноеЧисло = ГСЧ.СлучайноеЧисло(1000000, 9999999);
    
    Объект = СсылкаНаОбъект.ПолучитьОбъект();
    Объект.СлучайноеЧисло = СлучайноеЧисло;
    Объект.Записать();
	
КонецПроцедуры
  

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

Установим для пользователя право только просмотра элементов справочника (см. рисунок 2).

Рисунок 2. Права на чтение и просмотр элементов справочника

В режиме 1С:Предприятие в форме списка обе команды доступны, но, в форме элемента команда с установленным свойством не доступна (см. рисунок 3).

Рисунок 3. Доступность команд на формах при праве только просмотра

Возвращаем пользователю право редактирования элементов справочника, а в форме списка и в форме элемента в обработчике ПриСозданииНаСервере установим свойство формы ТолькоПросмотр в значение Истина.

	
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)	
	ЭтотОбъект.ТолькоПросмотр = Истина;	
КонецПроцедуры
  

В режиме 1С:Предприятие в форме списка и в форме элемента команда с установленным свойством не доступна, а другая команда доступна (см. рисунок 4).

Рисунок 4. Доступность команд на формах, открытых только на просмотр

Вывод

Данное свойство необходимо устанавливать, если выполнение команды приводит к изменению данных объекта базы данных, например, выполняется заполнение на основании или рассчитывается значение реквизита...

Для команды с установленным свойством платформа:

  1. обновляет список в форме списка (срабатывает событие ПриПолученииДанныхНаСервере)
  2. перечитывает данные объекта в форме объекта (срабатывает событие ПриЧтенииНаСервере)
  3. делает команду не доступной при отсутствии права редактирования объекта
  4. делает команду не доступной в форме, открытой только на просмотр

Конечно, все выше перечисленное можно прописать в самой команде и проигнорировать свойство "Изменяет данные", но зачем усложнять команду, если можно установить свойство в значение Истина и платформа все выполнит сама?

Дополнение

Почему при наличии права только просмотра, команда с установленным свойством "Изменяет данные" в форме списка доступна, а в форме элемента нет? Не знаю, но есть решение. В обработчике ПриСозданииНаСервере в форме списка анализируем право доступа "Изменение", при отсутствии данного права у текущего пользователя делаем команду не доступной.

	
ПравоИзменения = ПравоДоступа("Изменение", Метаданные.Справочники.СправочникА);
Элементы.ФормаСправочникСправочникАКомандаОбъектаИзменяетДанные.Доступность = ПравоИзменения;
  

Комментарии

  1. В строке
    ЭтотОбъект.ТолькоПросмотр = Истина;

    ЭтотОбъект зачем написано? Это что? И если это не написать что изменится?

    ОтветитьУдалить
    Ответы
    1. ЭтотОбъект - переменная, содержащая текущую форму. При обращении к свойствам и реквизитам формы можно опускать эту переменную, так что "ЭтотОбъект.ТолькоПросмотр = Истина" и "ТолькоПросмотр = Истина" равнозначны. Привык работать с формой через эту переменную, т.к. сразу понятно что идет обращение к свойству/реквизиту формы, а не инициализация переменной. Возможно в обработчиках на две строчки кода это лишнее :)

      Удалить
  2. Кстати, нынче если писать в управляемой форме ЭтотОбъект, то например SonarQube будет ругаться на это написание и подсказывать что надо писать ЭтаФорма

    ОтветитьУдалить
  3. Разъяснение топовое. Спасибо

    ОтветитьУдалить

Отправить комментарий