Почему код считается неправильным

1. kvaleksandr 22 11.05.17 07:17 Сейчас в теме
Здравствуйте. Подскажите почему такой код считается не правильным.

Код происходил в модуле документа РеализацияТоваровИУслуг.

//??? 23.12.2016
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

	п = ПользователиИнформационнойБазы.ТекущийПользователь();
    Пользователь =  Справочники.Пользователи.НайтиПоНаименованию(п.ПолноеИмя);
	ЭтаФорма = ПолучитьФорму("ФормаДокумента");
	ПроверкаСклада = ЯПроверкаПрав.ДоступКСкладам(Пользователь,ЭтаФорма, ЭтаФорма.Склад, Неопределено);
	Отказ = ЯПроверкаПрав.Отказ(ПроверкаСклада);

//???
Показать


Суть кода такая. В момент проведения на форме проверяются права на выбранный склад, если склад запрещен пользователю, тогда идет Отказ в проведении.

Мне сказали что нельзя вызывать так форму из модуля, но вот почему, я не знаю.

Может подскажет кто знающий с чем это связано? Может это систему будет подвешивать?

Код уже месяца 4 используется и особых изменений во времени при проведении не замечал.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
13. herfis 499 11.05.17 10:22 Сейчас в теме
(1)
Мне сказали что нельзя вызывать так форму из модуля, но вот почему, я не знаю.

Это неправильно идеологически
1) Предполагается, что работа в модуле объекта производится уже без форм. Формы должны были выполнить все свои задачи ранее - на этапе интерактивного взаимодействия с пользователем. При исполнении на сервере формы в принципе не существуют. В толстом клиенте в это редко упираешься. Но если, например, ты захочешь выполнять запись/проведение своего документа из регламентного задания (соответственно, через серверный модуль), то напорешься на ошибку, т.к. формы в принципе на стороне сервера создавать нельзя. В тонком клиенте более четкое разграничение, поэтому такой код у тебя изначально не скомпилируется.
2) Создавать объект формы (достаточно тяжелый) только для того, чтобы выполнить простую проверку - это явный оверкилл. Если простая проверка работает только для формы (хотя, в принципе, универсальна) - это явная ошибка проектирования.
2. BackinSoda 11.05.17 08:18 Сейчас в теме
Для чего в проверке прав нужно передавать форму ? Склад не является реквизитом ?
3. SyachinS 11.05.17 08:19 Сейчас в теме
ПолучитьФорму() это метод который исполняется на клиенте
Infector; +1 Ответить
4. ipoloskov 162 11.05.17 08:19 Сейчас в теме
Потом что когда через несколько лет вашу базу решат перевести на SQL, то в данном месте выскочит синтаксическая ошибка.
Разберитесь, зачем в ЯПроверкаПрав.ДоступКСкладам() нужен параметр "Форма". Я подозреваю, что нафиг он там не нужен.
5. kvaleksandr 22 11.05.17 08:50 Сейчас в теме
(4) база на SQL вертится, ошибки не выскакивали.

----------------------------------------------------------------------------------------------------------------------------------
В ЯПроверкаПрав.ДоступКСкладам() идет проверка на тип документа(ориентируется на форму).

Функция ДоступКСкладам(Пользователь,Документ, СкладОтправитель, СкладПолучатель) Экспорт	
	
	Выборка = ДоступКСкладамЗапрос(Пользователь,ТипЗнч(Документ.Ссылка));	
	Если Выборка.Количество() = 0 Тогда
		Возврат "";
	КонецЕсли;	

// РеализацияТоваровУслуг
	Если ТипЗнч(Документ.Ссылка) =Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда	
Показать


Сейчас только понял что можно было просто передать тип документа, а не форму, из которой потом я беру тип и делаю сравнение на тип документа.

--------------------------------------------------------------------------------------------------------------------

Если бы я передал просто значение типа документа заместо формы, тогда код намного ускорился, т.к. не будет сравнения типов документа, а будет простое сравнение строк.

	п = ПользователиИнформационнойБазы.ТекущийПользователь();
    Пользователь =  Справочники.Пользователи.НайтиПоНаименованию(п.ПолноеИмя);
	ПроверкаСклада = ЯПроверкаПрав.ДоступКСкладам(Пользователь,Строка(ТипЗнч(Ссылка)), Склад, Неопределено);
	Отказ = ЯПроверкаПрав.Отказ(ПроверкаСклада);



Функция ДоступКСкладам(Пользователь,ТипДокумента, СкладОтправитель, СкладПолучатель) Экспорт	
	
	Выборка = ДоступКСкладамЗапрос(Пользователь,ТипДокумента);	
	Если Выборка.Количество() = 0 Тогда
		Возврат "";
	КонецЕсли;	

// РеализацияТоваровУслуг
	Если ТипДокумента ="ДокументСсылка.РеализацияТоваровУслуг" Тогда					
			Пока Выборка.Следующий() Цикл
				Если СкладОтправитель = Выборка.СкладОтправитель Тогда
					НаличиеС = 1;
				КонецЕсли;						
			КонецЦикла;		
Показать
6. m-serg74 46 11.05.17 08:55 Сейчас в теме
(5)
тогда код намного ускорился, т.к. не будет сравнения типов документа, а будет простое сравнение строк


1. откуда такой вывод

2. Эта функция наверное еще из каких то мест вызывается, а Вы ее к одному подогнали
7. kvaleksandr 22 11.05.17 09:14 Сейчас в теме
(6)

1. )




2.) Она вызывается из 5 документов, в Функции ДоступКСкладам() идет сранение по типам документа и далее в зависимости от типа документа выполнение своего кода.
12. Release 11.05.17 09:56 Сейчас в теме
(5)
В ЯПроверкаПрав.ДоступКСкладам() идет проверка на тип документа(ориентируется на форму).

Откуда взялось такое утверждение? Судя по коду, вторым параметром в функцию должно передаваться значение с типом ДокументОбъект или ДокументСсылка. Что из модуля документа получается без проблем - ЭтотОбъект (или ЭтотОбъект.Ссылка, но это лишнее).
16. kvaleksandr 22 11.05.17 11:02 Сейчас в теме
(12) Я новичок в 1С, поэтому еще мало таких подробностей знаю. Спасибо за замечание.

(10), (11)

тут я получаю пользователя базы
п = ПользователиИнформационнойБазы.ТекущийПользователь();


А тут
Пользователь =  Справочники.Пользователи.НайтиПоНаименованию(п.ПолноеИмя);


уже нахожу его в справочнике Пользователи, т.к. у меня далее идет поиск по реквизиту регистра с типом "СправочникСсылка.Пользователи".

(13) Спасибо за разъяснение.
8. user633533_encantado 11 11.05.17 09:21 Сейчас в теме
  п = ПользователиИнформационнойБазы.ТекущийПользователь();
    Пользователь =  Справочники.Пользователи.НайтиПоНаименованию(п.ПолноеИмя);


Нафига этот бред, получить текущего пользователя, чтобы потом снова искать его в справочнике по имени ?

Вообще код из первого поста отвратительный, вы ведь работаете в какой-то типовой конфигурации, посмотрели бы как такие проверки делали разработчики.
ResetAtreides; roman77; Ганс; Осторожный; +4 Ответить
9. kvaleksandr 22 11.05.17 09:32 Сейчас в теме
(8) Код в интернете нашел как получить пользователя. Если у вас есть вариант получше, то не могли бы вы его показать? Других вариантов я пока не видел.
10. user633533_encantado 11 11.05.17 09:37 Сейчас в теме
(9)
п = ПользователиИнформационнойБазы.ТекущийПользователь();

Вы уже получили пользователя , как элемент справочника "Пользователи".
Зачем тогда "Пользователь = Справочники.Пользователи.НайтиПоНаименованию(п.ПолноеИмя);" идет потом ?
roman77; Ганс; +2 Ответить
14. SlavaKron 11.05.17 10:49 Сейчас в теме
(10)
как элемент справочника "Пользователи"

Нет, вообще-то, этот метод возвращает тип ПользовательИнформационнойБазы
п = ПараметрыСеанса.ТекущийПользователь

или
ИдентификаторПользователяИБ = ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор;
п = Справочники.Пользователи.НайтиПоРеквизиту("ИдентификаторПользователяИБ", ИдентификаторПользователяИБ);
15. user633533_encantado 11 11.05.17 11:01 Сейчас в теме
(14) Да, перепутал.

Вообще если это конфигурация с бсп, то нужно использовать "Пользователи.ТекущийПользователь()", функция вернет элемент справочника "пользователи".
17. kvaleksandr 22 11.05.17 11:07 Сейчас в теме
(15)
Пользователи.ТекущийПользователь()


Спасибо, это как раз то что нужно было.
11. Ганс 11.05.17 09:37 Сейчас в теме
(9)У вас п = Пользователь, другими словами строкой:
ПользователиИнформационнойБазы.ТекущийПользователь()

Вы уже получили пользователя, зачем вы повторно его ищете в справочнике!
19. m-serg74 46 11.05.17 12:47 Сейчас в теме
а вообще на 100% согласен с (8)

Вообще код из первого поста отвратительный
starik-2005; +1 Ответить
20. KazanKokos 10 11.05.17 14:17 Сейчас в теме
(8) я видел такой код как-то. Чел искал оТовар = Справочники.НоменклатураПоставщика.НайтиПоКоду(ТекОбъект.Код).ПолучитьОбъект();
ТекОбъект элемент того же справочника.
Все шло нормально пока в обмене другой прогер не начал переносить код справочника из другой базы 1 в 1 и в базе появились дубли по кодам. Кошмар конечно. Особенно если справочник пользователей ИБ за@ран и там есть другой пользователь с таким же именем пусть даже помеченным на удаление.
18. m-serg74 46 11.05.17 12:45 Сейчас в теме
что вы к этим пользователям привязались, ТС взял ради одного вызова похерил функцию которая вызывается не только оттуда откуда ему проще...

ИМХО это круче косяк
Оставьте свое сообщение

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