Как передать параметры в форму через навигационную ссылку в 1С?

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

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

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

Почему попытка передать параметры как в URL приводит к ошибке?

Первая интуитивная мысль — добавить параметры к навигационной ссылке по аналогии с GET-запросами в вебе, используя знаки "?" и "&". Например, так:


e1cib/data/Обработка.МОЯОБРАБОТКА.Форма.ТРЕБУЕМАЯФОРМА?Количество=1&ТолькоПросмотр=Истина

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

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

Исторически компания "1С" официально подтверждала, что передача параметров таким способом не поддерживается. Ситуация изменилась, но важно помнить об этом ограничении при работе со старыми конфигурациями или платформами.

Решение 1: Современный подход (для платформы 8.3.19 и выше)

Начиная с версии платформы 8.3.19, разработчики 1С добавили штатную возможность передачи параметров при формировании навигационной ссылки. Это самый правильный, простой и рекомендуемый способ, если ваша система обновлена до соответствующей или более новой версии.

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

Посмотрим на пример:

Предположим, у нас есть обработка ЗалитьДанныевДокОбработка, и при ее открытии мы хотим передать ссылку на документ, контрагента и вид отчетности.


// Создаем структуру с параметрами, которые хотим передать в форму
// Ключи структуры (первый, второй, третий параметр) - это имена
// переменных, которые будут доступны в параметрах открываемой формы.
// Значения структуры - это те данные, которые мы передаем.
ПараметрыСсылки = Новый Структура("Документ, Контрагент, ВидОтчетности",
                                 Объект.Ссылка,
                                 Объект.Контрагент,
                                 Объект.ВидОтчетности);

// Формируем навигационную ссылку на обработку.
// 1-й параметр: ссылка на метаданные объекта (нашей обработки).
// 2-й параметр: представление ссылки (текст, который увидит пользователь).
// 3-й параметр: та самая структура с нашими данными.
Ссылочка = ПолучитьНавигационнуюСсылку(Метаданные.Обработки.ЗалитьДанныевДокОбработка,
                                     Строка(Объект.Контрагент) + " " + Строка(Объект.ВидОтчетности),
                                     ПараметрыСсылки);

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

Как получить эти параметры в форме обработки?

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверяем, были ли переданы параметры при открытии
    Если Параметры.Свойство("Документ") Тогда
        // Используем полученные данные для инициализации формы
        СсылкаНаДокумент = Параметры.Документ;
        ТекущийКонтрагент = Параметры.Контрагент;
        // ... и так далее
    КонецЕсли;
    
КонецПроцедуры

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

Решение 2: Универсальный обходной путь (для любых версий)

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

Самый гибкий способ — это использование обработчика ОбработкаПолученияФормы в модуле менеджера вашей обработки.

Разберем по шагам:

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

  1. Сохраняем параметры. Перед тем, как пользователь перейдет по ссылке, нам нужно где-то сохранить параметры. Это можно сделать, например, в параметрах сеанса или во временном хранилище.

  2. Формируем простую ссылку. Создаем обычную навигационную ссылку на саму обработку, без каких-либо параметров.

  3. Перехватываем открытие формы. В модуле менеджера обработки (Обработка.МояОбработка.МодульМенеджера) создаем экспортную процедуру ОбработкаПолученияФормы.

Пример реализации в модуле менеджера:


&НаСервере
Процедура ОбработкаПолученияФормы(ИмяФормы, Параметры, ВыбраннаяФорма, ДополнительныеПараметры, СтандартнаяОбработка)
    
    // Получаем наши параметры из параметров сеанса или другого источника
    РежимРаботы = ПараметрыСеанса.РежимОткрытияМоейОбработки;

    Если РежимРаботы = "ТолькоПросмотр" Тогда
        // Если нужен режим просмотра, открываем специальную форму
        ВыбраннаяФорма = Метаданные.Обработки.МояОбработка.Формы.ФормаПросмотра;
        
        // Также можно передать дополнительные параметры уже в саму форму
        ДополнительныеПараметры.Вставить("ИсточникДанных", ПараметрыСеанса.ИсточникДанныхДляОбработки);

    ИначеЕсли РежимРаботы = "Редактирование" Тогда
        // В другом режиме - открываем основную форму
        ВыбраннаяФорма = Метаданные.Обработки.МояОбработка.Формы.ОсновнаяФорма;
    
    Иначе
        // Если режим не задан, пусть платформа сама выберет форму по умолчанию
        Возврат;
    КонецЕсли;
    
    // Отменяем стандартный механизм выбора формы,
    // так как мы определили ее сами
    СтандартнаяОбработка = Ложь;
    
КонецПроцедуры

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

Итоги и рекомендации

Подведем итог. Задача передачи параметров в форму через навигационную ссылку имеет два основных решения, выбор которого зависит от версии вашей платформы 1С:

  1. Если вы используете платформу 8.3.19 или новее, всегда используйте штатный механизм с функцией ПолучитьНавигационнуюСсылку() и передачей структуры с параметрами. Это просто, надежно и полностью поддерживается "1С".
  2. Если вы работаете на более старой платформе или вам нужна сложная логика выбора формы при открытии, используйте обработчик ОбработкаПолученияФормы в модуле менеджера. Этот способ универсален и дает максимальную гибкость.

Главное — избегайте попыток "вручную" дописать параметры в строку ссылки через "?" и "&", если не уверены в версии платформы, так как это может привести к непредсказуемому поведению системы.

← На главную