Все об 1С8 - просто и доступно

Добавить в Избранное  Сделать Стартовой  Написать письмо

Главная Статьи Вопрос-ответ Экспресс-справочник Гостевая книга
Статьи по 1С

Выбор записи из регистра сведений в режиме формы выбора

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

Создание внешней обработки

Добавим поле ввода для выбора и надпись для информативности.

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

Вспомогательная внешняя обработка
Повесим на это табличное поле обработчик выбора:

Процедура ПроизвольноеТабличноеПолеВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)

	ОповеститьОВыборе(ВыбраннаяСтрока);
	Оповестить(ВыбраннаяСтрока, ВыбраннаяСтрока);

КонецПроцедуры

Сохраним эту обработку и поместим ее в справочник внешних обработок в режиме клиента. Запомним наименование этой обработки, которое дадим в справочнике. По этому имени будем искать ее через запрос далее.

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

		ОткрытьФорму(ВнешняяОбработка,,ЭтаФорма);
		//ОткрытьФорму(ВнешняяОбработка,,ЭтаФорма,,,, Новый ОписаниеОповещения("ВыполнитьПослеЗакрытияВопроса", ЭтаФорма, ));

	КонецЕсли;
	
КонецПроцедуры
И еще добавим процедуру обработки оповещения:
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	ОС = Параметр.ОС.ПолучитьОбъект();
	ТранспортноеСредство = ОС.Ссылка; 
	ЭлементыФормы.НадписьТС.Заголовок = ОС.Наименование + ", " + ОС.Код;
КонецПроцедуры
Сохраняем нашу обработку. Запускаем ее в клиенте и пробуем получить результат. В поле ввода появляется ссылка на основное средство, а надпись выводит его наименование и код.
 
Данное решение не претендует на исключительность, но может быть использовано, как пример.