Передача данных между управляемыми формами

08.05.2018

Теги: 1С:ПредприятиеДокументОбработкаВыбораОткрытьФормуСписокСправочникУправляемаяФорма

Пусть у нас есть есть документ ПриходнаяНакладная с табличной частью Состав. Для этого документа необходимо реализовать подбор номенклатур в табличную часть. Должна быть возможность переносить в документ несколько номенклатур за раз. То есть сначала пользователь подбирает номенклатуры в определенную таблицу, а затем по команде «Перенести в документ» данные из этой таблицы переносятся в табличную часть документа. При переносе в табличную часть, если номенклатура уже была добавлена ранее, нужно увеличить количество в этой строке на значение, указанное в подборе.

Рассмотрим два способа решения этой задачи: без обращения к серверу и с обращением к серверу.

Без обращения к серверу

Создадим форму списка у справочника Номенклатура не назначая ее основной. Добавим реквизит формы ПодобранныеНоменклатуры (тип ТаблицаЗначений) и разместим соответствующий элемент формы. Для полей динамического списка ЭтоГруппа и Ссылка установим флаг ИспользоватьВсегда. Чуть позже станет понятно, для чего.

Все действия выбора будут сводиться к добавлению строки в таблицу ПодобранныеНоменклатуры элементов динамического списка. Если элемент уже был добавлен в таблицу, то увеличиваем его количество. Код обработки выбора элемента списка номенклатуры:

&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    // Проверка на наличие выбранной строки в динамическом списке
    ТекущиеДанные = Элементы.Список.ТекущиеДанные;
    Если ТекущиеДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;       
    // Для групп номенклатуры подбор не производится. Именно для обращения
    // к свойству «ЭтоГруппа» был установлен флаг «Использовать всегда», иначе
    // при отсутствии колонки «Это группа» в списке вылетала бы ошибка
    // «Поле объекта не найдено»
    Если ТекущиеДанные.ЭтоГруппа Тогда
        Возврат;
    КонецЕсли;
    // Отключаем стандартную обработку
    СтандартнаяОбработка = Ложь;
    // Ищем товар в таблице ПодобранныеНоменклатуры. Если нет — добавляем
    // строку, иначе увеличиваем количество
    РезультатПоиска = ПодобранныеНоменклатуры.НайтиСтроки(
        Новый Структура("Наименование", ТекущиеДанные.Ссылка)
    );
    Если РезультатПоиска.Количество() = 0 Тогда
        Строка = ПодобранныеНоменклатуры.Добавить();
        Строка.Наименование = ТекущиеДанные.Ссылка;
    Иначе
        Строка = РезультатПоиска[0];
    КонецЕсли;
    Строка.Количество = Строка.Количество + 1;
КонецПроцедуры

Форма подбора номенклатур вызывается из формы документа ПриходнаяНакладная по команде Подбор:

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

Когда в форме выбора необходимые номенклатуры подобраны, выполняется команда ПеренестиКлиент:

&НаКлиенте
Процедура ПеренестиКлиент(Команда)
    // Передаем данные выбора владельцу формы, т.е. документу ПриходнаяНакладная
    ОповеститьОВыборе(ПодобранныеНоменклатуры); 
КонецПроцедуры

Теперь подобранные номенклатуры доступны в обработчике ОбработкаВыбора элемента формы документа:

&НаКлиенте
Процедура СоставОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    // Заполняем таблицу документа подобранными номенклатурами
    Для Каждого Строка Из ВыбранноеЗначение Цикл
        РезультатПоиска = Объект.Состав.НайтиСтроки(
            Новый Структура("Номенклатура", Строка.Наименование)
        );
        Если РезультатПоиска.Количество() = 0 Тогда
            НоваяСтрока = Объект.Состав.Добавить();
            НоваяСтрока.Номенклатура = Строка.Наименование;
        Иначе
            НоваяСтрока = РезультатПоиска[0];    
        КонецЕсли;
        НоваяСтрока.Количество = НоваяСтрока.Количество + Строка.Количество;
    КонецЦикла;
КонецПроцедуры

С обращением к серверу

Отличия в реализации подбора будут в этом случае только в передаче данных в документ и, затем, обработки подобранных номенклатур в документе. Вот таким образом будет выглядеть команда передачи данных в документ из подбора:

&НаКлиенте
Процедура ПеренестиСервер(Команда)
    // Помещаем подобранные номенклатуры во временное хранилище на
    // сервере  и получаем соответствующий адрес в нем
    Адрес = ПодготовитьДанныеПодбора();
    // Передаем владельцу формы данные выбора 
    ОповеститьОВыборе(Адрес); 
КонецПроцедуры

&НаСервере
Функция ПодготовитьДанныеПодбора()
    // Выгружаем таблицу формы в таблицу значений для корректной
    // работы с данными на сервере
    ТаблицаПодобранныхНоменклатур = ПодобранныеНоменклатуры.Выгрузить();
    // Помещаем во временное хранилище и возвращаем адрес. Вторым параметром
    // передаем уникальный идентификатор формы. После закрытия формы данные
    // во временном хранилище будут очищены.
    Адрес = ПоместитьВоВременноеХранилище(
        ТаблицаПодобранныхНоменклатур,
        УникальныйИдентификатор
    );
    Возврат Адрес;
КонецФункции

Обработчик события ОбработкаВыбора элемента формы документа:

&НаКлиенте
Процедура СоставОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    // Обрабатываем выбранные номенклатуры на сервере
    ОбработатьВыбранноеЗначение(ВыбранноеЗначение);
КонецПроцедуры

&НаСервере
Процедура ОбработатьВыбранноеЗначение(ВыбранноеЗначение)
    // Получаем таблицу подобранных номенклатур из хранилища
    ТаблицаПодобранныхНоменклатур = ПолучитьИзВременногоХранилища(ВыбранноеЗначение);
    // Заполняем таблицу документа подобранными номенклатурами
    Для Каждого Строка Из ТаблицаПодобранныхНоменклатур Цикл
        РезультатПоиска = Объект.Состав.НайтиСтроки(
            Новый Структура("Номенклатура", Строка.Наименование)
        );
        Если РезультатПоиска.Количество() = 0 Тогда
            НоваяСтрока = Объект.Состав.Добавить();
            НоваяСтрока.Номенклатура = Строка.Наименование;
        Иначе
            НоваяСтрока = РезультатПоиска[0];    
        КонецЕсли;
        НоваяСтрока.Количество = НоваяСтрока.Количество + Строка.Количество;
    КонецЦикла;    
КонецПроцедуры

Поиск: 1С:Предприятие • Документ • Обработка выбора • Открыть форму • Список • Справочник • Управляемая форма

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.