При разработке документов в управляемом интерфейсе 1С:Предприятия 8.3 часто возникает задача: в табличной части документа реквизит-ссылка (например, документ оплаты, накладная или договор) заполняется автоматически при создании на основании. Пользователю необходимо предоставить возможность быстро перейти в связанный документ для просмотра, но при этом строго запретить интерактивную замену значения другим документом или его удаление клавишей Delete.
Разберем причины стандартных ошибок при настройке таких полей и подробно рассмотрим надежные варианты решения этой задачи.
Проанализируем типичную попытку решения: разработчик оставляет для колонки табличной части элемент Поле ввода и отключает в его свойствах кнопки выбора, выпадающего списка и очистки. На первый взгляд выбор другого документа становится невозможным, однако проявляется существенная уязвимость: поле сохраняет фокус ввода и доступность для редактирования, из-за чего пользователь может легко стереть ссылку нажатием клавиши Delete или Backspace.
Если же включить свойство Гиперссылка, но пытаться перехватить клик через события группы выбора (НачалоВыбора, ОбработкаВыбора), то обработчики не сработают. Это происходит потому, что клик по гиперссылке не инициирует процесс выбора значения, а вызывает специальное событие нажатия.
Рассмотрим рабочие способы правильной настройки элементов формы.
Разберем самый простой и стандартный для платформы 1С 8.3 способ, не требующий написания программного кода.
Поле ввода.Истина (флажок включен).Да.Посмотрим на поведение платформы: при включенном режиме ТолькоПросмотр платформа автоматически блокирует ввод с клавиатуры, вызов диалога выбора и очистку поля клавишами. При этом пиктограмма лупы (кнопка открытия) остается активной, и по клику на нее платформа автоматически открывает форму связанного документа.
Если требуется нестандартная логика при нажатии на лупу, можно назначить обработчик события Открытие для данного поля:
&НаКлиенте
Процедура ИмяТабличнойЧастиИмяРеквизитаОткрытие(Элемент, СтандартнаяОбработка)
// При необходимости можно отключить стандартное действие
// СтандартнаяОбработка = Ложь;
ТекущиеДанные = Элементы.ИмяТабличнойЧасти.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено И ЗначениеЗаполнено(ТекущиеДанные.ИмяРеквизита) Тогда
ПоказатьЗначение(, ТекущиеДанные.ИмяРеквизита);
КонецЕсли;
КонецПроцедуры
Рассмотрим вариант, когда необходимо представить ссылку в виде текстовой гиперссылки, по клику на которую сразу происходит переход к документу.
Поле ввода на Поле надписи.Истина.Поле надписи по своей природе не поддерживает редактирование или удаление данных с клавиатуры, поэтому риск стирания значения полностью исключен. Обработку перехода реализуем на клиенте:
&НаКлиенте
Процедура ИмяТабличнойЧастиИмяРеквизитаНажатие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ТекущиеДанные = Элементы.ИмяТабличнойЧасти.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено И ЗначениеЗаполнено(ТекущиеДанные.ИмяРеквизита) Тогда
ПоказатьЗначение(, ТекущиеДанные.ИмяРеквизита);
КонецЕсли;
КонецПроцедуры
В конфигурациях на платформе 8.3 (включая «Бухгалтерию предприятия 3.0»), работающих в режиме без использования модальных окон, рекомендуется применять метод ПоказатьЗначение(...) или ОткрытьФорму(...) вместо устаревшего синхронного вызова ОткрытьЗначение(...).
Если необходимо оставить вид элемента Поле ввода, но отображать его как ссылку, настроим следующие параметры:
Истина.Истина.
&НаКлиенте
Процедура ИмяТабличнойЧастиИмяРеквизитаНажатие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ТекущиеДанные = Элементы.ИмяТабличнойЧасти.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
ПоказатьЗначение(, ТекущиеДанные.ИмяРеквизита);
КонецЕсли;
КонецПроцедуры
Таким образом, комбинация свойства ТолькоПросмотр с обработкой события Нажатие или использованием кнопки открытия позволяет полностью защитить ссылку от непреднамеренного изменения или удаления, сохраняя удобный просмотр связанных документов.