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