Как исправить ошибку «Неизвестное имя формы» и проблемы с кодировкой при переходе по навигационной ссылке в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке сложных интерфейсов в 1С, особенно когда мы используем объект ФорматированныйДокумент для создания интерактивных систем (например, бизнес-процессов или справочных систем), мы часто сталкиваемся с необходимостью обеспечить пользователю переход к конкретным данным в «один клик». Однако стандартный механизм навигационных ссылок может преподнести неприятные сюрпризы в виде ошибок кодировки или сообщения «Неизвестное имя формы».

В данной статье мы подробно разберем, почему возникают такие ситуации, как правильно формировать ссылки на записи регистров сведений и каким образом можно обойти ограничения платформы при работе с гиперссылками в текстовых полях.

Анализ проблемы: почему ломается кодировка?

Рассмотрим ситуацию, когда в сообщении об ошибке вместо понятного имени метаданных мы видим «кракозябры», например, РегистрСведений. Проанализируем причину этого явления. Текст такого вида — это классический результат того, что строка, изначально сформированная в кодировке UTF-8, была ошибочно интерпретирована системой как Windows-1251.

Это часто происходит при программном формировании ссылки или её передаче через механизмы, которые не поддерживают автоматическое преобразование кодировок. Например, если мы вставляем ссылку в ФорматированныйДокумент в виде «сырого» HTML-текста. Платформа 1С (особенно в версиях ниже 8.3.15 или в определенных сборках тонкого клиента) может некорректно обрабатывать кириллические символы в URL-адресе навигационной ссылки.

Для решения проблемы с кодировкой рекомендуется:

  1. Использовать стандартную функцию ПолучитьНавигационнуюСсылку() вместо ручной склейки строки.
  2. Если ручное формирование неизбежно, применять метод КодироватьСтроку(ВашаСсылка, СпособКодированияСтроки.URLУмеренно).
  3. По возможности использовать латинские идентификаторы для имен объектов метаданных, если конфигурация позволяет их задать.

Разберем ошибку «Неизвестное имя формы» для регистров сведений

Выясним причину, по которой платформа выдает ошибку при попытке открыть форму записи регистра. Основная тонкость заключается в архитектурном различии между ссылочными объектами (справочники, документы) и регистрами.

Для справочника ссылка вида e1cib/data/Справочник.Партнеры?ref=УникальныйИдентификатор однозначно определяет объект. Однако у регистра сведений нет уникального идентификатора (ссылки) в привычном понимании. Запись регистра идентифицируется набором значений его измерений.

Существует два типа системных ссылок для регистров:

  1. e1cib/list/РегистрСведений.ИмяРегистра — открывает стандартный список всех записей.
  2. e1cib/data/РегистрСведений.ИмяРегистра?Ключ1=Значение1... — открывает форму конкретной записи.

Если мы пытаемся вызвать адрес типа e1cib/data/РегистрСведений.ИмяРегистра без параметров ключа, платформа не понимает, какую именно запись нужно отобразить. Вместо того чтобы открыть пустую форму или список, система сообщает о «неизвестном имени формы», так как объект (запись) не определен.

Как правильно сформировать ссылку на запись регистра

Проанализируем ситуацию: нам нужно открыть конкретную запись. Для этого необходимо сформировать Ключ записи. Рассмотрим пример кода, который позволяет получить корректную навигационную ссылку для регистра сведений СтруктураПартнеров:


// Создаем структуру, содержащую значения всех измерений записи
Отбор = Новый Структура;
Отбор.Вставить("Партнер", ВыбранныйПартнер);
Отбор.Вставить("Подразделение", ВыбранноеПодразделение);

// Формируем ключ записи
КлючЗаписи = РегистрыСведений.СтруктураПартнеров.СоздатьКлючЗаписи(Отбор);

// Получаем рабочую навигационную ссылку
НавигационнаяСсылка = ПолучитьНавигационнуюСсылку(КлючЗаписи);

Именно такую ссылку, полученную через КлючЗаписи, необходимо вставлять в поле ФорматированныйДокумент. В этом случае платформа автоматически добавит все необходимые параметры после знака вопроса, и переход будет работать корректно.

Обход проблемы через перехват события нажатия

Если стандартный переход по ссылке все равно вызывает сложности (например, из-за специфических настроек прав доступа или особенностей версии платформы), мы можем применить более гибкий подход. Вместо того чтобы полагаться на автоматику 1С, мы перехватим нажатие на гиперссылку в форме.

У элемента формы, который отображает ФорматированныйДокумент, существует событие ПриНажатии. Разберем, как его использовать для программного открытия формы:


&НаКлиенте
Процедура ОписаниеИсполнителюПриНажатии(Элемент, ВыбранныйАдрес, СпецКлавиши, СтандартнаяОбработка)
    
    // Если адрес похож на навигационную ссылку регистра
    Если Найти(ВыбранныйАдрес, "e1cib/data/РегистрСведений.СтруктураПартнеров") > 0 Тогда
        
        // Отменяем стандартную обработку платформой, чтобы не было ошибки
        СтандартнаяОбработка = Ложь;
        
        // Мы можем либо вызвать свою процедуру перехода:
        // ПерейтиПоНавигационнойСсылке(ВыбранныйАдрес);
        
        // Либо, что более надежно, разобрать параметры и вызвать ОткрытьФорму
        // Это позволит избежать проблем с кодировкой в URL
        Попытка
            ПерейтиПоНавигационнойСсылке(ВыбранныйАдрес);
        Исключение
            Сообщить("Не удалось перейти по ссылке, возможно, запись была удалена.");
        КонецПопытки;
        
    КонецЕсли;
    
КонецПроцедуры

Рассмотрим также вариант, предложенный в обсуждении, когда пользователь хочет программно обойти все ссылки в документе. Хотя это менее удобно для пользователя, такой метод позволяет точно контролировать процесс открытия:


&НаКлиенте
Процедура ОткрытьНавигационнуюСсылкуИзДокумента(Команда)
    // ОписаниеИсполнителюФД - это реквизит типа ФорматированныйДокумент
    Для каждого ЭлементДокумента Из ОписаниеИсполнителюФД.ПолучитьЭлементы() Цикл
        // Проверяем наличие навигационной ссылки в элементе
        Если ЗначениеЗаполнено(ЭлементДокумента.НавигационнаяСсылка) Тогда
            ПерейтиПоНавигационнойСсылке(ЭлементДокумента.НавигационнаяСсылка);    
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Рекомендации по правам доступа

Иногда ошибка «Неизвестное имя формы» может маскировать отсутствие прав доступа. Если у пользователя нет прав на чтение конкретного регистра или не назначена Основная форма записи в конфигураторе, платформа может выдать ошибку поиска формы. Проверьте следующие настройки в конфигураторе:

Итоги

Подводя итог, отметим, что для корректной работы ссылок в ФорматированныйДокумент необходимо:

  1. Всегда использовать КлючЗаписи для регистров сведений при формировании ссылки.
  2. Следить за кодировкой при программной генерации HTML-текста документа.
  3. Использовать событие ПриНажатии для тонкой настройки навигации и предотвращения системных ошибок.

Соблюдение этих правил позволит создать надежную систему навигации внутри ваших бизнес-процессов, обеспечивая пользователям удобный доступ к данным без лишних кликов и сообщений об ошибках.

← На главную