Запись реквизита при отсутствии прав на запись. Использование привилегированного режима.
Предположим, стоит задача - ограничить определенному пользователю доступ к записи реквизита "цена" табличной части произвольного документа.
Самое тупое, что приходит в голову - программно установить доступность поля ТЧ в зависимости от какого-то параметра.
Но в комментариях к одной записи вебинара П.Чистова он сам ответил человеку, что это решается путем снятия галки "Запись" у соответствующего реквизита нужного документа в роли пользователя.
Я сделал так на учебной базе.
В модуле формы документа есть обработчик события
Если мы запрещаем интерактивно редактировать цену, сняв галку, тогда нам надо в привилегированном режиме установить программно цену, взяв ее из регистра, например.
Но я не пойму как это правильно делать.
Пытался создать серверную процедуру, в которой включаю привилегированный режим (это серверный метод, не клиентский). В нее передавал строкуТЧ, но неправильно это делаю:
ошибку выдает.
как это по-людски делается?
Самое тупое, что приходит в голову - программно установить доступность поля ТЧ в зависимости от какого-то параметра.
Но в комментариях к одной записи вебинара П.Чистова он сам ответил человеку, что это решается путем снятия галки "Запись" у соответствующего реквизита нужного документа в роли пользователя.
Я сделал так на учебной базе.
В модуле формы документа есть обработчик события
&НаКлиенте
Процедура ПереченьНоменклатурыНоменклатураПриИзменении(Элемент)
// Получить текущую строку табличной части
СтрокаТабличнойЧасти = Элементы.ПереченьНоменклатуры.ТекущиеДанные;
// Установить цену (на сервере)
СтрокаТабличнойЧасти.Цена = РаботаСоСправочниками.РозничнаяЦена(Объект.Дата, СтрокаТабличнойЧасти.Номенклатура);
// Пересчитать сумму строки (на клиенте)
РаботаСДокументами.РассчитатьСумму(СтрокаТабличнойЧасти);
КонецПроцедуры
ПоказатьЕсли мы запрещаем интерактивно редактировать цену, сняв галку, тогда нам надо в привилегированном режиме установить программно цену, взяв ее из регистра, например.
Но я не пойму как это правильно делать.
Пытался создать серверную процедуру, в которой включаю привилегированный режим (это серверный метод, не клиентский). В нее передавал строкуТЧ, но неправильно это делаю:
&наСервере
Процедура УстановитьЦенуПривилегированныйРежим(СтрокаТабличнойЧасти)
УстановитьПривилегированныйРежим(истина);
СтрокаТабличнойЧасти.Цена = РаботаСоСправочниками.РозничнаяЦена(
Объект.Дата, СтрокаТабличнойЧасти.Номенклатура
);
УстановитьПривилегированныйРежим(ложь);
КонецПроцедуры
ошибку выдает.
как это по-людски делается?
Ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
(1) Ограничения прав на изменение касаются на самом деле записи этих изменений.
Соответственно, в Вашем коде прив.режим ни к чему: меняется просто реквизит формы, но запись объекта ещё не происходит.
Вам нужно между УстановитьПривилегированныйРежим() обернуть именно запись объекта.
Соответственно, в Вашем коде прив.режим ни к чему: меняется просто реквизит формы, но запись объекта ещё не происходит.
Вам нужно между УстановитьПривилегированныйРежим() обернуть именно запись объекта.
(3) Вы не правы.
Я ошибку получаю именно при вызове обработчика события. Следовательно, я делаю вывод, что оборачивать в прив.режим нужно кусок кода, где устанавливается недоступный реквизит.
Т.е. как я делал: заменил строку
на
в первом посте содержимое этой процедуры.
но так я получаю ошибку, связанную с типами данных. переменная СтрокаТабличнойЧасти имеет тип СтруктураЧегоТоТам... В общем с ней на клиенте надо работать как я понял. а прив.режим только на сервере устанавливается.
(4) ну понятно, что так проще сделать. но что-то меня зацепило. если авторитетный человек говорит, что надо так, значит надо посмотреть как можно правильно делать.
Я ошибку получаю именно при вызове обработчика события. Следовательно, я делаю вывод, что оборачивать в прив.режим нужно кусок кода, где устанавливается недоступный реквизит.
Т.е. как я делал: заменил строку
СтрокаТабличнойЧасти.Цена = РаботаСоСправочниками.РозничнаяЦена(Объект.Дата, СтрокаТабличнойЧасти.Номенклатура);
на
УстановитьЦенуПривилегированныйРежим(СтрокаТабличнойЧасти);
в первом посте содержимое этой процедуры.
но так я получаю ошибку, связанную с типами данных. переменная СтрокаТабличнойЧасти имеет тип СтруктураЧегоТоТам... В общем с ней на клиенте надо работать как я понял. а прив.режим только на сервере устанавливается.
(4) ну понятно, что так проще сделать. но что-то меня зацепило. если авторитетный человек говорит, что надо так, значит надо посмотреть как можно правильно делать.
(5)
По мне так, это свойство нужно для того, чтобы тот пользователь, у кого будут права, заполнил этот реквизит, а не мучиться разработчику с привилегированным режимом. Павел, конечно, человек уважаемый, но своей головой думать тоже надо)
надо так, значит надо посмотреть как можно правильно делать.
По мне так, это свойство нужно для того, чтобы тот пользователь, у кого будут права, заполнил этот реквизит, а не мучиться разработчику с привилегированным режимом. Павел, конечно, человек уважаемый, но своей головой думать тоже надо)
(7) Я не соглашусь с Вами. Не просто же так дана возможность установки прав на отдельные реквизиты.
Мне хочется знать как это методологически правильнее. Мало ли, вдруг дойдет дело до сдачи на сертификаты)
Прикреплю картинки, чтобы понятнее было остальным о чем речь.
Т.е. задача сводится к тому, чтобы правильно написать серверную процедуру установки реквизита таб.части "Цена", обернув ее код привилегирированным режимом.
Мне хочется знать как это методологически правильнее. Мало ли, вдруг дойдет дело до сдачи на сертификаты)
Прикреплю картинки, чтобы понятнее было остальным о чем речь.
Т.е. задача сводится к тому, чтобы правильно написать серверную процедуру установки реквизита таб.части "Цена", обернув ее код привилегирированным режимом.
Прикрепленные файлы:
(12) ну да...
УстановитьЦенуНаСервере(Элементы.ПереченьНоменклатуры.ТекущаяСтрока);
&НаСервере
Процедура УстановитьЦенуНаСервере(ТекущаяСтрока)
СтрокаТабличнойЧасти = Элементы.ПереченьНоменклатуры[ТекущаяСтрока];
УстановитьПривилегированныйРежим(истина);
СтрокаТабличнойЧасти.Цена = РаботаСоСправочниками.РозничнаяЦена(
Объект.Дата, СтрокаТабличнойЧасти.Номенклатура
);
УстановитьПривилегированныйРежим(ложь);
КонецПроцедуры
Показать
(8)
В 1С многое что можно, но где написано, что надо именно так? Нигде в типовых так не делают.
Идеологически привилегированный режим, где попало (особенно в формах), устанавливать нежелательно. Спеца по платформе сдал, там это не проверяется.
Я не соглашусь с Вами. Не просто же так дана возможность установки прав на отдельные реквизиты.
Мне хочется знать как это методологически правильнее. Мало ли, вдруг дойдет дело до сдачи на сертификаты)
Мне хочется знать как это методологически правильнее. Мало ли, вдруг дойдет дело до сдачи на сертификаты)
В 1С многое что можно, но где написано, что надо именно так? Нигде в типовых так не делают.
Идеологически привилегированный режим, где попало (особенно в формах), устанавливать нежелательно. Спеца по платформе сдал, там это не проверяется.
(1)
Имхо, это не только самое тупое, но и самое правильное. А все эти пляски с привилегированным режимом чреваты потенциальными дырами в безопасности.
Самое тупое, что приходит в голову - программно установить доступность поля ТЧ в зависимости от какого-то параметра.
Имхо, это не только самое тупое, но и самое правильное. А все эти пляски с привилегированным режимом чреваты потенциальными дырами в безопасности.
А если так?
&НаСервере
Процедура УстановитьЦенуНаСервере()
СтрокаТабличнойЧасти = Элементы.ПереченьНоменклатуры.ТекущиеДанные;
УстановитьПривилегированныйРежим(истина);
СтрокаТабличнойЧасти.Цена = РаботаСоСправочниками.РозничнаяЦена(
Объект.Дата, СтрокаТабличнойЧасти.Номенклатура
);
УстановитьПривилегированныйРежим(ложь);
КонецПроцедуры
Показать
Вакансии
Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)