Передача данных между управляемыми формами
08.05.2018
Теги: 1С:Предприятие • Документ • ОбработкаВыбора • ОткрытьФорму • Список • Справочник • УправляемаяФорма
Пусть у нас есть есть документ ПриходнаяНакладная
с табличной частью Состав
. Для этого документа необходимо реализовать подбор номенклатур в табличную часть. Должна быть возможность переносить в документ несколько номенклатур за раз. То есть сначала пользователь подбирает номенклатуры в определенную таблицу, а затем по команде «Перенести в документ» данные из этой таблицы переносятся в табличную часть документа. При переносе в табличную часть, если номенклатура уже была добавлена ранее, нужно увеличить количество в этой строке на значение, указанное в подборе.
Рассмотрим два способа решения этой задачи: без обращения к серверу и с обращением к серверу.
Без обращения к серверу
Создадим форму списка у справочника Номенклатура
не назначая ее основной. Добавим реквизит формы ПодобранныеНоменклатуры
(тип ТаблицаЗначений
) и разместим соответствующий элемент формы. Для полей динамического списка ЭтоГруппа
и Ссылка
установим флаг ИспользоватьВсегда
. Чуть позже станет понятно, для чего.
Все действия выбора будут сводиться к добавлению строки в таблицу ПодобранныеНоменклатуры
элементов динамического списка. Если элемент уже был добавлен в таблицу, то увеличиваем его количество. Код обработки выбора элемента списка номенклатуры:
&НаКлиенте Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) // Проверка на наличие выбранной строки в динамическом списке ТекущиеДанные = Элементы.Список.ТекущиеДанные; Если ТекущиеДанные = Неопределено Тогда Возврат; КонецЕсли; // Для групп номенклатуры подбор не производится. Именно для обращения // к свойству «ЭтоГруппа» был установлен флаг «Использовать всегда», иначе // при отсутствии колонки «Это группа» в списке вылетала бы ошибка // «Поле объекта не найдено» Если ТекущиеДанные.ЭтоГруппа Тогда Возврат; КонецЕсли; // Отключаем стандартную обработку СтандартнаяОбработка = Ложь; // Ищем товар в таблице ПодобранныеНоменклатуры. Если нет — добавляем // строку, иначе увеличиваем количество РезультатПоиска = ПодобранныеНоменклатуры.НайтиСтроки( Новый Структура("Наименование", ТекущиеДанные.Ссылка) ); Если РезультатПоиска.Количество() = 0 Тогда Строка = ПодобранныеНоменклатуры.Добавить(); Строка.Наименование = ТекущиеДанные.Ссылка; Иначе Строка = РезультатПоиска[0]; КонецЕсли; Строка.Количество = Строка.Количество + 1; КонецПроцедуры
Форма подбора номенклатур вызывается из формы документа ПриходнаяНакладная
по команде Подбор
:
&НаКлиенте Процедура Подбор(Команда) // Первый параметр — полное имя формы, третий параметр — элемент формы, // в который осуществляется подбор (владелец). Последним параметром // передается уникальный идентификатор формы. ОткрытьФорму( "Справочник.Номенклатура.Форма.ФормаПодбораИзДокумента", , Элементы.Состав, УникальныйИдентификатор ); КонецПроцедуры
Когда в форме выбора необходимые номенклатуры подобраны, выполняется команда ПеренестиКлиент
:
&НаКлиенте Процедура ПеренестиКлиент(Команда) // Передаем данные выбора владельцу формы, т.е. документу ПриходнаяНакладная ОповеститьОВыборе(ПодобранныеНоменклатуры); КонецПроцедуры
Теперь подобранные номенклатуры доступны в обработчике ОбработкаВыбора
элемента формы документа:
&НаКлиенте Процедура СоставОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) // Заполняем таблицу документа подобранными номенклатурами Для Каждого Строка Из ВыбранноеЗначение Цикл РезультатПоиска = Объект.Состав.НайтиСтроки( Новый Структура("Номенклатура", Строка.Наименование) ); Если РезультатПоиска.Количество() = 0 Тогда НоваяСтрока = Объект.Состав.Добавить(); НоваяСтрока.Номенклатура = Строка.Наименование; Иначе НоваяСтрока = РезультатПоиска[0]; КонецЕсли; НоваяСтрока.Количество = НоваяСтрока.Количество + Строка.Количество; КонецЦикла; КонецПроцедуры
С обращением к серверу
Отличия в реализации подбора будут в этом случае только в передаче данных в документ и, затем, обработки подобранных номенклатур в документе. Вот таким образом будет выглядеть команда передачи данных в документ из подбора:
&НаКлиенте Процедура ПеренестиСервер(Команда) // Помещаем подобранные номенклатуры во временное хранилище на // сервере и получаем соответствующий адрес в нем Адрес = ПодготовитьДанныеПодбора(); // Передаем владельцу формы данные выбора ОповеститьОВыборе(Адрес); КонецПроцедуры &НаСервере Функция ПодготовитьДанныеПодбора() // Выгружаем таблицу формы в таблицу значений для корректной // работы с данными на сервере ТаблицаПодобранныхНоменклатур = ПодобранныеНоменклатуры.Выгрузить(); // Помещаем во временное хранилище и возвращаем адрес. Вторым параметром // передаем уникальный идентификатор формы. После закрытия формы данные // во временном хранилище будут очищены. Адрес = ПоместитьВоВременноеХранилище( ТаблицаПодобранныхНоменклатур, УникальныйИдентификатор ); Возврат Адрес; КонецФункции
Обработчик события ОбработкаВыбора
элемента формы документа:
&НаКлиенте Процедура СоставОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) // Обрабатываем выбранные номенклатуры на сервере ОбработатьВыбранноеЗначение(ВыбранноеЗначение); КонецПроцедуры &НаСервере Процедура ОбработатьВыбранноеЗначение(ВыбранноеЗначение) // Получаем таблицу подобранных номенклатур из хранилища ТаблицаПодобранныхНоменклатур = ПолучитьИзВременногоХранилища(ВыбранноеЗначение); // Заполняем таблицу документа подобранными номенклатурами Для Каждого Строка Из ТаблицаПодобранныхНоменклатур Цикл РезультатПоиска = Объект.Состав.НайтиСтроки( Новый Структура("Номенклатура", Строка.Наименование) ); Если РезультатПоиска.Количество() = 0 Тогда НоваяСтрока = Объект.Состав.Добавить(); НоваяСтрока.Номенклатура = Строка.Наименование; Иначе НоваяСтрока = РезультатПоиска[0]; КонецЕсли; НоваяСтрока.Количество = НоваяСтрока.Количество + Строка.Количество; КонецЦикла; КонецПроцедуры
- Вычисляемые колонки в списках
- Можно ли использовать форму списка в качестве формы выбора?
- Форма динамического списка с произвольным запросом
- Организация подборов в табличную часть документа
- Как открыть форму списка с некоторым отбором?
- Как обработать выбор значения в поле ввода
- Как создать документ и открыть его форму?
Поиск: 1С:Предприятие • Документ • Обработка выбора • Открыть форму • Список • Справочник • Управляемая форма