Подмена рабочего стола

Опубликовал Александр Лапшин (zfilin) в раздел Программирование - Работа с интерфейсом

Несколько слов о рабочем столе в 1С 8.2, о том, что нельзя открыть произвольную форму при переключении подсистемы, а так же простой способ "обмануть" это ограничение (с примером).

В 1С версии 8.2, в режиме управляемого приложения, есть такая замечательная штука, как "Рабочий стол". На мой взгляд это прекрасная идея - предоставить разработчику возможность расположить самые необходимые функции и важную информацию прямо под носом у пользователя и раз и навсегда избавиться от вопросов вроде "А как мне найти тут?.." И, думаю, что не ошибусь, если скажу что многие расстраивались от того, что нельзя сразу открыть произвольную форму при переходе на вкладку подсистемы. Возможно, я чего-то не знаю, но события "ПриПереключенииПодсистемы" в платформе нет. А гугл на такие вопросы отвечает совсем не обнадеживающей ссылкой на форум 1С, где Максим Радченко сурово отвечает - нет и не будет! Разработчики плачут, колются, но продолжают жрать кактусы.
Но, что нам форум 1С, если мы и сами с усами.

Когда мне понадобилось несколько рабочих столов по подсистемам, я решил так: добавлю на рабочий стол одну форму, сделаю у нее закладок по количеству подсистем и на каждой закладке нарисую все, что мне нужно. А отображение стандартных закладок подсистем можно будет и вовсе отключить.
Сначала все было в порядке. Но, с увеличением количества элементов появились проблемы. Во-первых оно начало прилично тормозить. Во-вторых в дереве элементов и в модуле формы стало сложно ориентироваться. Не связанные по сути элементы для разных подсистем валились в "одну кучу". И еще напрягало то, что нужно соблюдать уникальность имен в пределах формы. Вместо того, чтобы на разных вкладках сделать две диаграммы с именем "Диаграмма" у каждой, приходилось писать что-то вроде "ДиаграммаОстатки" и "ДиаграммаВзаиморасчеты". Когда у меня стали появляться монстры, вроде "ГруппаПанелейСозданияДокументовОстатковНижняя" (...ОрденоноснаяКрасногоЗнамениИмениБорисаНуралиева ;-) я решил - хватит. Нужно было разносить разные рабочие столы на разные формы.

Тогда я применил простое решение и сейчас поделюсь им с вами. Суть способа проста. Я сделал несколько общих форм, по количеству необходимых мне рабочих столов. При создании формы на сервере я добавляю в форму панель с кнопками, которых ровно столько, сколько этих самых общих форм, и при нажатии на соответствующую кнопку открываю нужную форму (которая при создании опять добавляет себе эту панель).
В итоге, чтобы добавить новый рабочий стол, мне нужно сделать несколько простых действий:
1. Создать общую форму с именем "РабочийСтолНужноеИмя" (где вместо "НужноеИмя" можно подставить все, что угодно).
2. Поставить у этой формы заголовок "НужноеИмя" и отключить автозаголовок. (Это важный шаг, я по заголовку определяю текущую форму. Не совсем удачное решение, но работает).
3. Добавить форме событие "ПриСозданииНаСервере" и прописать там такой код:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    РабочийСтол.ПриСозданииНаСервере(ЭтаФорма);
КонецПроцедуры

(не удивляйтесь, "РабочийСтол" это у меня так называется общий модуль)

4. И добавить в модуль формы процедуру:

&НаКлиенте
Процедура РабочийСтолПереключить(Команда)
   
РабочийСтол.РабочийСтолПереключить(ЭтаФорма,Команда);
КонецПроцедуры

5. Все. Ну, и панель действий формы я отключаю или перемещаю вниз, оно так симпатичнее выглядит.

Одну из этих форм вы добавляете в рабочую область рабочего стола, установив в настройках ширину "Одна колонка". И вуаля - все работает.

Можете скачать и посмотреть сами. В принципе, это базовый шаблон, который можно еще наворотить, например, добавить на кнопки картинок. А можно оставить так.

Конечно, способ не единственный и, если по-чесноку, это "трикс". Намного лучше было бы пользоваться стандартными возможностями платформы не прибегая к фокусам-покусам с формами, но увы - что есть, тем и пользуемся.

А я хочу пожелать вам хорошего дня и хорошего вам кода. Спасибо за внимание.

Оригинал статьи в блоге автора.

Скачать файлы

Наименование Файл Версия Размер
DesktopReplacement.zip
.zip 7,83Kb
27.02.13
301
.zip 7,83Kb 301 Скачать

См. также

Добавить вознаграждение
Комментарии
1. Сергей Ожерельев (Поручик) 3470 13.03.11 19:08 Сейчас в теме
По ссылке
>>> может быть существуют какие либо явные причины не реализовывать данный обработчик, которых я не вижу.

Да пипец какой-то, сам не понимаю, какая религия запрещает. Если пользователи два года просят сделать маленькую фичу, стоит прислушаться к гласу народа.
2. Александр Лапшин (zfilin) 1803 13.03.11 20:57 Сейчас в теме
Разработка штука хитрая. Может, им там половину проекта надо перелопатить, чтобы такую фичу добавить.
Мало ли... Но хорошо было бы, хорошо.
3. script Мальчинко (script) 184 14.03.11 00:26 Сейчас в теме
Отлично! Я как раз любитель делать много панелей на панелях и шоб с закладками :D
4. Яков Коган (Yashazz) 1957 15.03.11 10:10 Сейчас в теме
И что тут нового и оригинального? Ровно тот же ход можно было хоть на 7.7 делать, что, собсно, и делалось. Я было понадеялся, это фича именно с использованием специфики 8.2, ан нет. :(
5. (Nexux) 16.03.11 09:32 Сейчас в теме
как бы так еще извратиться, чтобы дать юзверю возможность найстроки как в "нативном" рабочем столе, и распихать по ролям))
6. Александр Лапшин (zfilin) 1803 16.03.11 12:14 Сейчас в теме
Yashazz, Извините. =( Будет со спецификой 8.2 - обязательно напишу.

Nexux, Дык, а настройка формы? Включай/выключай! Ну, и с ролями можно придумать... Начиная от прав на открытие форм и анализа этого дела при добавлении кнопочек.
7. Андрей Акулов (DrAku1a) 1186 19.03.11 05:10 Сейчас в теме
Извратились бы лучше и интерфейс управляемого к виду обычного ("неуправляемого" :) ) приложения привели... Хотя это да... Это из ряда фантастики...
8. Sensey Master (MSensey) 55 22.03.11 08:53 Сейчас в теме
Извиняюсь за такую критику с моей стороны.
9. Александр Лапшин (zfilin) 1803 22.03.11 11:35 Сейчас в теме
Не нравится - ставьте минус, пишите администрации infostart, что на главную попадает всякая фигня.

Знаете, порой мне тоже кажется странным, что высший рейтинг получают обработки вроде "очередная новая универсальная загрузка из эксель" или "ура! я изобрел проверку орфографии вордом", но стараясь сохранять объективность я говорю себе: раз люди это оценили, значит им это действительно нужно и нечего тут придираться. Стараюсь подавлять в себе вот эту мелочность и снобизм. Чего и вам желаю.
neo-ti; susorov; AlekseiH34; Арчибальд; +4 Ответить 1
10. Александр Лапшин (zfilin) 1803 23.03.11 22:37 Сейчас в теме
(9) Простите за несколько резкий тон, я не бываю на главной (такая уж привычка, читаю в основном через еженедельный обзор из почты) и не знал что такое "выбор экспертов". Не могу не согласиться, что есть много замечательных публикаций более достойных того, чтобы попасть на этот главный баннер. Но все же с тем, что идея совсем недостойна внимания никак не соглашусь, вы тоже, знаете ли переборщили, мне кажется.

Не держите зла и давайте просто хорошо работать, чтобы нашим публикациям не стыдно было находиться в выборе экспертов.
11. - - (Rebelx) 928 24.03.11 09:33 Сейчас в теме
ничего не понял
приклей скриншоты
susorov; AlekseiH34; +2 Ответить
12. Vasiliy (dimisa) 72 15.12.11 12:42 Сейчас в теме
Хороший способ - но не понятн огде это нужно примменять
было бы интересно примеры применения этой фитчи
если у кого опыт использования в торговых конфигурациях
13. AZel84 (AZel84) 30 20.12.11 15:02 Сейчас в теме
Сейчас если у вас общая форма называется, например, ОстаткиТоваров, то кнопка будет называться "ОстаткиТоваров", а хотелось бы "Остатки товаров".
Если заменить процедуру в общем модуле на ниже приведённую, то заголовок кнопок будет браться из синонима общих форм.

