Как читать движения по РБ Хозрасчетный в подписке на событие

1. johny86 3 11.06.13 14:04 Сейчас в теме
УПП. Все регистраторы РБ "Хозрасчетный" подписаны на события ОбработкаПроведения, ПриЗаписи, ОбработкаУдаленияПроведения. Возможно, оптимальнее подписать набор записей РБ Хозрасчетный, но вопрос не в этом. Я знаю, что есть документ "Учет фактических данных...", но заказчик отказывается делать дополнительное действие - заполнять и проводить его. Т.е. после проведения документа РСБУ он хочет моментально видеть данные по бюджетам. Просьба, не предлагать варианты, как уйти от подписок, т.к. это уже пробовали, но уйти не смогли.

Задача - сделать трансляцию из РБ "Хозрасчетный" в РН "Обороты бюджетов".
Пользователь (консультант) настраивает в режиме предприятия произвольный запрос - источник данных в спр. "источники данных для расчета бюджетирования". Необходимо, чтобы на момент подписок в БД гарантировано были проводки Источника - документа-регистратора, который эту подписку инициировал.

Суть проблемы: Если в модуле ОбработкаПроведения какого-нибудь документа есть текст:

Проводка1 = Движения.Хозрасчетный.Добавить();
... // заполнение проводки 1

Движения.Записать(); или Движения.Хозрасчетный.Записать();

Проводка2 = Движения.Хозрасчетный.Добавить();
... // заполнение проводки 2

В подписке выполняется запрос, который не видит там проводку 2, но после окончания всех процедур эта проводка в базе есть.

Движения в РБ "Хозрасчетный" делают различные документы и разными способами. Документы, у которых запрещено проведение, которые не удаляют движения регистратора автоматически и т.д.

Вопрос: Какой код нужно написать в подписке на событие, общий для всех документов, чтобы не двоились проводки, и чтобы эти проводки были в БД на момент выполнения запроса в подписке?

Разумеется, что варианты
Источник.Движения.Хозрасчетный.Записать(); // код в обработчике подписки
или
Источник.Движения.Хозрасчетный.Записать(Ложь); // код в обработчике подписки
не являются универсальными для всех случаев, т.к. где-то они затирают движения, где-то добавляют. Т.е. нужно делать разветвление.

Пробовал много вариантов, но универсального пока не нашел. Может, кто-то уже имел опыт подобной задачи.

P.S. Код в модулях документов не меняем. Нужно, чтобы алгоритм подходил и для документа "ОперацияБух"
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
16. Danil.Potapov 517 14.06.13 18:56 Сейчас в теме
(1) johny86, а что мешает это делать по подписке регистра по событию ПриЗаписи?
2. echo77 1888 11.06.13 14:20 Сейчас в теме
Ищите движения не в движениях, а чтением данных из регистра бухгалтерии по регистратору.
Возможно в этом причина.
Либо движения формируются другой подпиской.

Почему вопрос в разделе Life?
4. johny86 3 11.06.13 14:36 Сейчас в теме
(2) echo77, движения формируются в модуле документа точно, на другие подписки не закладываемся.

"Ищите движения не в движениях, а чтением данных из регистра бухгалтерии по регистратору.
Возможно в этом причина. " - запрос выполняется, нужно чтобы движения были базе.
5. johny86 3 11.06.13 14:40 Сейчас в теме
(2) echo77, не найду, как изменить раздел.. ошибся
3. Kalam 105 11.06.13 14:23 Сейчас в теме
Для первоначального анализа выгружать в ТЗ "Источник.Движения.Хозрасчетный" и в зависимости от условий добавлять/удалять/загружать/выгружать
14. Kalam 105 12.06.13 17:12 Сейчас в теме
Короче говоря, делайте (3) в обработчике ПередЗаписью
6. Kalam 105 11.06.13 14:55 Сейчас в теме
ниче не понятно, что за запрос, когда он делается, когда есть проводки когда нет... вариантов масса что хотим то?
7. johny86 3 11.06.13 15:05 Сейчас в теме
(6) Kalam,

ОбработкаПроведения() // какой-то документ

Проводка1 = Движения.Хозрасчетный.Добавить();

Движения.Хозрасчетный.Записать();

Проводка2 = Движения.Хозрасчетный.Добавить();

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


ПодпискаНаОбработкуПроведения(Источник, Отказ)

Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса; // текст запроса настраивается в пользовательском режиме
РезультатЗапроса = Запрос.Выполнить(); // нужно, чтобы здесь были все проводки. Проводки 2 здесь нет

КонецПроцедуры
8. Kalam 105 11.06.13 15:22 Сейчас в теме
не правильная архитектура, срочно переделывать алгоритм.

создается ТЗ, в нее пихаются проводка1 и проводка2 и только потом записывать регистр.
9. johny86 3 11.06.13 15:30 Сейчас в теме
(8) Kalam, Вы читали первый пост? В документах никто не запрещает писать так.
Типовой документ Корректировка реализации, в модуле ОбработкаПроведения, строка 1484, обратите внимание на комментарий:

// Проводки формируются и в модуле документа, и при списании партий
Если СтруктураШапкиДокумента.ОтражатьВБухгалтерскомУчете
И мПараметрыПартионногоУчета.СписыватьПартииПриПроведенииДокументовБух Тогда
Движения.Хозрасчетный.Записать();
КонецЕсли;
10. Kalam 105 11.06.13 15:48 Сейчас в теме
А я то подумал в ОбработкеПроведения свои движения делаете.

(9) johny86,
Ну так уже понятнее становится :)
только при чем тут этот код?
11. Kalam 105 11.06.13 15:53 Сейчас в теме
И все-таки, посмотрите в подписке что у Вас в Источник.Движения.Хозрасчетный, думаю далее вопросов не будет
12. johny86 3 11.06.13 15:57 Сейчас в теме
Там может что-то быть, а может и ничего не быть.
Разумеется, я уже это смотрел.
13. devs 11.06.13 20:49 Сейчас в теме
(12) johny86, в базу движения записываются только в 2х случаях: 1) При Движения.Хозрасчетный.Записать() и 2) при окончании транзакции, возникшей при "ОбработкаПроведения". Поэтому если движения записываются в базу при разных ситуациях, вы не сможете взять данные запросом к БД.
Но чтобы решить проблему можно сделать так. Создаете подписку с источником "ДокументОбъект", событие "ОбработкаПроведения" (не проверял, но лучше чтоб она была ниже других подписок в дереве метаданных). В процедуре выгружаете движения по хозрасчетному в таблицу значений - Источник.Движения.Хозрасчетный.Выгрузить() и делаете свой запрос уже к этой таблице значений.
15. пользователь 13.06.13 21:54
Сообщение было скрыто модератором.
...
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот