Имя: Пароль:
1C
1С v8
Версионирование и проведение
, ,
0 ДядяМитяй
 
24.01.22
17:01
С удивлением обнаружил, что при включенном версионировании к моменту захода в обработку проведения уже и реквизит Проведен = истина и Ссылка.Проведен тоже. Хотел проверять на проведение непроведенного документа, а тут такая неожиданность. Пришлось проверку выносить в ПередЗаписью.
Это нормальное поведение или изъ... доставшейся мне самописки на БСП? И как грамотно выполнить проверку, что документ "не перепроводится", а проводится из непроведенного состояния. Ну кроме объявления переменной БулоПроведено в модуле объекта...
1 DrShad
 
24.01.22
17:09
так все проверки и делаются перед записью
2 RetardedToBoot
 
24.01.22
17:10
Поставь брекпоинт в обработку проведенич и при записи и смотри откуда вызываются.
3 Dmitrii
 
гуру
24.01.22
17:18
(0) Это нормальное поведение. Чем вызвано твоё удивление - непонятно. Когда документ проводится, он должен быть уже записан в базу данных. Т.к. запись и проведение выполняются в одной транзакции, если проведение обломится, то и запись вместе со всей транзакцией откатится.

Все подобные проверки выполняются ПередЗаписью. Типа "Если НЕ Ссылка.Проведен и РежимЗаписиДокумента.Проведение". При необходимости можно сохранить что-то в ДополнительныеСвойства. Но сама идея - вешать какую-то логику на то проводится ли документ повторно - как правило не самая лучшая.
4 ДядяМитяй
 
25.01.22
12:04
(3) Например, при проведении надо сделать проверку с громоздкими запросами к другим таблицам - документам, регистрам ... - а, скажем, если практикуется групповое перепроведение - этого делать не надо, потому что дико долго будет.
5 DrShad
 
25.01.22
12:15
(4) при групповом проведении пиши в ДопСвойства и на него проверяй
6 ДядяМитяй
 
25.01.22
12:17
(3) удивление вызвано тем, что Ссылка.Проведен = Истина. При обычном проведении такого не должно быть. А при версионировании видимо происходит запись перед тем, как начнется обработка проведения.
7 DrShad
 
25.01.22
12:18
тебе же сказали что запись происходит до проведения и не зависит от версионирования
8 Dmitrii
 
гуру
25.01.22
12:19
(4) Например, в типовой БП 3.0 это уже реализовано.
В модуле документа.

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
//.....
// При групповом перепроведении реквизиты документов не меняются,
// поэтому обновление связанных данных выполнять не требуется.
Если ПроведениеСервер.ГрупповоеПерепроведение(ЭтотОбъект) Тогда
    Возврат;
КонецЕсли;
//... какой-то код, с проверками и заполнением реквизитов, который выполняться не будет
КонецПроцедуры
9 Dmitrii
 
гуру
25.01.22
12:22
(6) >> При обычном проведении такого не должно быть.

Наоборот. В момент поведения (ОбработкаПроведения) документ уже записан. Поэтому при обращении к БД уже Ссылка.Проведен = Истина.
ПередЗаписью Ссылка.Проведен = Ложь. Если проводится не проведенный документ.
10 ДядяМитяй
 
25.01.22
12:24
(8) Спасибо, не знал
(9) Выглядит довольно дико. Все равно, что отправить отчет о сделанной работе и после этого приступить к ее выполнению. ))
11 Dmitrii
 
гуру
25.01.22
12:24
+ к (8).
Аналогичный код можно встретить и в ОбработкаПроведения. Наример.

Если НЕ ПроведениеСервер.ГрупповоеПерепроведение(ЭтотОбъект) Тогда
ТаблицаСтатусовСчетов = СтатусыДокументов.ПодготовитьТаблицуСтатусовПоступленияПоСчетам(
  ПараметрыПроведения.ПоступлениеТоваровУслугПоСчету,
  ПараметрыПроведения.ПоступлениеВозвратнойТарыПоСчету,
  ПараметрыПроведения.Реквизиты);
КонецЕсли;
12 Dmitrii
 
гуру
25.01.22
12:26
(10) >> Выглядит довольно дико.

Наоборот. Выглядит абсолютно логично. При проведении мы должны оперировать текущими данными документа, а не тем что в нём было до записи. Странным было бы проводить документ с данными, которые были ДО того как пользователь что-то в нём поменял.
13 Kassern
 
25.01.22
12:26
(10) а как вы по другому это реализуете? Ведь проведен или нет, это всего лишь типовой реквизит документа. Такой же как дата и номер. Чтобы сделать проводки с этим регистратором, надо, чтобы документ уже был в базе. Вы предлагаете записывать документ в базу без пометки проведения, потом делать проводки, а потом еще раз записывать документ, чтобы поставить пометку проведен?
14 pechkin
 
25.01.22
12:27
(10) а ты предлагаешь несколько раз записывать документ?
15 Kassern
 
25.01.22
12:28
(14) видимо так, либо метку проведения хранить не в документе, а в отдельном регистре)
16 pechkin
 
25.01.22
12:29
если нужно состояние до записи, то сохрани его в процедуре ПередЗаписью
17 pechkin
 
25.01.22
12:30
ну а проверки воообще лучше делать в процедуре ОбработкаПроверкиЗаполнения
18 ДядяМитяй
 
25.01.22
12:34
(14) а фактически так и получается - если проведение обломилось, то записывается еще раз уже без "проведен"
19 Kassern
 
25.01.22
12:35
(18) "то записывается еще раз уже без "проведен"" самостоятельно типовые документы так не записываются. Только если вы сами в попытку не пропишите, мол если не провелось, то просто записать.
20 Kassern
 
25.01.22
12:36
(18) попробуйте любой типовой документ без записи сразу провести. Если будут ошибки, то он у вас не запишется в базу, транзакция будет отменена
21 DrShad
 
25.01.22
12:40
(19) +1
22 ДядяМитяй
 
25.01.22
12:40
(19) мы заходим в обработку проведения. документ уже записан с проведен = истина, при проведении случается отказ = истина. по вашей же логике записывается еще раз с проведен = ложь.
(20) "транзакция будет отменена". а почему же ссылка.проведен = истина? разные транзакции? одна после записи другая после проведения?
23 pechkin
 
25.01.22
12:41
(22) это называется отмена транзакции. Советую поизучать что такое транзакции
24 DrShad
 
25.01.22
12:42
(22) потому что ты в транзакции смотришь
25 Kassern
 
25.01.22
12:46
(22) Почитайте про работу с транзакциями и у вас множество вопросов отпадет
26 Dmitrii
 
гуру
25.01.22
12:51
(22) >> при проведении случается отказ = истина, по вашей же логике, записывается еще раз.

Это по твоей логике. По логике СУБД и 1С происходит откат транзакции к предыдущему состоянию объектов базы данных, где документ не записывали и не проводили. Никто дважды ничего не записывает. Даже если ты принудительно в обработке проведения понавтыкаешь ЭтотОбъект.Записать(), при отмене транзакции всё просто откатиться назад.
27 Жан Пердежон
 
25.01.22
12:54
(22) Проведен - реквизит документа, документ 1 раз в базу записывается
28 Dmitrii
 
гуру
25.01.22
12:54
ОФФ. Вообще странно, что такие очевидные вещи приходится рассказывать коллеге с семилетнем стажем на форуме.
29 Жан Пердежон
 
26.01.22
14:17
(28) да, должно быть странно;
с другой стороны из опыта собеседований 5-7 лет и более стажа не гарантируют знаний
и по факту может оказаться слабее джуна с 1,5 годами на большом проекте