Имя: Пароль:
1C
1С v8
Странное поведение В УФ
,
0 Franchiser
 
гуру
05.06.20
17:15
Внешняя обработка.
Есть реквизиты обработки, которые выведены на форму:
Организация,
Период (тип стандартный период),
Флаг1,
Флаг2
.и т.д.


С модуле обработки определена экспортная процедура Мояпроцедура()

В серверной процедуре на форме вызываю кодом:
РеквизитФормыВЗначение("Объект"). Мояпроцедура();

В процедуре происходит установка реквизитов Организация, Период, Флаг1, Флаг2.

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

По логике период не должен был заполниться как и все остальные  реквизиты.
Почему заполнился Период?
1 RomanYS
 
05.06.20
17:23
(0) ничего заполняться не должно. Может ещё какой код есть, который период заполняет.
2 Franchiser
 
гуру
05.06.20
17:26
нет, никакого кода, сейчас тестовую обработку сделаю
3 Franchiser
 
гуру
05.06.20
17:34
тестовая обработка:
https://yadi.sk/d/MN6FQvOy7J6-1g
4 Franchiser
 
гуру
05.06.20
17:39
(3) поменял название реквизита Период на СтПериод. Результат не изменился...
5 Franchiser
 
гуру
05.06.20
17:41
платформа 8.3.17.1386
6 fisher
 
05.06.20
17:47
С реквизитами обработок чехарда какая-то. С самого начала они не заполнялись с сервера, потом с какого-то релиза вроде как пробрасывались кто-то говорил... Теперь опять какая-то непонятка суда по сабжу.
Я делаю проще. Как не использовал в УФ реквизиты обработок, так и не использую.
7 Franchiser
 
гуру
05.06.20
17:48
(6) мне конечно пофиг, но должно же одинаково работать для всех. А не так что для типа стандартный период одним образом, остальные по-другому.
8 fisher
 
05.06.20
17:49
(7) Может, контексты протекли :)
9 Вафель
 
05.06.20
17:50
а обратно то из объекта в реквизит идет преобразование?
10 Franchiser
 
гуру
05.06.20
17:52
(9) нет не  идет, мне не нужно в данном чтобы менялся реквизит формы после изменений в модуле.
Я отлаживаю механизм регламента ручным запуском процедуры ВыполнитьКоманду().
11 Вафель
 
05.06.20
17:53
(10) ну вот поэтому и не заполняется
12 Franchiser
 
гуру
05.06.20
17:53
(11) вопрос был "почему период заполняется"
13 Вафель
 
05.06.20
17:54
случайно не при создании вызываешь?
14 Franchiser
 
гуру
05.06.20
17:55
(13) нет, обработку приложил, если интересно можешь посмотреть
15 Вафель
 
05.06.20
17:56
выложи код (на pastebin). влом обработку открывать
16 Franchiser
 
гуру
05.06.20
18:00
17 Сергиус
 
05.06.20
23:21
(0)Да, глюк повторяется, платформа 8.3.16.1148
18 Фрэнки
 
06.06.20
00:16
глюк... глюк... нет никакого глюка. Всегда так работало и будет и дальше работать также

РеквизитФормыВЗначение("Объект"). Мояпроцедура();

Эта строчка кода _конструктор_ объекта и создает новый экземпляр - если это понятие о чем-то говорит. Оно не использует какой-то существующий экземпляр, но создает! Все.

Если очень хочется каким-то способом передавать значения между модулями и хочется для этого приспособить реквизиты, то халявы не получится.
Другими способами - через параметры, через структуры, которые пропихиваются в параметры, через хранилища значений... что мне часто кажется жутко неоптимальным.
Вероятно, что еще какие-то варианты есть. Но через создание нового экземпляра.
И, кстати, обработкаОбъект не единственный вид объектов, с которым такие фокусы не прокатывают.
19 Сергиус
 
06.06.20
01:12
(18)Почему прокатывает с реквизитом типа стандартный период и не прокатывает со строкой и булево?
20 hhhh
 
06.06.20
01:20
(19) возможно на форме задано сохранение реквизитов. Задпно, что период сохраняется, а остальные нет.
21 Сергиус
 
06.06.20
01:22
(20)Нет там сохранения, автор в посте (3) выложил пример обработки.
22 Сергиус
 
06.06.20
01:25
+(21)Причем с реквизитом типа Дата такое не прокатывает. Конкретно СтандартныйПериод только.
23 Жан Пердежон
 
