|
Движения документа в подписке на события | ☑ | ||
---|---|---|---|---|
0
suvolod
06.09.12
✎
15:21
|
Бух 2.0, док "Перемещение товаров", хочу дописать некоторые движения по забалансовому счету при проведении этого документа.
Пытался сделать так: Процедура ПодпискаНаСобытие1ОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт Набор = Источник.Движения.Хозрасчетный; Если Набор.Количество()>0 Тогда Иначе Набор.Прочитать(); КонецЕсли; КонецПроцедуры В итоге при первом проведении - мой набор всегда пуст, при перепроведении документа - набор содержит "старые" записи по бух.регистру (т.е. существовавшие до перепроведения документа) Вопрос. Каким образом можно (и можно ли вообще) получить новые движения документа через подписку на событие по этому документу? |
|||
1
sanja26
06.09.12
✎
15:26
|
если хочешь дописать, то и дописывай
Движение = Источник.Движения.Хозрасчетный.Добавить() |
|||
2
Naumov
06.09.12
✎
15:27
|
(0) А читать за чем? Пиши в коллекцию и спи спокойно
|
|||
3
sanja26
06.09.12
✎
15:27
|
или после записи получай набор, предварительно проверив на проведен()
|
|||
4
suvolod
06.09.12
✎
15:30
|
для формирования проводки по забалансовому счету мне нужны данные, которые были сформированны основным кодом. В частности, субконто Партии
|
|||
5
ОбычныйЧеловек
06.09.12
✎
15:35
|
(0) Делай через набор записей
НаборЗаписей=РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Регистратор.Установить(Регистратор); НаборЗаписей.Прочитать(); |
|||
6
sanja26
06.09.12
✎
15:36
|
кстати да в подписке на проведение уже должны быть движения
|
|||
7
y22-k
06.09.12
✎
15:41
|
// код рабочий
НаборДвиженийБУ = Источник.Движения.Хозрасчетный.Выгрузить(); // убиваем строки с 91 счетом МстрокДоходов = НаборДвиженийБу.Найтистроки(Новый Структура("СчетДт,СчетКт",ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками,ПланыСчетов.Хозрасчетный.ПрочиеДоходы)); Для каждого строка из МстрокДоходов Цикл НаборДвиженийБУ.Удалить(строка); Конеццикла; МстрокРасходов = НаборДвиженийБу.Найтистроки(Новый Структура("СчетДт,СчетКт",ПланыСчетов.Хозрасчетный.ПрочиеРасходы,ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками)); Для каждого строка из МстрокРасходов Цикл НаборДвиженийБУ.Удалить(строка); Конеццикла; //Ищем товары СЗОбработанныхстрок = Новый СписокЗначений; МстрокТоваров = НаборДвиженийБу.Найтистроки(Новый Структура("СчетКт",ПланыСчетов.Хозрасчетный.ТоварыНаСкладах)); Для каждого строка из МстрокТоваров Цикл МстрокТЧ = Источник.товары.Найтистроки(Новый структура("Номенклатура,Количество",Строка.СубконтоКт1,Строка.КоличествоКт)); Если МстрокТЧ.Количество() > 1 тогда //Осторожно тк может быть одно количество и разные цены ОсобаяОбработка = Истина; иначе ОсобаяОбработка = Ложь; КонецЕсли; Для каждого строкаТЧ из МстрокТЧ цикл Если ОсобаяОбработка и НЕ СЗОбработанныхстрок.НайтиПоЗначению(строкаТЧ.НомерСтроки) = неопределено тогда //новая строка Строка.Сумма = ?(Источник.СуммаВключаетНДС,СтрокаТЧ.Сумма-СтрокаТЧ.СуммаНДС,СтрокаТЧ.Сумма); СЗОбработанныхстрок.Добавить(СтрокаТЧ.Номерстроки); иначеесли ОсобаяОбработка и СЗОбработанныхстрок.НайтиПоЗначению(строкаТЧ.НомерСтроки) = неопределено тогда// уже ее обработали продолжить; иначеЕсли Не ОсобаяОбработка тогда Строка.Сумма = ?(Источник.СуммаВключаетНДС,СтрокаТЧ.Сумма-СтрокаТЧ.СуммаНДС,СтрокаТЧ.Сумма); Конецесли; КонецЦикла; Конеццикла; Источник.Движения.Хозрасчетный.Загрузить(НаборДвиженийБУ); |
|||
8
y22-k
06.09.12
✎
15:42
|
(7) Подписка обработка проведения
|
|||
9
suvolod
06.09.12
✎
15:42
|
(5) Код, похожий на твой, уже пробовал, но таблица движений остается пустая:
НаборЗаписей=РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Регистратор.Установить(Источник.Ссылка); НаборЗаписей.Прочитать(); |
|||
10
suvolod
06.09.12
✎
15:43
|
(6)(7)Спасибо, сейчас попробую
|
|||
11
suvolod
06.09.12
✎
15:46
|
нет, тоже не прокатывает..
первая же строчка НаборДвиженийБУ = Источник.Движения.Хозрасчетный.Выгрузить(); возвращает пустую ТЗ. Но движения определенно есть! После проведения документа вижу целых 4 проводки |
|||
12
suvolod
06.09.12
✎
15:48
|
видимо, придется через подписку ПриЗаписи наборазаписей регистра делать.. хотя лично мне кажется более удобным (да и логичным) засунуть это в подписку ОбработкаПроведения самого документа.
|
|||
13
ОбычныйЧеловек
06.09.12
✎
15:49
|
&suvolod хочешь нас уверить, что у тебя в подписке на событии приведенный выше код не видит движений?
|
|||
14
suvolod
06.09.12
✎
15:50
|
да
|
|||
15
ОбычныйЧеловек
06.09.12
✎
15:51
|
(14) Быть такого не может.
|
|||
16
ОбычныйЧеловек
06.09.12
✎
15:51
|
(14) Движение по регистру бух. выполняется в модуле проведения или в еще одной подписке?
|
|||
17
Naumov
06.09.12
✎
15:52
|
(4) 1С считает, что алгоритм подписки не должен зависеть/влиять от алгоритма проведения документа.
|
|||
18
0Mint
06.09.12
✎
15:53
|
(0)
НачатьТранзакцию нигде не применяешь? |
|||
19
unregistered
06.09.12
✎
15:54
|
(0) Явно подписка не на то событие. На какое событие подписываешься?
|
|||
20
hhhh
06.09.12
✎
15:57
|
(15) может. Там или или. Или вариант из (0) видит движения или из (5).
|
|||
21
ОбычныйЧеловек
06.09.12
✎
15:59
|
(20) В подписке уже есть все движения т.е. она выполняется после модуля проведения (у меня на этом конфа вся построена а автор уверяет, что движений там нету).
|
|||
22
suvolod
06.09.12
✎
15:59
|
(14)как это проверить?
Я использую абсолютно типовую БП 2.0, в которой добавил единственную подписку - Источник: ДокументОбъект.ПеремещениеТоваров, Событие - ОбработкаПроведения. Код: Процедура ПодпискаНаСобытие1ОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт НаборЗаписейРББух = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей(); НаборЗаписейРББух.Отбор.Регистратор.Установить(Источник.Ссылка); НаборЗаписейРББух.Прочитать(); КонецПроцедуры НаборЗаписей пуст, хотя после проведения проводки по доку есть |
|||
23
ОбычныйЧеловек
06.09.12
✎
16:03
|
(22) Не знаю как работает типовая, но с удовольствием бы посмотрел как может этот код не возвращать записи..
|
|||
24
hhhh
06.09.12
✎
16:03
|
(21) если движения не записаны, тогда Источник.Движения их видит, а НаборЗаписей.Прочитать() не видит.
или случай 2. Движения пишутся через НаборЗаписей. ТОгда надо всегда делать Прочитать(); |
|||
25
unregistered
06.09.12
✎
16:04
|
(22) Такой код вроде как должен вернуть пустой набор, т.к. данные еще не записаны в базу.
Код из (0) более правильный - получать набор через свойство Источник.Движения. |
|||
26
ОбычныйЧеловек
06.09.12
✎
16:05
|
(24) Так как они могут быть не записаны, если в "подписку на событие" попадаем только когда выполнится "модуль проведения"
|
|||
27
sanja26
06.09.12
✎
16:05
|
(0) Набор = Источник.Движения.Хозрасчетный;
здесь что? |
|||
28
sanja26
06.09.12
✎
16:07
|
в модуль подписки вообще попадает?
все должно быть, если есть движения у документа Галки сервер стоят, вызов сервера? |
|||
29
unregistered
06.09.12
✎
16:08
|
(26) Молча.
Если в коде обработки проведения ни где не было принудительной записи Движения.Записать() или Движения.Хозрасчетный.Записать(), то наборы записеи будут записаны в базу по окончании транзакции. |
|||
30
ОбычныйЧеловек
06.09.12
✎
16:09
|
Функция ПолучитьТаблицуДвиженийРегистра(Док, стрРегистр="Хозрасчетный")
НаборДвижений=Док.Движения[стрРегистр]; Если НаборДвижений.Количество()>0 Тогда Возврат Док.Движения[стрРегистр].Выгрузить(); КонецЕсли; НаборДвижений=РегистрыНакопления[стрРегистр].СоздатьНаборЗаписей(); НаборДвижений.Отбор.Регистратор.Установить(Док.Ссылка); НаборДвижений.Прочитать(); Если НаборДвижений.Количество()>0 Тогда Возврат НаборДвижений.Выгрузить(); КонецЕсли; Возврат Неопределено; КонецФункции |
|||
31
Alex S D
06.09.12
✎
16:10
|
(26) в общем случае они могут быть записаны в модуле набора записей регистра,
(22) кстати там идет обращение к движениям, там что показывает в наборе? |
|||
32
unregistered
06.09.12
✎
16:10
|
(30) В обработке проведения твой код вернет либо пустой набор (при первом проведении), либо старый набор (при перепроведении).
|
|||
33
ОбычныйЧеловек
06.09.12
✎
16:11
|
(32) Мы же говорим о подписке на событие ведь так?
|
|||
34
unregistered
06.09.12
✎
16:11
|
(33) Да.
|
|||
35
ОбычныйЧеловек
06.09.12
✎
16:13
|
(34) может код проверить?
|
|||
36
sanja26
06.09.12
✎
16:13
|
(29) обработка проведения выполняется в транзакции
|
|||
37
unregistered
06.09.12
✎
16:16
|
(36) Бинго!
Так что прочитать записи наборов ты сможешь только по окончании транзакции (если не делается принудительная их запись в коде Движения.Записать()) |
|||
38
Alex S D
06.09.12
✎
16:17
|
(37) и что, они же должны быть видны через Движения.Хозрасчетный всеравно
|
|||
39
sanja26
06.09.12
✎
16:17
|
(37) т.е. в БП 2.0 забыли написать Движения.Записать())?????????
|
|||
40
unregistered
06.09.12
✎
16:17
|
(38) Совершенно верно.
Через свойства Источник.Движения ты их увидишь. А из базы прочитать не сможешь - их в базе еще нет. |
|||
41
unregistered
06.09.12
✎
16:18
|
(39) А зачем они должны были это написать?....
|
|||
42
sanja26
06.09.12
✎
16:19
|
(41) для механизма подписок епт..
|
|||
43
unregistered
06.09.12
✎
16:19
|
(39) Свой код в (22) исправь:
Процедура ПодпискаНаСобытие1ОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт НаборЗаписейРББух = Источник.Движения.Хозрасчетный; КонецПроцедуры |
|||
44
unregistered
06.09.12
✎
16:20
|
(42) Дятел?
Тебе русским языком говорят, что надо читать набор через свойства документа Движения. В подписке это будет выглядеть так: Проводки = Источник.Движения.Хозрасчетный; |
|||
45
Alex S D
06.09.12
✎
16:21
|
(44) хехе см (0)
|
|||
46
unregistered
06.09.12
✎
16:22
|
(45) я читал (0). И сильно сомневаюсь, что там написана правда.
Либо обработчик вообще не отрабатывает, либо подписка сделана на другое событие, а не на обработку проведения. |
|||
47
Alex S D
06.09.12
✎
16:24
|
(46) судя по параметрам имеено на проведение сделана)
|
|||
48
sanja26
06.09.12
✎
16:24
|
(44)Сам дятел
Как ты запросом будешь получать движения с учетом движений, уже сделанных этим документом. скройся под стол |
|||
49
Alex S D
06.09.12
✎
16:24
|
кеш почисть xD
|
|||
50
ОбычныйЧеловек
06.09.12
✎
16:25
|
suvolod возьми код из (30) - потом unregistered расскажешь работает так или нет.
|
|||
51
unregistered
06.09.12
✎
16:27
|
(48) Солнышко.
И откуда у нас вдруг вылез запрос? Что-то в (0) про запрос ни какой речи нет. |
|||
52
unregistered
06.09.12
✎
16:29
|
(50) Не будет твой код работать.
Он получит СТАРЫЕ движения докмента. |
|||
53
sanja26
06.09.12
✎
16:30
|
(51) у меня в подписке на проведение запрос, использующий движеня из обработки проведения...
кстати (0) не первый v8: В обработчике подписки на обработку проведения в наборе регистра пусто |
|||
54
ОбычныйЧеловек
06.09.12
✎
16:31
|
(52) не вижу смысла спорить - если автору будет интересно - он проверит (будет\небудет)
|
|||
55
unregistered
06.09.12
✎
16:32
|
(53) А чтож ты родной раньше молчал?
Если тебе в обработке проведения нужно получать данные из регстров уже С УЧЕТОМ проведения, то единственный способ это делать принудительную запись - Движения.Записать() или Движения.Хозрасчетный.Записать() и только после этого писать свои запросы к регистрам. |
|||
56
sanja26
06.09.12
✎
16:39
|
(55) ну у меня получение остатков идет, конечно, вид границы исключая, но движения, насколько помню, попадали, если без границы
|
|||
57
unregistered
06.09.12
✎
16:41
|
Короче только что проверил.
БП 2.0.37.14 Документ ПеремещениеТоваров Подписка на событие ОбработкаПроведения Код обработчика подписки: Процедура ПодпискаНаСобытие1ОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт НЗ = Источник.Движения.Хозрасчетный; ТЗНЗ = НЗ.Выгрузить(); Сообщить(ТЗНЗ.Количество()); КонецПроцедуры При любых раскладах (первое проведение/перепроведение ранее проведенного) выдает правильный результат. То есть набор записей есть и с правильным количеством записей. Можете спорить дальше сколько хотите. |
|||
58
sanja26
06.09.12
✎
16:43
|
(57) споришь ты. доказывал, что в типовой в подписке может не быть движений
|
|||
59
unregistered
06.09.12
✎
16:43
|
(56) >> движения, насколько помню, попадали
Такого быть не может. Как может что-то попасть в результат запроса, если этого еще нет в базе данных? Либо этот запрос делался уже после записи (которая идет в одной транзакции с проведением). Либо внутри обработки проведения была выполнена принудительная запись движений. |
|||
60
unregistered
06.09.12
✎
16:46
|
(58) Ааааааа.....
Перечитай все мои посты и найди, где я говорил, что движений нет! Ты хоть понимаешь разницу между НаборЗаписей = Источник.Движения.Хозрасчетный; и НаборЗаписей = РегистрыНакопления[стрРегистр].СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Регистратор.Установить(Док.Ссылка); НаборЗаписей.Прочитать(); |
|||
61
unregistered
06.09.12
✎
16:49
|
+ к (60)
Движения (свойство документа, содержащее наборы записей по всем регистрам) есть. Но эти наборы записей еще не записаны в базу данных. Поэтому посмотреть наборы записей через свойство документа "Движения" ты можешь, а вот прочитать их из базы запросом или объектной моделью методом СоздатьНаборЗаписей() - нет. |
|||
62
Lama12
06.09.12
✎
16:50
|
(0) Всю ветку не читал... но мнение имею :)
1. Проверяем как делает движения документ. Если документ делает движения стандартным способом то это одно, если делает записи в наборы регистров, то подписку нужно делать на запись в регистр, иначе не перехватишь. 2. По поводу пустого набора записей. Скорее всего документ действительно делает запись движений "кривым" - правильным способом. В подписке ты перехватываешь только затирание движений, а сами движения записываются в другом месте петум прямой записи в набор записи регистра. 3. При простой - "не правильной" записи движений, в подписке перехватываются движения которые документ будет делать если ты их не изменишь. |
|||
63
sanja26
06.09.12
✎
17:05
|
(59) внутри обработки проведения была запись движений. КА, РТиУ
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |