Выбор Адреса контрагента из Контактной информации. Пример работы с "Оповестить о выборе"

16.01.23

Задачи пользователя - Адаптация типовых решений

Решение задачи выбора Адреса контрагента из Контактной информации на платформах 8.2, 8.3, на обычных и управляемых формах, Бухгалтерии 2.0 и 3.0

Скачать исходный код

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

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 бухгалтерия пропадает строка справочник контрагентов форма контактной

См. также

Табличная часть в доп. реквизитах и формирование таблиц в шаблоне docx для 1С:ДО 3.0

Адаптация типовых решений Платформа 1С v8.3 1С:Документооборот Россия Платные (руб)

Расширение конфигурации для «1С:Документооборот КОРП», редакция 3.0. позволяет: 1.использовать произвольные табличные части в качестве дополнительных реквизитов к документу; 2 использовать произвольные табличные части в шаблонах в формате docx для автоматического заполнения таблиц.

29400 руб.

29.06.2023    4659    9    5    

18

Расширение для 1С:УНФ. Автоматическое снятие резервов в Заказах покупателей

Логистика, склад и ТМЦ Адаптация типовых решений Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Управленческий учет Платные (руб)

Чтобы не допустить путаницы с обещаниями клиентам и для четкого контроля исполнения заказов мы используем резервирование товаров. Мы доработали УНФ, чтобы она автоматически отменяла старые резервы и не мешала эффективно продавать.

7200 руб.

02.08.2023    3082    4    0    

20

Создать на основании - своя кнопка (БСП). Проблема двух подменю Создать на основании

БСП (Библиотека стандартных подсистем) Адаптация типовых решений Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Понадобилось в подменю "Создать на основании" добавить свою команду, которая открывает обработку. В процессе доработок появилась проблема двух подменю "Создать на основании". В статье о том, как решились проблемы.

01.03.2024    1701    dimanich70    8    

14

Доработка отчета "Связанные документы" (структура подчиненности) для вывода объектов из любого расширения

Адаптация типовых решений Платформа 1С v8.3 1С:Управление торговлей 11 Россия Абонемент ($m)

Доработка типового отчета "Связанные документы" позволяет просто и быстро расширять состав объектов для построения структуры подчиненности документов, используя объекты основной конфигурации и любых расширений.

1 стартмани

27.10.2023    2112    19    avmartynov    14    

44

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2252    25    progmaster    8    

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. GAVe 10.01.17 17:13 Сейчас в теме
Пора скрывать это к БП 3.0 относится.
ИМХО, у всех уже БП 3.1.
2. spacecraft 10.01.17 17:23 Сейчас в теме
(1) и как оно там в будущем? Коммунизм победит?
3. Designer1C 448 28.11.19 17:54 Сейчас в теме
Благодарю за статью !
Как для меня, так очень доходчиво написано !
Быстро помогло решить одну интерфейсную задачку.
4. ilya4 20.01.21 19:49 Сейчас в теме
Тоже наблюдал баг с исчезновением заполненных реквизитов, когда есть передача данных между переменными типа "объект".
Для исправления мне помогло для передачи данных между объектом-реквизитом формы и объектом-источником воспользоваться командой КопироватьДанныеФормы(ОбъектИсточник,ОбъектНаФорме) , на сервере
Оставьте свое сообщение