Книга: Разработка интерфейса прикладных решений на платформе "1С:Предприятие 8"
Назад: Использование временного хранилища для передачи данных между формами
Дальше: Второй вариант решения

Первый вариант решения

Итак, создадим форму документа РасходнаяНакладная. Создадим команду формы Подбор и перетащим ее в командную панель таблицы формы Товары. Обработчик команды Подбор заполним следующим образом (листинг 4.44).

Листинг 4.44. Обработчик команды «Подбор»

&НаКлиенте

Процедура Подбор(Команда)

 

ПараметрыПодбора = Новый Структура("ТчТоваровДокумента", Объект.Товары);

ФормаПодбора = ОткрытьФорму("Документ.РасходнаяНакладная.Форма.ФормаПодбора", ПараметрыПодбора, ЭтаФорма);

 

КонецПроцедуры

В этом обработчике мы создаем структуру ПараметрыФормы и добавляем в нее элемент ТчТоваровДокумента, который будет содержать табличную часть документа (Объект.Товары). Затем мы открываем форму подбора документа ФормаПодбора с параметром типа ДанныеФормыКоллекция как подчиненную форме документа.

Теперь создадим форму документа с именем ФормаПодбора с основным реквизитом СписокТоваров типа ДинамическийСписок, отражающим данные справочника Товары.

Затем создадим реквизит формы ОтобранныеТовары типа ТаблицаЗначений (с колонками Товар типа СправочникСсылка.Товары и Количество типа Число), который будет содержать список отобранных товаров и их количество.

Перетащим реквизиты СписокТоваров и ОтобранныеТовары в форму, а также зададим свойства этих таблиц формы: Заголовок, ПоложениеЗаголовкаВерх, ПоложениеКоманднойПанелиНет. Зададим также свойство формы Заголовок – «Подбор товара» и выключим свойство Автозаголовок, ПоложениеКоманднойПанелиНиз.

Чтобы обеспечить заполнение реквизита ОтобранныеТовары данными табличной части расходной накладной, создадим обработчик события формы ПриСозданииНаСервере и заполним его следующим образом (листинг 4.45).

Листинг 4.45. Обработчик события «ПриСозданииНаСервере»

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

 

ТчТоваровДокумента = Параметры.ТчТоваровДокумента;

 

Для Каждого ТоварТч Из ТчТоваровДокумента Цикл

Элемент = ОтобранныеТовары.Добавить();

Элемент.Товар = ТоварТч.Товар;

Элемент.Количество = ТоварТч.Количество;

 

КонецЦикла;

 

КонецПроцедуры

В этом обработчике мы в цикле обходим коллекцию данных, содержащуюся в параметре формы ТчТоваровДокумента, и заполняем таблицу значений ОтобранныеТовары элементами этой коллекции.

Таким образом, список отобранных товаров при открытии формы подбора будет заполнен данными табличной части расходной накладной.

Затем реализуем возможность добавления товаров из списка товаров в таблицу отобранных товаров. Для этого создадим обработчик события ВыборЗначения у таблицы формы СписокТоваров и включим у этой таблицы свойство РежимВыбора (листинг 4.46).

Листинг 4.46. Обработчик события «ВыборЗначения» таблицы формы «СписокТоваров»

&НаКлиенте

Процедура СписокТоваровВыборЗначения(Элемент, Значение, СтандартнаяОбработка)

 

СтандартнаяОбработка = Ложь;

ДобавитьТовар(Значение);

 

КонецПроцедуры

В модуле формы поместим процедуру ДобавитьТовар(), в которой выполняется добавление товаров из списка товаров в таблицу отобранных товаров. Но заметим, что эта процедура не имеет отношения к передаче данных между формами (листинг 4.47).

Листинг 4.47. Процедура «ДобавитьТовар()»

&НаКлиенте

Процедура ДобавитьТовар(Товар)

 

Элемент = ОтобранныеТовары.Вставить(0);

Элемент.Товар = Товар;

Элемент.Количество = 1;

Элементы.ОтобранныеТовары.ТекущаяСтрока = Элемент.ПолучитьИдентификатор();

 

КонецПроцедуры

Затем, при нажатии кнопки ОК, форма подбора должна закрываться, и список отобранных товаров должен передаваться обратно в табличную часть расходной накладной.

Для этого создадим команду формы подбора ОК и перетащим ее в командную панель формы. Отключим свойство командной панели Автозаполнение и установим свойство ГоризонтальноеПоложениеПраво. Также перетащим в командную панель формы команду Отмена из списка стандартных команд формы.

Обработчик команды ОК заполним следующим образом (листинг 4.48).

Листинг 4.48. Обработчик команды «ОК»

&НаКлиенте

Процедура ОК(Команда)

 

ВладелецФормы.ОбработатьПодбор(ОтобранныеТовары);

Закрыть();

 

КонецПроцедуры

В этом обработчике, перед тем как закрыть форму подбора, мы вызываем экспортируемую процедуру ОбработатьПодбор() владельца формы, то есть формы объекта – документа РасходнаяНакладная, и передаем в нее список отобранных товаров (листинг 4.49).

Листинг 4.49. Процедура «ОбработатьПодбор()»

&НаКлиенте

Процедура ОбработатьПодбор(ОтобранныеТовары) Экспорт

 

Объект.Товары.Очистить();

Для Каждого ТоварТч Из ОтобранныеТовары Цикл

Элемент = Объект.Товары.Добавить();

Элемент.Товар = ТоварТч.Товар;

Элемент.Количество = ТоварТч.Количество;

 

КонецЦикла;

 

Модифицированность = Истина;

 

КонецПроцедуры

В этой процедуре, помещенной в модуле формы документа РасходнаяНакладная, мы очищаем табличную часть документа, затем в цикле обходим коллекцию данных, содержащуюся в параметре ОтобранныеТовары, и заполняем табличную часть документа элементами этой коллекции. И затем свойство формы Модифицированность устанавливаем в значение Истина, так как мы изменили табличную часть документа.

Таким образом, табличная часть расходной накладной при закрытии формы подбора по кнопке ОК будет заполнена списком отобранных товаров.

ПРИМЕЧАНИЕ

Этот пример можно посмотреть в демонстрационной конфигурации «11 (вар. 1) Использование временного хранилища для передачи данных между формами».

Запустим «1С:Предприятие», откроем документ Расходная накладная № 3 (он содержит 1000 позиций товаров) и нажмем кнопку Подбор. После этого откроется форма подбора, в которую будут переданы строки табличной части документа.

Посмотрим, сколько вызовов сервера при этом произойдет и какой будет объем передаваемых данных между клиентом и сервером. Мы специально рассматриваем пример документа с большой табличной частью, так как на нем лучше сравнивать показатели производительности.

Таблица 4.3. Показатели производительности

Текущие вызовы Отправлено Принято
29 189 303 153302

Мы видим, что сервер вызывается 29 раз. Один вызов происходит, чтобы открыть форму подбора, и 28 вызовов сервера тратятся на «дочитывание» строк табличной части в форму документа на клиент порциями по 35 строк.

Объем принятых данных отражает ситуацию, когда табличная часть «доехала» в форму документа на клиент, так как с клиента мы «отправляем» Объект.Товары в параметрах открываемой формы.

Объем отправленных данных отражает ситуацию, когда вся табличная часть с клиента «уехала» на сервер, так как она передается в параметре метода ОткрытьФорму().

Для наглядности рассмотрим схему передачи данных между клиентом и сервером (рис. 4.67).

Рис. 4.67. Схема передачи данных между клиентом и сервером

После того как пользователь произведет подбор товаров из справочника (в нашем примере выбран всего один товар) и закроет форму подбора, отобранные товары и их количество будут переданы обратно в табличную часть расходной накладной (рис. 4.66).

Посмотрим теперь на показатели производительности.

Таблица 4.4. Показатели производительности

Текущие вызовы Отправлено Принято
28 11 271 97 690

28 вызовов сервера тратятся на «дочитывание» строк таблицы значений ОтобранныеТовары в форму подбора на клиент порциями по 35 строк.

Объем принятых данных отражает ситуацию, когда таблица ОтобранныеТовары «доехала» в форму подбора на клиент, так как с клиента мы вызываем процедуру ОбработатьПодбор(), в которую передаем эту таблицу в качестве параметра.

Для наглядности рассмотрим схему передачи данных между клиентом и сервером (рис. 4.68).

Рис. 4.68. Схема передачи данных между клиентом и сервером

Может возникнуть вопрос: «Почему в первой таблице, когда в форму документа дочитывалась табличная часть, было передано 153 302, а тут, когда те же данные дочитываются в форму подбора, передано всего 97 690?»

Дело в том, что в первой таблице дочитывалась именно табличная часть. Во второй таблице дочитывалась не табличная часть, а таблица значений. Таблица значений устроена проще, чем табличная часть, поэтому она сериализуется лучше (объем данных меньше). Кроме того, в первом примере табличная часть содержит три колонки, а таблица значений во втором случае содержит всего две колонки. За счет этого во втором случае и получается меньший объем принятых данных.

В результате мы добились нужной функциональности формы, но при большом массиве передаваемых данных такой вариант обмена данными между формами будет неоптимальным.

Для наглядности рассмотрим схему программного взаимодействия клиента и сервера (рис. 4.69).

Рис. 4.69. Схема программного взаимодействия сервера и клиента

Как мы видим, при открытии формы подбора платформа делает вызов сервера.

ПРИМЕЧАНИЕ

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

Но при этом в форму подбора передается параметр ТчТоваровДокумента, содержащий данные табличной части формы объекта. Все строки табличной части сначала «приедут» с сервера, так как на клиенте присутствует только видимая часть этих строк (см. ). Затем все они «поедут» на сервер при открытии формы подбора.

При передаче отобранных товаров обратно в форму документа в параметре процедуры ОбработатьПодбор() все данные таблицы значений ОтобранныеТовары формы подбора будут «дочитаны» с сервера на клиент.

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

Рассмотрим теперь другой вариант.

Назад: Использование временного хранилища для передачи данных между формами
Дальше: Второй вариант решения