06.06.20
02:18
(18) слышал анекдот про чукчу-писателя?
(0) 8.3.16.1030
подтверждаю, протекает именно тип СтандартныйПериод (с любым именем реквизита),
дата, стандартная дата начала - норм.
Пили пост на партнерке.
24 runoff_runoff
 
06.06.20
03:00
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
ОбработкаОбъект.МояПроцедура();
ЗначениеВРеквизитФормы(ОбработкаОбъект, "Объект"); // нужно вернуть объект в данные формы
25 Franchiser
 
гуру
06.06.20
10:29
(24) не хочу я возвращать объект, хочу оставить форму как была до запуска
26 Фрэнки
 
06.06.20
10:36
(25) мало того! в данном конкретном случае речь идет об использовании экземпляра объекта, который просто хранится в базе в виде ветки метаданных.

Это не экземпляр документа из списка ДокументОбъект, не экземпляр справочника из списка СправочникОбъект.

Тут было бы достаточно создать процедуру с параметрами (в скобках) и все.
27 Kassern
 
06.06.20
10:45
(0) Вообще не понимаю, зачем пихать реквизит формы в объект, если нужно всего лишь реквизиты заполнить? Я понимаю еще, если нужно из модуля формы обратиться в модуль объекта обработки и выполнить какую-нибудь экспортную функцию. Вы могли просто (даже на клиенте, если простой тип данных) заполнить значениями реквизиты формы, без этих "плясок с бубмном". Например

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    Период.ДатаНачала=НачалоМесяца(ТекущаяДата());
    Период.ДатаОкончания=ТекущаяДата();
    Реквизит1 ="Тест";
    Реквизит2 =Истина;
КонецПроцедуры
28 Franchiser
 
гуру
06.06.20
22:37
(27) (26) я описываю проблему, что ошибка в платформе. А вы мне тут пишете  как нужно было сделать, или не понимаете для чего.
Объясняю, эта обработки только для демонстрации ошибки. Реально процедуру используется при ручном запуске обработке и при запуске регламкнтного задания. Во втором случае формате открывается а используется команда с вызовом серверного метода без открытия формы. Я из формы вызываю отладку команды которая отрабатывает так как если бы выполнялся регламент. На текущий момент нет практического смысла в указанном поведении но при разработке нужно будет это учитывать в будущем.
29 Franchiser
 
гуру
06.06.20
22:41
(27) у меня по факту там в процедуре цикл в котором меняется период и организация и выполняются запросы к внешним данным.
А если открывать форму то можно запустить обработку только за конкретный период и по конкретной организации.
30 hhhh
 
06.06.20
22:44
(28) в будущем похоже тоже не будет практического смысла. Какой смысл, если 99 реквизитов не передается, а один реквизит "Период" передается?
31 Franchiser
 
гуру
06.06.20
22:54
(30) а может кому то не нужно чтобы период передавался, как мне. Тогда нужно запоминать старое значение периода и его восстанавливать как до обработки. Зачем мне последний период который в цикле устанавливался в модуле обработки...
32 Ненавижу 1С
 
гуру
06.06.20
22:57
Проверил:

Период = Новый СтандартныйПериод(ВариантСтандартногоПериода.Месяц);  //так норм
Период.ДатаНачала = НачалоМесяца(ТекущаяДата());                     // а так протекает

Видимо как-то криво работает и связано с тем, что СтандартныйПериод это таки ссылка-на-объект, а не простое значение
Но объект живущий на форме
33 Фрэнки
 
07.06.20
00:08
(28) // я описываю проблему, что ошибка в платформе.

Это не ошибка в платформе, а осознанное, заранее проработанное поведение.
34 Фрэнки
 
07.06.20
00:10
И там выше написали, чтоб пилил пост на Партнерку - вот и пили.

Авось у них получится внятно объяснить, если тутошние объяснения тебя не устраивают.
35 Franchiser
 
гуру
07.06.20
01:55
(34) нет доступа в партнерку у меня.
(33) какое поведение? Что тип стандартный период как-то иначе протекает и обрабатывается в форме? Проблема только с этим типом.
36 RomanYS
 
07.06.20
11:41
(32) похоже прав
Если реквизит произвольного типа инициализировать на форме, то его изменения через РеквизитФормыВЗначение("Объект")... вернутся на форму. Если реквизит переиницилизировать (Реквизит = Новый ...) в процедуре объекта, то изменения не передадутся.

Стандартный период не единственный тип, тоже самое, например, со списком значений. Возможно работает вообще с любым типами имеющими конструкторы (Новый ...), но это не точно.
Основная теорема систематики: Новые системы плодят новые проблемы.