Обновить реквизит СуммаДокумента = сумма проводок БУ Добрый день! Помогите решить задачку - необходимо в реквизит документа СуммаДокумента записывать сумму всех его проводок. Не понимаю куда воткнуть эту обработку, понятное дело, что сумму имеет смысл записывать только после того, когда процедура ОбработкаПроведения завершена. Я делаю в процедуре ОбработкаПроведения: ПроводкиБУ = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей(); ПроводкиБУ.Отбор.Регистратор.Установить(Ссылка); ПроводкиБУ.Прочитать(); ИтогоСуммаПоПроводкам = 0; Для Каждого Проводка Из ПроводкиБУ Цикл ИтогоСуммаПоПроводкам = ИтогоСуммаПоПроводкам + Проводка.Сумма; КонецЦикла; СуммаДокумента = ИтогоСуммаПоПроводкам; ОбъектДок.Записать(РежимЗаписиДокумента.Запись); Однако в ряде случаев не отрабатывает, как будто проводок нет, хотя они создаются. Подписка на событие записи регистра бухгалтерии Хозрасчетный не интересна, т.к. это в целом затормозит систему из-за одного документа, который не так часто проводят. Подскажите, плз! |
А ПриЗаписи? Посмотри винимательно в каких случаях вызывается ОбработкаПроведения |
ПриЗаписи - вызывается до процедуры ОбработкаПроведения - не пойдет! После ОбработкаПроведения вызывается только Подписка на событие записи регистра накопления, или в форме документа ПослеЗаписи, что вообще не пойдет! |
Описание: [b]Возникает при проведении документа[/b]. Основное назначение процедуры-обработчика данного события - генерация движений по документу. Выполняется в транзакции записи. Примечание: Если для данного вида документа в конфигурации установлено автоматическое удаление движений, то перед возникновением события все движения по документу будут удалены. |
есть вариант что часть проводок делается в подписке, поэтому при проведении их ещё нет. |
Да нет, ничего не делается в подписке, процедура ОбработкаПроведения вполне стандартна: Процедура ДвиженияПоРегистрам() ... ДвиженияПоРегистрамРегл(РежимПроведения, СтруктураШапкиДокумента, ТаблицаПоТоварам, Отказ, Заголовок); ДвиженияПоРегистрамУпр(РежимПроведения, СтруктураШапкиДокумента, ТаблицаПоТоварам, Отказ, Заголовок); ... КонецПроцедуры Все делается в процедурах модуля документа, или вызываются процедуры общих модулей |
То есть все выглядит так: Процедура ОбработкаПроведения(Отказ, РежимПроведения) ... ДвиженияПоРегистрам(...) ... КонецПроцедуры |
А ничего, что транзакция ещё не завершена и в базе в регистре может храниться "устаревшая" информация, а ты её оттуда, из базы, набором читаешь (ПроводкиБУ.Прочитать())? |
Вот я и спрашиваю совета, как это сделать правильно? Понимаю, что то, что сейчас абсолютно не верно. |
(8) Так всё ж прозрачно - анализируй записываемые сейчас движения, а не записанные ранее. |
То есть ты предлагаешь отлавливать все движения по БУ, которые совершаются в обработке проведения? А эти движения могут быть конкретно разбросаны в разных процедурах, тем более модулях, что то очень муторно, эта идея была, но была сразу же отброшена ввиду трудоемкости |
[em]эти движения могут быть конкретно разбросаны в разных процедурах[/em] - разбросан алгоритм их формирования, а вот сами движения живут компактно, в наборе. |
Приведи пример модуля, как мне эти движения отловить, пока не понимаю. Как мне прочитать этот набор, в какой процедуре - ОбработкаПроведения? ДвиженияПоРегистрамРегл? |
Движения.МойРегистр Если в процессе проведения специально в базу набор не сбрасывался методом Записать(Ложь) - они там, болезные. |
(6) так у тебя в обработке проведения и не будет видно что есть подписка. сумму считай из таблиц которые пишутся в регистры а не из регистра. если у тебя автозапись, то оно же в обработке проведения не записано ещё |
Чем подписка плоха? |
Процедура МЗ_СписаниеОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт Если не (***твое условие на корректировку документа****) тогда возврат конецесли; ТаблицаСпроводками = ИСточник.Движения.ЕПСБУ.Выгрузить(); иСТОЧНИК.МеняйЧтоХочешь. Источник.Записать(); КонецПроцедуры |
В том то и дело, что я не выловлю Движения.Хозрасчетный, потому что в него запись происходит из тех самых далеких процедур, а не в одном месте. Что касается подписки - это в любом случае дополнительный тормоз, такой регистр, как Регистр бухгалтерии Хозрасчетный, используется в 99% при проведении документов. Лишние проверки и тормоза из-за документа, который используется совсем не часто - нет, так не хочу. |
В подписке выловешь. Она подписка работает после всех алгоритмов. Подписка в примере не на регистр бухгалтерии а на конкретный документ и на 99% записей не влияет. Посмотри сколько подписок в типовой конфигурации. |
Проверил в подписке моего документа ОбработкаПроведения, действительно, код обработчика подписки вызывается в последнюю очередь, после процедуры ОбработкаПроведения в модуле документа, текст моей процедуры: ПроводкиБУ = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей(); ПроводкиБУ.Отбор.Регистратор.Установить(Источник.Ссылка); ПроводкиБУ.Прочитать(); ИтогоСуммаПоПроводкам = 0; Для Каждого Проводка Из ПроводкиБУ Цикл ИтогоСуммаПоПроводкам = ИтогоСуммаПоПроводкам + Проводка.Сумма; КонецЦикла; Однако, все равно, никаких записей набора регистра я не получаю, пусто... |
Замени в 16 епсбу на хозрасчетный и получишь тз с проводками. |
(19) Обработка работает до того как записи попадают в регистр. Тебе нужны движения документа. |
Текущее время: 00:12. Часовой пояс GMT +3. |