gifts2017

Работа с "Оповестить о выборе" и Контактной информацией

Опубликовал Ирина Удачливая (config) в раздел Программирование - Инструментарий

Решение задачи, как в табличную часть добавить адрес контрагента через форму выбора.
1.Что нужно сделать в форме-приемнике (форме Владельца)?
2.Что нужно сделать в форме-источнике (форме выбора Контактной информации)?
3.Что еще нужно сделать в форме-приемнике?
4.Как записать изменения Контактной информации из формы выбора?
5.А чем не подходит СписокЗначений?
6.Дополнительная информация
7.Вопрос к Знатокам

В Бухгалтерии 2.0 было так все просто:

		ФормаВыбора = РегистрыСведений.КонтактнаяИнформация.ПолучитьФормуСписка("ФормаСписка", ЭтаФорма);
		ФормаВыбора.РежимВыбора = Истина;

		ФормаВыбора.РегистрСведенийСписок.Отбор.Объект.Значение = Контрагент;
		ФормаВыбора.РегистрСведенийСписок.Отбор.Объект.Использование = Истина;

		СтруктураОтбораАдресов = Новый СписокЗначений;
		СтруктураОтбораАдресов.Добавить(Перечисления.ТипыКонтактнойИнформации.Адрес);
		ФормаВыбора.РегистрСведенийСписок.Отбор.Тип.ВидСравнения = ВидСравнения.ВСписке;
		ФормаВыбора.РегистрСведенийСписок.Отбор.Тип.Значение = СтруктураОтбораАдресов;
		ФормаВыбора.РегистрСведенийСписок.Отбор.Тип.Использование = Истина;
		ФормаВыбора.ЭлементыФормы.РегистрСведенийСписок.Колонки.Тип.Видимость = Ложь;

		ВыбранныйАдрес = ФормаВыбора.ОткрытьМодально();

		Если ЗначениеЗаполнено(ВыбранныйАдрес) Тогда
			Элемент.Значение = ВыбранныйАдрес;
		КонецЕсли;

Было написано немного кода, и все красиво и удобно работало, но при переходе на 3.0 мне пришлось "потанцевать"

1.Что нужно сделать в форме-приемнике (форме Владельца)

У нас есть некая табличная часть. В один из её реквизитов мы хотим добавить адрес контрагента, используя форму выбора адреса. В моем примере это "ТабличнаяЧасть1" с реквизитом "Адрес" типа Строка. Соотвественно в моей обработке есть и сам реквизит "Контрагент" типа СправочникСсылка.Контрагенты. Важно не забыть добавить кнопку выбора.

Структура обработки и КнопкаВыбора

Дальше объявляем у Адреса событие НачалоВыбора. В диалоговом окне выбираем только "на клиенте"

НачалоВыбора

В этом событии должен отработать следующий код:

&НаКлиенте
Процедура ТабличнаяЧасть1АдресНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	//Не забудем отменить Стнадартную обработку
	СтандартнаяОбработка = Ложь;
	
	//Проверим, чтобы был выбран контрагент
	Если Объект.СсылкаКонтрагент.Пустая() Тогда
		ВвестиЗначение(Объект.СсылкаКонтрагент, "Выберите контрагента");
	КонецЕсли;
	
	Если НЕ Объект.СсылкаКонтрагент.Пустая() Тогда
		
		//Откроем форму выбора адреса
		//В параметры можно передать все необходимые данные для формы выбора. Но в нашем случае это только Контрагент
		ПараметрыФормы = Новый Структура();
		ПараметрыФормы.Вставить("СсылкаКонтрагент", Объект.СсылкаКонтрагент);
		
		ОткрытьФорму("ВнешняяОбработка.ПримерРаботыСОповеститьОВыборе.Форма.ВыборАдреса", ПараметрыФормы, ЭтаФорма); 
		
	КонецЕсли;

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

2.Что нужно сделать в форме-источнике

Дошли до формы выбора адреса. У меня получилась такая простенькая форма:

Форма Выбора адреса

Нам понадобятся два реквизита СпрОбъект (тип СправочникОбъект.Контрагенты) и соответственно СсылкаКонтрагент. Вытаскиваем (перетягиваем) на форму Табличную часть "Контактная информация" у СпрОбъект и ничего заполнять не надо, просто в дальнейшем получим объект у СсылкаКонтрагент и информация будет отражаться на форме.

Что необходимо сделать в модуле формы выбора:

Во-первых,

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	// Заполним реквизиты формы из ранее переданных параметров.
	ЗаполнитьЗначенияСвойств(ЭтаФорма, Параметры, "СсылкаКонтрагент");
КонецПроцедуры

Во-вторых, получим объект у Контрагента, чтобы заполнилась табличная часть Контактной информации на форме

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	ПриОткрытииНаСервере();
КонецПроцедуры

&НаСервере
Процедура ПриОткрытииНаСервере()
	
	//Заполним таблицу контактной информации
	КонтрагентОбъект = СсылкаКонтрагент.ПолучитьОбъект();
	ЗначениеВРеквизитФормы(КонтрагентОбъект, "СпрОбъект");  
	                                                                            
КонецПроцедуры

В-третьих, у табличной части объявляем событие "Выбор" только "на клиенте" и добавляем ОповеститьОВыборе

&НаКлиенте
Процедура СпрОбъектКонтактнаяИнформацияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	
	//Ключ структуры - имя реквизита формы-владельца
	СтруктураРезультат = Новый Структура();
	СтруктураРезультат.Вставить("Адрес",         Элемент.ТекущиеДанные.Представление);
	СтруктураРезультат.Вставить("АдресЗаполнено",  Истина); //чтобы не пропала строка
	ЗаполнитьЗначенияСвойств(СтруктураРезультат, ЭтаФорма);
	ОповеститьОВыборе(СтруктураРезультат);
	
КонецПроцедуры

3.Что еще нужно сделать в форме-приемнике


Объявить процедуру ОбработкаВыбора только "на клиенте" и вставить подобный код:

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
	
	ДанныеСтроки = Новый Структура("Адрес, АдресЗаполнено");  //имя заполняемого реквизита
	ТекущиеДанные = Элементы.ТабличнаяЧасть1.ТекущиеДанные;
	
	ЗаполнитьЗначенияСвойств(ДанныеСтроки, ВыбранноеЗначение); //заполним структуру

	ЗаполнитьЗначенияСвойств(ТекущиеДанные, ДанныеСтроки); //заполним табличную часть
	
	Модифицированность = Истина;

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

4.Как записать изменения Контактной информации из формы выбора

Как видно из рисунка выше, у меня объявлена Команда формы - ЗаписатьИзменения. На ней "висит" следующая процедура:

//Записать изменения
&НаКлиенте
Процедура ЗаписатьИзменения(Команда)
	ЗаписатьИзмененияНаСервере();
КонецПроцедуры

&НаСервере
Процедура ЗаписатьИзмененияНаСервере()
	
	НовыеДанные= Новый ТаблицаЗначений;
	НовыеДанные=СпрОбъект.КонтактнаяИнформация.Выгрузить();
	
	
	ОбъектКонтрагент = СсылкаКонтрагент.ПолучитьОбъект();
	
	ОбъектКонтрагент.КонтактнаяИнформация.Загрузить(НовыеДанные);
	
	ОбъектКонтрагент.Записать();

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

5.А чем не подходит СписокЗначений?

У меня был момент поробовать через простой способ выбора - через список значений, но у меня получилась слишком неудобная штука, слишком много выпадающих вниз адресов

СписокЗначений

На всякий случай - Как сделать выбором список значений:

&НаКлиенте
Процедура ТабличнаяЧасть1НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	ДанныеВыбора = Новый СписокЗначений;
	ДанныеВыбора.ЗагрузитьЗначения(ТабличнаяЧасть1НачалоВыбораНаСервере());      

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

&НаСервере
Функция ТабличнаяЧасть1НачалоВыбораНаСервере()
	
	ПараметрыОтбора = Новый Структура;
	ПараметрыОтбора.Вставить("Тип",Перечисления.ТипыКонтактнойИнформации.Адрес);
	НайденныеСтроки = Объект.Контрагент.КонтактнаяИнформация.НайтиСтроки(ПараметрыОтбора);
	МассивВыбора = Новый Массив;
	Для Каждого Строка из НайденныеСтроки Цикл
		МассивВыбора.Добавить(Строка.Представление);
	КонецЦикла;	
	Возврат МассивВыбора;

КонецФункции

6.Дополнительная информация

Обработка тестировалась на Бухгалтерии 3.0 на двух релизах - 3.0.42.85 и 3.0.36.11.

В теории подойдет конечно ко всем конфигурациям, где Контактная информация хранится в Табличной части справочника Контрагентов.

Кое-что взято с этой публикации http://infostart.ru/public/270979/

7.Вопрос к Знатокам

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

ПропажаСтроки

Вопрос очень простой: Что же делать, как же быть в такой ситуации?

Покопавшись самостоятельно, удалось найти, что в самых свежих релизах Бухгалтерии 3.0 такая ошибка не воспроизводится. Разработчики добавили реквизит формы типа "Булево" (у меня это АдресЗаполнено, у них это АналитикаУчетаЗаполнена) и его в ОбработкеВыбора исходной формы заполняют. НО если (с учетом этого добавления) запустить мою обработку на старом релизе - строчка пропадет, если на новом - останется. Платформу при этом не меняем. В связи с этим, всё равно хочется докопаться до сути. КАК при одной платформе, но разных релизах один и тот же код отрабатывает по-разному, учитывая, что никакие общие модули не используем?

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
ПримерРаботыСОповеститьОВыборе.epf
.epf 12,89Kb
16.12.15
0
.epf 12,89Kb 0 Скачать

См. также

Contragent+ 5.0 от 2 500
Подписаться Добавить вознаграждение
В этой теме еще нет сообщений.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа