Форма выбора с отбором

III. Решение задачи через ФормуВыбора для конфигураций на платформе 8.3, управляемых форм, Бухгалтерии 3.0

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

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

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

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

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

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

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

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

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

Во-первых,

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

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

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

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

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

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

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

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

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

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

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

IV. Вопрос к Знатокам- «Баг или криворук?»

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

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

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