I. Решение задачи для для конфигураций на платформе 8.2, обычных форм, Бухгалтерии 2.0
пример кода для выбора адреса из Контактной информации:
ФормаВыбора = РегистрыСведений.КонтактнаяИнформация.ПолучитьФормуСписка("ФормаСписка", ЭтаФорма);
ФормаВыбора.РежимВыбора = Истина;
ФормаВыбора.РегистрСведенийСписок.Отбор.Объект.Значение = Контрагент;
ФормаВыбора.РегистрСведенийСписок.Отбор.Объект.Использование = Истина;
СтруктураОтбораАдресов = Новый СписокЗначений;
СтруктураОтбораАдресов.Добавить(Перечисления.ТипыКонтактнойИнформации.Адрес);
ФормаВыбора.РегистрСведенийСписок.Отбор.Тип.ВидСравнения = ВидСравнения.ВСписке;
ФормаВыбора.РегистрСведенийСписок.Отбор.Тип.Значение = СтруктураОтбораАдресов;
ФормаВыбора.РегистрСведенийСписок.Отбор.Тип.Использование = Истина;
ФормаВыбора.ЭлементыФормы.РегистрСведенийСписок.Колонки.Тип.Видимость = Ложь;
ВыбранныйАдрес = ФормаВыбора.ОткрытьМодально();
Если ЗначениеЗаполнено(ВыбранныйАдрес) Тогда
Элемент.Значение = ВыбранныйАдрес;
КонецЕсли;
II. Решение задачи через СписокЗначений для конфигураций на платформе 8.3, управляемых форм, Бухгалтерии 3.0
пример кода:
&НаКлиенте
Процедура ТабличнаяЧасть1НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ДанныеВыбора = Новый СписокЗначений;
ДанныеВыбора.ЗагрузитьЗначения(ТабличнаяЧасть1НачалоВыбораНаСервере());
КонецПроцедуры
&НаСервере
Функция ТабличнаяЧасть1НачалоВыбораНаСервере()
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Тип", Перечисления.ТипыКонтактнойИнформации.Адрес);
НайденныеСтроки = Объект.Контрагент.КонтактнаяИнформация.НайтиСтроки(ПараметрыОтбора);
МассивВыбора = Новый Массив;
Для Каждого Строка из НайденныеСтроки Цикл
МассивВыбора.Добавить(Строка.Представление);
КонецЦикла;
Возврат МассивВыбора;
КонецФункции
Получившийся выпадающий список адресов:
(мне показалось неудобным искать адрес, если данных в регистре много, поэтому предлагаю другой вариант ниже)
III. Решение задачи через ФормуВыбора для конфигураций на платформе 8.3, управляемых форм, Бухгалтерии 3.0
III.1.Что нужно сделать в форме-приемнике (форме Владельца)
У нас есть некая табличная часть. В один из её реквизитов мы хотим добавить адрес контрагента, используя форму выбора адреса. В моем примере это "ТабличнаяЧасть1" с реквизитом "Адрес" типа Строка. Соотвественно в моей обработке есть и сам реквизит "Контрагент" типа СправочникСсылка.Контрагенты. Важно не забыть добавить кнопку выбора.
Дальше объявляем у Адреса событие НачалоВыбора. В диалоговом окне выбираем только "на клиенте"
В этом событии должен отработать следующий код:
&НаКлиенте
Процедура ТабличнаяЧасть1АдресНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
//Не забудем отменить Стнадартную обработку
СтандартнаяОбработка = Ложь;
//Проверим, чтобы был выбран контрагент
Если Объект.СсылкаКонтрагент.Пустая() Тогда
ВвестиЗначение(Объект.СсылкаКонтрагент, "Выберите контрагента");
КонецЕсли;
Если НЕ Объект.СсылкаКонтрагент.Пустая() Тогда
//Откроем форму выбора адреса
//В параметры можно передать все необходимые данные для формы выбора. Но в нашем случае это только Контрагент
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить("СсылкаКонтрагент", Объект.СсылкаКонтрагент);
ОткрытьФорму("ВнешняяОбработка.ПримерРаботыСОповеститьОВыборе.Форма.ВыборАдреса", ПараметрыФормы, ЭтаФорма);
КонецЕсли;
КонецПроцедуры
III.2.Что нужно сделать в форме-источнике
Дошли до формы выбора адреса. У меня получилась такая простенькая форма:
Нам понадобятся два реквизита СпрОбъект (тип СправочникОбъект.Контрагенты) и соответственно СсылкаКонтрагент. Вытаскиваем (перетягиваем) на форму Табличную часть "Контактная информация" у СпрОбъект и ничего заполнять не надо, просто в дальнейшем получим объект у СсылкаКонтрагент и информация будет отражаться на форме.
Что необходимо сделать в модуле формы выбора:
Во-первых,
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Заполним реквизиты формы из ранее переданных параметров.
ЗаполнитьЗначенияСвойств(ЭтаФорма, Параметры, "СсылкаКонтрагент");
КонецПроцедуры
Во-вторых, получим объект у Контрагента, чтобы заполнилась табличная часть Контактной информации на форме
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПриОткрытииНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПриОткрытииНаСервере()
//Заполним таблицу контактной информации
КонтрагентОбъект = СсылкаКонтрагент.ПолучитьОбъект();
ЗначениеВРеквизитФормы(КонтрагентОбъект, "СпрОбъект");
КонецПроцедуры
В-третьих, у табличной части объявляем событие "Выбор" только "на клиенте" и добавляем ОповеститьОВыборе
&НаКлиенте
Процедура СпрОбъектКонтактнаяИнформацияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
//Ключ структуры - имя реквизита формы-владельца
СтруктураРезультат = Новый Структура();
СтруктураРезультат.Вставить("Адрес", Элемент.ТекущиеДанные.Представление);
СтруктураРезультат.Вставить("АдресЗаполнено", Истина); //чтобы не пропала строка
ЗаполнитьЗначенияСвойств(СтруктураРезультат, ЭтаФорма);
ОповеститьОВыборе(СтруктураРезультат);
КонецПроцедуры
III.3.Что еще нужно сделать в форме-приемнике
Объявить процедуру ОбработкаВыбора только "на клиенте" и вставить подобный код:
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
ДанныеСтроки = Новый Структура("Адрес, АдресЗаполнено"); //имя заполняемого реквизита
ТекущиеДанные = Элементы.ТабличнаяЧасть1.ТекущиеДанные;
ЗаполнитьЗначенияСвойств(ДанныеСтроки, ВыбранноеЗначение); //заполним структуру
ЗаполнитьЗначенияСвойств(ТекущиеДанные, ДанныеСтроки); //заполним табличную часть
Модифицированность = Истина;
КонецПроцедуры
III.4.Как записать изменения Контактной информации из формы выбора
Как видно из рисунка выше, у меня объявлена Команда формы - ЗаписатьИзменения. На ней "висит" следующая процедура:
//Записать изменения
&НаКлиенте
Процедура ЗаписатьИзменения(Команда)
ЗаписатьИзмененияНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаписатьИзмененияНаСервере()
НовыеДанные = Новый ТаблицаЗначений;
НовыеДанные = СпрОбъект.КонтактнаяИнформация.Выгрузить();
ОбъектКонтрагент = СсылкаКонтрагент.ПолучитьОбъект();
ОбъектКонтрагент.КонтактнаяИнформация.Загрузить(НовыеДанные);
ОбъектКонтрагент.Записать();
КонецПроцедуры
IV. Вопрос к Знатокам- "Баг или криворук?"
Все замечательно работает. Но есть одно непонятное мне действо. Если в добавленной строке Табличной части источника ничего не заполнено, а мы пользуемся ОповеститьОВыборе(), то только что добавленная строчка исчезает. Причем это проявляется даже в типовой Бухгалтерии. Например, берем документ Реализация(услуги), добавляем строчку в Табличную часть, не выбирая Номенклатуру пытаемся сначала установить Счета учета. Открывается форма выбора, выставляем счета, нажимаем на ОК. В документе появляется строчка. Но стоит щелкнуть мышкой в другом месте, строчка пропадет.
Вопрос очень простой: Что же делать, как же быть в такой ситуации?
Покопавшись самостоятельно, удалось найти, что в самых свежих релизах Бухгалтерии 3.0 такая ошибка не воспроизводится. Разработчики добавили реквизит формы типа "Булево" (у меня это АдресЗаполнено, у них это АналитикаУчетаЗаполнена) и его в ОбработкеВыбора исходной формы заполняют. НО если (с учетом этого добавления) запустить мою обработку на старом релизе - строчка пропадет, если на новом - останется. Платформу при этом не меняем. В связи с этим, всё равно хочется докопаться до сути. КАК при одной платформе, но разных релизах один и тот же код отрабатывает по-разному, учитывая, что никакие общие модули не используем?
Печатные формы для БП 3.0: УПД, ТОРГ-12, Акт, Счет-фактура, Доверенность, Счет
УПД с прочерками
Печать документов за поставщика
Платежная ведомость Т-53
Печать почтовых конвертов
[Расширение] Разрешить редактировать Счета на оплату после установки Даты запрета изменения данных
[Расширение] Исключение Актов сверок из Даты запрета изменения данных
[Расширение] Форма списка Счета на оплату, с возможностью отбора тех ссылок, у которых нет подчиненных документов (не выписана реализация)