8.х Как передать выбранную строку динамического списка в форму владелец

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Bkmz, 20 мар 2017.

  1. TopicStarter Overlay
    Bkmz
    Online

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    277
    Симпатии:
    7
    Баллы:
    29
    Есть ФормаДокумента в табличной части которой есть поле в котором я выбираю партию. При выборе я открываю общую форму со списком приходных. Как мне обратно передать выбранное значение из списка?

    [​IMG]
  2. TopicStarter Overlay
    Bkmz
    Online

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    277
    Симпатии:
    7
    Баллы:
    29
    Сделал через Оповестить();

    В модуле формы в которой я выбираю партию:
    [​IMG]

    Код:
    &НаКлиенте
    Процедура ПриходныеВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
        ЭтаФорма.Закрыть();
        Оповестить("Выбрана партия", ЭтаФорма.ТекущийЭлемент.ТекущиеДанные.Партия);
    КонецПроцедуры
    
    В модуле формы в которой я принимаю партию:

    Код:
    &НаКлиенте
    Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
        Если ИмяСобытия = "Выбрана партия" Тогда
            ЭтаФорма.ТекущийЭлемент.ТекущиеДанные.Партия = Параметр;  
        КонецЕсли;
    КонецПроцедуры
    
    Возможны еще какие-то варианты? Насколько этот правильный?
  3. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    15.150
    Симпатии:
    554
    Баллы:
    204
    Да нормуль все, главное чтобы потом не запутаться, какое имя события должно быть.
  4. TopicStarter Overlay
    Bkmz
    Online

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    277
    Симпатии:
    7
    Баллы:
    29
    Я думаю стоит еще проверить на владельца формы. Чтобы во всех открытых формах не менять текущую строку.
  5. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    15.150
    Симпатии:
    554
    Баллы:
    204
    Нее, тут не совсем так. Вы использовали обработчик для всей таблицы, на мой взгляд это не совсем корректно, т.к. вы изменяете значение только в одной колонке. Если потребуется добавить еще одну колонку, то нужно будет следить, чтобы код отрабатывал верно именно для колонки с партией. Мне кажется это немного лишнее, ИМХО :)
  6. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    8.592
    Симпатии:
    876
    Баллы:
    204
    У меня реализован выбор договора контрагента вот так:

    Код:
    &НаКлиенте
    Процедура ТабЧастьПриАктивацииЯчейки(Элемент)
    
    Список = Новый СписокЗначений;
    .....добавляем в список значения....
    
    ПоказатьВыборИзМеню(Новый ОписаниеОповещения("ОбработкаВыпускВекселя", ЭтаФорма, Новый Структура("ТекВалюта, ТекущиеДанные", ТекВалюта, ТекущиеДанные)), Список);
    
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ОбработкаВыпускВекселя(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт
       
        ТекВалюта = ДополнительныеПараметры.ТекВалюта;
        ТекущиеДанные = ДополнительныеПараметры.ТекущиеДанные;
       
        Если ВыбранныйЭлемент = Неопределено тогда
            Возврат;
        КонецЕсли;   
       
        Если ВыбранныйЭлемент.Значение = "Очистить" Тогда
            ТекущиеДанные.Вексель = ПредопределенноеЗначение("Справочник.ДоговорыКонтрагентов.ПустаяСсылка");
            Возврат;
        КонецЕсли;   
       
        Если ВыбранныйЭлемент.Значение = "Ничего" Тогда
            ПараметрыФормы = Новый Структура("ТекущаяСтрока", ВыбранныйВладелецВыпуск);
            ОткрытьФорму("Справочник.Контрагенты.Форма.ФормаВыбораУправляемая", ПараметрыФормы, , , , ,Новый ОписаниеОповещения("ОбработкаВыборКонтрагентаЗавершение", ЭтаФорма, Новый Структура("ВыбранныйЭлемент, ТекВалюта, ТекущиеДанные", ВыбранныйЭлемент, ТекВалюта, ТекущиеДанные)));
            Возврат;
        КонецЕсли;   
       
        ОбработкаВыпускВекселяФрагмент(ВыбранныйЭлемент, ТекВалюта, ТекущиеДанные);
       
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ОбработкаВыпускВекселяФрагмент(Знач ВыбранныйЭлемент, Знач ТекВалюта, Знач ТекущиеДанные)
       
        Перем Ответ, СвойстваВекселяСтруктура, ТекстВопроса;
       
        Если ВыбранныйЭлемент.Значение = "Ничего" ИЛИ ВыбранныйЭлемент.Значение = "В" Тогда
           
            ПараметрыОтбора = Новый Структура("Владелец", ВыбранныйВладелецВыпуск);
            ПараметрыФормы = Новый Структура("Отбор, ТекущаяСтрока", ПараметрыОтбора, ВыбранныйРодительВыпуск);
       
            ОткрытьФорму("Справочник.ДоговорыКонтрагентов.Форма.ФормаВыбораГруппыУправляемая", ПараметрыФормы, , , , , Новый ОписаниеОповещения("ОбработкаВыборГруппыДоговораЗавершение", ЭтаФорма, Новый Структура("ТекВалюта, ТекущиеДанные", ТекВалюта, ТекущиеДанные)));
            Возврат;
           
        КонецЕсли;
       
        ОбработкаВыпускВекселяФрагментФрагмент(ТекВалюта, ТекущиеДанные);
       
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ОбработкаВыпускВекселяФрагментФрагмент(Знач ТекВалюта, Знач ТекущиеДанные)
       
        Перем Ответ, СвойстваВекселяСтруктура, ТекстВопроса;
       
        ШаблонЗаполненияСтруктура = ПолучитьШаблонЗаполненияНаСервере();
       
        СвойстваВекселяСтруктура = Новый Структура("Организация, Родитель, Владелец, Наименование, ВалютаВзаиморасчетов, ДатаВозникновенияОбязательства, ДатаПогашенияОбязательства, Процент, Abacus_ID, ВидОбъекта, ШаблонЗаполненияСтруктура",
        Объект.Организация, ВыбранныйРодительВыпуск, ВыбранныйВладелецВыпуск, "Вексель " + СокрЛП(ТекущиеДанные.SERIES) + "-" + СокрЛП(ТекущиеДанные.NUMER), ТекВалюта, ТекущиеДанные.CREATE_DATE, ТекущиеДанные.MIN_CLOSE_DATE, ТекущиеДанные.PCT_RATE, ТекущиеДанные.BILL_ID, ПредопределенноеЗначение("Перечисление.ВидыОбъектовАБАКУС.ДоговорыКонтрагентов"), ШаблонЗаполненияСтруктура);
       
        Если НЕ ЗначениеЗаполнено(ТекущиеДанные.Вексель) Тогда
           
            Если СоответствиеОбъектаСуществует(СвойстваВекселяСтруктура) Тогда
               
                ТекстВопроса = "Уже существует соответствие векселя. Обновить?";
               
                ПоказатьВопрос(Новый ОписаниеОповещения("ОбработкаПодтверждениеОбновленияСвязиВекселяЗавершение", ЭтаФорма, Новый Структура("СвойстваВекселяСтруктура, ТекущиеДанные", СвойстваВекселяСтруктура, ТекущиеДанные)), ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет);
                Возврат;           
               
            КонецЕсли;
           
            ОбработкаВыпускВекселяФрагментФрагментФрагмент(СвойстваВекселяСтруктура, ТекущиеДанные);
           
        Иначе
            ПоказатьПредупреждение(, "В поле уже указан вексель!" + Символы.ПС + "Для продолжения необходимо очистить поле Вексель");
        КонецЕсли;
    
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ОбработкаВыпускВекселяФрагментФрагментФрагмент(Знач СвойстваВекселяСтруктура, Знач ТекущиеДанные)
       
        СоздатьСобственныйВексель(СвойстваВекселяСтруктура);
       
        ЗаписатьСоответствиеОбъекта(СвойстваВекселяСтруктура);
       
        ТекущиеДанные.Вексель = СвойстваВекселяСтруктура.ОбъектСсылка;
       
        Модифицированность = Истина;
    
    КонецПроцедуры
  7. 1с-ник
    Online

    1с-ник Профессионал в 1С

    Регистрация:
    5 окт 2014
    Сообщения:
    906
    Симпатии:
    152
    Баллы:
    104
    Только я не вижу режим выбора, где кнопка "Выбрать"?
    Номад, так у него самопальная форма, а у тебя выбора :)
  8. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    8.592
    Симпатии:
    876
    Баллы:
    204
    Какая разница, какая форма? :)
  9. 1с-ник
    Online

    1с-ник Профессионал в 1С

    Регистрация:
    5 окт 2014
    Сообщения:
    906
    Симпатии:
    152
    Баллы:
    104
    http://v8.1c.ru/metod/faq2/answer.jsp?id=628
    Правда ответ не актуален, т.к. довольно часто произвольные формы имитируют как форму выбора, но все-таки не так, как сделал автор, а с изменением режима выбора, чтобы она хотя бы была похожа на форму выбора. А в данном случае открывается произвольная форма, не понятно с которой что делать. Вот была бы там кнопка "Выбрать" - я бы сразу понял, что это такое и куда "клацать".
    Bkmz нравится это.
  10. TopicStarter Overlay
    Bkmz
    Online

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    277
    Симпатии:
    7
    Баллы:
    29
    Резонно. Спасибо
    --- Объединение сообщений, 21 мар 2017 ---
    Гуглил информацию по параметру:
    Но так и не понял его принцип работы. "ОбработкаВыборКонтрагентаЗавершение" - это имя процедуры которая должна выполнятся когда закроется форма "
    Справочник.Контрагенты.Форма.ФормаВыбораУправляемая"? Она только оповещает или может еще и выполнить какой-то код в зависимости от того какие параметры вернет закрываемая форма? Или я вообще все неправильно понял?
    Последнее редактирование: 21 мар 2017
  11. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    8.592
    Симпатии:
    876
    Баллы:
    204
    Она закрывается при выборе, возвращая выбранное значение - типовой механизм работы формы выбора.
    Если форма своя, то в режиме выбора она так же должна возвращать выбранное значение.
  12. TopicStarter Overlay
    Bkmz
    Online

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    277
    Симпатии:
    7
    Баллы:
    29
    А можно какую-то ссылку с показательным примером?
  13. TopicStarter Overlay
    Bkmz
    Online

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    277
    Симпатии:
    7
    Баллы:
    29
    Разобрался. Сделал так:

    В модуле формы из которой открывается общая форма:

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

    Код:
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
         Приходные.Параметры.УстановитьЗначениеПараметра("Номенклатура", Параметры.Номенклатура);  // Устанавливаю параметр в произвольный запрос динамического списка
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ПриходныеВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)   // Процедура устанавливается в событии "Выбор" динамического списка
        ЭтаФорма.Закрыть(ЭтаФорма.ТекущийЭлемент.ТекущиеДанные.Партия);   // Передаю выбранную Партию в параметре метода Закрыть().
    КонецПроцедуры
    
    Отказ от использования модальных окон в платформе 1С:Предприятие 8.3
    http://курсы-по-1с.рф/news/отказ-от-модальных-окон-в-1с-8-3/
    Последнее редактирование: 22 мар 2017

Поделиться этой страницей