Рассмотрим довольно частую задачу для разработчика 1С: необходимо открыть форму обработки по навигационной ссылке, но не просто открыть, а передать в нее определенные параметры для инициализации. Например, чтобы форма открылась с уже заполненными данными или в определенном режиме. На первый взгляд, задача кажется простой, но на практике она имеет важные нюансы, зависящие от версии платформы 1С:Предприятие.
Проанализируем, почему стандартные подходы, привычные по веб-разработке, могут не работать, и разберем два надежных способа решения этой задачи: современный, доступный на новых версиях платформы, и универсальный, подходящий для более старых релизов.
Первая интуитивная мысль — добавить параметры к навигационной ссылке по аналогии с GET-запросами в вебе, используя знаки "?" и "&". Например, так:
e1cib/data/Обработка.МОЯОБРАБОТКА.Форма.ТРЕБУЕМАЯФОРМА?Количество=1&ТолькоПросмотр=Истина
Однако, если вы работаете на платформе старше версии 8.3.19 (например, 8.3.12, как в исходном вопросе), такой подход не сработает. Механизм обработки навигационных ссылок в старых версиях не был рассчитан на парсинг произвольных параметров в таком формате. В результате вы столкнетесь с одним из следующих сценариев:
Исторически компания "1С" официально подтверждала, что передача параметров таким способом не поддерживается. Ситуация изменилась, но важно помнить об этом ограничении при работе со старыми конфигурациями или платформами.
Начиная с версии платформы 8.3.19, разработчики 1С добавили штатную возможность передачи параметров при формировании навигационной ссылки. Это самый правильный, простой и рекомендуемый способ, если ваша система обновлена до соответствующей или более новой версии.
Решение заключается в использовании функции ПолучитьНавигационнуюСсылку() с передачей в нее структуры, содержащей необходимые параметры.
Посмотрим на пример:
Предположим, у нас есть обработка ЗалитьДанныевДокОбработка, и при ее открытии мы хотим передать ссылку на документ, контрагента и вид отчетности.
// Создаем структуру с параметрами, которые хотим передать в форму
// Ключи структуры (первый, второй, третий параметр) - это имена
// переменных, которые будут доступны в параметрах открываемой формы.
// Значения структуры - это те данные, которые мы передаем.
ПараметрыСсылки = Новый Структура("Документ, Контрагент, ВидОтчетности",
Объект.Ссылка,
Объект.Контрагент,
Объект.ВидОтчетности);
// Формируем навигационную ссылку на обработку.
// 1-й параметр: ссылка на метаданные объекта (нашей обработки).
// 2-й параметр: представление ссылки (текст, который увидит пользователь).
// 3-й параметр: та самая структура с нашими данными.
Ссылочка = ПолучитьНавигационнуюСсылку(Метаданные.Обработки.ЗалитьДанныевДокОбработка,
Строка(Объект.Контрагент) + " " + Строка(Объект.ВидОтчетности),
ПараметрыСсылки);
// Теперь переменная "Ссылочка" содержит готовую навигационную ссылку,
// при переходе по которой платформа откроет форму обработки
// и передаст в нее указанные параметры.
Как получить эти параметры в форме обработки?
Все переданные таким образом данные будут доступны в событии ПриСозданииНаСервере в стандартном свойстве формы Параметры. Вы можете обратиться к ним по ключам, которые задали в структуре.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем, были ли переданы параметры при открытии
Если Параметры.Свойство("Документ") Тогда
// Используем полученные данные для инициализации формы
СсылкаНаДокумент = Параметры.Документ;
ТекущийКонтрагент = Параметры.Контрагент;
// ... и так далее
КонецЕсли;
КонецПроцедуры
Этот метод является наиболее предпочтительным, так как он полностью поддерживается платформой, надежен и не требует сложных "обходных путей".
Что делать, если вы работаете на старой платформе или по каким-то причинам не можете ее обновить? В этом случае придется использовать более сложный, но не менее надежный архитектурный подход. Основная идея — перехватить открытие "чистой" навигационной ссылки и программно добавить нужную логику.
Самый гибкий способ — это использование обработчика ОбработкаПолученияФормы в модуле менеджера вашей обработки.
Разберем по шагам:
Представим, что у вас есть не одна, а несколько форм в обработке, и в зависимости от неких внешних условий (которые мы хотим передать как параметры) нужно открыть одну из них.
Сохраняем параметры. Перед тем, как пользователь перейдет по ссылке, нам нужно где-то сохранить параметры. Это можно сделать, например, в параметрах сеанса или во временном хранилище.
Формируем простую ссылку. Создаем обычную навигационную ссылку на саму обработку, без каких-либо параметров.
Перехватываем открытие формы. В модуле менеджера обработки (Обработка.МояОбработка.МодульМенеджера) создаем экспортную процедуру ОбработкаПолученияФормы.
Пример реализации в модуле менеджера:
&НаСервере
Процедура ОбработкаПолученияФормы(ИмяФормы, Параметры, ВыбраннаяФорма, ДополнительныеПараметры, СтандартнаяОбработка)
// Получаем наши параметры из параметров сеанса или другого источника
РежимРаботы = ПараметрыСеанса.РежимОткрытияМоейОбработки;
Если РежимРаботы = "ТолькоПросмотр" Тогда
// Если нужен режим просмотра, открываем специальную форму
ВыбраннаяФорма = Метаданные.Обработки.МояОбработка.Формы.ФормаПросмотра;
// Также можно передать дополнительные параметры уже в саму форму
ДополнительныеПараметры.Вставить("ИсточникДанных", ПараметрыСеанса.ИсточникДанныхДляОбработки);
ИначеЕсли РежимРаботы = "Редактирование" Тогда
// В другом режиме - открываем основную форму
ВыбраннаяФорма = Метаданные.Обработки.МояОбработка.Формы.ОсновнаяФорма;
Иначе
// Если режим не задан, пусть платформа сама выберет форму по умолчанию
Возврат;
КонецЕсли;
// Отменяем стандартный механизм выбора формы,
// так как мы определили ее сами
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Этот способ сложнее в реализации, но он дает полный контроль над процессом открытия формы. Вы можете реализовать любую логику: в зависимости от прав пользователя, внешних данных или других условий открывать разные формы и передавать в них любые необходимые параметры.
Подведем итог. Задача передачи параметров в форму через навигационную ссылку имеет два основных решения, выбор которого зависит от версии вашей платформы 1С:
ПолучитьНавигационнуюСсылку() и передачей структуры с параметрами. Это просто, надежно и полностью поддерживается "1С".
ОбработкаПолученияФормы в модуле менеджера. Этот способ универсален и дает максимальную гибкость.
Главное — избегайте попыток "вручную" дописать параметры в строку ссылки через "?" и "&", если не уверены в версии платформы, так как это может привести к непредсказуемому поведению системы.