Как уменьшить количество заблокированных объектов
История о том как я решил пересобрать форму справочника клиентов и чем это все закончилось…
- Описание
- Подробнее
Описание
После удачного упорядочения формы я решил добавить новые возможности или нечто подобное. Долго думать не пришлось, и идея родилась моментально.
Думаю многие из вас сталкивались с проблемой, когда элемент справочника заблокирован. В сети полно различных разработок, которые позволяют видеть, кто и когда заблокировал объект. Я решил пойти немного в другом направлении. В 90% случаев объект открывается только для того что бы уточнить какие то реквизиты. Но каждые такие открытия блокируют объект и как часто бывает человек заблокировавший объект не очень, то и торопится его освободить.
Что можно сделать ? Первая мысль была изменить пользователям параметр «Режим открытия объектов» с «Редактирование» на «Просмотр». Но тут, же появилась вторая мысль, а что делать, если нужно все-таки редактировать объект, а не смотреть на него. Не очень удобно.
Вот так и родилась моя идея. (Надеюсь, новый велосипед не изобрел :))
Суть состоит в том, что бы по умолчанию открывать объект на просмотр, а при необходимости нажать на соответствующую кнопку на форме для редактирования. При сохранении объекта сбрасывается режим редактирования, объект становится открытым только для чтения.
В итоге получилось: две переменки и три процедуры. Смотрим ниже. Алгоритм работает как для справочников, так и для документов.
Глобальный модуль:
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Перем гОбъект, гРежимОбъекта Экспорт;
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Процедура ОткрытьОбъект()
ОбъектОткрыто = 0;
ТипОбъекта = ТипЗначенияСтр(гОбъект);
Если ТипОбъекта = «Справочник» Тогда
ОбъектОткрыто = ОткрытьФорму(гОбъект.ТекущийЭлемент(),,гРежимОбъекта);
ИначеЕсли ТипОбъекта = «Документ» Тогда
ОбъектОткрыто = ОткрытьФорму(гОбъект.ТекущийДокумент(),,гРежимОбъекта);
КонецЕсли;
Если ОбъектОткрыто = 1 Тогда
гОбъект = 0;
ОбработкаОжидания(«ОткрытьОбъект», 0);
КонецЕсли;
КонецПроцедуры
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Процедура РедактироватьОбъект(Кт) Экспорт
гОбъект = 0;
гРежимОбъекта = 0;
ТипОбъекта = «»;
ВидОбъекта = Кт.Вид();
Попытка
Объект = Кт.ТекущийЭлемент();
ТипОбъекта = «Справочник»;
Исключение
Объект = 0;
КонецПопытки;
Если Объект = 0 Тогда
Попытка
Объект = Кт.ТекущийДокумент();
ТипОбъекта = «Документ»;
Исключение
Объект = 0;
КонецПопытки;
КонецЕсли;
Если Объект = 0 Тогда
Возврат;
КонецЕсли;
гОбъект = СоздатьОбъект(ТипОбъекта + «.» + ВидОбъекта);
Если ТипОбъекта = «Справочник» Тогда
гОбъект.НайтиЭлемент(Объект);
ИначеЕсли ТипОбъекта = «Документ» Тогда
гОбъект.НайтиДокумент(Объект);
КонецЕсли;
Если гОбъект.Блокировка(1) = 0 Тогда
Предупреждение(«Объект заблокирован другим пользователем.», 60);
Возврат;
Иначе
гОбъект.Блокировка(0);
Кт.Форма.Закрыть();
КонецЕсли;
ОбработкаОжидания(«ОткрытьОбъект», 1);
КонецПроцедуры
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Процедура ПосмотретьОбъект(Кт) Экспорт
гОбъект = 0;
гРежимОбъекта = 1;
ТипОбъекта = «»;
ВидОбъекта = Кт.Вид();
Попытка
Объект = Кт.ТекущийЭлемент();
ТипОбъекта = «Справочник»;
Исключение
Объект = 0;
КонецПопытки;
Если Объект = 0 Тогда
Попытка
Объект = Кт.ТекущийДокумент();
ТипОбъекта = «Документ»;
Исключение
Объект = 0;
КонецПопытки;
КонецЕсли;
Если Объект = 0 Тогда
Возврат;
КонецЕсли;
гОбъект = СоздатьОбъект(ТипОбъекта + «.» + ВидОбъекта);
Если ТипОбъекта = «Справочник» Тогда
гОбъект.НайтиЭлемент(Объект);
ИначеЕсли ТипОбъекта = «Документ» Тогда
гОбъект.НайтиДокумент(Объект);
КонецЕсли;
Кт.Форма.Закрыть();
ОбработкаОжидания(«ОткрытьОбъект», 1);
КонецПроцедуры
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Модуль «Справочника\Документа»:
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Процедура кРедактировать()
РедактироватьОбъект(Контекст);
КонецПроцедуры
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Процедура ПриЗаписи()
ПосмотретьОбъект(Контекст);
КонецПроцедуры
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Теперь для того что б это все заработало нужно:
1. Установить параметр «Режим открытия объектов» = «Просмотр» для всех пользователей;
2. На форму «справочника\документа» повесить «кнопку\перехватчик сочетания клавиш» и привязать к процедуре кРедактировать();
3. В процедуру при призаписи добавляем ссылку на ПосмотретьОбъект(Контекст);
4. Наличи внешней компоненты «1ссрр\formex». (У меня 1срр версия 2.0.3.7) (Больше не требуется)
Вот собственно и все. Надеюсь этот алгоритм приглянется кому то еще.
1. В ближайшем будущем планирую добавить режим сброса блокировки если в объекте, открытом на редактирование, нажата кнопка записать. (Записал — освободил) (Выполнил)
2. В ближайшем будущем планирую добавить режим сброса блокировки если в объекте нет активности в течении N-минут.

