Автоматическое снятие флажка "Показывать в списке выбора" при пометке на удаление".

1. serg138 14.09.15 12:55 Сейчас в теме
Добрый день! Только начинаю осваивать 1с. Для себя хочу сделать вот какую вещь. В УПП есть справочник "Пользователи". Там можно завести нового и задать ему пароль и т.д. Так вот я хочу сделать так, чтобы при пометке на удаление пользователя автоматом снималась галочка "Показывать в списке выбора". Открыл конфигурацию, нашел там справочник "Пользователи", там есть различные формы. По идее удаляется пользователь в форме списка. Так вот в модуль формы списка я добавил это:
&НаКлиенте
Процедура НаименованиеПриИзменении(Элемент)
//Тестовая процедура
ПУ = Элемент.ТекущиеДанные.ПометкаУдаления;
ЕСЛИ ПУ = Истина Тогда
ПоказыватьВСпискеВыбора = Ложь;
КонецЕсли;
КонецПроцедуры

Синтаксических ошибок не обнаружено, но ничего не работает в итоге.
Вообще в справочнике "Пользователи" нет реквизита "ПоказыватьВСпискеВыбора"(булево), но он размещен на форме "ФормаРедактированиеПользователяИБ" этого справочника.

Зато есть обработка "СписокПользователейИБ", где есть табличная часть "ТабличнаяЧастьПользователей", где собственно и имеются все реквизиты с свойствами пользователя (пароль, показывать в списке и т.д.)

Так вот я запутался куда мне запихивать эту процедуру, и вообще правильно ли она написана? Может кто даст подсказки для верного направления?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. sommid 14.09.15 13:13 Сейчас в теме
Вам бы еще на совсем простых примерах поразбираться.. даже не знаю что тут комментировать ).
1. событие пометки на удаление надо отлавливать в специально для этого предусмотренном обработчике ПередЗаписью() в модуле объекта вашего справочника.
2. В вашей задаче на самом деле используется 2 разных объекта: элемент справочника Пользователи, который вы редактируете, помечаете на удаление и т.д. и объект Пользователь информационной базы, соответствующий редактируемому элементу справочника Пользователи. Так вот свойство "Показывать в списке выбора" принадлежит именно второму объекту. Т.е. в модуле объекта в обработчике ПередЗаписью() либо ПриЗаписи() (в вашем случае, наверное, даже больше подходит ПриЗаписи()) нужно получить нужного пользователя информационной базы (смотрите как это происходит в форме элемента), в нем изменить интересующее свойство и записать его
И я вообще не понял почему вы привязались к событию изменения наименования.. вобщем читайте книжки и лучше разбирайте какие-нибудь простейшие примеры
3. serg138 14.09.15 13:39 Сейчас в теме
Спасибо, как я понял нужно продолжать осваивать материал и только потом вернуться к этому вопросу.
4. apiary 14.09.15 13:46 Сейчас в теме
(3) serg138, Так работает, только привязывать нужно к ПриИзменении
Процедура СписокПриИзменении(Элемент)
		ПУ = Элемент.ТекущиеДанные.Ссылка.ПометкаУдаления; 
		ЕСЛИ ПУ = Истина Тогда
		Пользователь = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Элемент.ТекущиеДанные.Ссылка.ИдентификаторПользователяИБ);
		Пользователь.ПоказыватьВСпискеВыбора = Ложь;
		Пользователь.Записать();
		КонецЕсли; 
КонецПроцедуры
5. sommid 14.09.15 14:06 Сейчас в теме
(4) можно и так, но имейте ввиду, что при пометке удаления из других форм, либо алгоритмов это действие не выполнится
6. serg138 14.09.15 15:12 Сейчас в теме
(4) apiary, Спасибо, действительно работает. Я хотел тоже выбрать "при изменении", но только сейчас увидел, что ошибся. Но самое главное, что все остальное у меня не правильно, а ваш листинг полностью рабочий. Попробую разобраться в нем.
Процедура СписокПриИзменении(Элемент)

Тут даем имя процедуре и присваиваем значение "Элемент". Если это значение убрать, то процедура не работает.

ПУ = Элемент.ТекущиеДанные.Ссылка.ПометкаУдаления;

Создаем переменную "ПУ" и присваиваем ей значение. То есть ПУ = значение колонки "ПометкаУдаления" в текущей, выделенной строке. "ПометкаУдаления" это стандартный реквизит справочника.

ЕСЛИ ПУ = Истина Тогда

Соответственно если при измении пометили элемент справочника на удаление, тогда производим действие описанное дальше.

Пользователь = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Элемент.ТекущиеДанные.Ссылка.ИдентификаторПользователяИБ);

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

Пользователь.ПоказыватьВСпискеВыбора = Ложь;

Снимаем флажок для этого пользователя.

Пользователь.Записать();

Записываем изменения.

Честно говоря до конца не понял строку "Пользователь = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору". Вроде как должно идти обращение к табличной части обработки "СписокПользователейИБ", ведь именно там содержится реквизит "ПоказыватьВСпискеВыбора", но имя "СписокПользователейИБ" нигде не упоминается.
7. Xershi 1555 14.09.15 15:21 Сейчас в теме
(6) serg138,
Пользователь = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Элемент.ТекущиеДанные.Ссылка.ИдентификаторПользователяИБ);

Тут делаем переменную "Пользователь". А чтобы в нее засунуть самого пользователя ИБ, а не элемент справочника "Пользователи" и применяется конструкция:
ПользователиИнформационнойБазы

Читая справку вы найдете метод:
НайтиПоУникальномуИдентификатору

Где нужно указать
УникальныйИдентификатор = Элемент.ТекущиеДанные.Ссылка.ИдентификаторПользователяИБ
8. serg138 14.09.15 17:07 Сейчас в теме
Возникла проблема.Листинг
Процедура СписокПриИзменении(Элемент)
        ПУ = Элемент.ТекущиеДанные.Ссылка.ПометкаУдаления; 
        ЕСЛИ ПУ = Истина Тогда
        Пользователь = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Элемент.ТекущиеДанные.Ссылка.ИдентификаторПользователяИБ);
        Пользователь.ПоказыватьВСпискеВыбора = Ложь;
        Пользователь.Записать();
        КонецЕсли; 
КонецПроцедуры


прекрасно работает на чистой базе, но когда его вставил в рабочую базу в тоже самое место, то ничего не работает.Просто полностью скопировал, но код не отрабатывает.
9. Xershi 1555 14.09.15 17:11 Сейчас в теме
(8) serg138, точку останова ставил?
10. serg138 14.09.15 17:25 Сейчас в теме
(9) Xershi,

нет, ничего такого не ставил, но уже все заработало. Причем какой раз замечаю такую странность. Если полностью скопировать листинг процедуры в другую конфигурацию, то код не работает, а если выбрать в свойствах "При изменении", нажать лупу и в модуль созданной процедуры добавить содержимое процедуры, то все работает прекрасно. Выходит, что процедуру лучше добавлять лупой , а копировать туда только содержимое.
11. Xershi 1555 15.09.15 09:00 Сейчас в теме
(10) serg138, так тут ты просто не подключил процедуру. Естественно ее нужно подключить, а потом можно заменить копированием.
12. serg138 15.09.15 09:38 Сейчас в теме
Спасибо, теперь все понял.
Оставьте свое сообщение

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