&НаСервере
Процедура ПриСозданииНаСервере(Форма) Экспорт
ПанельРабочиеСтолы = Форма.Элементы.Вставить("_ПанельРабочиеСтолы",Тип("ГруппаФормы"),,Форма.ПодчиненныеЭлементы[0]);
ПанельРабочиеСтолы.Вид = ВидГруппыФормы.КоманднаяПанель;
Для каждого ОбщаяФорма Из Метаданные.ОбщиеФормы Цикл
Если Лев(ОбщаяФорма.Имя,11) = "РабочийСтол" Тогда
ИмяРабочегоСтола = Сред(ОбщаяФорма.Имя,12);
ЗаголовокРабочегоСтола = СокрЛП(ОбщаяФорма.Синоним);
КомандаКнопки = Форма.Команды.Добавить("РабочийСтолПереключить"+ИмяРабочегоСтола);
КомандаКнопки.Действие = "РабочийСтолПереключить";
НоваяКнопка = Форма.Элементы.Добавить("_"+ИмяРабочегоСтола, Тип("КнопкаФормы"), ПанельРабочиеСтолы);
НоваяКнопка.ИмяКоманды = "РабочийСтолПереключить"+ИмяРабочегоСтола;
НоваяКнопка.Заголовок = ЗаголовокРабочегоСтола;
НоваяКнопка.Пометка = ?(Форма.Заголовок = ИмяРабочегоСтола,Истина,Ложь);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
14. Александр Лапшин (zfilin) 1803 20.12.11 15:13 Сейчас в теме
Да, я ее для себя и так дорабатывал и картинки подсистем на кнопки вставлял, и вообще.
Вообщем, это так - набросок, а докрутить можно как угодно.
15. Виктория Коршанова (Chif13) 868 14.03.12 13:28 Сейчас в теме
а нельзя было создать обработку, включенную в рабочий стол, которая имеет закладки и прочую там фитчу, настроить ее по ролям и все такое?
16. Александр Лапшин (zfilin) 1803 14.03.12 13:50 Сейчас в теме
Можно. А в статье описано почему именно это не самый удачный способ. Вы ее читали?
17. Vasiliy (dimisa) 72 27.03.12 15:37 Сейчас в теме
не понравилось
уж лучше переписать под эти нужды боковое окно сообщений
что бы там гипперссылки были на объекты метаданных
18. Александр Лапшин (zfilin) 1803 27.03.12 16:35 Сейчас в теме
Да, решение не идеальное. И ссылки конечно лучше, но тут немного о другом речь.
О том как сделать несколько рабочих столов на каждом из которых есть графики, списки, диаграммы и пр.
Увы, ссылки это несколько другая задача. =(
19. Ghost_W0lf (NittenRenegade) 07.11.12 08:23 Сейчас в теме
Тюрьмы, как известно, в головах. Платформа меняется - способы работы остаются. Зачем совершать переход Сурового через Траблы, если есть такие замечательные вещи, как Общие формы и Функциональные опции?
Почитайте Руководство разработчика по этим разделам и всё поймете, там не сложно.
20. Александр Лапшин (zfilin) 1803 07.11.12 10:28 Сейчас в теме
(19) Спасибо за ценную рекомендацию.
21. Ghost_W0lf (NittenRenegade) 07.11.12 10:34 Сейчас в теме
zfilin, мы, 1С-ники, должны помогать друг другу!

Наклепал статейку
статейка на infostart.ru
22. Дмитрий Елисеев (w-divin) 11.03.13 21:22 Сейчас в теме
Реализация предполагает отключение отображения подсистем? а как реализовать чтобы в зависимости от режима запуска (веб-клиент, тонкий/толстыый клиент) использовались либо стандартные посдсистемы, либо данная реализация?
23. Александр Лапшин (zfilin) 1803 12.03.13 02:04 Сейчас в теме
(22) Ну, способ оставляет желать лучшего. Когда-то я его применял, в некоторых проектах.
Теперь я бы посоветовал не использовать его, использовать стандартные подсистемы.
А так, насколько я знаю, нет метода включить и выключить программно отображение подсистем.

(21) Конечно должны. Не думал, что публикация пригодится, но гляди ж ты. Спасибо. =)
24. Дмитрий Елисеев (w-divin) 16.03.13 09:47 Сейчас в теме
(23) метода програмно включить/выключить нет, а нужен именно этот функционал - т.е. при заходе через браузер их не было вообще - только панель навигации (причем тоже сильно урезанная), через тонкий клиент 1-3 подсистемы, а через толстый все. Можно конечно вывернуться ролями ФО, но делать по 3 пользователя на каждого не есть гуд, особенно когда их больше 300 (((
25. Юрий Осипов (yuraos) 843 15.07.13 07:05 Сейчас в теме
(19) Ghost_W0lf,
новые платформы - это новые тюрьмы
и камеры в них все де...(пардон) хуже и хуже.
--
сколько раз не брался за управляемое приложение
столько же раз в этом убеждался.
26. Юрий Осипов (yuraos) 843 15.07.13 07:09 Сейчас в теме
(25)
те минимальные элементы ООП,
которые присутствуют в обычном приложении
(и к стати некоторые из них появились именно в платформе 8.2)
в управляемом практически - практически бесполезны,
поскольку их нельзя использовать на клиенте.
27. Юрий Осипов (yuraos) 843 15.07.13 07:16 Сейчас в теме
(26)
ну интерфейсные возможности управляемого интерфейса
просто сравнивать нечего с обычным...
в нем много чего нельзя:
- нельзя запретить максимизацию управляемой формы, открытой модально.
- нельзя изменить картинку в заголовке управляемой формы.
- нельзя запретить изменение размера управляемой формы.
- у надписей неразмещенных в табличных полях, почему-то нельзя задавать фон,
отличный от фона управляемой формы.
- у надписи (не в табличном поле) можно задать контекстное меню, оно системой выводится
но почему-то обработчик выбранной в меню команды не срабатывает
***
28. Юрий Осипов (yuraos) 843 15.07.13 07:18 Сейчас в теме
(27)
***
я думаю список можно продолжить.
29. Юлия Пухова (luchyk007) 23.10.13 11:57 Сейчас в теме
как раз столкнулся с необходимостью использовать рабочий стол, раздавать права доступа на каждый элемент долго, проще подменить рабочий стол целиком - спасибо.
30. Александр Лапшин (zfilin) 1803 23.10.13 18:12 Сейчас в теме