Имя: Пароль:
1C
1С v8
Подскажите по подпискам/обработчикам событий УТ 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) Тут смотри сам как тебе удобнее. В РС можно сохранить и заиспользовать сведения, даже после проведения (например, провести нужно, но требуется оценить "масштаб урона"). В обычном случае можешь запись после проведения удалять.
Закон Брукера: Даже маленькая практика стоит большой теории.