Как запретить изменять документ пользователю по условию

1. user986816 13.07.22 10:51 Сейчас в теме
Не получается запретить пользователю изменять документ по условию, делаю так но результат дает записать документ, где я ошибаюсь ?
По теме из базы знаний
Найденные решения
10. user986816 27.07.22 16:00 Сейчас в теме
Почитал как советовали все, в итоге разобрался

Переменная1 = "Частный покупатель";
СтроковоеПредставление = Строка(Объект.Контрагент.ПолучитьОбъект());

ЕСЛИ Найти(Строка(ПользователиКлиентСервер.ТекущийПользователь()),"Администратор") и СтроковоеПредставление = Переменная1
тогда
Отказ = Истина;
Сообщить("НЕЗЯ");
КонецЕсли;
11. aezdakov 6 27.07.22 16:44 Сейчас в теме
(10)
СтроковоеПредставление = Строка(Объект.Контрагент.ПолучитьОбъект());

Вот это прям очень не очень. Хотя бы так делайте:
СтроковоеПредставление = Строка(Объект.Контрагент);

А потом поднатореете и дойдёте до функции БСП "ЗначениеРеквизитаОбъекта" в общем модуле "ОбщегоНазначения", и что глобальная функция "Найти" уже устарела, и что проверять надо не имя пользователя, а его права и так далее и так далее.
Функция строки от ссылки/объекта Вам в случае со справочником Контрагент в большинстве случаев вернёт значение реквизита "наименование" этого контрагента, отсюда получается, что вот эта проверка "СтроковоеПредставление = Переменная1" вам вернёт истину, если будет полное совпадение, а так как наименование контрагента доступна для редактирования пользователям с соответствующими правами, то проживет ваше решение именно до того момента, пока пользователи не влезут в наименование. Скорее всего, это может и никогда не случиться. В рамках Вашего решения лучше проверять пару ИНН и КПП, они уникальны у нас в стране, например так:
Объект.Контрагент.ИНН = ИНН и Объект.Контрагент.КПП = КПП, определив выше эту пару ИНН и КПП по коду, как у Вас сделано с "Переменная1 ".
А так прям по правильному, то контрагентов, по которым требуется срабатывание условия, нужно выводить в какой-нибудь регистр сведений, к примеру, и организовать возможность его редактировать ответственному (назначить права доступа на такой регистр), а в условии уже проверять вхождение контрагента в этот регистр. Так Вы дадите пользователям контроль над данной проверкой, которая сегодня нужна, а завтра нет или нужна ещё по одному контрагенту. С текущем же решением проблемы Вы создали работу для программиста, так как когда понадобится изменение условия (нужен ещё по одному контрагенту, например), то пользователям потребуется помощь программиста, без него не смогут ничего сделать.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. tvm 13.07.22 11:01 Сейчас в теме
(1) сравнение не верное
Объект.Контрагент тип ссылка
"Частный покупатель" тип строка
3. starjevschik 13.07.22 11:01 Сейчас в теме
наймите программиста. Автор кода не понимает разницу между ссылкой и строкой, то есть не знает самых азов, ему учиться и учиться. Дешевле нанять программиста программировать, эффективнее. Задача копеечная.
4. user986816 13.07.22 11:03 Сейчас в теме
(3)Ну это понятное дело проще нанять, ну как я тогда научусь
5. starjevschik 13.07.22 11:04 Сейчас в теме
(4) научиться несложно, курсы, преподаватель, все объяснит. Не сразу же работать.
6. user986816 13.07.22 11:05 Сейчас в теме
(5)Я и не работаю программистом.
7. DesertPunk 13.07.22 11:17 Сейчас в теме
(4) Как минимум, Радченко прочитай, а не лезь в "продакшн" без понимания как оно там работает
9. user986816 13.07.22 11:23 Сейчас в теме
(7)Хорошо, буду начинать изучать
8. ZergKRSK 130 13.07.22 11:21 Сейчас в теме
10. user986816 27.07.22 16:00 Сейчас в теме
Почитал как советовали все, в итоге разобрался

Переменная1 = "Частный покупатель";
СтроковоеПредставление = Строка(Объект.Контрагент.ПолучитьОбъект());

