Влияние свойства "Изменяет данные" на поведение команды объекта
Многие начинающие разработчики игнорируют свойство команды объекта "Изменяет данные"то ли не замечают его, то ли не хотят разбираться с ним. Давайте выясним, каким образом данное свойство влияет на поведение команды и почему не стоит его игнорировать.
Создадим для справочника две команды, одна с установленным свойством "Изменяет данные", другая без (см. рисунок 1).
![]() |
Рисунок 1. Команды объекта |
Команды выполняют одинаковое действие - запись случайного числа в реквизит СлучайноеЧисло элемента справочника.
-== МОДУЛЬ КОМАНДЫ ==-
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
УстановитьСлучайноеЧисло(ПараметрКоманды);
КонецПроцедуры
&НаСервере
Процедура УстановитьСлучайноеЧисло(Ссылка)
Справочники.СправочникА.УстановитьСлучайноеЧисло(Ссылка);
КонецПроцедуры
-== МОДУЛЬ МЕНЕДЖЕРА СПРАВОЧНИКА ==-
Процедура УстановитьСлучайноеЧисло(СсылкаНаОбъект) Экспорт
ГСЧ = Новый ГенераторСлучайныхЧисел;
СлучайноеЧисло = ГСЧ.СлучайноеЧисло(1000000, 9999999);
Объект = СсылкаНаОбъект.ПолучитьОбъект();
Объект.СлучайноеЧисло = СлучайноеЧисло;
Объект.Записать();
КонецПроцедуры
В режиме 1С:Предприятие открываем форму списка и выделяем элемент списка. Если нажать на команду без установленного свойства, то никаких изменений в списке мы не увидим, хотя новое случайное число записано в реквизит. Если же нажать на команду с установленным свойством, то сразу увидим в списке новое случайное число. Открываем форму элемента и так же поочередно нажимаем на команды, поведение платформы будет аналогичным.
Установим для пользователя право только просмотра элементов справочника (см. рисунок 2).
![]() |
Рисунок 2. Права на чтение и просмотр элементов справочника |
В режиме 1С:Предприятие в форме списка обе команды доступны, но, в форме элемента команда с установленным свойством не доступна (см. рисунок 3).
![]() |
Рисунок 3. Доступность команд на формах при праве только просмотра |
Возвращаем пользователю право редактирования элементов справочника, а в форме списка и в форме элемента в обработчике ПриСозданииНаСервере установим свойство формы ТолькоПросмотр в значение Истина.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЭтотОбъект.ТолькоПросмотр = Истина;
КонецПроцедуры
В режиме 1С:Предприятие в форме списка и в форме элемента команда с установленным свойством не доступна, а другая команда доступна (см. рисунок 4).
![]() |
Рисунок 4. Доступность команд на формах, открытых только на просмотр |
Вывод
Данное свойство необходимо устанавливать, если выполнение команды приводит к изменению данных объекта базы данных, например, выполняется заполнение на основании или рассчитывается значение реквизита...
Для команды с установленным свойством платформа:
- обновляет список в форме списка (срабатывает событие ПриПолученииДанныхНаСервере)
- перечитывает данные объекта в форме объекта (срабатывает событие ПриЧтенииНаСервере)
- делает команду не доступной при отсутствии права редактирования объекта
- делает команду не доступной в форме, открытой только на просмотр
Конечно, все выше перечисленное можно прописать в самой команде и проигнорировать свойство "Изменяет данные", но зачем усложнять команду, если можно установить свойство в значение Истина и платформа все выполнит сама?
Дополнение
Почему при наличии права только просмотра, команда с установленным свойством "Изменяет данные" в форме списка доступна, а в форме элемента нет? Не знаю, но есть решение. В обработчике ПриСозданииНаСервере в форме списка анализируем право доступа "Изменение", при отсутствии данного права у текущего пользователя делаем команду не доступной.
ПравоИзменения = ПравоДоступа("Изменение", Метаданные.Справочники.СправочникА);
Элементы.ФормаСправочникСправочникАКомандаОбъектаИзменяетДанные.Доступность = ПравоИзменения;
В строке
ОтветитьУдалитьЭтотОбъект.ТолькоПросмотр = Истина;
ЭтотОбъект зачем написано? Это что? И если это не написать что изменится?
ЭтотОбъект - переменная, содержащая текущую форму. При обращении к свойствам и реквизитам формы можно опускать эту переменную, так что "ЭтотОбъект.ТолькоПросмотр = Истина" и "ТолькоПросмотр = Истина" равнозначны. Привык работать с формой через эту переменную, т.к. сразу понятно что идет обращение к свойству/реквизиту формы, а не инициализация переменной. Возможно в обработчиках на две строчки кода это лишнее :)
УдалитьКстати, нынче если писать в управляемой форме ЭтотОбъект, то например SonarQube будет ругаться на это написание и подсказывать что надо писать ЭтаФорма
ОтветитьУдалитьРазъяснение топовое. Спасибо
ОтветитьУдалить