Передача данных между управляемыми формами. Категория: 1С:Предприятие • Программирование

Текущие данные 1с представляют из себя структуру данных текущей строки таблицы формы. Для доступа к ним используется свойство ТекущиеДанные.

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

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

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

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

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

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

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

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

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

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

Варианты получения свойства Текущие данные 1С

В общем случае к свойству ТекущиеДанные можно обратиться через элемент формы к которому оно относится.

Элементы.<ИмяТаблицыФормы>.ТекущиеДанные

Например:

ТекущиеДанные = Элементы.ТаблицаНоменклатуры.ТекущиеДанные;

Но при обращении к текущим данным из обработчика события таблицы формы, можно воспользоваться параметром Элемент. В нем уже содержится таблица формы. В этом случае обращение к текущим данным будет выглядеть следующим образом:

Элемент.ТекущиеДанные

Например:

&НаКлиентеПроцедура ТаблицаНоменклатурыПриИзменении(Элемент) Если Элемент.ТекущиеДанные = Неопределено Тогда Возврат; КонецЕсли; //Код обрабатывающий событие КонецПроцедуры

Такое обращение к текущим данным не получится реализовать в обработчиках событий колонок таблицы формы. Так как в параметр Элемент там передается ПолеФормы, относящееся к колонке.

Метод асинхронной передачи файла на сервер

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

НачатьПомещениеФайла(<ОписаниеОповещенияОЗавершении>, <Адрес>, <ПомещаемыйФайл>, <Интерактивно>, <УникальныйИдентификаторФормы>, <ОписаниеОповещенияПередНачаломПомещенияФайла>)

Метод работает в асинхронном режиме. Возможны два варианта выбора файла для передачи на сервер:

  • интерактивной режим, при котором пользователю будет выдан диалог выбора файла;
  • неинтерактивный режим, при котором уже известен путь к требуемому файлу на компьютере клиента. Такое возможно, например, когда пользователь в отдельном поле ввода выбрал путь к обрабатываемому файлу. Такой сценарий описан в этой статье.

Параметр ОписаниеОповещенияОЗавершении содержит описание процедуры (тип ОписаниеОповещения), которая будет вызвана после завершения помещения файла во временное хранилище. Эта процедура должна иметь ключевое слово Экспорт и 4 параметра:

  • Результат — для интерактивного режима возвращает результат работы пользователя с окном выбора файла. Истина — пользователь выбрал файл; Ложь — пользователь отказался от выбора;
  • Адрес — адрес временного хранилища;
  • ПомещаемыйФайл — путь к файлу;
  • ДополнительныеПараметры — значение, указанное при создании объекта ОписаниеОповещения.

Следует обратить внимание на параметр УникальныйИдентификаторФормы. В него рекомендуется передавать идентификатор текущей формы для сохранения данных во временном хранилище между несколькими серверными вызовами. При закрытии формы данные из временного хранилища будут автоматически удалены.

Поставленная задача

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

1.png

Подбор осуществлястя только по элементам справочника. При переносе в табличную часть, если товар уже в нее был добавлен, нужно увеличить количество в этой строке на значение, указанное в подборе.

Одиночный подбор

При одиночном подборе форма справочника будет закрываться сразу после выбора элемента. Для выбора следующего элемента необходимо будет снова инициировать подбор.

Откроем форму документа ПриходнаяНакладная , создадим команду Подбор и назначим для нее обработчик:

В этой процедуре мы открываем форму выбора для справочника Номенклатура , указывая, что она подчинена таблице Материалы формы документа ПриходнаяНакладная ( Элементы.Материалы ). При выборе из формы выбора справочника выбранное значение будет передано в обработчик события ОбработкаВыбора таблицы формы Материалы , так как она является владельцем открытой формы выбора.

Поэтому откроем палитру свойств таблицы Материалы и создадим обработчик события ОбработкаВыбора :

В этой процедуре мы добавляем новую строку в таблицу Материалы и присваиваем колонке Материал в новой строке выбранное в форме выбора справочника значение. Это значение передается в обработчик события в параметре ВыбранноеЗначение .

Множественный подбор

При множественном подборе форма справочника будет открыта до тех пор, пока пользователь не закроет ее интерактивно или не будет вызван метод формы Закрыть() .

