Дано: Есть объект с реквизитом, в котором храниться ссылочное значение с определенным представлением элементов. Необходимо на форме нашего объекта отображать элемент отличным от предопределенного способом, оставив возможность работы с ним: выбор из списка, очистка поля, открытие формы.
Наш объект:

Реквизит Операция содержит тип “ДокументСсылка.ОперацияБух”, который имеет представление вида “Операция (бухгалтерский и налоговый учет) 00000000001 от 10.08.2011 16:44:41”. Это красивое и емкое название нам не подходит, нам ближе простое и суровое “№00000000001 от 10.08.2011 г.”.
Реквизит Операция содержит тип “ДокументСсылка.ОперацияБух”, который имеет представление вида “Операция (бухгалтерский и налоговый учет) 00000000001 от 10.08.2011 16:44:41”. Это красивое и емкое название нам не подходит, нам ближе простое и суровое “№00000000001 от 10.08.2011 г.”.
Итак, приступим. Первым шагом создадим форму объекта. Она минималистична и прекрасна. Но в ней есть несколько интересных моментов.

1. ОперацияСтрокой – так названо наше поле ввода – никак не связано с реквизитом Операция. Разве, что названием. Это поле вообще не обременено связями ни с какими данными, имеет тип строка неограниченной длины.
2. Отмечены кнопки, которые будут присутствовать в нашем интерфейсе: КнопкаВыбора, КнопкаОчистки и КнопкаОткрытия.
3. Снят флажок с реквизита РедактированиеТекста.
Вот и все. Остальные немногочисленные действия производятся исключительно в модуле формы. Текст с комментариями вот он:
//Процедура, которая меняет отображение в нужное нам
Процедура ПолучитьОтображениеОперации()
Если ЗначениеЗаполнено(Операция) Тогда
ЭлементыФормы.ОперацияСтрокой.Значение = "№"+Строка(Операция.Номер)+
" от "+Формат(Операция.Дата, "ДФ='dd.MM.yyyy ""г.""'");
Иначе
ЭлементыФормы.ОперацияСтрокой.Значение = "###";
КонецЕсли;
КонецПроцедуры
//Позаботимся о том, чтобы при открытии формы поле уже выглядело так, как нам надо
Процедура ПриОткрытии()
ПолучитьОтображениеОперации();
КонецПроцедуры
//Открытие операции
Процедура ОперацияСтрокойОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если Не ЗначениеЗаполнено(Операция) Тогда
Возврат;
КонецЕсли;
ФормаДокумента = Операция.ПолучитьФорму("ФормаДокумента");
Если НЕ ФормаДокумента.Открыта() Тогда
ФормаДокумента.Открыть();
Иначе
ФормаДокумента.Активизировать();
КонецЕсли;
КонецПроцедуры
//Очищаем не только поле ввода, но и значение, хранимое в реквизите
Процедура ОперацияСтрокойОчистка(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Операция = Документы.ОперацияБух.ПустаяСсылка();
ПолучитьОтображениеОперации();
КонецПроцедуры
//Организуем выбор из списка
Процедура ОперацияСтрокойНачалоВыбора(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ФормаВыбора = Документы.ОперацияБух.ПолучитьФормуВыбора();
ФормаВыбора.ВладелецФормы = Элемент;
Если НЕ ФормаВыбора.Открыта() Тогда
ФормаВыбора.Открыть();
Иначе
ФормаВыбора.Активизировать();
КонецЕсли;
КонецПроцедуры
//Обрабатываем выбор, установив значение в реквизит и обновив отображение
Процедура ОперацияСтрокойОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Операция = ВыбранноеЗначение;
ПолучитьОтображениеОперации();
КонецПроцедуры
Этим небольшим количеством текста мы добились желаемого: вольное отображение реквизита и стандартная работа с ним:

Комментариев нет:
Отправить комментарий
Подумать, что мне не наплевать.