ЕСЛИ Найти(Строка(ПользователиКлиентСервер.ТекущийПользователь()),"Администратор") и СтроковоеПредставление = Переменная1
тогда
Отказ = Истина;
Сообщить("НЕЗЯ");
КонецЕсли;
11. aezdakov 6 27.07.22 16:44 Сейчас в теме
(10)
СтроковоеПредставление = Строка(Объект.Контрагент.ПолучитьОбъект());

Вот это прям очень не очень. Хотя бы так делайте:
СтроковоеПредставление = Строка(Объект.Контрагент);

А потом поднатореете и дойдёте до функции БСП "ЗначениеРеквизитаОбъекта" в общем модуле "ОбщегоНазначения", и что глобальная функция "Найти" уже устарела, и что проверять надо не имя пользователя, а его права и так далее и так далее.
Функция строки от ссылки/объекта Вам в случае со справочником Контрагент в большинстве случаев вернёт значение реквизита "наименование" этого контрагента, отсюда получается, что вот эта проверка "СтроковоеПредставление = Переменная1" вам вернёт истину, если будет полное совпадение, а так как наименование контрагента доступна для редактирования пользователям с соответствующими правами, то проживет ваше решение именно до того момента, пока пользователи не влезут в наименование. Скорее всего, это может и никогда не случиться. В рамках Вашего решения лучше проверять пару ИНН и КПП, они уникальны у нас в стране, например так:
Объект.Контрагент.ИНН = ИНН и Объект.Контрагент.КПП = КПП, определив выше эту пару ИНН и КПП по коду, как у Вас сделано с "Переменная1 ".
А так прям по правильному, то контрагентов, по которым требуется срабатывание условия, нужно выводить в какой-нибудь регистр сведений, к примеру, и организовать возможность его редактировать ответственному (назначить права доступа на такой регистр), а в условии уже проверять вхождение контрагента в этот регистр. Так Вы дадите пользователям контроль над данной проверкой, которая сегодня нужна, а завтра нет или нужна ещё по одному контрагенту. С текущем же решением проблемы Вы создали работу для программиста, так как когда понадобится изменение условия (нужен ещё по одному контрагенту, например), то пользователям потребуется помощь программиста, без него не смогут ничего сделать.
14. user986816 27.07.22 17:10 Сейчас в теме
(11)
СтроковоеПредставление = Строка(Объект.Контрагент);

Хорошо, спасибо за информацию. Только такой момент что на этом контрагенте не записан ИНН и КПП, поэтому и ищу наименование.
15. user986816 27.07.22 17:11 Сейчас в теме
(14) Уже понял, спасибо) (11) полностью расписал
16. aezdakov 6 27.07.22 17:20 Сейчас в теме
(14)в таком случае можно зацепиться за реквизит "код". Если он не виден в карточке контрагента или в списке контрагентов, то смотрите в сторону изменить форму, эта кнопка находится в меню "ещё", скорее всего там просто надо галку поставить напротив этого реквизита. Реквизит "код" в справочниках 1С является уникальным в обычных случаях для всего справочника. Редко когда этот реквизит делают не уникальным, т.е. могут быть несколько записей с одинаковым кодом, так же возникают случаи задвоения по коду при переносах из других 1С, но это уже тонкости.
Код ="000-001";
Если Объект.Контрагент.Код = Код Тогда
...
КонецЕсли;
18. lefthander 27.07.22 17:57 Сейчас в теме
(10)
Сообщить("НЕЗЯ");
Здесь ошибка - правильно "НИЗЗЯ"!!! :)
12. polax 27.07.22 16:46 Сейчас в теме
(10) Вот это
СтроковоеПредставление = Строка(Объект.Контрагент.ПолучитьОбъект());

Ни в какие ворота! Получать объект и его в строку? Это.... атас
Либо Строка(Объект.Контрагент), а лучше Объект.Контрагент.Наименование
17. aezdakov 6 27.07.22 17:27 Сейчас в теме
(12)
Либо Строка(Объект.Контрагент), а лучше Объект.Контрагент.Наименование

по этому поводу, что тут лучше можно ещё поспорить. Насколько я знаю, то строка от ссылки вызывает запрос представления этой ссылки и только его тащит, а вот обращение к наименованию через точку вызовет запрос ко всем элементам ссылки и возвращать будет с сервера данные по всей ссылке. Так что оптимальнее всё же строка(ссылка)
13. polax 27.07.22 16:46 Сейчас в теме
Пока писал. Более конкретно разъяснили
Оставьте свое сообщение

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