При разработке сложных интерфейсов в 1С, особенно когда мы используем объект ФорматированныйДокумент для создания интерактивных систем (например, бизнес-процессов или справочных систем), мы часто сталкиваемся с необходимостью обеспечить пользователю переход к конкретным данным в «один клик». Однако стандартный механизм навигационных ссылок может преподнести неприятные сюрпризы в виде ошибок кодировки или сообщения «Неизвестное имя формы».
В данной статье мы подробно разберем, почему возникают такие ситуации, как правильно формировать ссылки на записи регистров сведений и каким образом можно обойти ограничения платформы при работе с гиперссылками в текстовых полях.
Рассмотрим ситуацию, когда в сообщении об ошибке вместо понятного имени метаданных мы видим «кракозябры», например, РегистрСведений. Проанализируем причину этого явления. Текст такого вида — это классический результат того, что строка, изначально сформированная в кодировке UTF-8, была ошибочно интерпретирована системой как Windows-1251.
Это часто происходит при программном формировании ссылки или её передаче через механизмы, которые не поддерживают автоматическое преобразование кодировок. Например, если мы вставляем ссылку в ФорматированныйДокумент в виде «сырого» HTML-текста. Платформа 1С (особенно в версиях ниже 8.3.15 или в определенных сборках тонкого клиента) может некорректно обрабатывать кириллические символы в URL-адресе навигационной ссылки.
Для решения проблемы с кодировкой рекомендуется:
ПолучитьНавигационнуюСсылку() вместо ручной склейки строки.КодироватьСтроку(ВашаСсылка, СпособКодированияСтроки.URLУмеренно).Выясним причину, по которой платформа выдает ошибку при попытке открыть форму записи регистра. Основная тонкость заключается в архитектурном различии между ссылочными объектами (справочники, документы) и регистрами.
Для справочника ссылка вида e1cib/data/Справочник.Партнеры?ref=УникальныйИдентификатор однозначно определяет объект. Однако у регистра сведений нет уникального идентификатора (ссылки) в привычном понимании. Запись регистра идентифицируется набором значений его измерений.
Существует два типа системных ссылок для регистров:
e1cib/list/РегистрСведений.ИмяРегистра — открывает стандартный список всех записей.e1cib/data/РегистрСведений.ИмяРегистра?Ключ1=Значение1... — открывает форму конкретной записи.Если мы пытаемся вызвать адрес типа e1cib/data/РегистрСведений.ИмяРегистра без параметров ключа, платформа не понимает, какую именно запись нужно отобразить. Вместо того чтобы открыть пустую форму или список, система сообщает о «неизвестном имени формы», так как объект (запись) не определен.
Проанализируем ситуацию: нам нужно открыть конкретную запись. Для этого необходимо сформировать Ключ записи. Рассмотрим пример кода, который позволяет получить корректную навигационную ссылку для регистра сведений СтруктураПартнеров:
// Создаем структуру, содержащую значения всех измерений записи
Отбор = Новый Структура;
Отбор.Вставить("Партнер", ВыбранныйПартнер);
Отбор.Вставить("Подразделение", ВыбранноеПодразделение);
// Формируем ключ записи
КлючЗаписи = РегистрыСведений.СтруктураПартнеров.СоздатьКлючЗаписи(Отбор);
// Получаем рабочую навигационную ссылку
НавигационнаяСсылка = ПолучитьНавигационнуюСсылку(КлючЗаписи);
Именно такую ссылку, полученную через КлючЗаписи, необходимо вставлять в поле ФорматированныйДокумент. В этом случае платформа автоматически добавит все необходимые параметры после знака вопроса, и переход будет работать корректно.
Если стандартный переход по ссылке все равно вызывает сложности (например, из-за специфических настроек прав доступа или особенностей версии платформы), мы можем применить более гибкий подход. Вместо того чтобы полагаться на автоматику 1С, мы перехватим нажатие на гиперссылку в форме.
У элемента формы, который отображает ФорматированныйДокумент, существует событие ПриНажатии. Разберем, как его использовать для программного открытия формы:
&НаКлиенте
Процедура ОписаниеИсполнителюПриНажатии(Элемент, ВыбранныйАдрес, СпецКлавиши, СтандартнаяОбработка)
// Если адрес похож на навигационную ссылку регистра
Если Найти(ВыбранныйАдрес, "e1cib/data/РегистрСведений.СтруктураПартнеров") > 0 Тогда
// Отменяем стандартную обработку платформой, чтобы не было ошибки
СтандартнаяОбработка = Ложь;
// Мы можем либо вызвать свою процедуру перехода:
// ПерейтиПоНавигационнойСсылке(ВыбранныйАдрес);
// Либо, что более надежно, разобрать параметры и вызвать ОткрытьФорму
// Это позволит избежать проблем с кодировкой в URL
Попытка
ПерейтиПоНавигационнойСсылке(ВыбранныйАдрес);
Исключение
Сообщить("Не удалось перейти по ссылке, возможно, запись была удалена.");
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Рассмотрим также вариант, предложенный в обсуждении, когда пользователь хочет программно обойти все ссылки в документе. Хотя это менее удобно для пользователя, такой метод позволяет точно контролировать процесс открытия:
&НаКлиенте
Процедура ОткрытьНавигационнуюСсылкуИзДокумента(Команда)
// ОписаниеИсполнителюФД - это реквизит типа ФорматированныйДокумент
Для каждого ЭлементДокумента Из ОписаниеИсполнителюФД.ПолучитьЭлементы() Цикл
// Проверяем наличие навигационной ссылки в элементе
Если ЗначениеЗаполнено(ЭлементДокумента.НавигационнаяСсылка) Тогда
ПерейтиПоНавигационнойСсылке(ЭлементДокумента.НавигационнаяСсылка);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Иногда ошибка «Неизвестное имя формы» может маскировать отсутствие прав доступа. Если у пользователя нет прав на чтение конкретного регистра или не назначена Основная форма записи в конфигураторе, платформа может выдать ошибку поиска формы. Проверьте следующие настройки в конфигураторе:
Подводя итог, отметим, что для корректной работы ссылок в ФорматированныйДокумент необходимо:
КлючЗаписи для регистров сведений при формировании ссылки.ПриНажатии для тонкой настройки навигации и предотвращения системных ошибок.Соблюдение этих правил позволит создать надежную систему навигации внутри ваших бизнес-процессов, обеспечивая пользователям удобный доступ к данным без лишних кликов и сообщений об ошибках.