С появлением версии платформы 1С:Предприятие 8.2 пользователям стала доступна функция передачи ссылок на объекты информационной базы. Теперь пользователь может по электронной почте переслать, например своему коллеге, ссылку на документ, и последний откроет его в пару щелчков. Нам нужно лишь получить ссылку на объект:
А пользователь по этой ссылке откроет его уже на своей стороне:
Никакого поиска в списке и прочее. Быстро и удобно! Но данный функционал доступен только в управляемом приложении. Сегодня в статье рассмотрим собственную реализацию механизма навигационных ссылок для обычного приложения.
Давайте создадим обработку, которая будет создавать некоторое подобие навигационной ссылки для выбранного объекта в информационной базе, но работать будет в обычном приложении. Основная форма обработки показана на следующем скриншоте:
Структура метаданных обработки будет состоять из двух реквизитов и непосредственно основной формы. Реквизита будет два:
1) «ОбъектИБ» с типом «Любая ссылка»
2) «СсылкаНаОбъект» с типом «Строка» длинной 255 символов.
Выбрав ссылку на объект информационной базы пользователь нажимает на кнопку «Получить ссылку». В результате будет сформирована строка ссылки на объект, включающая в себя информацию о типе объекта и его GUID для однозначной идентификации и его последующего открытия. На следующем листинге показан программный код обработчика этой кнопки:
Процедура ПолучитьСсылкуНажатие(Элемент) Если ЗначениеЗаполнено(ОбъектИБ) Тогда // Получаем полный путь к метаданным объекта ТипОбъектаИБ = ОбъектИБ.Метаданные().ПолноеИмя(); // Получаем GUID объекта в информационной базе GUIDОбъектаИБ = ОбъектИБ.УникальныйИдентификатор(); // Формируем строку ссылки как "Путь метаданных + GUID объекта" СсылкаНаОбъект = Строка(ТипОбъектаИБ) + "__" + GUIDОбъектаИБ; Иначе Сообщить("Нужно выбрать объект информационной базы!", СтатусСообщения.ОченьВажное); КонецЕсли; КонецПроцедуры
По сформированной ссылке другой пользователь может открыть объект через эту же обработку. Скопировав текст ссылки в поле «Ссылка на объект» ему будет необходимо нажать на кнопку «Перейти по ссылке». Если ссылка корректная, то будет открыт соответствующий объект. Программный код для этой команды представлен на следующем листинге:
Процедура КнопкаВыполнитьНажатие(Кнопка) // Ищем разделитель информации о типе объекта и его GUID'е Разделитель = Найти(СсылкаНаОбъект, "__"); Если Разделитель 0 Тогда // Парсим путь к метаданным из текста ссылки МетаданныеОбъекта = Лев(СсылкаНаОбъект, Найти(СсылкаНаОбъект, "__")-1); // Получаем соответствующий менеджер для типа Если Найти(МетаданныеОбъекта, "Документ") 0 Тогда Менеджер = Документы; ИначеЕсли Найти(МетаданныеОбъекта, "Справочник") 0 Тогда Менеджер = Справочники; ИначеЕсли Найти(МетаданныеОбъекта, "ПланВидовРасчета") 0 Тогда Менеджер = ПланыВидовРасчета; ИначеЕсли Найти(МетаданныеОбъекта, "ПланВидовХарактеристик") 0 Тогда Менеджер = ПланыВидовХарактеристик; ИначеЕсли Найти(МетаданныеОбъекта, "ПланСчетов") 0 Тогда Менеджер = ПланыСчетов; ИначеЕсли Найти(МетаданныеОбъекта, "БизнесПроцесс") 0 Тогда Менеджер = БизнесПроцессы; ИначеЕсли Найти(МетаданныеОбъекта, "Задача") 0 Тогда Менеджер = Задачи; КонецЕсли; // Парсим имя объекта Имя = Прав(МетаданныеОбъекта, СтрДлина(МетаданныеОбъекта) - Найти(МетаданныеОбъекта, ".")); // Получаем GUID из текста ссылки GUIDОбъекта = Новый УникальныйИдентификатор(СтрЗаменить(СсылкаНаОбъект, МетаданныеОбъекта+"__", "")); // По GUID'у получаем ссылку на объект и открываем ее ПолученнаяСсылка = Менеджер[Имя].ПолучитьСсылку(GUIDОбъекта); ОткрытьЗначение(ПолученнаяСсылка); КонецЕсли; КонецПроцедуры
Весь смысл команды заключается в парсинге текста ссылки для получения типа объекта и его уникального идентификатора. Затем объект открывается по найденной ссылке.
Используя принцип, заложенный в тестовой обработке, мы можем встроить, например, в любую конфигурацию команды для получения и открытия подобных навигационных ссылок в формы документов и справочников.
В конечном итоге механизм навигационных ссылок, подобный стандартному в управляемом приложении, мы можем воссоздать и для обычных форм.