Имя: Пароль:
1C
 
УФ: Программно запретить создание нового документа
,
0 bvb
 
20.01.25
13:07
Нужно программно (невзирая на роли) по совокупности условий не давать создавать новый документ.

С выдачей сообщения (а лучше модального предупреждения пользователю)

Я чего-то не соображу как это лучше делать:
в обработчике заполнения или в ПриСозданииНаСервере() ?
1 maxab72
 
20.01.25
13:10
перед записью проверять.
2 Ёпрст
 
20.01.25
13:14
(0) модально?..а если обработкой будут создавать, ..то ой?)
3 Tarlich
 
20.01.25
13:16
(0) так можно и при открытии отказ сделать....
(2) при записи то же добавить
4 Fedor-1971
 
20.01.25
13:16
(0) Обработчик заполнения не имеет Отказа, а ПриСозданииНаСервере, таки, имеет, в нём и запрещай
5 Ёпрст
 
20.01.25
13:17
(4) там можно вызватьИсключение
6 Fedor-1971
 
20.01.25
13:17
(2) Походу, нужен запрет интерактивного создания документа
7 Fedor-1971
 
20.01.25
13:17
(5) Можно, но форма откроется
8 Ёпрст
 
20.01.25
13:20
(7) неа
9 Ёпрст
 
20.01.25
13:27
Не откроется.
Но это не всегда удобно.
Например, нужно ввести только 1 подчиненный док. Тогда в
ОбработкаЗаполнения проверяем это, если уже есть, передаем это в  ПриОткрытии, и там, Отказ = Истина; ОткрытьЗначение (то что нашли)

Довольно, частая задача.
10 Ёпрст
 
20.01.25
13:27
А чего именно нужно ТС, хз.
11 bvb
 
20.01.25
13:38
(10) Мне нужно работникам склада при совокупности определенных условий (пусть будет для простоты после 18.00) создавать заказы покупателей

Что это работники склад я идентифицирую по роли :

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

        
    КонецЕсли;
12 bvb
 
20.01.25
13:40
ПриСозданииНаСервереПосле в расширении :
Запрещено изменение параметра, отменяющего действие (параметр номер 1 в процедуре )
13 Ненавижу 1С
 
гуру
20.01.25
13:44
(11) что-то запрещать при наличии роли это антипаттерн
14 arsik
 
гуру
20.01.25
13:49
В АльфаАвто вот так сделано в обработке заполнения. Хз это из БСП или собственное
ТекстСообщения = НСтр("ru = 'Склад, указанный в документе основании, обычный. Ввод складского ордера невозможен.'");
УправлениеДиалогомСервер.ЗапретитьОткрытиеФормыОбъекта(ЭтотОбъект, ТекстСообщения);
Возврат;


Процедура ЗапретитьОткрытиеФормыОбъекта(ВходнойОбъект, ТекстСообщения) Экспорт
	
	ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, ВходнойОбъект, "ОтменитьОткрытие",, Истина);
	
КонецПроцедуры // ЗапретитьОткрытиеФормыОбъекта)


Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	Отказ = Отказ Или РаботаСФормой.НужноОтменитьОткрытиеФормы();
	Если Отказ Тогда
		Возврат;
	КонецЕсли;


Можно еще через ОбработкаПолученияФормы такое реализовать - подменить форму на свою заглушку при соблюдении условия.
15 bvb
 
20.01.25
14:16
(13)

Альтернатива : ?

Если СокрЛП(ПараметрыСеанса.Текущий.Пользователь.Наименование) = "Вася"  Тогда
16 Fedor-1971
 
20.01.25
14:04
(11) Параметры.Ключ.Пустая() - так-то однозначная проверка документа (справочника) на новый Объект.Ссылка.Пустая()
(13) Если роль используется как флаг (т.е. у неё нет прав на объекты конфигурации) - то по смыслу: либо запрещаем, либо разрешаем
17 Fedor-1971
 
20.01.25
14:06
(15) Альтернатива "Параметры пользователя", но про них забываешь в 90% случаев. Лезем в код и "О, ё.., это параметр пользователя, а не роль"
Минус - надо всем кладовщикам расставлять по одному, но есть и плюс - старшему можно разрешить действие
18 Prog_man
 
гуру
20.01.25
14:11
(0) ПриСозданииНаСервере() чем не подходит ?
вставить проверку что документ новый + условие на Роль, как вариант. можно и в расширении сделать.
19 Eiffil123
 
20.01.25
14:17
(14) в Бит.Финанс тоже через обработку заполнения и вызов исключения.
20 bvb
 
20.01.25
14:22
(17) Я не понял какие Вы предлагаете использовать "Параметры пользователя" ?
21 bvb
 
20.01.25
14:29
Странно думал задачка тривиальная и меня счас обосрут как профана, но оказалась мнения разделилсь

Короче остановился :

//Обязательно нужно использовать "Перед" , в "После"  Запрещено изменение параметра, отменяющего действие (параметр номер 1 в процедуре )

Процедура KMS_ПриСозданииНаСервереПеред(Отказ, СтандартнаяОбработка)
    
    Если РольДоступна("KMS_Склад")
                И ХитроеУсловие
        И  Параметры.Ключ.Пустая()  //это новый документ
        Тогда            
        
        Отказ = Истина;
        
        ТекстСообщения = "Выписывать заказы в данный момент работникам склада запрещено";
        
        ВызватьИсключение (ТекстСообщения);
22 arsik
 
гуру
20.01.25
14:39
(21) Используй лучше ИзменениеИКонтроль. обновлять потом намного проще будет
PS: Я правильно понимаю, что за ХитроеУсловие скрывается прям говнокод который стыдно на форуме показать? :)
23 bvb
 
20.01.25
15:14
(22) Зачем изменение и контроль Если можно перед ?

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