Имя: Пароль:
1C
1С v8
Движения документа в подписке на события
,
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) внутри обработки проведения была запись движений. КА, РТиУ
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.