Имя: Пароль:
1C
 
Как обойти РольДоступна() при програмной записи РС?
0 1сПупс
 
24.09.26
07:19
Коллеги, доброго утра.

В внешней обработке (подключена как БСП) делаю записи в РегСвед.
	Запрос = Новый Запрос;
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
		
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		
		НоваяЗаписьРС = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
		НоваяЗаписьРС.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
		НовыйШтрихкод = РегистрыСведений.ШтрихкодыНоменклатуры.СформироватьШтрихкодEAN13();
		НоваяЗаписьРС.Штрихкод = НовыйШтрихкод;
		НоваяЗаписьРС.Записать();

	КонецЦикла

Данную обработку будет использовать персонал.

В Модуле набора записей данного регистра_ Заказчик в расширении жестко обрезал запись РегСвед если роль не ПолныеПрава. "Мол, специально отрубили чтобы не создавали":
&Перед("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, Замещение)
	
	Если не РольДоступна("ПолныеПрава") Тогда
		Отказ = Истина;
	КонецЕсли;	
	
КонецПроцедуры


Можно ли сделать так, что если я вызываю запись из конкретной обработки контроль прав не выполнялся?
1 arsik
 
гуру
24.09.26
07:25
Передавать флаг через ДополнительныеСвойства набора записей
2 1сПупс
 
24.09.26
07:35
(1) думал об этом, но как его заполнить на стороне внешней обработки?
3 arsik
 
гуру
24.09.26
07:41
(2) Через какой объект ты записываешь во внешней обработке? Или там у тебя не программная запись?
4 1сПупс
 
24.09.26
07:47
Переписал так расширение, но тут получается что при любой программной записи не будет контроля на права. А нужно только из моей обработки:

&Перед("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, Замещение)
	
	Если Не ДополнительныеСвойства.Свойство("ИнтерактивнаяЗапись") Тогда
		Возврат;
	КонецЕсли;
	
	Если не РольДоступна("ПолныеПрава") Тогда
		Отказ = Истина;
	КонецЕсли;	
	
	
КонецПроцедуры

&После("ОбработкаПроверкиЗаполнения")
Процедура Расш1_ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
	
	ДополнительныеСвойства.Вставить("ИнтерактивнаяЗапись");
	
КонецПроцедуры

5 Мультук
 
гуру
24.09.26
07:46
(2)

1)

google:
1с регистрсведений наборзаписей ДополнительныеСвойства

Ответ:
НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Период.Установить(ТекущаяДата());

// Заполняем набор записей...

// Передаем произвольный параметр через ДополнительныеСвойства
НаборЗаписей.ДополнительныеСвойства.Вставить("ИгнорироватьПроверку", Истина);

НаборЗаписей.Записать();



Там же пример кода для
Процедура Расш1_ПередЗаписью(Отказ, Замещение)



2) Это для СоздатьНаборЗаписей, а  можно так сделать для СоздатьМенеджерЗаписи ?
Нет, нельзя.
6 arsik
 
гуру
24.09.26
07:45
(4) 🤦
7 1сПупс
 
24.09.26
07:46
(3) юзер нажимает кнопку, формируются записи, серверный код привел в первом посте.
8 arsik
 
гуру
24.09.26
07:47
(7) 🤦🤦
9 1сПупс
 
24.09.26
07:52
(5) Благодарю! походу придется создавать записи через НаборЗаписей, а не  МенеджерЗаписи...
10 Lama12
 
24.09.26
07:52
А все боятся что ИИ заменит программистов. Ну, ну...
11 Garykom
 
гуру
24.09.26
07:55
Переписать расширение с добавлением специальной роли на этот РС кроме ПолныеПрава
Пользователям выдавать эту роль
12 Мультук
 
гуру
24.09.26
08:03
(11)

Тогда будет еще 20 страниц обсуждения,
чтобы такие пользователи могли программно менять регистр,
а интерактивно - нет
13 ZloyBrawler
 
24.09.26
08:19
(12) это классика)) Давайте наделаем искусственных ограничений, а потом героически будем их обходить. У нас таким же способом ТЗ пишутся...
14 1сПупс
 
24.09.26
08:25
(11) хотели так сделать, но пользователей много... решили искать способ обхода программный.
15 Kigo_Kigo
 
24.09.26
08:58
ОбненДанными.Загрузка = Истина, не?
Если.ОбменДанными.Загрузка = Истина тогда
Возврат;

не знаю, но дожно сработать для НаборЗаписей.ОбненДанными.Загрузка = Истина
16 1сПупс
 
24.09.26
09:17
может кому пригодится:

Обработка:
	Запрос = Новый Запрос;
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
		
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		
		НаборЗаписей = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей();
		НаборЗаписей.ДополнительныеСвойства.Вставить("НеПроводитьПроверкуНаПрава");
		НоваяЗаписьНабора = НаборЗаписей.Добавить();
		НоваяЗаписьНабора.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
		НовыйШтрихкод = РегистрыСведений.ШтрихкодыНоменклатуры.СформироватьШтрихкодEAN13();
		НоваяЗаписьНабора.Штрихкод = НовыйШтрихкод;
		НоваяЗаписьНабора.УТР_Серия = ВыборкаДетальныеЗаписи.Серия; 
		
		Попытка
			НаборЗаписей.Записать(Ложь);
		Исключение
			Сообщить("Ошибка при записи набора: " + ОписаниеОшибки());
		КонецПопытки;

	КонецЦикла


Расширение:
&Перед("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, Замещение)
	
	Если ДополнительныеСвойства.Свойство("НеПроводитьПроверкуНаПрава") Тогда
		Возврат;
	КонецЕсли;

	Если не РольДоступна("ПолныеПрава") Тогда
		Отказ = Истина;
	КонецЕсли;	
	
КонецПроцедуры


пришлось писать набор в цикле, там новый номер штрихкода ищется среди уже имеющихся в базе. Отдельное спасибо Мультук
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn