Здравствуйте. Подскажите почему такой код считается не правильным.
Код происходил в модуле документа РеализацияТоваровИУслуг.
Суть кода такая. В момент проведения на форме проверяются права на выбранный склад, если склад запрещен пользователю, тогда идет Отказ в проведении.
Мне сказали что нельзя вызывать так форму из модуля, но вот почему, я не знаю.
Может подскажет кто знающий с чем это связано? Может это систему будет подвешивать?
Код уже месяца 4 используется и особых изменений во времени при проведении не замечал.
Код происходил в модуле документа РеализацияТоваровИУслуг.
//??? 23.12.2016
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
п = ПользователиИнформационнойБазы.ТекущийПользователь();
Пользователь = Справочники.Пользователи.НайтиПоНаименованию(п.ПолноеИмя);
ЭтаФорма = ПолучитьФорму("ФормаДокумента");
ПроверкаСклада = ЯПроверкаПрав.ДоступКСкладам(Пользователь,ЭтаФорма, ЭтаФорма.Склад, Неопределено);
Отказ = ЯПроверкаПрав.Отказ(ПроверкаСклада);
//???
ПоказатьСуть кода такая. В момент проведения на форме проверяются права на выбранный склад, если склад запрещен пользователю, тогда идет Отказ в проведении.
Мне сказали что нельзя вызывать так форму из модуля, но вот почему, я не знаю.
Может подскажет кто знающий с чем это связано? Может это систему будет подвешивать?
Код уже месяца 4 используется и особых изменений во времени при проведении не замечал.
По теме из базы знаний
- Обработка обмена из Комплексной автоматизации 1.1 (2012г.) в Бухгалтерию 3.0 (для сотен организаций с плохими данными)
- Как поставить качество кода на поток и при этом не разориться? Какие шаги стоит сделать уже завтра, чтобы повысить планку качества?
- Почему PostgreSQL не лучше MS SQL
- Формула успешного внедрения DevOps и Agile в 1С: от неудачи к неудаче без потери энтузиазма
- Результаты ревью кода 1500+ решений каталога Инфостарт: наиболее частые ошибки разработчиков в коде
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
Это неправильно идеологически
1) Предполагается, что работа в модуле объекта производится уже без форм. Формы должны были выполнить все свои задачи ранее - на этапе интерактивного взаимодействия с пользователем. При исполнении на сервере формы в принципе не существуют. В толстом клиенте в это редко упираешься. Но если, например, ты захочешь выполнять запись/проведение своего документа из регламентного задания (соответственно, через серверный модуль), то напорешься на ошибку, т.к. формы в принципе на стороне сервера создавать нельзя. В тонком клиенте более четкое разграничение, поэтому такой код у тебя изначально не скомпилируется.
2) Создавать объект формы (достаточно тяжелый) только для того, чтобы выполнить простую проверку - это явный оверкилл. Если простая проверка работает только для формы (хотя, в принципе, универсальна) - это явная ошибка проектирования.
Мне сказали что нельзя вызывать так форму из модуля, но вот почему, я не знаю.
Это неправильно идеологически
1) Предполагается, что работа в модуле объекта производится уже без форм. Формы должны были выполнить все свои задачи ранее - на этапе интерактивного взаимодействия с пользователем. При исполнении на сервере формы в принципе не существуют. В толстом клиенте в это редко упираешься. Но если, например, ты захочешь выполнять запись/проведение своего документа из регламентного задания (соответственно, через серверный модуль), то напорешься на ошибку, т.к. формы в принципе на стороне сервера создавать нельзя. В тонком клиенте более четкое разграничение, поэтому такой код у тебя изначально не скомпилируется.
2) Создавать объект формы (достаточно тяжелый) только для того, чтобы выполнить простую проверку - это явный оверкилл. Если простая проверка работает только для формы (хотя, в принципе, универсальна) - это явная ошибка проектирования.
Потом что когда через несколько лет вашу базу решат перевести на SQL, то в данном месте выскочит синтаксическая ошибка.
Разберитесь, зачем в ЯПроверкаПрав.ДоступКСкладам() нужен параметр "Форма". Я подозреваю, что нафиг он там не нужен.
Разберитесь, зачем в ЯПроверкаПрав.ДоступКСкладам() нужен параметр "Форма". Я подозреваю, что нафиг он там не нужен.
(4) база на SQL вертится, ошибки не выскакивали.
----------------------------------------------------------------------------------------------------------------------------------
В ЯПроверкаПрав.ДоступКСкладам() идет проверка на тип документа(ориентируется на форму).
Сейчас только понял что можно было просто передать тип документа, а не форму, из которой потом я беру тип и делаю сравнение на тип документа.
--------------------------------------------------------------------------------------------------------------------
Если бы я передал просто значение типа документа заместо формы, тогда код намного ускорился, т.к. не будет сравнения типов документа, а будет простое сравнение строк.
----------------------------------------------------------------------------------------------------------------------------------
В ЯПроверкаПрав.ДоступКСкладам() идет проверка на тип документа(ориентируется на форму).
Функция ДоступКСкладам(Пользователь,Документ, СкладОтправитель, СкладПолучатель) Экспорт
Выборка = ДоступКСкладамЗапрос(Пользователь,ТипЗнч(Документ.Ссылка));
Если Выборка.Количество() = 0 Тогда
Возврат "";
КонецЕсли;
// РеализацияТоваровУслуг
Если ТипЗнч(Документ.Ссылка) =Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
ПоказатьСейчас только понял что можно было просто передать тип документа, а не форму, из которой потом я беру тип и делаю сравнение на тип документа.
--------------------------------------------------------------------------------------------------------------------
Если бы я передал просто значение типа документа заместо формы, тогда код намного ускорился, т.к. не будет сравнения типов документа, а будет простое сравнение строк.
п = ПользователиИнформационнойБазы.ТекущийПользователь();
Пользователь = Справочники.Пользователи.НайтиПоНаименованию(п.ПолноеИмя);
ПроверкаСклада = ЯПроверкаПрав.ДоступКСкладам(Пользователь,Строка(ТипЗнч(Ссылка)), Склад, Неопределено);
Отказ = ЯПроверкаПрав.Отказ(ПроверкаСклада);
Функция ДоступКСкладам(Пользователь,ТипДокумента, СкладОтправитель, СкладПолучатель) Экспорт
Выборка = ДоступКСкладамЗапрос(Пользователь,ТипДокумента);
Если Выборка.Количество() = 0 Тогда
Возврат "";
КонецЕсли;
// РеализацияТоваровУслуг
Если ТипДокумента ="ДокументСсылка.РеализацияТоваровУслуг" Тогда
Пока Выборка.Следующий() Цикл
Если СкладОтправитель = Выборка.СкладОтправитель Тогда
НаличиеС = 1;
КонецЕсли;
КонецЦикла;
Показать
(5)
Откуда взялось такое утверждение? Судя по коду, вторым параметром в функцию должно передаваться значение с типом ДокументОбъект или ДокументСсылка. Что из модуля документа получается без проблем - ЭтотОбъект (или ЭтотОбъект.Ссылка, но это лишнее).
В ЯПроверкаПрав.ДоступКСкладам() идет проверка на тип документа(ориентируется на форму).
Откуда взялось такое утверждение? Судя по коду, вторым параметром в функцию должно передаваться значение с типом ДокументОбъект или ДокументСсылка. Что из модуля документа получается без проблем - ЭтотОбъект (или ЭтотОбъект.Ссылка, но это лишнее).
(12) Я новичок в 1С, поэтому еще мало таких подробностей знаю. Спасибо за замечание.
(10), (11)
тут я получаю пользователя базы
А тут
уже нахожу его в справочнике Пользователи, т.к. у меня далее идет поиск по реквизиту регистра с типом "СправочникСсылка.Пользователи".
(13) Спасибо за разъяснение.
(10), (11)
тут я получаю пользователя базы
п = ПользователиИнформационнойБазы.ТекущийПользователь();
А тут
Пользователь = Справочники.Пользователи.НайтиПоНаименованию(п.ПолноеИмя);
уже нахожу его в справочнике Пользователи, т.к. у меня далее идет поиск по реквизиту регистра с типом "СправочникСсылка.Пользователи".
(13) Спасибо за разъяснение.
п = ПользователиИнформационнойБазы.ТекущийПользователь();
Пользователь = Справочники.Пользователи.НайтиПоНаименованию(п.ПолноеИмя);
Нафига этот бред, получить текущего пользователя, чтобы потом снова искать его в справочнике по имени ?
Вообще код из первого поста отвратительный, вы ведь работаете в какой-то типовой конфигурации, посмотрели бы как такие проверки делали разработчики.
(10)
Нет, вообще-то, этот метод возвращает тип ПользовательИнформационнойБазы
или
как элемент справочника "Пользователи"
Нет, вообще-то, этот метод возвращает тип ПользовательИнформационнойБазы
п = ПараметрыСеанса.ТекущийПользователь
или
ИдентификаторПользователяИБ = ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор;
п = Справочники.Пользователи.НайтиПоРеквизиту("ИдентификаторПользователяИБ", ИдентификаторПользователяИБ);
(8) я видел такой код как-то. Чел искал оТовар = Справочники.НоменклатураПоставщика.НайтиПоКоду(ТекОбъект.Код).ПолучитьОбъект();
ТекОбъект элемент того же справочника.
Все шло нормально пока в обмене другой прогер не начал переносить код справочника из другой базы 1 в 1 и в базе появились дубли по кодам. Кошмар конечно. Особенно если справочник пользователей ИБ за@ран и там есть другой пользователь с таким же именем пусть даже помеченным на удаление.
ТекОбъект элемент того же справочника.
Все шло нормально пока в обмене другой прогер не начал переносить код справочника из другой базы 1 в 1 и в базе появились дубли по кодам. Кошмар конечно. Особенно если справочник пользователей ИБ за@ран и там есть другой пользователь с таким же именем пусть даже помеченным на удаление.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот