Как из модуля формы передать значение в модуль объекта
Вопрос на самом деле достаточно простой, но начинающие программисты часта попадают в «ступор», когда такое необходимо сделать. Когда такое нам может понадобиться? Например, в отчете остатков товара при выводе есть колонка «Ответственный», который должен проверить фактический остаток на складе по этой номенклатуре. При этом ответственного выбирает пользователь в таблице значений (чтобы не усложнять задачу позволим выбирать лишь элементы номенклатуры). Вот так выглядит форма отчета:
Таблицу с ответственными нам и нужно передать в модуль объекта. Рассмотрим два способа как это сделать. Рассматривать создание самого отчета не будем, скажу лишь, то в результате таблица значений с ответственными передается как внешний источник данных в компоновщик СКД.
Реализация
Через табличную часть обработки
Это самый простой способ. В метаданных отчета создадим табличную часть, добавим для нее соответствующий элемент на форму, в событии «ПриКомпоновкеРезультата» выгрузим табличную часть в таблицу значений и передадим в компоновщик.
Так будет выглядеть обработчик компоновки результата:
Способ может использоваться в большинстве случаев. Похожим образом можно добавить не табличную часть, а реквизит обработки с типом «ТаблицаЗначений» (такой тип поддерживается для реквизитов обработок и отчетов) и передавать ее через этот реквизит. Но что делать, если нужно передать, например, структуру, содержащую в себе и таблицу значений, и системные перечисления, и таблицы значений, а может еще и хранилище значения или двоичные данные? В таком случае прибегнем ко второму способу.
Внешний отчет с примером передачи данных через табличную часть отчета Вы можете скачать по ссылке.
Через временное хранилище
Это самый универсальный способ, так как передать мы сможем данные любого типа. Для начала создадим реквизит отчета со строковым типом неограниченной длины.
Таблица значений с ответственными для каждой номенклатуры теперь будет реквизитом формы. Колонки для нее инициализируются перед открытием формы отчета. Самое главное — это поместить таблицу значений во временное хранилище при формировании отчета, а затем по адресу в хранилище уже в событии «ПриКомпоновкеРезультата» получить эту таблицу и обрабатывать аналогично первому примеру. Переопределим обработчик кнопки формы отчета «Сформировать» на следующий:
В модуле объекта для события «ПриКомпоновкеРезультата» сделаем небольшое изменение:
Вот и все, результат формирования отчета будет аналогичен первому способу. Передача параметров через временное хранилище позволяет передавать любые типы данных и любого размера. Особенно это актуально для управляемых форм в режиме тонкого клиента, где вопросы оптимальности работы с серверными вызовами и размером передаваемых данных являются приоритетными.
Пример отчета с передачей данных через временное хранилище значений Вы можете скачать по ссылке.
Вместо выводов
Абсолютно правильного рецепта для решения подобной задачи нет. Все зависит от конкретной задачи.
1С. Запуск из модуля формы процедуры модуля объекта.
Обычно работа с процедурами из модуля объекта ведется при срабатывании событий объекта (Запись, Проведение, Отмена проведения и пр.).
Но иногда возникает необходимость запустить процедуру модуля объекта из модуля формы.
Для того чтобы это осуществить нужно на сервере получить объект и вызвать его процедуру:
&НаСервере
Процедура Пример()
ОбъектЗначение = РеквФормВЗнач(«Объект»);
ОбъектЗначение.ПроцедураМодуляОбъекта();
КонецПроцедуры
Для отчетов заменяем “Объект” на “Отчет”:
&НаСервере
Процедура Пример()
ОбъектЗначение = РеквФормВЗнач(«Отчет»);
ОбъектЗначение.ПроцедураМодуляОбъекта();
КонецПроцедуры
Как из управляемой формы 1С вызвать процедуру модуля объекта
Обычно в модулях объекта помещаются процедуры и функции, предназначенные для обработки событий, возникающих при записи, удалении, выполнении обработки проверки заполнения и т. д. Особенность обработки событий в модуле формы заключается в том, что они срабатывают и при комплексе программной работы с объектом. Такое расположение процедур и функций в модуле объекта позволяет обращаться к ним из других источников (к примеру, из внешних обработок 1С). При этом порой возникает необходимость вызова такой процедуры из основной формы объекта.
2. Функции основного реквизита формы
Вызов выполняется в несколько шагов и предполагает следующую логику:
из клиентской процедуры формы вызывается сопутствующая серверная процедура, в которой основной реквизит управляемой формы 1С подготавливается для передачи данных на сервер функцией РеквизитФормыВЗначение(). Далее вызывается процедура, расположенная в модуле объекта. После обработки прикладной объект возвращается в реквизит формы с помощью функции ЗначениеВРеквизитФормы()
Также стоит обратить внимание, что вызываемая из модуля объекта процедура должна быть экспортной.