Имя: Пароль:
1C
1С v8
УФ. Передать ссылку на реквизит обработки в процедуру как параметр
,
0 zelenprog
 
20.12.23
10:44
Здравствуйте!

В общем модуле есть процедура, которая должна "вычислить" некоторое значение и записать его в реквизит обработки типа "ПолеВвода".

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

ОбщМодуль_Доп.ЗаполнитьПолеВвода(Объект.ПолеВвода1);

Однако, поле ввода передается в процедуру просто как строка.
А надо, чтобы оно передалось по ссылке. Как это сделать???
1 banco
 
20.12.23
10:57
2 zelenprog
 
20.12.23
11:07
(1) Прочитал. Но ответа там не нашел.

У меня обе процедуры (и вызывающая процедура в форме и вызываемая процедура общего модуля) являются клиентскими.
Так что передачи управления нету.

В параметре вызываемой процедуры "Знач" не указан. Значит, передача должна выполниться по ссылке.

Тут проблема в том, что надо как-то "адресовать" ссылку реквизита обработки.
3 vicof
 
20.12.23
11:27
Тип какой у твоего реквизита с именем, говорящим о том, что ты не понимаешь, что такое реквизит и что такое поле ввода?
4 Волшебник
 
20.12.23
11:36
ПолеВвода1 - плохое имя
5 zelenprog
 
20.12.23
11:49
(3) Тип у реквизита "Строка".

>> ... ты не понимаешь, что такое реквизит и что такое поле ввода?

Я понимаю. Но про "ПолеВвода" я конечно не правильно написал.
Значит так.
В обработке на вкладке "Данные" добавлен реквизит "ИмяФайла" с типом "Строка". На форму добавлен элемент типа "ПолеВвода", у которого установлен ПутьКДанным "Объект.ИмяФайла".

(4) >> ПолеВвода1 - плохое имя

Согласен. На самом деле имя реквизита - "ИмяФайла".
Процедруа в общем модуле должна выполнить поиск файла по сложным критериям и подставить его имя в поле ввода.
6 Valdis2007
 
20.12.23
11:52
(5) ИмяФайла -реквизит обработки? или формы обработки?
7 zelenprog
 
20.12.23
11:53
(6) Реквизит обработки.
8 Garykom
 
гуру
20.12.23
11:54
Реквизиты обработок (особенно внешних) лучше не использовать
Глюки разные

Имхо я стараюсь использовать реквизиты формы
9 vicof
 
20.12.23
11:56
Ты передаешь строку в общий модуль.
Строка передается по значению, ссылок на строку не существует.
Объект.ИмяФайла = ЗаполнитьПолеВвода(Объект.ИмяФайла); должно тебя спасти.
10 Valdis2007
 
20.12.23
11:59
убери в определении процедуры в модуле ключевое слово - Знач

ЗаполнитьПолеВвода(Знач Параметр)
11 zelenprog
 
20.12.23
12:01
(9) Хм...
Значит, если реквизит обработки - имеет тип, например, "ТаблицаЗначений", то ссылку на такой реквизит я смогу передать.
А если реквизит имеет тип "Строка", то ссылки на такой реквизит нету?

Странно.
А как можно "выкрутиться"?
12 zelenprog
 
20.12.23
12:02
(8) Попробовал передавать реквизит формы - результат тот же.

(9) У меня нету "Знач" в объявлении параметров процедуры.
13 zelenprog
 
20.12.23
12:02
(10) У меня нету "Знач" в объявлении параметров процедуры.
14 Valdis2007
 
20.12.23
12:09
(13) тогда делай как в (9) Объект.ИмяФайла = ЗаполнитьПолеВвода(Объект.ИмяФайла);
15 Valdis2007
 
20.12.23
12:09
если ЗаполнитьПолеВвода - функция
16 Garykom
 
гуру
20.12.23
12:14
В переводе на фронт/бэк из веб-технологий вопрос звучит примерно так:

"На бэке (nodejs) есть процедура, которая должна вычислить и заполнить элемент html в браузере.
Как его передать по ссылке из js?"

Ответ: Никак.
17 zelenprog
 
20.12.23
12:21
(16) Ну у меня же не фронт\бэк. У меня обе процедуры "клиентские".
18 Garykom
 
гуру
20.12.23
12:26
Объект["ИмяРеквизита"]

Но это изврат
19 Garykom
 
гуру
20.12.23
12:26
(18)+ Либо через ЗаполнитьЗначенияСвойств
20 НафНаф
 
20.12.23
13:06
(0) а оно и передается по ссылке
21 Dmitrii
 
гуру
20.12.23
13:29
(0)

СтрокаДляЗаполненияПоляВвода = "";
ОбщМодуль_Доп.ЗаполнитьПолеВвода(СтрокаДляЗаполненияПоляВвода);
Если ЗначениеЗаполнено(СтрокаДляЗаполненияПоляВвода) Тогда
  Объект.ПолеВвода1 = СтрокаДляЗаполненияПоляВвода;
КонецЕсли;
22 Dmitrii
 
гуру
20.12.23
13:32
+1 к (20)

Кстати говоря, да.
Всё работает корректно.
Где-то косяк у автора.
23 zelenprog
 
20.12.23
14:15
(20),(22) Нашел в чем мой косяк.

Если присваивать в той же процедуре через имя параметра, то все работает:

Процедура ЗаполнитьРеквизитИмяФайла (пРеквизит)
  ...
  пРеквизит = "Новое значение";
  ...
КонецПроцедуры


Однако, мне надо передавать ссылку на этот реквизит в другую процедуру через локальную переменную или через свойство структуры:

Процедура ЗаполнитьРеквизитИмяФайла (пРеквизит) Экспорт

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

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


Процедура ВыборФайлаЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
    Если ВыбранныеФайлы <> Неопределено Тогда
        ДополнительныеПараметры.РеквизитИмяФайла = ВыбранныеФайлы[0];
    КонецЕсли;
КонецПроцедуры



И вот тут уже передать ссылку на реквизит типа "Строка" через структуру не получается.
Хотя, если этот реквизит является "сложным" типом (например "ТаблицаЗначений"), то ссылку передать можно!
24 zelenprog
 
20.12.23
14:20
(18) >> Объект["ИмяРеквизита"]
>> Но это изврат

А почему это изврат?
И как правильно делать в таком случае?
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс