|
Выбор записи из регистра сведений в режиме формы выбора
|
Раз была поставлена задача добавить реквизит "Основное средство" в документ. Но
заполняться этот реквизит с формы документа должен был исключительно
транспортными средствами из регистра сведений "Регистрация транспортных
средств". Реквизит был добавлен и когда началось изготовление обработки выбора,
то выяснилось, что из формы списка регистра сведений строчку не выберешь. Что
делать? Задача была решена следующим образом.
Чтобы не портить типовой функционал регистра добавлением в него своей формы
выбора решено было сделать следующее. Создать внешнюю обработку, поместить ее в
справочник внешних обработок и при заполнении выше указанного реквизита вызывать
и использовать в качестве формы выбора из регистра. Теперь подробнее о том, как
это было сделано. Обо
всем по порядку.
Первым делом открываем конфигуратор и создаем новый внешнюю обработку.
Добавим поле ввода для выбора и надпись для информативности.

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

Повесим на это табличное поле обработчик выбора:
Процедура ПроизвольноеТабличноеПолеВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
ОповеститьОВыборе(ВыбраннаяСтрока);
Оповестить(ВыбраннаяСтрока, ВыбраннаяСтрока);
КонецПроцедуры
Сохраним эту обработку и поместим ее в справочник внешних обработок в режиме
клиента. Запомним наименование этой обработки, которое дадим в справочнике. По
этому имени будем искать ее через запрос далее.
Теперь в обработке выбора записи из регистра на кнопку выбора
добавим следующий код:
Процедура ТранспортноеСредствоНачалоВыбора(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ВнешниеОбработки.Ссылка КАК Обработка,
| ВнешниеОбработки.ВидОбработки,
| ВнешниеОбработки.Наименование,
| ВнешниеОбработки.Код
|ИЗ
| Справочник.ВнешниеОбработки КАК ВнешниеОбработки
|ГДЕ
| ВнешниеОбработки.Наименование = &Наименование";
Запрос.УстановитьПараметр("Наименование", "Вспомогательная внешняя обработка");
ЗапросРезультат = Запрос.Выполнить().Выбрать();
Если ЗапросРезультат.Следующий() Тогда
ОбработкаКод = ЗапросРезультат.Код;
Обработка = Справочники.ВнешниеОбработки.НайтиПоКоду(ОбработкаКод);
ИмяФайла = ПолучитьИмяВременногоФайла();
ДвоичныеДанные = Обработка.ХранилищеВнешнейОбработки.Получить();
ДвоичныеДанные.Записать(ИмяФайла);
ВнешняяОбработка = ВнешниеОбработки.ПолучитьФорму(ИмяФайла);
Иначе
ВнешняяОбработка = Неопределено;
КонецЕсли;
Если Не ВнешняяОбработка = Неопределено Тогда
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| РегистрацияТранспортныхСредствСрезПоследних.ОсновноеСредство КАК ОС,
| РегистрацияТранспортныхСредствСрезПоследних.Организация
|ИЗ
| РегистрСведений.РегистрацияТранспортныхСредств.СрезПоследних КАК РегистрацияТранспортныхСредствСрезПоследних";
ЗапросРезультат = Запрос.Выполнить().Выбрать();
ЗапросРезультатКолонки = Запрос.Выполнить().Колонки;
Для Сч = 0 По ЗапросРезультатКолонки.Количество() - 1 Цикл
ВнешняяОбработка.ЭлементыФормы.ПроизвольноеТабличноеПоле.Колонки.Добавить(ЗапросРезультатКолонки[Сч].Имя);
ВнешняяОбработка.ЭлементыФормы.ПроизвольноеТабличноеПоле.Колонки[Сч].Данные = ЗапросРезультатКолонки[Сч].Имя;
ВнешняяОбработка.ЭлементыФормы.ПроизвольноеТабличноеПоле.Колонки[Сч].ТолькоПросмотр = Истина;
ВнешняяОбработка.ПроизвольноеТабличноеПоле.Колонки.Добавить(ЗапросРезультатКолонки[Сч].Имя);
КонецЦикла;
ВнешняяОбработка.ЭлементыФормы.ПроизвольноеТабличноеПоле.Значение = Запрос.Выполнить().Выгрузить();
ОткрытьФорму(ВнешняяОбработка,,ЭтаФорма);
КонецЕсли;
КонецПроцедуры
И еще добавим процедуру обработки оповещения:
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
ОС = Параметр.ОС.ПолучитьОбъект();
ТранспортноеСредство = ОС.Ссылка;
ЭлементыФормы.НадписьТС.Заголовок = ОС.Наименование + ", " + ОС.Код;
КонецПроцедуры
Сохраняем нашу обработку. Запускаем ее в клиенте и пробуем получить результат. В
поле ввода появляется ссылка на основное средство, а надпись выводит его
наименование и код.
Данное решение не претендует на исключительность, но может быть использовано,
как пример.
|
|