1с передать параметр в обработку проведения
У многих обработчиков событий формы есть параметр ПараметрыЗаписи. Этот параметр является структурой и для формы документа содержит два предопределенных свойства – РежимЗаписи и РежимПроведения. В состав ПараметровЗаписи можно добавлять свои свойства для их передачи другим обработчикам формы, где также доступны ПараметрыЗаписи. На самом деле таких событий в модуле формы всего 5.
Перечислим их в порядке срабатывания:
- ПередЗаписью() – на клиенте
- ПередЗаписьюНаСервере() – на сервере
- ПриЗаписиНаСервере() – на сервере (в рамках транзакции)
- ПослеЗаписиНаСервере() – на сервере
- ПослеЗаписи() – на клиенте.
Через параметр ПараметрыЗаписи можно передавать между этими событиями дополнительную информацию. Например, перед записью/проведением необходимо задать вопрос на создание дополнительных подчиненных объектов базы данных. Задать какой-либо вопрос возможно только на клиенте, а единственное событие, где это может быть сделано, – это событие ПередЗаписью(). Что же касается создания дополнительных подчиненных объектов, то это возможно только на сервере и только после записи текущего объекта. Тогда у объекта гарантированно будет ссылка. В этом случае подходящими событиями будут ПриЗаписиНаСервере() и ПослеЗаписиНаСервере().
Выбор среди этих двух событий определяется исходной задачей. Например, если по какой-либо причине не получится создать подчиненный объект, тогда и текущий объект не должен быть записан в базу данных. В этом случае необходимо использовать событие ПриЗаписиНаСервере(), так как оно выполняется в рамках транзакции, и при отмене транзакции все изменения таблиц базы будут также отменены. Если же создание подчиненных объектов не столь критично, тогда код можно разместить в обработчике ПослеЗаписиНаСервере().
Пример передачи параметров:
Передача дополнительных параметров между событиями модуля объекта
Довольно часто возникает задача анализа режима записи документа в обработчике модуля объекта ПриЗаписи(). К сожалению, в рамках этого события нет возможности определить режим записи документа, но это можно сделать в обработчике ПередЗаписью(), у которого есть входящий параметр РежимЗаписи.
Конечно, чтобы передать значение РежимаЗаписи из обработчика ПередЗаписью() в обработчик ПриЗаписи(), можно объявить глобальную переменную модуля и через нее передавать значение, но есть более изящный способ – воспользоваться свойством объекта ДополнительныеСвойста. ДополнительныеСвойста представляют собой структуру, с помощью которой можно связать с объектом дополнительную информацию:
Передача дополнительных параметров между событиями модуля формы и модуля объекта
Также можно использовать комбинацию двух вышеописанных способов. Например, перед проведением документа задается некоторый вопрос, ответ на который необходимо проанализировать в рамках обработки проведения. Для передачи результата ответа на вопрос можно использовать следующую цепочку событий:
После того как пользователь запустил процесс проведения, в первую очередь необходимо задать вопрос пользователю, а это можно сделать только на клиенте, так как на сервере запрещены диалоги и открытие других форм. Для этого необходимо использовать клиентское событие модуля формы ПередЗаписью(), так как это единственное событие, возникающее на стороне клиента в процессе проведения документа. В этом событии необходимо проанализировать режим записи документа и задать необходимый вопрос, после чего результат поместить в ПараметрыЗаписи.
Далее результат необходимо передать в объект. Единственным подходящим событием является серверное событие модуля формы ПередЗаписьюНаСервере(), так как в нем уже доступен объект через параметр ТекущийОбъект и также доступны ПараметрыЗаписи. В этом событии необходимо проанализировать наличие ответа в структуре ПараметрыЗаписи и через параметр ТекущийОбъект перенести значение в структуру ДополнительныеСвойства.
После этого можно будет проанализировать результат ответа на вопрос в рамках обработки проведения, но при этом следует учитывать, что параметра в структуре ДополнительныеСвойства может и не быть, так как проведение документа может выполняться и программно.
Итак, что же такое параметр?
Параметр – это значение, передаваемое в форму при открытии. Параметр может иметь любой тип и принимать любое значение.
Зачем нужен параметр?
Параметр нужен для передачи в форму дополнительных значений. Например: откуда открыта форма.
Как передать параметр?
Параметр передается в форму при открытии. Например:
Как получить параметр в открывшейся форме?
Получить параметр, переданный в форму, мы можем таким образом:
Как передать несколько значений?
Поскольку параметр может принимать любое значение, он может принимать значение типа Список. Пример
Пример обработки его в открывшейся форме:
Что такое контекст формы?
Контекст – это идентификатор формы, что-то вроде ее имени. Он используется для того, чтобы точно указать программе, к какой форме вы обращаетесь. То есть с помощью контекста можно обращаться к одной форме из другой.
Как работать с контекстом?
Все довольно просто. Для того, чтобы с контекстом работать, его надо сначала передать.
Передается он с помощью параметра. Например:
Но правильнее будет воспользоваться такой процедурой в глобально модуле:
использовать ее нужно так:
Для закрепления полученных знаний приведем практический пример.
Создадим тестовую обработку, и назовем ее Пример. Добави на нее кнопку Закрыть для закрытия формы. Теперь добавим на нее Текстовый реквизит и пропишем ему в поле Формула ТР. Также в модуле формы пропишем:
Теперь откроем форму списка справочника Номенклатура и добавим туда кнопку. В формуле кнопки напишем
Запустите 1С, откройте справочник номенклатуры, нажмите кнопку. Откроется форма и там будет наименование выбранной номенклатуры. Мы передали параметр.
Теперь передадим несколько значений. У кнопки поменяем формулу на ОткрытьПример(). Опишем процедуру:
В обработке перепишем:
Пробуем. В зависимости от того, группа или нет, текущий элемент, в обработке пишется полное наименование или обычное.
Теперь поработаем с контекстом. Перепишем процедуру ОткрытьПример:
Изменим и обработку:
В текстовом реквизите на обработке в формулу пропишем Надпись() и приделаем туда еще одну кнопку Обновить у которой в формулу пропишем Форма.Обновить()
Запускаем. При открытии в текстовом реквизите высвечивается текущий элемент справочника, но при его смене надпись не меняется, а меняется она только после нажатия кнопки Обновить. То есть текстовый реквизит на форме не обновляется. Незадача? Давайте решим и ее. Оказывается, при открытии формы можно получить и ее контекст из места открытия. В форме списка справочника объявим переменную ПримерКонт. Перепишем процедуру ОткрытьПример:
Теперь в функции какого-нить текстового реквизита (например ИнформационнаяНадпись()), пропишем такие строки:
Передача параметров по ссылке и по значению при вызове процедур и функций
Внимание! Материал данной статьи устарел. Рекомендуется использовать документацию к платформе "1С:Предприятие 8".
Встроенный язык 1С:Предприятия поддерживает два способа передачи параметров в процедуры и функции: передача параметров по ссылке и передача параметров по значению.
Передача параметров по ссылке
По умолчанию, во встроенном языке 1С:Предприятия 8 передача параметров в процедуры и функции осуществляется по ссылке. Это означает, что изменение формального параметра внутри процедуры или функции будет отражаться на значении фактического параметра, переданного при вызове процедуры или функции.
Передача параметров по значению
При передаче параметра вызываемой процедуры или функции по значению, изменение значения формального параметра внутри процедуры или функции никак не влияет на фактический параметр, передаваемый при вызове процедуры или функции. Указание, что параметр нужно передавать по значению, осуществляется с помощью ключевого слова Знач .
Особенности передачи переменных различных типов данных по значению
Передача переменных различных типов данных по значению имеет свои особенности. Они заключаются в том, что при работе с методами и свойствами контекста формальных параметров может изменяться состояние фактического параметра, передаваемого при вызове процедуры или функции.
Рассмотрим в качестве примера ситуацию, когда параметром процедуры, передаваемым по значению, является таблица значений. Внутри вызываемой процедуры ОбработатьТаблицу() создается новый экземпляр таблицы значений, в который добавляется три строки. Это никак не влияет на состояние таблицы значений Тз , переданной в качестве фактического параметра при вызове процедуры ОбработатьТаблицу() :
Рассмотрим в качестве примера ситуацию, когда параметром процедуры, передаваемым по значению, является таблица значений. Внутри вызываемой процедуры СвернутьТаблицу() таблица значений, переданная в качестве параметра при вызове процедуры, сворачивается:
Схематично изобразить происходящее при вызове процедуры СвернутьТаблицу(Тз) можно следующим образом:
(1) - вызов процедуры СвернутьТаблицу . В качестве фактического параметра указывается переменная Тз, хранящая ссылку на экземпляр таблицы значений;
(2) - из процедуры вызывается метод Свернуть таблицы значений;
(3) - формальный параметр ссылается на тот же самый экземпляр таблицы значений, что и фактический параметр (переменная Тз) - происходит свертка в экземпляре таблицы значений, на которую ссылается переменная Тз;
(4) - выходим из процедуры. Экземпляр таблицы значений, на которую ссылается переменная Тз, находится в свернутом состоянии.
Таким образом, передача фактического параметра по значению в данном случае не привела к созданию копии таблицы значений. При работе со свойствами и методами таблицы значений мы работаем со свойствами и методами той таблицы значений, которая использовалась при вызове процедуры СвернутьТаблицу() .
Разница для всех типов при передаче параметра процедуры или функции по ссылке или по значению проявляется в присвоении фактическому параметру процедуры или функции нового значения. Вызов свойств и методов контекста фактического параметра, если таковые имеются, влияет на формальный параметр независимо от того, передается ли он по ссылке или по значению.
1с УНФ.
Есть типовый отчет акт сверки.
Нужно этот отчет переделать. Т.е. взять копию и изменить макет, чтобы затем из покупателей этот отчет открывался и формировался, как типовый. Собственно с изменением макета проблем нет.
Но я не пойму, как в этот отчет передается контекст. В самом отчете нельзя зайти в настройки, их там нет. Как мне сказали, вроде бы его переписывали, но не в этом суть.
Я копирую отчет, он у меня появляется в отчетах покупателей, но при открытии не формируется сразу. После формирования вручную, он формируется пустым.
Тоже самое, если я делаю его внешним. Он появляется в списке отчетов у покупателя, но формируется пустым. Отчет один в один с типовым. Не могу сообразить, как передать в открываемый отчет параметры. Я вижу, что при формировании типовый отчет берет параметры из компоновщика. Но не могу найти, где заполняется компоновщик. Отчет без формы.
(0) берется форма по умолчанию. Щелкаешь на корне конфигурации Свойства и там находишь, форма отчета, форма настроек отчета, форма вариантов отчета.(0) Смотря какая конфигурация.
в БП3 это просто, есть ряд предопределённых процедур, которые вызываются в зависимости от указанных параметров.
Вот тут настройки задаются.
А вот тут полный модуль одного из отчета.
Просто я вот так делаю, в последнее время :)
. Запрос там подменяется для обхода блокировок безопасности в СКД.
. Думаю надо начать переделывать такое на СхемеЗапросоа. но это потом.
(0) И да, Утро, не обессудь.
(6) К сожалению, у меня нет формы отчета. Используется общая форма УНФ.
Даже если я не добавляю отчет в дополнительные, а просто открываю, сначала запускается процедура общей формы ПриСозданииНаСервере.
В ней есть некоторая структура - параметры, со значение Данные формы структура. К сожалению, что это за параметры и откуда берутся я не смог найти, не так давно на УФ работаю. Если открываю типовый отчет, то в параметрах есть свойства отбора, где и указан ключ и значение.
При открытии внешнего или скопированного типового отчета, в параметрах этого свойства нет. Судя по всему, нужно как-то передать это свойств в параметры. А вот как передать непонятно.
Я уже много ссылок перерыл, но в целом, выходит, что проще написать отчет с нуля. Тогда скорее всего все заработает. Но хотелось бы взять и именно типовый, с минимальными изменениями.
Читайте также: