1с передача данных между формами

Существует несколько вариантов передачи данных между формами в режиме обычного приложения 1С предприятия

Список способов

  1. Непосредственная запись в реквизиты формы
  2. Оповещение формы
  3. Оповещение владельца формы (о выборе, о записи)
  4. Оповещение подчиненным формам (об активизации строки, объекта)
  5. Оповещение об изменении
  6. Через объекты посредники (справочники, регистры сведений, файлы)

Механизм работы в первом случае:

  • получается объект типа «Форма», например через метод Справочники.Контрагенты.ПолучитьФорму () или ЭтаФорма.Владелец (если форма является подчиненной и владелец задан)
  • запись в известные заранее реквизиты формы

Форма не дает средств для перебора доступных реквизитов. Поэтому в момент записи в отсутствующий реквизит возможна ошибка, например, в случае, если формой владельцем оказалась форма отличная от ожидаемой. Тип передаваемого значения определяется доступным типом реквизита, т.е. если тип реквизита «ссылка на справочник», то передать строку не получится, либо необходимо использовать другой реквизит. Если проблем с типами нет (в частности через тип строки без ограничения длины, возможно передать любые типы данных воспользовавшись ЗначениеВСтрокуВнутр()) то между формами Владелец-Подчиненная форма возможен двухсторонний обмен.

Метод Оповестить() второго способа

Является самым универсальным для обмена, поскольку предоставляет возможности:

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

Обмен через объекты-посредники:

  • Требует наличия объекта, доступа к нему
  • Не вызывает события изменения как и в первом случае
  • Требует периодического считывания данных для проверки
  • Позволяет передавать известные заранее типы значений

Используется, например, при организации чатов, оповещениях пользователей об обновлениях

Остальные методы:

ОповеститьОбАктивизации, ОповеститьОбАктивизацииОбъекта, ОповеститьОбИзменении, ОповеститьОВыборе, ОповеститьОЗаписиНового, ОповеститьОЗаписиНовогоОбъекта являются узкоспециализированными и односторонними (владельцу формы, подчиненным формам)

Нулевую рекламную идею можно помножить на миллион долларов – все равно получится нуль.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Реализация

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

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

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

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

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

Форма подбора товаров вызывается из формы документа по команде «Подбор».

Программный код вызова формы подбора из документа следующий:

Когда в форме выбора необходимые товары подобраны выполняется команда «ПеренестиВДокументКлиент». Обработчик события очень простой:

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

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

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

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

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

Теперь алгоритм обработки выбора элемента формы документа «Товары» изменится следующим образом:

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

Вместо выводов

Способ передачи данных между формами зависит от конкретной задачи, поэтому не стоит думать, что использование временного хранилища на сервере является абсолютно правильным решением. В типовых конфигурациях, таких как «Управление торговлей 11» или «Розница» подбор осуществляется с использованием временного хранилища на сервере. Однако для простых задач, на подобии рассмотренного примера, осуществление передачи данных на клиенсткой стороне куда оптимальней, нежели вызов сервера.

По ссылке Вы можете скачать тестовую конфигурацию с примером из статьи.

Оцените статью
SoftLast
Добавить комментарий