Форум на Kuban.ru (http://forums.kuban.ru/)
-   Территория 1С (http://forums.kuban.ru/f1040/)
-   -   Обновить реквизит СуммаДокумента = сумма проводок БУ (http://forums.kuban.ru/f1040/obnovit-_rekvizit_summadokumenta_%3D_summa_provodok_bu-6462588.html)

denisv 28.01.2015 11:12

Обновить реквизит СуммаДокумента = сумма проводок БУ
 
Добрый день!
Помогите решить задачку - необходимо в реквизит документа СуммаДокумента записывать сумму всех его проводок. Не понимаю куда воткнуть эту обработку, понятное дело, что сумму имеет смысл записывать только после того, когда процедура ОбработкаПроведения завершена. Я делаю в процедуре ОбработкаПроведения:
ПроводкиБУ = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
ПроводкиБУ.Отбор.Регистратор.Установить(Ссылка);
ПроводкиБУ.Прочитать();
ИтогоСуммаПоПроводкам = 0;
Для Каждого Проводка Из ПроводкиБУ Цикл
ИтогоСуммаПоПроводкам = ИтогоСуммаПоПроводкам + Проводка.Сумма;
КонецЦикла;
СуммаДокумента = ИтогоСуммаПоПроводкам;
ОбъектДок.Записать(РежимЗаписиДокумента.Запись);
Однако в ряде случаев не отрабатывает, как будто проводок нет, хотя они создаются.
Подписка на событие записи регистра бухгалтерии Хозрасчетный не интересна, т.к. это в целом затормозит систему из-за одного документа, который не так часто проводят. Подскажите, плз!

nordbox 28.01.2015 11:19

А ПриЗаписи?
Посмотри винимательно в каких случаях вызывается
ОбработкаПроведения

denisv 28.01.2015 11:22

ПриЗаписи - вызывается до процедуры ОбработкаПроведения - не пойдет! После ОбработкаПроведения вызывается только Подписка на событие записи регистра накопления, или в форме документа ПослеЗаписи, что вообще не пойдет!

nordbox 28.01.2015 11:22

Описание:
[b]Возникает при проведении документа[/b]. Основное назначение процедуры-обработчика данного события - генерация движений по документу. Выполняется в транзакции записи.

Примечание:
Если для данного вида документа в конфигурации установлено автоматическое удаление движений, то перед возникновением события все движения по документу будут удалены.

angro 28.01.2015 11:26

есть вариант что часть проводок делается в подписке, поэтому при проведении их ещё нет.

denisv 28.01.2015 11:31

Да нет, ничего не делается в подписке, процедура ОбработкаПроведения вполне стандартна:
Процедура ДвиженияПоРегистрам()
...
ДвиженияПоРегистрамРегл(РежимПроведения, СтруктураШапкиДокумента, ТаблицаПоТоварам, Отказ, Заголовок);

ДвиженияПоРегистрамУпр(РежимПроведения, СтруктураШапкиДокумента, ТаблицаПоТоварам, Отказ, Заголовок);
...
КонецПроцедуры
Все делается в процедурах модуля документа, или вызываются процедуры общих модулей

denisv 28.01.2015 11:33

То есть все выглядит так:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
...
ДвиженияПоРегистрам(...)
...
КонецПроцедуры

roma n 28.01.2015 12:14

А ничего, что транзакция ещё не завершена и в базе в регистре может храниться "устаревшая" информация, а ты её оттуда, из базы, набором читаешь (ПроводкиБУ.Прочитать())?

denisv 28.01.2015 13:02

Вот я и спрашиваю совета, как это сделать правильно? Понимаю, что то, что сейчас абсолютно не верно.

roma n 28.01.2015 13:14

(8) Так всё ж прозрачно - анализируй записываемые сейчас движения, а не записанные ранее.

denisv 28.01.2015 13:19

То есть ты предлагаешь отлавливать все движения по БУ, которые совершаются в обработке проведения? А эти движения могут быть конкретно разбросаны в разных процедурах, тем более модулях, что то очень муторно, эта идея была, но была сразу же отброшена ввиду трудоемкости

roma n 28.01.2015 13:31

[em]эти движения могут быть конкретно разбросаны в разных процедурах[/em]
- разбросан алгоритм их формирования, а вот сами движения живут компактно, в наборе.

denisv 28.01.2015 13:33

Приведи пример модуля, как мне эти движения отловить, пока не понимаю. Как мне прочитать этот набор, в какой процедуре - ОбработкаПроведения? ДвиженияПоРегистрамРегл?

roma n 28.01.2015 16:18

Движения.МойРегистр
Если в процессе проведения специально в базу набор не сбрасывался методом Записать(Ложь) - они там, болезные.

angro 28.01.2015 16:25

(6) так у тебя в обработке проведения и не будет видно что есть подписка.

сумму считай из таблиц которые пишутся в регистры а не из регистра. если у тебя автозапись, то оно же в обработке проведения не записано ещё

GariPortman 28.01.2015 18:06

Чем подписка плоха?

GariPortman 28.01.2015 18:15

Процедура МЗ_СписаниеОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт

Если не (***твое условие на корректировку документа****) тогда возврат конецесли;



ТаблицаСпроводками = ИСточник.Движения.ЕПСБУ.Выгрузить();


иСТОЧНИК.МеняйЧтоХочешь.

Источник.Записать();

КонецПроцедуры

denisv 29.01.2015 10:27

В том то и дело, что я не выловлю Движения.Хозрасчетный, потому что в него запись происходит из тех самых далеких процедур, а не в одном месте. Что касается подписки - это в любом случае дополнительный тормоз, такой регистр, как Регистр бухгалтерии Хозрасчетный, используется в 99% при проведении документов. Лишние проверки и тормоза из-за документа, который используется совсем не часто - нет, так не хочу.

GariPortman 29.01.2015 12:06

В подписке выловешь. Она подписка работает после всех алгоритмов. Подписка в примере не на регистр бухгалтерии а на конкретный документ и на 99% записей не влияет. Посмотри сколько подписок в типовой конфигурации.

denisv 29.01.2015 13:48

Проверил в подписке моего документа ОбработкаПроведения, действительно, код обработчика подписки вызывается в последнюю очередь, после процедуры ОбработкаПроведения в модуле документа, текст моей процедуры:
ПроводкиБУ = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
ПроводкиБУ.Отбор.Регистратор.Установить(Источник.Ссылка);
ПроводкиБУ.Прочитать();
ИтогоСуммаПоПроводкам = 0;
Для Каждого Проводка Из ПроводкиБУ Цикл
ИтогоСуммаПоПроводкам = ИтогоСуммаПоПроводкам + Проводка.Сумма;
КонецЦикла;

Однако, все равно, никаких записей набора регистра я не получаю, пусто...

GariPortman 29.01.2015 14:50

Замени в 16 епсбу на хозрасчетный и получишь тз с проводками.

GariPortman 29.01.2015 16:00

(19) Обработка работает до того как записи попадают в регистр. Тебе нужны движения документа.


Текущее время: 00:12. Часовой пояс GMT +3.