Имя: Пароль:
1C
1С v8
Где сохранить данные между вызовами событий разных объектов?
,
0 tciban
 
25.07.22
10:19
А вот такой, коллеги, возник вопрос - где бы мне сохранить структурку данных в подписке на событие документа, что бы потом ее вытащить в модуле набора записей регистра, в событии при записи?
Учитывая, что в регистре мы имеем ссылку на документ, а значит ДополнительныеСвойства документа нам не годятся, Учитываем так же, что в УТ 10.3 удаление движений регистра идет программно, потому у нас подписки модуля набора записей вызываются 2-жды. ДополнительныеСвойства регистра тоже не годятся :( А я как раз хочу передать в событие ПриЗаписи движения документа до перепроведения...

ПараметрыСеанса тоже не стоит использовать - их надо аккуратно инициализировать в соответствующем месте, а хочется все проще сделать.

Куда засунуть данные? Что то вроде глобальной переменной, но что бы доступна была и на сервере и на клиенте. Какое нибудь хранилище или что еще что живет в пределах сеанса в памяти?
1 H A D G E H O G s
 
25.07.22
10:30
Свой отдельный, специально обученныц параметр сеанса на все случаи жизни.
2 tciban
 
25.07.22
10:36
(1) Не, это слишком просто и очевидно. Какие еще есть способы хочу узнать! Вот например как такая идея - через поток?
Как то так:
  Поток = Новый ПотокВПамяти();
  ЗаписьДанных = Новый ЗаписьДанных(Поток);
и далее...
3 Garykom
 
гуру
25.07.22
10:38
(0) А чем не устраивает классика в виде https://www.koderline.ru/expert/instruktsii/article-vremennoe-khranilishche-v-1s/ ?
4 tciban
 
25.07.22
10:41
(3) А разве нам не надо знать адрес для чтения из временного хранилища? А как мы передадим адрес?
5 RomanYS
 
25.07.22
10:44
(0) Почему не годятся ДополнительныеСвойства набора записей регистра?
6 Garykom
 
гуру
25.07.22
10:45
(4) Для этого используется БезопасноеХранилищеДанных
7 Кура-Цеце
 
25.07.22
10:47
(5) Потому что при записи регистра у тебя два разных объекта набора, каждый со своими дополнительными данными. Один используется при удалении, второй - при добавлении.
8 Кура-Цеце
 
25.07.22
10:48
(6) Микросервис же. На go. Не?
9 RomanYS
 
25.07.22
10:49
(7) так первый набор его не интересует, а во второй прекрасно всё передаётся из модуля/подписки проведения
10 Garykom
 
гуру
25.07.22
10:49
(8) Видимо тебя трясет что другие смогли кроме 1С освоить еще и много других технологий? А ты не смог?
11 tciban
 
25.07.22
10:50
(5) потому что в УТ 10.3 набор записей создается дважды - при очистке регистра и при записи новых движений. Меня интересует второй вызов. Меду этими вызовами ДополнительныеСвойства очищаются.
12 RomanYS
 
25.07.22
10:50
(7) кстати проверил на ЗАВИСИМОМ РС, при проведении запись один(!) раз
13 Кура-Цеце
 
25.07.22
10:52
(12) А теперь проверь при перепроведении с "удалять движения автоматически"
14 tciban
 
25.07.22
10:53
(6) БезопасноеХранилищеДанных
Доступность:
Мобильный клиент, мобильное приложение (клиент).

У меня УТ 10.3 Не мобильное приложение. ОФ Хотя совместимость конфы отключена, да...
15 Garykom
 
гуру
25.07.22
10:53
(14) Гм что то путаешь.
https://pro1c8.ru/kak-hranit-paroli/
16 RomanYS
 
25.07.22
10:54
(13) Да, теперь записи две. Но допсвойства переданные из обработки проведения есть только во втором, собственно что и нужно ТС
17 Кура-Цеце
 
25.07.22
10:55
(15) Это БСПшный регистр сведений, о освоивший еще и много других технологий.
18 RomanYS
 
25.07.22
10:55
(11) из обработки проведения ты работаешь именно со вторым вызовом
19 Garykom
 
гуру
25.07.22
10:56
(17) Ну да. А что его УТ 10.3 нет? Оно не на БСП?
20 tciban
 
25.07.22
10:57
Господа! Если я смогу передать адрес на хранилище, то зачем мне вообще хранилище? я то что нужно и так передам.
21 Кура-Цеце
 
25.07.22
10:58
(18) Да, похоже для движений это отдельный случай. Надо только убедится, что оно из подписки работает, он же уже не в модуле.
22 Garykom
 
гуру
25.07.22
10:59
(20) адрес хранилища можно приколотить
23 RomanYS
 
25.07.22
11:00
(21) Ну да, если в модуле набор явно не записали, то проблем в подписке не будет. А если была явная запись - поздно пить боржоми, но можно ещё раз перечитать регистр
24 tciban
 
25.07.22
11:04
(22) если я могу поместить адрес хранилища куда либо, откуда я смогу его получить там где мне надо, то что мешает мне туда же засунуть те, данные, которые передавать через хранилище планируется?
25 tciban
 
25.07.22
11:05
(23) Проблема в том, что при отмене проведения документа вход в подписку будет 1 раз, при перепроведении - 2 раза. При первом проведении - 1 раз. Как в модуле набора записей понять что происходит с документом?
26 Garykom
 
гуру
25.07.22
11:06
(24) СП открываешь и там:
Глобальный контекст (Global context)
ПолучитьИзВременногоХранилища (GetFromTempStorage)
Синтаксис:
ПолучитьИзВременногоХранилища(<Адрес>)
Параметры:
<Адрес> (обязательный)
Тип: Строка.
Адрес, указывающий на значение во временном хранилище.


ЗЫ <Адрес> (обязательный)
Тип: Строка.
27 RomanYS
 
25.07.22
11:12
(25) по наличию допсвойства, оно будет передаваться только из проведения
28 Garykom
 
гуру
25.07.22
11:16
(0) "передать в событие ПриЗаписи движения документа до перепроведения"

а для чего это требуется?
чтобы понимать что ничего не поменялось?
29 Кура-Цеце
 
25.07.22
11:16
(19) Нет, УТ 10 не на БСП. БСП начали внедрять во все продукты с управляемыми формами, УТ 11, БП 3 и т.п.
30 Garykom
 
гуру
25.07.22
11:17
(28)+ т.е. например не надо док в план обмена/синхронизацию засовывать, он такой же
31 Кура-Цеце
 
25.07.22
11:18
(26) А сам адрес, из которого данные извлекать надо, ты как собираешся в точку получения передавать? И что мешает точно таким же путем вместо адреса нужные данные?
32 Garykom
 
гуру
25.07.22
11:32
(31)
    Адрес0 = "e1cib/tempstorage/f5e3d398-0315-4d44-8efa-553f0b1775f3?seanceId=7be41162-ea24-4dbd-9f02-fc38f964c65d";
    Адрес1 = ПоместитьВоВременноеХранилище("Данные1", Адрес0);
    
    Значение = ПолучитьИзВременногоХранилища(Адрес0);
    Сообщить("Значение: "+Значение);
33 Garykom
 
гуру
25.07.22
11:33
(32)+ Но это не совсем документированная хрень, так нежелательно
34 СеменовСемен
 
25.07.22
11:35
(0) в подписке таки объект, а не ссылка.
У него есть движения, а там и доп свойства
35 Ненавижу 1С
 
гуру
25.07.22
11:38
(34) имеется ввиду подписка на регистр, где регистратором является нужный документ
36 tciban
 
25.07.22
11:48
Коллеги! Ну не верю я, что никто с такой задачей как передача данных куда то в событие из не связанного с этим места не сталкивался! Я ведь почему спрашиваю - хочу найти наиболее простой и универсальный способ. Так то я способов придумал конечно. Например в УТ 10.3 в глобальном модуле есть переменная глОбщиеЗначения, хоть и доступна она только на клиенте, но работает. Ну еще конечно можно через ПараметрыСеанса... Но как то все это не то... Я уверен, что кто нибудь придумал проще и гениальнее!
37 Ненавижу 1С
 
гуру
25.07.22
11:55
(36) глобальные переменные - это путь в никуда или к нашему "гению 1с"
По факту, используйте ДополнительныеСвойства объекта. Их же можно передавать и в набор записей регистра. При правильном использовании - все будет хорошо. Ну вот такая объектная модель 1С.
38 tciban
 
25.07.22
12:06
(37) глобальные переменные - это путь в никуда или к нашему "гению 1с" - ну не я добавил в модуль приложения эту переменную, это типовой код 1С. И они это сделали раньше "гения", опередили его.
39 Lama12
 
25.07.22
12:08
Все не читал. При использовании ВременногоХранилища наверно стоит добавить признак из какого сеанса запись идет? Если параллельно будут проводиться документы, то как определить параметры какого документа в хранилище?
ИМХО, с параметром сеанса вроде красивее.
Но все таки ДополнительныеСвойства всетаки надо как-то постараться использовать.
40 tciban
 
25.07.22
12:14
(39) Один и тот же документ в разных сеансах проводить не получится, а признак ИмяВидаСНомером я сделал :) Ну а параметры сеанаса да, наверное правильнее сосредоточиться на них
41 Кура-Цеце
 
25.07.22
12:19
(32) > ?seanceId=7be41162-ea24-4dbd-9f02-fc38f964c65d
Хардкод идентификатора сеанса в коде, какая милота.
Не, ну может в микросервисах на go так и принято, не знаю. Но 1С, вообще-то многопользовательская система. Это и к хранению промежуточных параметров в базе данных относится.
42 Garykom
 
гуру
25.07.22
12:22
(41) Написал что так нежелательно.
Но если руки не кривые и знания есть то можно.
Кто мешает идентификатор сеанса подставлять?
43 Кура-Цеце
 
25.07.22
12:32
(42) > идентификатор сеанса подставлять
Так-так-так. А теперь расскажи, откуда его взять и что для этого надо.
44 Garykom
 
гуру
25.07.22
12:41
(43) Логично же получить используя ПоместитьВоВременноеХранилище
45 Ryzeman
 
25.07.22
12:43
(0) господи, зачем так извращаться... У тебя набор записывается дважды - проверяй на количество. Если оно нулевое - пропускай своё допсвойство, если не нулевое - работай с ним.

В рамках мозгового штурма ещё могу предложить временный текстовый файлик и отдельную базу данных к с обменом через odata.
46 tciban
 
25.07.22
12:49
(45) В данной конкретной задаче я хочу сравнить движения до перепроведения (а это первое вхождение в модуле набора записей ПередЗаписью) и при проведении - а это второе вхождение в бработчик При Записи модуля набора записей регистра. И  допсвойство, в которое я в первом вхождении что то помещу к этому моменту уже пустое!!!
47 Ryzeman
 
25.07.22
12:54
(46) В таком случае не логичнее сравнивать данные до попытки их записать?...
48 Мультук
 
гуру
25.07.22
13:21
(46)

//В нужно документе
Процедура ОбработкаПроведения()

   //Сформировали пул движений а-ля  УТ 11

   //Сравнили ДО

   //Явно сохранили движения

   //Сравнили после

КонецПроцедуры
49 tciban
 
25.07.22
13:22
Кстати, вспомнил, почему мне не годиться параметр сеанса! Тип данных параметра сеанса нельзя сделать Структура, только фиксированная структура максимум. Я же хочу запомнить вид операции (проведение,
перепроведение, отмена проведения) таблица движений документа до, границ последовательности до операции.

(47) Проще всего получить таблицу новых движений в событии ПриЗаписи.
50 tciban
 
25.07.22
13:24
(48) Это пройденный вариант! Не работает. Если я обнаружу, что движения до и после идентичны, то после завершения обработчика ОбработкаПроведения граница последовательности все равно сдвинется.
51 tciban
 
25.07.22
15:11
в общем что бы не страдать сделал я параметр сеанса типа хранилище и все через него пустил. работает.
52 Ненавижу 1С
 
гуру
25.07.22
15:18
(51) адепт гения
53 Ryzeman
 
25.07.22
15:19
(52) ++++
54 Garykom
 
гуру
25.07.22
15:26
(51) Правильно сделал
55 Garykom
 
гуру
25.07.22
15:26
(54)+ Только я бы не тип хранилище а адрес в параметрах сеанса
56 RomanYS
 
25.07.22
15:38
(54) Правильно использовать допсвойства, которые ровно для этого и придуманы.
57 СеменовСемен
 
25.07.22
16:41
(35) все верно. В документе передаешь.
В наборе записей получаешь
58 Конструктор1С
 
25.07.22
17:26
(51) ректальненько, тянет на "гениальность"
59 СеменовСемен
 
25.07.22
17:35
(58) ну у гения хотя бы заказ есть не ломать конфу
60 tciban
 
26.07.22
14:18
(52) Вот тут я не понял в чем была шутка юмора - чем тебе Параметр Сеанса не угодил?
61 tciban
 
26.07.22
14:18
(55) А смысл в таком усложнении?
62 RomanYS
 
26.07.22
14:22
(60) странный вопрос. Очевидно глобальный контекст (включаю ПС) не предназначен для передачи параметров между связанными объектами. Есть прямое решение и никакой необходимости в костылях
63 tciban
 
26.07.22
14:23
(56) Я уже устал объяснять - допсвойство живет пока живет документ-объект. В модуле записей регистра у тебя нету документа, есть только ссылка на него! Ну е-мое, как еще то объяснить?! Вот ты в событии документа ПередЗаписью засунешь что то в доп. свойство и как ты это увидишь, гед в модуле набора записей регистра?

Сразу же про допсвойства регистра - при проведении реализации в УТ 10.3 набор записей создается 2 раза! Сначала удаляются записи регистра, потом снова создается набор записей и туда пишется новые записи. Между двумя этими событиями содержимое допсвойств не выживает!

Или я где то ошибаюсь? Ну так расскажи где.
64 RomanYS
 
26.07.22
14:26
(63) >>Между двумя этими событиями содержимое допсвойств не выживает!
Ему и не надо выживать между. Допсвойство заполненное в проведении придёт во вторую запись.
65 tciban
 
26.07.22
14:29
(64) Где же эго увидеть при второй записи? Ну если не лезть к нему в Обработке проведения?

Еще раз - в событии При записи модуля набора записей регистра нет документа-объекта. Там есть ссылка. У нее нет допсвойств. Мне же нужно вернуть гп на место именно в модуле набора записей, при записи. в другом месте ГП еще не менялась, ее не вернуть.
66 tciban
 
26.07.22
14:29
надеюсь объяснил не слишком путано :)
67 RomanYS
 
26.07.22
14:34
(65) что такое ГП?

в обработке/подписке проведения
Движения.ТвойРегистр.ДополнительныеСвойства.Вставить("ТвойПараметрДляНабораЗаписей");

При записи регистра
Если ДополнительныеСвойства.Свойство("ТвойПараметрДляНабораЗаписей") и ...
68 RomanYS
 
26.07.22
14:35
(67) в подписке проведения это будет работать только если в модуле не было прямой записи набора
69 Конструктор1С
 
26.07.22
15:22
(63) ты можешь вообще пояснить, зачем тебе понадобился онанизм по работе с какими-то данными документа в модуле набора записей?
70 tciban
 
26.07.22
15:41
(67) (69) ГП - граница последовательности. Она меняется при записи регистра Партии товаров на складах. Для поступления товров и услуг, оприходования и поступления допрасходов вернуть на место ее, если ничего на самом деле по партиям не менялось можно только в модуле набора записей в событии ПриЗаписи. Для всего остального да, в Обработке проведения можно все отловить и вернуть
71 errorg
 
28.07.22
02:31
(20) Ссылка на регистратор между записями пустого и нового наборов регистра не меняется.
ПоместитьВоВременноеХранилище(ДвиженияДоПроведения, Строка(Регистратор.УникальныйИдентификатор()))
72 tciban
 
28.07.22
07:18
(71) Спасибо! Хорошая идея.
73 errorg
 
28.07.22
09:32
(72) Да не особо:) Видимо, комбинировать надо с (32)
74 tciban
 
28.07.22
20:30
(73) в чем видите проблему?
75 aha2022
 
07.08.22
01:20
Может кому понадобится. В ут 10 получилось использовать совет из (67). В подписке ПередЗаписьюДокумента В дополнительное свойства ДокументОбъект записываем начальные движения документа. В зависимости от состояния документа и режима записи - в подписках ОбработкаПроведения и ОтменаПроведения используем эти движения для контроля/ или передаем в Дополнительное свойство Движения.ТвойРегистр (тогда эти свойства будут доступны при записи набора записей регистра)
76 aha2022
 
07.08.22
01:23
На мой взгляд, тут самое нетривиальное - подход "перекидывания" дополнительных свойств между разными объектами (документом и набором записей регистра) в разных подписках.
77 Сергиус
 
08.08.22
01:12
(0)Отдельные "гении" в справочник писать предлагали..)
Независимо от того, куда вы едете — это в гору и против ветра!