Запись реквизита при отсутствии прав на запись. Использование привилегированного режима.

1. AlexeyPapanov 458 16.08.17 14:50 Сейчас в теме
Предположим, стоит задача - ограничить определенному пользователю доступ к записи реквизита "цена" табличной части произвольного документа.
Самое тупое, что приходит в голову - программно установить доступность поля ТЧ в зависимости от какого-то параметра.
Но в комментариях к одной записи вебинара П.Чистова он сам ответил человеку, что это решается путем снятия галки "Запись" у соответствующего реквизита нужного документа в роли пользователя.
Я сделал так на учебной базе.
В модуле формы документа есть обработчик события
&НаКлиенте
Процедура ПереченьНоменклатурыНоменклатураПриИзменении(Элемент)
	// Получить текущую строку табличной части
	СтрокаТабличнойЧасти = Элементы.ПереченьНоменклатуры.ТекущиеДанные;
	// Установить цену (на сервере)
	СтрокаТабличнойЧасти.Цена = РаботаСоСправочниками.РозничнаяЦена(Объект.Дата, СтрокаТабличнойЧасти.Номенклатура);
	// Пересчитать сумму строки (на клиенте)
	РаботаСДокументами.РассчитатьСумму(СтрокаТабличнойЧасти);
КонецПроцедуры
Показать

Если мы запрещаем интерактивно редактировать цену, сняв галку, тогда нам надо в привилегированном режиме установить программно цену, взяв ее из регистра, например.
Но я не пойму как это правильно делать.
Пытался создать серверную процедуру, в которой включаю привилегированный режим (это серверный метод, не клиентский). В нее передавал строкуТЧ, но неправильно это делаю:
&наСервере
Процедура УстановитьЦенуПривилегированныйРежим(СтрокаТабличнойЧасти)
	УстановитьПривилегированныйРежим(истина);
	СтрокаТабличнойЧасти.Цена = РаботаСоСправочниками.РозничнаяЦена(
			Объект.Дата, СтрокаТабличнойЧасти.Номенклатура
		);
	УстановитьПривилегированныйРежим(ложь);
КонецПроцедуры

ошибку выдает.

как это по-людски делается?
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
3. japopov 68 16.08.17 15:01 Сейчас в теме
(1) Ограничения прав на изменение касаются на самом деле записи этих изменений.
Соответственно, в Вашем коде прив.режим ни к чему: меняется просто реквизит формы, но запись объекта ещё не происходит.
Вам нужно между УстановитьПривилегированныйРежим() обернуть именно запись объекта.
5. AlexeyPapanov 458 16.08.17 15:28 Сейчас в теме
(3) Вы не правы.
Я ошибку получаю именно при вызове обработчика события. Следовательно, я делаю вывод, что оборачивать в прив.режим нужно кусок кода, где устанавливается недоступный реквизит.

Т.е. как я делал: заменил строку
    СтрокаТабличнойЧасти.Цена = РаботаСоСправочниками.РозничнаяЦена(Объект.Дата, СтрокаТабличнойЧасти.Номенклатура);

на
УстановитьЦенуПривилегированныйРежим(СтрокаТабличнойЧасти);

в первом посте содержимое этой процедуры.

но так я получаю ошибку, связанную с типами данных. переменная СтрокаТабличнойЧасти имеет тип СтруктураЧегоТоТам... В общем с ней на клиенте надо работать как я понял. а прив.режим только на сервере устанавливается.

(4) ну понятно, что так проще сделать. но что-то меня зацепило. если авторитетный человек говорит, что надо так, значит надо посмотреть как можно правильно делать.
6. Alexey_ 26 16.08.17 15:33 Сейчас в теме
(5)
(3) прав, значение реквизита записывается в базу не в строке
СтрокаТабличнойЧасти.Цена = РаботаСоСправочниками.РозничнаяЦена(Объект.Дата, СтрокаТабличнойЧасти.Номенклатура);
, а при записи всего объекта
7. Dream_kz 129 16.08.17 15:34 Сейчас в теме
(5)
надо так, значит надо посмотреть как можно правильно делать.

По мне так, это свойство нужно для того, чтобы тот пользователь, у кого будут права, заполнил этот реквизит, а не мучиться разработчику с привилегированным режимом. Павел, конечно, человек уважаемый, но своей головой думать тоже надо)
ipoloskov; +1 Ответить
8. AlexeyPapanov 458 16.08.17 15:45 Сейчас в теме
(7) Я не соглашусь с Вами. Не просто же так дана возможность установки прав на отдельные реквизиты.
Мне хочется знать как это методологически правильнее. Мало ли, вдруг дойдет дело до сдачи на сертификаты)
Прикреплю картинки, чтобы понятнее было остальным о чем речь.

Т.е. задача сводится к тому, чтобы правильно написать серверную процедуру установки реквизита таб.части "Цена", обернув ее код привилегирированным режимом.
Прикрепленные файлы:
9. Alexey_ 26 16.08.17 15:48 Сейчас в теме
(8)не передавай ДанныеФормыЭлементКоллекции с клиента на сервер, ошибки не будет,
СтрокаТабличнойЧасти.Цена = РаботаСоСправочниками.РозничнаяЦена(Объект.Дата, СтрокаТабличнойЧасти.Номенклатура);
было правильным
12. AlexeyPapanov 458 16.08.17 16:11 Сейчас в теме
(9) ну я как бы понимаю это)
(10) текущие данные таблицы недоступны на сервере. ошибка будет.
какой-то геморр(
13. EVKash 14 16.08.17 16:25 Сейчас в теме
(12) ну да...
УстановитьЦенуНаСервере(Элементы.ПереченьНоменклатуры.ТекущаяСтрока);

&НаСервере
Процедура УстановитьЦенуНаСервере(ТекущаяСтрока)
    СтрокаТабличнойЧасти = Элементы.ПереченьНоменклатуры[ТекущаяСтрока];
    УстановитьПривилегированныйРежим(истина);
    СтрокаТабличнойЧасти.Цена = РаботаСоСправочниками.РозничнаяЦена(
            Объект.Дата, СтрокаТабличнойЧасти.Номенклатура
        );
    УстановитьПривилегированныйРежим(ложь);
КонецПроцедуры
Показать
15. Dream_kz 129 16.08.17 17:22 Сейчас в теме
(8)
Я не соглашусь с Вами. Не просто же так дана возможность установки прав на отдельные реквизиты.
Мне хочется знать как это методологически правильнее. Мало ли, вдруг дойдет дело до сдачи на сертификаты)

В 1С многое что можно, но где написано, что надо именно так? Нигде в типовых так не делают.
Идеологически привилегированный режим, где попало (особенно в формах), устанавливать нежелательно. Спеца по платформе сдал, там это не проверяется.
4. Dream_kz 129 16.08.17 15:02 Сейчас в теме
(1)
Самое тупое, что приходит в голову - программно установить доступность поля ТЧ в зависимости от какого-то параметра.

Да не тупое решение, нормальное. Не вижу причин его не использовать.
14. ipoloskov 162 16.08.17 16:47 Сейчас в теме
(1)
Самое тупое, что приходит в голову - программно установить доступность поля ТЧ в зависимости от какого-то параметра.

Имхо, это не только самое тупое, но и самое правильное. А все эти пляски с привилегированным режимом чреваты потенциальными дырами в безопасности.
2. Fox-trot 156 16.08.17 15:00 Сейчас в теме
так вроде ошибка в коде а не в алгоритме
10. EVKash 14 16.08.17 15:49 Сейчас в теме
А если так?
&НаСервере
Процедура УстановитьЦенуНаСервере()
    СтрокаТабличнойЧасти = Элементы.ПереченьНоменклатуры.ТекущиеДанные;
    УстановитьПривилегированныйРежим(истина);
    СтрокаТабличнойЧасти.Цена = РаботаСоСправочниками.РозничнаяЦена(
            Объект.Дата, СтрокаТабличнойЧасти.Номенклатура
        );
    УстановитьПривилегированныйРежим(ложь);
КонецПроцедуры
Показать
11. Alexey_ 26 16.08.17 16:03 Сейчас в теме
(10) в данном случае, установка привилегированного режима без записи объекта в БД бессмысленна
Оставьте свое сообщение
Вакансии
Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)

Программист 1С
Москва
зарплата от 250 000 руб.
Полный день

Программист 1C
Волгоград
зарплата от 200 000 руб.
Полный день

Аналитик
Санкт-Петербург
зарплата от 200 000 руб. до 250 000 руб.
Полный день