Запрет на перемещение элемента в другую группу
Всем доброго времени суток!
Наверняка я не один столкнулся с подобной ситуацией. Любой открывший справочник (контрагенты, номенклатура и т.д.) заметит,что кнопки "иерархический просмотр" и "перемещение элемента в другую группу" идентичный по цветовой гамме и расположены рядом друг с другом.
Менеджеры частенько сами того не желая перемещают элементы справочников в "другие" группы, создавая тем самым хаос..
Каким образом можно ограничить доступность (активность) этой кнопки только для менеджеров?..
Заранее всем спасибо!
Наверняка я не один столкнулся с подобной ситуацией. Любой открывший справочник (контрагенты, номенклатура и т.д.) заметит,что кнопки "иерархический просмотр" и "перемещение элемента в другую группу" идентичный по цветовой гамме и расположены рядом друг с другом.
Менеджеры частенько сами того не желая перемещают элементы справочников в "другие" группы, создавая тем самым хаос..
Каким образом можно ограничить доступность (активность) этой кнопки только для менеджеров?..
Заранее всем спасибо!
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) MyPuK_OLD, (3) fierylions,
Перед записью:
Если ИзмененРодитель() И РольДоступна("ЖопорукийМенеджер") Тогда
Отказ = Истина;
Сообщить("Руки прочь от родителя!")
КонецЕсли;
-----
Функция ИзмененРодитель()
Возврат (Родитель <> {ПолучитьТекущегоРодителяЗапросомИзБазы});
КонецФункции
-----
А ещё можно скрыть команду перемещения на форме списка.
Перед записью:
Если ИзмененРодитель() И РольДоступна("ЖопорукийМенеджер") Тогда
Отказ = Истина;
Сообщить("Руки прочь от родителя!")
КонецЕсли;
-----
Функция ИзмененРодитель()
Возврат (Родитель <> {ПолучитьТекущегоРодителяЗапросомИзБазы});
КонецФункции
-----
А ещё можно скрыть команду перемещения на форме списка.
Можно как вариант сделать булевную галку. Если разрешить перетаскивание в ложь (в константе например) тогда идет запрет изменения родителя у элемента справочника. Если же галка в истине то спокойно пользователь сможет перемещать элемент но уже сознательно! Проверку ставьте перед записью элемента.
(18) ZergKRSK, нечто подобное прокатит?
Процедура ПроверитьДоступ(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
Если ПользователиИнформационнойБазы.ТекущийПользователь().Роли.Содержит(Метаданные.Роли.МенеджерПоПродажам) Тогда
Отказ = Истина;
Сообщить("Нарушение прав доступа!");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьДоступ(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
Если ПользователиИнформационнойБазы.ТекущийПользователь().Роли.Содержит(Метаданные.Роли.МенеджерПоПродажам) Тогда
Отказ = Истина;
Сообщить("Нарушение прав доступа!");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
(25) ZergKRSK,
Процедура ПроверитьДоступ(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
Если (Источник.Родитель <> Источник.Ссылка.Родитель) И РольДоступна("ЖопорукийМенеджер") Тогда
Отказ = Истина;
Сообщить("Нарушение прав доступа!");
КонецЕсли;
КонецПроцедуры
так не катит...менеджеры при таком раскладе не могут создавать номенклатуру. "РежимЗаписи, РежимПроведения" это может убрать?..
Процедура ПроверитьДоступ(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
Если (Источник.Родитель <> Источник.Ссылка.Родитель) И РольДоступна("ЖопорукийМенеджер") Тогда
Отказ = Истина;
Сообщить("Нарушение прав доступа!");
КонецЕсли;
КонецПроцедуры
так не катит...менеджеры при таком раскладе не могут создавать номенклатуру. "РежимЗаписи, РежимПроведения" это может убрать?..
А что за конфа? Режим: управляенмое или обычное приложение?
В принципе можно в свойствах командной панели (конфигуратор) убрать флаг автозаполнения и добавить кнопки ручками.
Если конфа стандартная то возможно автозаполнение уже отключено, передвинь кнопку в другое место.
А в управл.прилож. (1С Предприятие) еще проще, в настройках формы.
В принципе можно в свойствах командной панели (конфигуратор) убрать флаг автозаполнения и добавить кнопки ручками.
Если конфа стандартная то возможно автозаполнение уже отключено, передвинь кнопку в другое место.
А в управл.прилож. (1С Предприятие) еще проще, в настройках формы.
панель-ку че-то не хочу верстать
Не обязательно в ручную кнопку убирать. Если она добавлена не автозаполнением, то в модуле формы можно вставить обработчик типа:
ЭлементыФормы.Панель.Кнопка.Видимость = Не РольДоступна("ЖопорукийМенеджер");
Одна строка в модуле не вызовет проблем при обновлении, главное, обрамить её комментариями.
меня смущает "Перед записью", а если менеджер выбирает объект в документе, и случайно вместо иерархического просмотра нажимает на перемещение?..прокатит ли Ваш вариант с добавлением в модуль объекта?
Конечно! Чтобы сменить родителя, нужно перезаписать объект. Не важно, из какого места и какой кнопкой это будет выполняться
Если речь идет о типовой конфигурации, которая обновляется, то однозначно это надо решать через подписку на события. В таком случае никаких изменений в модуле объекта или формы, связанных с записью. В данном случае это дурной тон программирования. Такие изменения делаются только в случае, если это невозможно обойти с помощью подписок.
Да что ж вы как боитесь то этих обновлений!?)))
Если грамотно внедрять свой код, то никаких проблем не возникнет. Ну да, при обновлении придётся залезть в модуль, - но это дело двух секунд. Зато всё в одном месте и не надо чесать репу типа "да где же происходит изменение этого реквизита при записи!? я уже весь модуль облазил!"
ладно, тема не об этом.
Если грамотно внедрять свой код, то никаких проблем не возникнет. Ну да, при обновлении придётся залезть в модуль, - но это дело двух секунд. Зато всё в одном месте и не надо чесать репу типа "да где же происходит изменение этого реквизита при записи!? я уже весь модуль облазил!"
ладно, тема не об этом.
(24) doom2good,
Например это УПП.
Туча справочников и в каждом надо будет потом это сделать.
Как будете реализовывать?
В каждом справочнике код менять?
А при обновлении увидите десятки справочников, которые отличаются.
В случае с подпиской при обновлении вы абсолютно не увидите, что конфигурации отличаются.
Например это УПП.
Туча справочников и в каждом надо будет потом это сделать.
Как будете реализовывать?
В каждом справочнике код менять?
А при обновлении увидите десятки справочников, которые отличаются.
В случае с подпиской при обновлении вы абсолютно не увидите, что конфигурации отличаются.
Ладно-ладно!.. Убедили)) Подписки хорошо, когда нужно добавить какую-нить ерунду, типа этого контроля смены родителя. Но когда идут глобальные изменения - там проще всё делать в модулях.
Тем более, всё равно, конфигурацию придётся снять с поддержки. И если изменения объекта в обновлении пересекутся с измененным объектом в доработанной базе (что маловероятно), то ещё меньше вероятность, что изменения будут находиться в одном методе.
Тем более, всё равно, конфигурацию придётся снять с поддержки. И если изменения объекта в обновлении пересекутся с измененным объектом в доработанной базе (что маловероятно), то ещё меньше вероятность, что изменения будут находиться в одном методе.
Если эти глобальные изменения делаются в модулях объектов, которые потом надо обновлять, и эти изменения можно делать в подписках, то надо бить по рукам таких программеров. Потом сидишь и переписываешь все за ними, дабы не тратить много времени на анализ каждый раз при обновлении.
Это даже не обсуждается: если нет веских запретов на подписку, то при изменении обновляемых конфигураций надо все делать в подписке!
Это даже не обсуждается: если нет веских запретов на подписку, то при изменении обновляемых конфигураций надо все делать в подписке!
(30) Sabfir, вот тут я опять поспорю:
Если я ковыряю какой-нить документ, где куча различных изменений, не все из которых можно перенести в подписки, то мне проще разместить всё в модуле объекта, чем раскидывать всё это по подпискам. В случае когда мне нужно, например, изменить обработчик перед записью, я пишу свою процедуру "<префикс>ПередЗаписью()", ставлю её вызов в конце типовой и набиваю всем чем нужно. И при сравнении, когда я вижу "<префикс>ИмяМетода", я даже не заглядываю в него.
щё раз повторюсь: моя позиция относительно подписок касается только глобальных изменений объектов! Я не говорю про простые случаи, когда, например, перед записью документа нужно изменить ответственного на "васю пупкина" - тут понятно, подписка выигрывает.
Если я ковыряю какой-нить документ, где куча различных изменений, не все из которых можно перенести в подписки, то мне проще разместить всё в модуле объекта, чем раскидывать всё это по подпискам. В случае когда мне нужно, например, изменить обработчик перед записью, я пишу свою процедуру "<префикс>ПередЗаписью()", ставлю её вызов в конце типовой и набиваю всем чем нужно. И при сравнении, когда я вижу "<префикс>ИмяМетода", я даже не заглядываю в него.
щё раз повторюсь: моя позиция относительно подписок касается только глобальных изменений объектов! Я не говорю про простые случаи, когда, например, перед записью документа нужно изменить ответственного на "васю пупкина" - тут понятно, подписка выигрывает.
Если Не Источник.ЭтоНовый() И (Источник.Родитель <> Источник.Ссылка.Родитель) И РольДоступна("ЖопорукийМенеджер") Тогда
Отказ = Истина;
Сообщить("Запрещено изменять родителя иерархического справочника!");
КонецЕсли;
В форме списка справочника на поле номенклатура жамкаешь
И
Вполне возможно, что достаточно последней только процедуры, но залочил наверняка)
Процедура СписокНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, Выполнение)
// Вставить содержимое обработчика.
Если РольДоступна("Менеджер") Тогда
Выполнение = Ложь;
КонецЕсли;
КонецПроцедуры
И
Процедура СписокПередИзменениемРодителя(Элемент, Отказ)
// Вставить содержимое обработчика.
Если РольДоступна("Менеджер") Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Вполне возможно, что достаточно последней только процедуры, но залочил наверняка)
А я при создании формы на сервере делаю кнопки недоступными:
Элементы.Список.РазрешитьПеретаскивание = Не РольДоступна("РОЛЬ");
Если Элементы.СписокКонтекстноеМеню.ПодчиненныеЭлементы.Найти("СписокКонтекстноеМенюПеренестиЭлемент") <> Неопределено Тогда
Элементы.СписокКонтекстноеМеню.ПодчиненныеЭлементы.СписокКонтекстноеМенюПеренестиЭлемент.Доступность = Не РольДоступна("РОЛЬ");
КонецЕсли;
Элементы.Список.РазрешитьПеретаскивание = Не РольДоступна("РОЛЬ");
Если Элементы.СписокКонтекстноеМеню.ПодчиненныеЭлементы.Найти("СписокКонтекстноеМенюПеренестиЭлемент") <> Неопределено Тогда
Элементы.СписокКонтекстноеМеню.ПодчиненныеЭлементы.СписокКонтекстноеМенюПеренестиЭлемент.Доступность = Не РольДоступна("РОЛЬ");
КонецЕсли;
А я, не боясь обновлений (ибо мне не надо) Добавил "заглушку" в процедуры перетаскивания на форме. Именно они обычный источник всех ошибок в номенклатуре.
Т.е. осознанно поменять по прежнему можно, но случайно мисскликнув мышкой - уже нельзя.
Процедура СправочникСписокНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, Выполнение)
Выполнение=Ложь;
Возврат;
КонецПроцедуры
Т.е. осознанно поменять по прежнему можно, но случайно мисскликнув мышкой - уже нельзя.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот