Как удалить документы программно без явной выдачи на это прав?

1. Aleksandr_prof 192 20.09.21 17:29 Сейчас в теме
Есть обработка для УТ 10.3. Одна из функций, удаление созданных документов. Команда работает под полными правами, но не работает под другими пользователями. УстановитьПривилегированныйРежим не помогло. В момент удаления пишет ошибку "Нарушение прав доступа!". Как можно сделать это программно? Вот код.
Процедура КоманднаяПанельУдалитьСозданныеДокументы(Кнопка)
	
	УстановитьПривилегированныйРежим(Истина);
	Запрос = Новый Запрос;
	Запрос.Текст = ПолучитьТекстЗапросаСозданныхДокументов();
	Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(ДатаАнализа) - 1);
	Запрос.УстановитьПараметр("КонецПериода", КонецДня(ДатаАнализа));
	Запрос.УстановитьПараметр("Комментарий", КомментарийДляСоздаваемыхДокументов);
	Выборка = Запрос.Выполнить().Выбрать();
	ТекстСообщения = "";
	Пока Выборка.Следующий() цикл
		Ссылка = Выборка.Ссылка;
		ТекстСообщения = ТекстСообщения + "Объект " + Ссылка + " не удалён";
		Ссылка.ПолучитьОбъект().Удалить();
		Если Ссылка.ПолучитьОбъект() = Неопределено тогда
			ТекстСообщения = СтрЗаменить(ТекстСообщения, "не удалён", "успешно удалён" + Символы.ПС);
			КоличествоУдаленных = ?(КоличествоУдаленных = неопределено, 1, КоличествоУдаленных + 1);
		КонецЕсли;
	КонецЦикла;
	Если КоличествоУдаленных <> неопределено тогда
		ТекстСообщения = ТекстСообщения + "Всего удалено: " + КоличествоУдаленных + " объектов";
	Иначе
		ТекстСообщения = "За указанную дату нет документов к удалению";
	КонецЕсли;
	Сообщить(ТекстСообщения);
	
	КоманднаяПанельЗаполнить("");
	
	УстановитьПривилегированныйРежим(Ложь);
		
КонецПроцедуры
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. nomad_irk 72 20.09.21 17:49 Сейчас в теме
(1)чтобы УстановитьПривилегированныйРежим помогло, установка режима должна быть строго на сервере.

Либо вызов своей функции/процедуры осуществляете через общий привилегированный модуль.
5. Aleksandr_prof 192 20.09.21 17:53 Сейчас в теме
(4) Процедура и так серверная, но находится в модуле обычной формы. Это как-то влияет?
6. nomad_irk 72 20.09.21 17:59 Сейчас в теме
(5)напрямую. В модуле формы - клиентский контекст, даже в модуле объекта будет, т.к. это обычное приложение.
2. SGordon1 20.09.21 17:35 Сейчас в теме
А точно в правах дело, в привелигированный модуль пробовали?
3. Aleksandr_prof 192 20.09.21 17:48 Сейчас в теме
(2) Нет, не пробовал. Дело в том, что это внешняя обработка. Поэтому добавлять модуль в конфигурацию ради того, чтобы связать с этой обработкой - пока сомнительно.
7. Dr.HiHi 3 20.09.21 18:27 Сейчас в теме
возможно где-то отключается привелигированный режим
попробуйте перенести перед выполнение запроса
УстановитьПривилегированныйРежим(Истина);
Выборка = Запрос.Выполнить().Выбрать();


эти строчки лишние
и так ясно что в любом случаи удалит
Если Ссылка.ПолучитьОбъект() = Неопределено тогда
            ТекстСообщения = СтрЗаменить(ТекстСообщения, "не удалён", "успешно удалён" + Символы.ПС);
            КоличествоУдаленных = ?(КоличествоУдаленных = неопределено, 1, КоличествоУдаленных + 1);
        КонецЕсли;

привелигированный режим автоматически выключиться в конце выполнения процедуры
УстановитьПривилегированныйРежим(Ложь);
8. Aleksandr_prof 192 20.09.21 18:39 Сейчас в теме
(7) За лишние строчки спасибо, убрал.
Пробовал и перед выполнением запроса написать УстановитьПривилегированныйРежим, и непосредственно перед удалением в цикле - не помогло.
9. Dr.HiHi 3 20.09.21 19:19 Сейчас в теме
(8) странно... пробовал в тестовой базе и все норм удаляет
удаляете проведенный или непроведенный документ??
попробуйте тот же модуль, но на другом виде документа (типа довереность, счет, чекккм, просто добавьте новый документ)
так же посмотрите в журнале что пишет... на что именно нету прав
10. Aleksandr_prof 192 20.09.21 19:23 Сейчас в теме
(9) Удаляю проведённый документ. В журнале пишет: "Документ. Реализация товаров и услуг, Право: Удаление".
При этом под полными правами удаляет нормально. Сдаётся мне, что УстановитьПривилегированныйРежим - не всемогущая штука.
11. Fox-trot 158 20.09.21 19:32 Сейчас в теме
(10) в отладке смотрел? режим не меняется в цикле?
12. Aleksandr_prof 192 20.09.21 19:36 Сейчас в теме
(11) ПривилегированныйРежим() - почему-то всегда ложь. И до, и после и в цикле. У пользователя снята галка "Защита от опасных действий". Нашёл в справке про метод "ПривилегированныйРежим()" - в клиент-серверном варианте всегда возвращает "Ложь".
13. Fox-trot 158 20.09.21 19:46 Сейчас в теме
(12) на клиенте всегда ложь - это нормально. видимо где-то в коде модуля документа режим сбрасывается, тогда придется в цикле устанавливать режим заново обернув в попытку
14. Dr.HiHi 3 20.09.21 20:50 Сейчас в теме
(10) попробуй удалить не проведенный документ... создай в конфигураторе новый документ без прав пользователя и попробуй удалить через обработку...
мне кажется что при удалении цепляет еще что-то, а там прав нету
15. user1437016 21.09.21 08:31 Сейчас в теме
В обработке безопасный режим в ложь надо ставить, чтобы УстановитьПривилегированныйРежим() сработал.
16. Aleksandr_prof 192 21.09.21 10:17 Сейчас в теме
(15) Перед тем как установить привилегированный режим, проверяю, что БезопасныйРежим() = Ложь. При этом после УстановитьПривилегированныйРежим() ничего не происходит (т. е. ПривилегированныйРежим() всё также = Ложь).
17. Aleksandr_prof 192 21.09.21 11:42 Сейчас в теме
Пришлось добавить экспортную процедуру удаления по ссылке в общий привилегированный модуль:
Процедура УдалитьОбъектБазыДанных(УдаляемыйОбъект) Экспорт
	
	УдаляемыйОбъект.ПолучитьОбъект().Удалить();
	
КонецПроцедуры

Как я понял, в форме обычного приложения в модуле формы обработки я всегда нахожусь в контексте клиента. А если явно написать директиву &НаСервере, то пишет, что процедура с таким именем не найдена. Возможно это связано с клиент-серверным вариантом работы.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот