Разработка и Конфигурация · 11 мин
Как открыть форму объекта в 1С ЗУП, если известна текстовая ссылка
Как открыть форму объекта в 1С ЗУП, если известна текстовая ссылка: разбор методов, примеры кода, обработка ошибок и проверка результата.
Задача открыть форму объекта по текстовой ссылке возникает при разработке обработок для 1С:Зарплата и управление персоналом: например, когда ссылка на сотрудника, документ начисления или элемент справочника приходит из файла обмена, письма, журнала регистрации или другого информационного блока в виде строки. Платформа 1С не умеет напрямую «понимать» произвольный текст как ссылку — её нужно сначала преобразовать в объект типа Ссылка, и только потом открывать форму.
Ключевой момент: текстовая ссылка в 1С — это не просто наименование объекта. Чаще всего под ней понимают либо внутреннее представление ссылки (результат функции ЗначениеВСтрокуВнутр), либо навигационную ссылку вида e1cib/data/..., либо GUID. Для каждого формата свой способ восстановления ссылки и открытия формы.
Ниже разобраны рабочие варианты для управляемого приложения, которое используется в современных релизах ЗУП, а также приёмы для толстого клиента и обычных форм, если база ещё работает в старом режиме.
Что скрывается за «текстовой ссылкой» в 1С
Прежде чем писать код, определите, какой именно формат строки у вас на руках. От этого зависит весь алгоритм. В практике работы с ЗУП встречаются три основных варианта.
Первый — внутреннее представление значения, которое возвращает функция ЗначениеВСтрокуВнутр(Ссылка). Такая строка выглядит как фрагмент с фигурными скобками и шестнадцатеричными символами. Её часто сохраняют в файлы обмена, хранилища настроек и регистры сведений при интеграциях.
Второй — уникальный идентификатор (GUID) в привычном виде «xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx». Именно в таком виде ссылки передают внешние системы: CRM, кадровые порталы, сервисы электронного документооборота. По GUID ссылку восстанавливают методом ПолучитьСсылку у менеджера объекта.
Третий — навигационная ссылка вида e1cib/data/Справочник.Сотрудники?ref=.... Её можно скопировать из интерфейса ЗУП командой «Получить ссылку» или вывести через ПолучитьНавигационнуюСсылку(). Такую строку платформа умеет открывать напрямую, без программного преобразования.
Самый простой способ: навигационная ссылка и ОткрытьЗначение
Если строка получена как навигационная ссылка, задача решается без восстановления объекта. Платформа сама разберёт формат и откроет нужную форму — достаточно передать строку в глобальный контекст как адрес для перехода.
На тонком клиенте используют метод ПерейтиПоНавигационнойСсылке, который доступен в управляемом приложении. В простейшем случае код выглядит так:
// Навигационная ссылка получена, например, из файла или буфера
НавигационнаяСсылка = "e1cib/data/Справочник.Сотрудники?ref=80e20050569b0e6d11e9a1b2c3d4e5f6";
ПерейтиПоНавигационнойСсылке(НавигационнаяСсылка);Если у вас уже есть не строка, а готовая ссылка на объект (например, её вернул запрос или функция поиска), форму открывают одной строкой: ОткрытьЗначение(СсылкаНаОбъект). Платформа сама определит тип объекта и подберёт основную форму — для справочника «Сотрудники» это будет форма элемента, для документа «Начисление зарплаты» — форма документа.
Метод ОткрытьЗначение удобен тем, что не требует знать имя формы и состав параметров. Его ограничение — нельзя передать дополнительные параметры открытия, например режим только просмотра или отбор.
Восстановление ссылки из внутреннего представления
Когда строка получена через ЗначениеВСтрокуВнутр, обратное преобразование выполняет функция ЗначениеИзСтрокиВнутр. Она работает и на сервере, и на толстом клиенте, но в тонком клиенте недоступна — это частая причина ошибок при переносе старого кода в управляемое приложение ЗУП.
&НаСервере
Функция ОткрытьОбъектПоСтроке(СтрокаСсылки)
Ссылка = ЗначениеИзСтрокиВнутр(СтрокаСсылки);
Возврат Ссылка;
КонецФункции
&НаКлиенте
Процедура ОткрытьПоТекстовойСсылке(Команда)
Ссылка = ОткрытьОбъектПоСтроке(ТекстоваяСсылка);
Если ЗначениеЗаполнено(Ссылка) Тогда
ОткрытьЗначение(Ссылка);
КонецЕсли;
КонецПроцедурыОбратите внимание на структуру: преобразование выполняется в серверной функции, а открытие формы — на клиенте. Это обязательное разделение в управляемом приложении: интерактивные действия с формами возможны только в клиентском контексте.
Перед вызовом ЗначениеИзСтрокиВнутр полезно обернуть код в попытку-исключение. Если строка повреждена, обрезана при копировании или относится к другой версии конфигурации, функция вызовет исключение, и пользователь увидит техническое окно ошибки вместо понятного сообщения.
Открытие объекта по GUID из внешней системы
Интеграции ЗУП с внешними кадровыми и учётными системами почти всегда оперируют GUID. Чтобы открыть форму объекта по такой строке, нужно знать тип объекта — сам по себе GUID не содержит информации о том, это сотрудник, физическое лицо или документ.
Алгоритм: создать объект УникальныйИдентификатор из строки, затем вызвать метод ПолучитьСсылку у соответствующего менеджера — Справочники.Сотрудники, Документы.БольничныйЛист и так далее.
&НаСервере
Функция СсылкаПоGUID(СтрокаGUID)
Попытка
УИД = Новый УникальныйИдентификатор(СтрокаGUID);
Ссылка = Справочники.Сотрудники.ПолучитьСсылку(УИД);
// Проверяем, что объект реально существует в базе
Если Ссылка.ПолучитьОбъект() = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
Возврат Ссылка;
Исключение
Возврат Неопределено;
КонецПопытки;
КонецФункцииПроверка существования объекта обязательна. ПолучитьСсылку возвращает «битую» ссылку даже для GUID, которого нет в базе, и попытка открыть форму такого объекта приведёт к ошибке «Объект не найден». Метод ПолучитьОбъект() для несуществующей ссылки вернёт Неопределено — это самый надёжный способ проверки.
Если тип объекта заранее неизвестен, придётся перебирать вероятные менеджеры (Сотрудники, ФизическиеЛица, документы кадрового учёта) или хранить тип вместе со строкой. Универсального метода «найти ссылку по GUID без указания типа» в платформе нет.
Открытие формы через ОткрытьФорму с параметром Ключ
Когда нужен контроль над открытием — конкретная форма, режим просмотра, владелец формы — вместо ОткрытьЗначение используют глобальный метод ОткрытьФорму. Ссылку передают в параметре с именем Ключ.
&НаКлиенте
Процедура ОткрытьСотрудника(Ссылка)
ПараметрыФормы = Новый Структура("Ключ", Ссылка);
ОткрытьФорму("Справочник.Сотрудники.ФормаОбъекта", ПараметрыФормы);
КонецПроцедурыТакой вариант предпочтителен, когда в конфигурации для объекта назначено несколько форм и нужна не основная, а конкретная. В ЗУП это актуально для документов с несколькими пользовательскими формами или для открытия объекта в составе сложной рабочей формы.
Дополнительные параметры ОткрытьФорму позволяют задать владельца формы, уникальность (чтобы повторный вызов активировал уже открытое окно вместо создания дубликата) и режим блокирования окна владельца. Для служебных обработок полезно передавать уникальность — иначе пользователи открывают десятки копий одной формы.
Сравнение способов открытия
Самый простой вызов, платформа сама выбирает основную форму. Не позволяет передать параметры и управлять окном.
Полный контроль: конкретная форма, владелец, уникальность, дополнительные параметры. Требует знать имя формы.
Работает со строкой e1cib/... без восстановления ссылки. Подходит, когда известна только навигационная ссылка.
Проверка результата и типичные ошибки
После внедрения кода проверьте сценарий на реальных данных: строка из файла обмена, GUID из внешней системы, навигационная ссылка из интерфейса. Успешный результат — открытая форма именно того объекта, который зашифрован в строке, без сообщений об ошибке.
Как проверить результат
Форма показывает того сотрудника или документ, чья ссылка была в строке
Открывается другой объект или пустая форма нового элемента
Ссылка.ПолучитьОбъект() возвращает объект
Возвращается Неопределено — ссылка битая, открывать форму нельзя
Преобразование строки на сервере, ОткрытьЗначение на клиенте
Ошибка «Метод недоступен» при вызове ЗначениеИзСтрокиВнутр на тонком клиенте
Отдельная группа проблем связана с правами. Если у пользователя нет права просмотра объекта, форма не откроется или откроется с ошибкой доступа. В служебных обработках для широкого круга пользователей предусмотрите понятное сообщение вместо стандартного окна нарушения прав.
Что запомнить и когда привлекать разработчика
Описанные приёмы относятся к программной доработке: код размещают во внешней обработке, расширении конфигурации или общем модуле. Изменять типовую конфигурацию ЗУП напрямую не рекомендуется — это усложнит обновления. Безопасный путь — внешняя обработка или расширение.
Что важно запомнить
Определите формат строки: навигационная ссылка, внутреннее представление или GUID. Преобразуйте её в ссылку на сервере, проверьте существование объекта и откройте форму на клиенте через ОткрытьЗначение или ОткрытьФорму с параметром Ключ.
Если требуется массовая обработка ссылок, интеграция с внешней системой или открытие объектов нестандартных типов, задачу разумно передать специалисту по разработке на платформе 1С — самостоятельная доработка оправдана для простых сценариев с одним известным типом объекта.
Частые вопросы
Можно ли открыть форму объекта без программирования, просто по строке?
Да, если у вас есть навигационная ссылка вида e1cib/... — её можно вставить в диалог «Перейти по ссылке» в главном меню системы или в адресную строку браузера при работе через веб-клиент. Для GUID или внутреннего представления без кода не обойтись.
Как получить текстовую ссылку на объект, чтобы потом её использовать?
В интерфейсе ЗУП откройте объект и используйте команду «Получить ссылку» — в буфер попадёт навигационная ссылка. Программно GUID получают выражением Ссылка.УникальныйИдентификатор(), а внутреннее представление — функцией ЗначениеВСтрокуВнутр(Ссылка).
Почему ЗначениеИзСтрокиВнутр выдаёт ошибку на тонком клиенте?
Этот метод недоступен в контексте тонкого и веб-клиента по архитектурным ограничениям платформы. Выносите преобразование в серверную функцию с директивой &НаСервере и возвращайте на клиент готовую ссылку для открытия формы.
Что делать, если открывается ошибка «Объект не найден»?
Это значит, что ссылка восстановлена формально, но объекта с таким идентификатором в базе нет — он удалён или строка относится к другой информационной базе. Перед открытием проверяйте существование через Ссылка.ПолучитьОбъект() и сообщайте пользователю о ситуации.
Как открыть форму, если тип объекта по строке неизвестен?
Платформа не умеет определять тип по «голому» GUID. Либо храните тип вместе со строкой при выгрузке, либо последовательно проверяйте вероятные менеджеры (Справочники.Сотрудники, Справочники.ФизическиеЛица, нужные документы), пока ПолучитьОбъект() не вернёт существующий объект.
Безопасно ли хранить ссылки через ЗначениеВСтрокуВнутр для долгосрочного обмена?
Нет, формат внутреннего представления не гарантирует совместимость между версиями платформы и конфигурации. Для интеграций и долговременного хранения используйте GUID — он стабилен и однозначно восстанавливается методом ПолучитьСсылку.