Обработчик команды Подбор :

Обработчик события ОбработкаВыбора остается без изменений.

Передача файла на сервер средствами БСП

В конфигурациях со встроенной Библиотекой стандартных подсистем для передачи файлов с клиента на сервер можно использовать процедуры

ЗагрузитьФайл(ОбработчикЗавершения,  ПараметрыЗагрузки = Неопределено, ИмяФайла = «», АдресВоВременномХранилище = «») Экспорт

ЗагрузитьФайлы(ОбработчикЗавершения, ПараметрыЗагрузки = Неопределено, ЗагружаемыеФайлы = Неопределено) Экспорт

общего модуля ФайловаяСистемаКлиент или

ВыбратьИПередатьФайлНаСервер(ОповещениеЗавершения, Знач ПараметрыДиалога = Неопределено, Знач ИдентификаторФормы = Неопределено) Экспорт

общего модуля ОбменДаннымиКлиент.

Пример интерактивной загрузки файла на сервер средствами БСП:

&НаКлиенте
Процедура ЗагрузитьФайлИнтерактивно(Команда)

ПараметрыДиалога = Новый Структура;
ПараметрыДиалога.Вставить(«Заголовок», НСтр(«ru = ‘Выберите файл XML’»));
ПараметрыДиалога.Вставить(«Фильтр», НСтр(«ru=’Файл XML (*.xml)|*.xml’»));

Оповещение = Новый ОписаниеОповещения(«ЗагрузитьФайлЗавершение», ЭтотОбъект);
ОбменДаннымиКлиент.ВыбратьИПередатьФайлНаСервер(Оповещение, ПараметрыДиалога, УникальныйИдентификатор);

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

&НаКлиенте
Процедура ЗагрузитьФайлЗавершение(Знач РезультатПомещенияФайлов, Знач ДополнительныеПараметры) Экспорт

Адрес = РезультатПомещенияФайлов.Хранение;
ТекстОшибки = РезультатПомещенияФайлов.ОписаниеОшибки;
ИмяВыбранногоФайла = РезультатПомещенияФайлов.Имя;

Если ПустаяСтрока(ТекстОшибки) И ПустаяСтрока(Адрес) Тогда

ТекстОшибки = НСтр(«ru = ‘Ошибка передачи файла на сервер’»);

КонецЕсли;

Если НЕ ПустаяСтрока(ТекстОшибки) Тогда

ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки);
Возврат;

КонецЕсли;

ВыполнитьЗагрузкуНаСервере(Адрес);

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

Остались вопросы?
Спросите в комментариях к статье.

Смотри также:

Как открыть форму внешней обработки или отчета программно
Как получить список открытых окон 1С
Программное получение системной информации о компьютере и конфигурации

Использование метода ОповеститьОВыборе()

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

Метод ОповеститьОВыборе() посылает оповещение владельцу формы о выполнении выбора или подбора, передает ему выбранное значение и закрывает форму, если она открыта не в режиме множественного выбора.

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

Справка

ТабличноеПоле.ДобавитьСтроку()

Добавляет строку в табличное поле, аналогично выполнению команды «Добавить».

  • Если табличное поле связано с таблицей или деревом значений, метод добавляет строку в таблицу или дерево значений (аналогично соответствующим методам этих объектов).
  • Если табличное поле связано со списком объектов, хранимых в базе данных, метод начинает редактирование нового объекта этого списка. (Например, список объектов в форме списка справочника, или документа).
  • Если табличное поле связано с набором записей или табличной частью, то метод начинает редактирование новой записи. (Например, список записей в форме списка регистра сведений; табличная часть документа или справочника).

Доступность: Толстый клиент.

ДанныеФормыКоллекция.Добавить()

Добавляет элемент в конец коллекции и возвращает его в качестве результата метода. Возвращаемое значение: ДанныеФормыЭлементКоллекции .

Доступность: тонкий клиент, веб-клиент, сервер, толстый клиент, мобильное приложение(клиент), мобильное приложение(сервер).

В общем случае клиент и сервер 1С — это разные компьютеры с различной файловой системой. Рассмотрим как правильно передать файл с компьютера клиента на компьютер сервера.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: