![]() |
|
Подскажите по подпискам/обработчикам событий УТ 10.3 | ☑ | ||
---|---|---|---|---|
0
tciban
24.06.15
✎
13:50
|
Допиливаю УТ 10.3 (не надо смеяться, работа есть работа). Стоит следующая задача: для каждого договора делаем дату сверки баланса, нужно запретить изменять взаиморасчеты ранее этой даты. Ну там понятно что часто лазают в доки, чего нибудь исправляют. Доков, которые влияют на регистр взаиморасчетов контрагентов немало, потому идея такая - запомнить движения документа до перепроведения, получить что он хочет делать в регистре (например это можно сделать подписавшись на событие ПередЗаписью набора записей регистра взаиморасчетов контрагентов, затем сравнить, если меняется сума по договору с датой сверки баланса - отказать.
Ну положим что будет писаться в регистр я, как уже сказал могу получить в обработчике события ПередЗаписью набора записей регистра подпиской (возможно это не единственный и не лучший способ, посоветуйте другие), но как туда передать, какие движения у документа были раньше? Через ДополнительныеСвойства набора записей не получается, там набор создается по 2 раза при проведении некоторых доков. Заранее благодарен всем отметившимся и с интересом жду какие мне откроются глубины мудрости! ;) |
|||
1
Славен
24.06.15
✎
13:51
|
(0) ммм доков много, а регистр то один
|
|||
2
Славен
24.06.15
✎
13:52
|
(1) в регистре в модуле набора записей в ПРиЗаписи поставь проверку на период
|
|||
3
tciban
24.06.15
✎
13:58
|
(2) ну так то подписка реально и не нужна, можно в модуле набора записей. Но как там получить что было в наборе раньше и что будет теперь? Потому как проверять надо. Вот например был у нас в документе договор со сверкой баланса, а его оп! и заменили на другой. Значит взаиморасчеты по тому изменяться, а этого допустить нельзя. Илои же просто перепроводим документ, в котором есть договор со сверкой баланса, но сумма не менялась, ну просто открыли документ и написали комментарий и записываем - это делать можно.
|
|||
4
vicof
24.06.15
✎
14:03
|
При проведении Отказ = Договор.ДатаСверки >= Дата
|
|||
5
tciban
24.06.15
✎
14:10
|
(4) для разных доков договор может быть в разных местах - шапке или в разных табличных частях.
Вопрос в другом - вот например перепроводим Реализацию (напоминаю что речь идет про УТ 10.3). Событие набора записей ПередЗаписью вызывается 2 раза, НО если при первом входе сделать ДополнительныеСвойства.Вставить("Вход", 1), то при втором входе ДополнительныеСвойства все равно пустые! Как мне при втором входе получить что было в регистре и что будет? |
|||
6
vicof
24.06.15
✎
14:12
|
(5) Ну пройдись по метаданным. Универсальная функция в 25 строчек
|
|||
7
D_E_S_131
24.06.15
✎
14:17
|
У НабораЗаписей разве нет отбора по Регистратору, из которого можно получить ссылку на документ? Или, имея ссылку на документ, нет возможности прочитать записи регистра накопления?
|
|||
8
tciban
24.06.15
✎
14:18
|
(6) опять же этого недостаточно, потому что даже если есть договор с установленной сверкой, но если мы не меняем сумму, а просто перепроводим документ - то все ок, можно проводить. Потому мне нужно получить движения документа до перепроведения и какие мы собираемся сделать. Второе легко сделать в событии набора записей через Выгрузить() - на выходе имеем табличку :)
|
|||
9
tciban
24.06.15
✎
14:20
|
(7) в ут 10.3 большинство типовых доков сначала трет свои движения, а потом пишет. Т.е. 2 события перед записью - сначала есть движения старые движения, но нет новых, при втором входе - есть новые через выгрузить(), но нет уже старых! Как передать полученные при первом событии старые движения во второй вызов обработчика событий?
|
|||
10
vicof
24.06.15
✎
14:20
|
(8) тогда перед записью проверяй сумму в объекте и сумму по ссылке
|
|||
11
tciban
24.06.15
✎
14:26
|
(10) хлопотно это. Для каждого вида документа по своему надо эту сумму считать.
|
|||
12
tciban
24.06.15
✎
14:26
|
потому и стараюсь найти универсальное решение.
|
|||
13
D_E_S_131
24.06.15
✎
14:28
|
(9) Что-то мне подсказывает, что все равно все эти вызовы удаление/создание новых идет в одной транзакции и в базе до окончания проведения так и будут находиться старые данные.
|
|||
14
tciban
24.06.15
✎
14:32
|
(13) Но как бы до них добраться? Еще раз - все типовые документы УТ 10.3 сначала удаляют движения, потом пишут новые. Поэтому на втором этапе прочитать старые движения через Отбор.Регистратор.Значение уже не получается.
|
|||
15
tciban
24.06.15
✎
19:11
|
Неужели так никто ничего дельного и не скажет :(
|
|||
16
Fragster
гуру
24.06.15
✎
19:18
|
(15) сделай проверку перед записью набора и при записи набора регистра. 1 запрос.
перед записью будет срабатывать для имеющихся движений перед удалением, при записи - для новых после записи. Поскольку все происходит в транзакции - отработает всё как надо. |
|||
17
Fragster
гуру
24.06.15
✎
19:19
|
А документов, которые делают записи по взаиморасчетам разными периодами, я что-то не помню...
|
|||
18
Fragster
гуру
24.06.15
✎
19:19
|
(17)+ если автор хочет в одном документе часть движений разрешать менять, а часть - нет
|
|||
19
tciban
24.06.15
✎
19:36
|
(16) не совсем понял. Мне, по идее, нужно сравнить движения документа до изменения и движения документа после изменения. Но при первом входе в обработчик события я получаю движения до изменения, но не вижу движений которые будут после изменения, а во втором вхождении старых движений уже нет, потому мне старые сравнить не с чем...
|
|||
20
tciban
24.06.15
✎
19:38
|
И я не могу придумать гед сохранить в памяти движения до изменения при входе в обработчик собития в первый раз, что бы потом из видно было при втором входе в обработчик при записи, где я уже вижу что будет записано в регистр по новому.
|
|||
21
tciban
25.06.15
✎
07:41
|
up!
|
|||
22
Fragster
гуру
25.06.15
✎
08:40
|
(20) тебе не надо запоминать движения.
|
|||
23
Fragster
гуру
25.06.15
✎
08:42
|
если движения в закрытом периоде были - увидишь это перед записью пустого набора - сразу отказ. если это новые движения в закрытом периоде - то отказ при записи новых заполненных движений.
Запоминать ничего не надо. |
|||
24
Fragster
гуру
25.06.15
✎
08:43
|
или у тебя ситуаций, когда один документ делает движения сразу и в закрытом и в не закрытом периоде? Сделай особенные права и дай их человеку, который соображает.
|
|||
25
tciban
25.06.15
✎
08:57
|
(24) Если документ тупо перепроводиться, не меня взаиморасчетов, то и отказ не нужен. Потому то я и хочу сравнивать старые и новые движения.
пока придумал запоминать старые движения в глобальной переменной глОбщиеЗначения (которая в модуле обычного приложения есть). Не красиво конечно как то, но должно сработать. |
|||
26
Лодырь
25.06.15
✎
09:01
|
(25) А убрать автоматическое удаление движений не вариант?
|
|||
27
tciban
25.06.15
✎
09:26
|
(26) а атм не автоматическое, там в каждом типовом документе при проведении вызывается ОбщегоНазначения.УдалитьДвиженияРегистратора(ЭтотОбъект, Отказ);
|
|||
28
tciban
25.06.15
✎
09:27
|
и лезть править в каждый документ я как то не хочу. Хочется решить задачу минимальными изменениями конфигурации.
|
|||
29
tciban
25.06.15
✎
09:28
|
(26) Потому что в душе я тоже Лодырь :)
|
|||
30
Fedor-1971
25.06.15
✎
09:36
|
(27) так ты уже сам знаешь место, где нужно исправить.
Анализируй в ОбщегоНазначения.УдалитьДвиженияРегистратора(ЭтотОбъект, Отказ), как ты сам написал она во ВСЕХ!!! стандартных доках. |
|||
31
Fragster
гуру
25.06.15
✎
09:46
|
(30) того еще переписать контроль взаиморасчетов, если он есть, также во всех (ну и фифо по документам расчета, или что там от остатков зависит)
|
|||
32
Fragster
гуру
25.06.15
✎
09:47
|
(25) а зачем перепроводить документы закрытого периода?
|
|||
33
tciban
25.06.15
✎
10:06
|
ну тут как бы не закрытие периода, а просто для каждого договора время от времени сверяют взаиморасчеты с контрагентом ну и отмечают дату сверки. После этого взаиморасчеты в базе на дату раньше даты сверки менять нельзя.
|
|||
34
tciban
25.06.15
✎
10:09
|
(31) да нафига так сложно? При первом входе получаю старые движения документа в виде таблички, пихаю в структуру глОбщиеЗначения, при втором входе сравниваю, если надо - отказ. Вот и все. Вся проверка локализирована в модуле набора записей в одной процедуре.
|
|||
35
D_E_S_131
25.06.15
✎
11:08
|
Наверное вариант это сделать хранилище типа РС. Измерение - ссылка на документ и ресурс с хранением структуры из ТЗ с прошлыми движениями. В подписке проверяешь движения на "пустоту", по этому факту определяешь, что произошла очистка. В этот момент считываешь из базы исходное состояние. Сохраняешь "исходное состояние" в РС.
Во "втором проходе" выполняешь сверку с данными в РС. Есть другая идея, но она требует проверки. Во втором проходе получить "исходное состояние" через вызов фонового задания. Возможно (тут и надо проверить), что выполнение фонового задания не будет считаться "этим же сеансом" и результат транзакции не повлияет на него. |
|||
36
tciban
25.06.15
✎
11:21
|
(35) Не, регистр сведений тут излишен, перепроведение происходит в рамках одного сеанса, после его завершения или отмены эти сведения нам не нужны.
|
|||
37
tciban
25.06.15
✎
11:21
|
Проще в глобальной переменной :)
|
|||
38
D_E_S_131
25.06.15
✎
11:41
|
(37) Тут смотри сам как тебе удобнее. В РС можно сохранить и заиспользовать сведения, даже после проведения (например, провести нужно, но требуется оценить "масштаб урона"). В обычном случае можешь запись после проведения удалять.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |