1с передать параметр в команду
Передача параметров по ссылке и по значению при вызове процедур и функций
Внимание! Материал данной статьи устарел. Рекомендуется использовать документацию к платформе «1С:Предприятие 8».
Встроенный язык 1С:Предприятия поддерживает два способа передачи параметров в процедуры и функции: передача параметров по ссылке и передача параметров по значению.
Передача параметров по ссылке
По умолчанию, во встроенном языке 1С:Предприятия 8 передача параметров в процедуры и функции осуществляется по ссылке. Это означает, что изменение формального параметра внутри процедуры или функции будет отражаться на значении фактического параметра, переданного при вызове процедуры или функции.
Передача параметров по значению
Особенности передачи переменных различных типов данных по значению
Передача переменных различных типов данных по значению имеет свои особенности. Они заключаются в том, что при работе с методами и свойствами контекста формальных параметров может изменяться состояние фактического параметра, передаваемого при вызове процедуры или функции.
Рассмотрим в качестве примера ситуацию, когда параметром процедуры, передаваемым по значению, является таблица значений. Внутри вызываемой процедуры СвернутьТаблицу() таблица значений, переданная в качестве параметра при вызове процедуры, сворачивается:
Схематично изобразить происходящее при вызове процедуры СвернутьТаблицу(Тз) можно следующим образом:
Разница для всех типов при передаче параметра процедуры или функции по ссылке или по значению проявляется в присвоении фактическому параметру процедуры или функции нового значения. Вызов свойств и методов контекста фактического параметра, если таковые имеются, влияет на формальный параметр независимо от того, передается ли он по ссылке или по значению.
Как с помощью команды выполнить отчет с некоторыми параметрами?
Использование параметризуемых команд в формах объектов позволяет при выполнении команды передать в обработчик команды какой-либо параметр, например значение ссылочного реквизита формы. И затем использовать его, например, открыть с этим параметром форму отчета.
В следующем примере, при помощи параметризируемой команды ОстаткиПоТовару выводится отчет, показывающий остатки товара, указанного в текущей строке списка товаров.
Для этого у отчета ОстаткиТоваровНаСкладах создана команда ОстаткиПоТовару со свойствами:
Тип параметра команды определяет, что во всех формах, имеющих реквизит типа СправочникСсылка.Товары эта команда автоматически будет добавлена в список параметризуемых команд доступных в форме. В форме списка и в форме элемента справочника Товары эта команда будет автоматически видима.
Обработчик команды содержит код:
В параметр Отбор добавляется структура, содержащая элемент Товар со значением, содержащимся в параметре команды ( ПараметрКоманды ).
Параметр КлючНазначенияИспользования – « ОстаткиПоТовару » определяет назначение использования формы.
А как вывести отчет сразу по нескольким товарам?
В этом случае в обработчик команды в качестве параметра будет всегда передаваться массив значений (даже если выбрано одно значение). Первым элементом массива будет выступать текущая строка таблицы списка в режиме множественного выделения.
Если нужен отчет по группе справочника, можно выделить все элементы группы или в обработчике команды программно сформировать список товаров, для которых нужно получить остатки.
1с команды: командный интерфейс формы
Всем привет! Продолжаем делать заметки в рубрику ‘Джуниор1с’. И сегодня мы рассмотрим один из примеров – как работать с командами в 1с и для чего они нужны.
Команда в 1с – это объект конфигурации, благодаря которому разработчик может описать алгоритм действий, который выполнится в тот момент, когда командной воспользуется пользователь: появится печатная формы, произойдет отображение каких-либо данных и так далее.
Рассмотрим пример с использованием команды на простом примере: В справочнике ‘_ДемоКонтрагенты’ необходимо отображать все документы безналичной денежной оплаты ‘_ДемоСписаниеБезналичныхДенежныхСредств’ в которых присутствует данный контрагент (проще говоря все переводы денежных средств текущему контрагенту). Данная задача легко решается с использованием команд в 1с.
В первую очередь создадим у справочника ‘_ДемоКонтрагенты’ новую форму, в которой будем отображать набор необходимых документов и отобразим на ней динамический список:
Отлично, теперь все что нам осталось, это каким-то образом отобразить данную форму пользователю и установить параметр динамического списка ‘Получатель’ равным текущему контрагенту.
Для этого мы создаем новую команду ‘ОтобразитьСписокБезналичныхОплат’ у нашего справочника:
Заметьте, данную команду мы параметризовали: тип параметра команды ‘СправочникСсылка._ДемоКонтрагенты’. Это говорит о том, платформа в качестве одного из параметров в команду будет передавать значение данного типа. А так же данная команда будет доступна в формах значений указанного типа.
Отлично, теперь указываем группу: месторасположение команды в командном интерфейсе формы. Сохраняемся и убеждаемся что наша команда появилась в нужно нам месте:
Теперь нам необходимо в модуле нашей команды написать алгоритм отображения созданной ранее формой с документами. Для этого необходимо открыть эту форму и передать в неё в качестве параметра текущего контрагента для установки параметра динамического списка.
В модуле нашей команда автоматически создалась процедура обработки команды с параметрами:
Поскольку ранее мы параметризовали нашу команду, то в качестве параметра ‘ПараметрКоманды’ – мы получаем текущего контрагента, которого мы и передадим в открываемую нами форму:
Практика: Передаем произвольный параметр и открываем форму выбранной нами дополнительной обработки
В этой статье я решил собрать 2 практических случая, которые используются не так часто, но которые нужно знать, чтобы вообще знать что так можно. Все это я решил сделать и показать в одной конфигурации на базе БСП. Для данного примера скачал с официального сайта 1с (https://releases.1c.ru/) версию БСП 3.0.1.428.
1. Передача пользовательского параметра в управляемое приложение.
Варианты передачи пользовательского параметра.
УП (управляемое приложение) может принимать пользовательские параметры, которые могут передаваться из других приложений. Этот параметр можно обработать произвольным образом. В данной статье в зависимости от его значения будем открывать разные дополнительные обработки, которые используются в любой конфигурации на БСП (библиотеки стандартных подсистем). Существует множество способов передать пользовательский параметр в управляемое приложение, все их описать не представляется возможным, поэтому расскажу про 3 самых простых для меня:
Просто через командную строку (Выполнить > cmd)
В этом случае можно просто указать полный путь к базе 1С и необходимый минимум параметров: «C:\Program Files (x86)\1cv8\8.3.14.1779\bin\1cv8.exe»
Через “батник” (.bat файл)
Все то же самое, только в файле:
Pause нужно для того, чтобы окно не закрылось, как правило останавливать выполнение скрипта считается плохим тоном. Если не установить кодировку 866, то система не сможет корректно прочитать кириллицу.
Вызов через скрипт visual basic (.vbs скрипт)
Пример vbs:
Чтобы не было проблем с кириллицей, можно сохранить в кодировке Windows-1251.
/C [строка текста] — передача параметра в конфигурацию.
Хорошая статья про запуск 1С с параметрами: //infostart.ru/public/104654/
При отладке параметр можно передавать из конфигуратора:
2. Открытие дополнительной обработки на начальной странице.
Создаем новую обработку.
В конфигурации БиблиотекаСтандартныхПодсистемДемо добавляем новую обработку, предварительно включив возможность редактирования:
Переименуем обработку, например, в ОсновноеРабочееМестоПользователя. В модуле управляемого приложения в событии ПриНачалеРаботыСистемы прописываем следующий код:
Создадим обработку “Моя обработка”.
Далее создадим простую внешнюю обработку, для подключения ее как дополнительную. Назовем ее, к примеру, Моя обработка.
В модуле объекта напишем:
В Функции СведенияОВнешнейОбработке() получим ПараметрыРегистрации:
— укажем версию (удобнее всего указывать дату, сразу понятно что за версия);
— вставим в них новое свойство “Информация”, и нашей информацией;
— укажем БезопасныйРежим = Ложь;
— добавим новую команду, укажем представление, идентификатор, тип команды в свойстве Использование и ПоказыватьОповещение = Ложь;
Создадим форму обработки и назначим ее как основная. На форме создадим декорацию и укажем у нее Заголовок “Это моя обработка”.
После того как подключим, по имени обработки (он же ИдентификаторОбработки по которому в системе определяется уникальность обработки), можно будет к ней обращаться.
Создадим обработку “Моя новая обработка”.
По такому же принципу создадим еще одну дополнительную обработку, но с идентификатором МояНоваяОбработка. Теперь у нас есть выбор из двух обработок, и в зависимости от значения передаваемого параметра мы можем выбирать любую. Чтобы не было совсем скучно на форме нашей новой обработки помимо декорации давайте создадим новую Группу вида Коммандная панель.
А в ней Подгруппу вида Подменю.
Затем создадим две команды и назначим им обработчики. Теперь у нас в группе коммандной панели есть группа подменю, в которой содержатся две команды.
В модуле объекта нашей второй обработки МояНоваяОбработка напишем:
Вернемся к встроенной в конфигурацию обработке.
Теперь вернемся к встроенной в конфигурацию обработке ОсновноеРабочееМестоПользователя и в форме в событии ПриСозданииНаСервере напишем:
Далее создадим новую процедуру ОткрытьФормуОбработки и в событии ПриОткрытии ее вызовем:
Опытным путем удалось установить, что если обращаться в событии ПриОткрытии к ЭтаФорма.Окно и передавать его как параметр для метода ОткрытьФорму(), то обработка не будет открываться в текущем окне. Поэтому тут используется метод глобального контекста ПодключитьОбработчикОжидания() в котором указали имя процедуры, которая должна быть обязательно с ключевым словом Экспорт.
В Функции ПодключитьВнешнююОбработку() подключается обработка из справочника ДополнительныеОбработкиИОтчеты. Метод ОбщегоНазначения.ЗначенияРеквизитовОбъекта() получает сразу одним запросом значение двух реквизитов и возращает их в структуре. Затем из ХранилищеОбработки получаем данные обработки в бинарном формате (ДвоичныеДанные), помещаем во временное хранилище, чтобы методом ВнешниеОбработки.Подключить(), можно было подключить эту обработку в системе и затем уже обращаться к ней в строковом параметре метода ОткрытьФорму().
Как вы поняли, мы будем передавать и анализировать какой параметр приходит. Он строкового типа, поэтому в нем можно передать, к примеру, имя обработки, чтобы она сразу открылась.
Если мы будем передавать пользовательский параметр “МояОбработка”, откроется наша первая обработка, если параметр “МояНоваяОбработка”, откроется наша вторая обработка.
Как видно на скриншоте, в открытой обработке ОсновноеРабочееМестоПользователя мы программно подключили другую обработку, которую определили в нашем пользовательском параметре и открыли основную форму этой обработки внутри окна другой формы.
Программирование в 1С для всех
В этой статье я приведу небольшой пример, который может возникнуть в реальной жизни, и который будет полезен начинающим программистам 1С, особенно тем, кто столкнулся с открытием одной управляемой формы из другой формы и передачей значений с формы на форму.
Рассмотрим следующую задачу: в табличной части некоторого документа есть реквизит «Пояснение» (тип строка), для удобства работы пользователей необходимо сделать так, чтобы при нажатии на кнопку «Лупа» поля ввода этого реквизита текущей строки табличной части, открывалась форма с многострочным полем ввода, где пользователь может ввести нужный ему текст. После нажатия на кнопку «Поместить» открывшейся формы вся информация из поля ввода должна быть передана в соответствующее поле текущей строки табличной части.
Для демонстрации решения, я использую учебную конфигурацию, где в табличной части документа «Поступление товаров и услуга» имеется реквизит «Пояснение» (строка (250)).
На форме документа у поля «Пояснение» таблицы формы в свойство «КнопкаОткрытия» установим значение «Да».
В результате у нас у соответствующего поля на форме появится кнопка Открыть.
Теперь создадим произвольную форму документа, которую назовем ФормаВводаПояснения.
У этой формы создадим реквизит управляемой формы «Ввод пояснения» (строка (250))
И поместим этот реквизит на форму в виде поля ввода. У поля ввода установим многострочный режим и уберем заголовок.
У командной панели формы снимем флаг «Автозаполнение»
Создадим команду формы «Поместить», которую разместим в командной панели формы в виде кнопки. И у этой кнопки установим флаг у свойства «Кнопка по умолчанию»
Теперь займемся параметрами. Вполне возможно, что в нашем поле таблицы формы документа уже будет какая-то информация, поэтому её необходимо будет передать в форму ввода пояснения. Для этого на форме ввода пояснения создадим параметр ПриемникПояснения, в который, впоследствии, и будем передавать значение пояснения из формы документа.
Теперь сделаем так, чтобы при открытии формы значение из этого параметра передавалось в реквизит «Ввод пояснения» из нашей формы. Для этого у нашей формы ввода пояснения создадим событие при создании на сервере.
В этом обработчике напишем следующий код
Нам осталось отработать нажатие на кнопку «Поместить», для этого создадим обработчик соответствующей команды в клиентском контексте.
В этом обработчике мы будем закрывать форму, а в качестве параметра закрытия передадим реквизит формы.
С этой формой мы закончили, перейдем к форме документа. На форме документа у поля Пояснения таблицы формы создадим обработчик события ПриОткрытии в клиентском контексте.
Это событие возникает, когда пользователь нажимает на кнопку «Открыть» соответствующего поля.
В обработчике события, первым делом, в параметр СтандартнаяОбработка установим значение Ложь. Тогда при нажатии на кнопку открытия, не будет срабатывать стандартная обработка платформы, которая срабатывает при нажатии на эту кнопку.
Теперь в этой же процедуре нам нужно получить значение поля Пояснение текущей строки.
Это значение мы будем передавать в качестве параметра в форму ввода пояснения при её открытии. Для этого я создам структуру, где в качестве ключа будет название параметра из формы ввода пояснения (ПриемникПояснения), который мы создали в форме ввода пояснения, а в качестве значения структуры будет значение, которое мы только что получили.
Открывать формы мы будем при помощи метода глобального контекста ОткрытьФорму, передадим в неё параметры ввода, а также установим, чтобы блокировалось окно владельца.
Если мы на этом остановимся, то у нас форма ввода пояснения откроется, информация из формы документа там появится, но информация с формы пояснения не будет передана в форму документа, как мы планировали. Для того, чтобы это произошло необходимо создать описание оповещения, в котором будет указан метод, который сработает после закрытия формы ввода описания. В конечном итоге у нас должен получиться следующий обработчик события нажатия на кнопку открытия.
В описании оповещения мы указали процедуру ПослеВыбораПояснения. Нам необходимо создать такую процедуру в клиентском контексте, и сделать её экспортной.
В этой процедуре, мы текущему значению поля Пояснение присваиваем результат закрытия формы ввода пояснения.
На этом наше программирование закончено. Работа выполнена.
Другие статьи про открытие управляемых форм:
Подробно вопросы передачи параметров, открытия форм рассмотрены в книге «Основы разработки в 1С: Такси. Разработка управляемого приложения за 12 шагов». Эта книга станет настоящим подспорьем для тех, кто только начал знакомиться с разработкой управляемого приложения.
Книга «Основы разработки в 1С: Такси» отлично подойдёт тем, кто уже начал программировать и испытывает определенные сложности с этой темой и тем, кто уже давно программирует, но ни разу еще не работал с управляемыми формами 1С
Промо-код на скидку в 15% — 48PVXHeYu
Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»
Эти книги плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog
Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму:
можно оплатить вручную:
Яндекс.Деньги — 410012882996301
Web Money — R955262494655
Вступайте в мои группы в соцсетях, и будьте в курсе всех новостей
One thought on “ Открытие формы в 1С 8.3 с передачей параметров на примере ”
Не работает….после внесения текста в дополнительной форме…Он не передается в основную форму




























