|
Пропадают движения в подписке проведения | ☑ | ||
---|---|---|---|---|
0
Пчелкин
21.09.15
✎
22:08
|
УПП 1.3.68.1 8.2.19.90
Отчет производства за смену. Задача: сделать так, чтобы при проведении документа продукция не отображалась на складе сразу. Реализация: делаю реквизит документа ПоказатьДвижения (булево), выношу на форму. Создаю подписку на обработку проведения. В процедуре проверка: <sxh 1c> Если Источник.ПоказатьДвижения Тогда Возврат; КонецЕсли; МассивРегистров = Новый Массив; МассивРегистров.Добавить("ЗаказыНаПроизводство"); МассивРегистров.Добавить("ПартииТоваровНаСкладах"); МассивРегистров.Добавить("ПартииТоваровНаСкладахБухгалтерскийУчет"); МассивРегистров.Добавить("ПартииТоваровНаСкладахНалоговыйУчет"); МассивРегистров.Добавить("СвободныеОстатки"); МассивРегистров.Добавить("ТоварыНаСкладах"); МассивРегистров.Добавить("ТоварыОрганизаций"); МассивРегистров.Добавить("ТоварыВРезервеНаСкладах"); Для Каждого ИмяРегистра из МассивРегистров Цикл НаборЗаписей = Источник.Движения[ИмяРегистра]; НаборЗаписей.Прочитать(); НаборЗаписей.УстановитьАктивность(Ложь); КонецЦикла; </sxh 1c> Провожу документ. Движения в товарных регистрах есть, и они неактивны. Всё замечательно. Ставлю галочку ПоказатьДвижения, провожу документ: движений в товарных регистрах нет совсем (по другим регистрам проводится нормально). Провожу повторно - движения появляются. Провожу с ПоказатьДвижения = Ложь, закрываю форму документа, открываю снова и провожу с ПоказатьДвижения = Истина - все хорошо, движения есть. ЧЯДНТ? |
|||
1
Пчелкин
21.09.15
✎
22:15
|
Добавил в начало процедуры следующий код:
НЗ = Источник.Движения.ТоварыНаСкладах; НЗ.Прочитать(); Провожу с ПоказатьДвижения = Истина. Смотрю в отладчике: записи в НЗ есть, активны. В движениях документа записи в ТоварыНаСкладах есть, а в других товарных регистрах - пусто. Т.е. вызов метода Прочитать() как-то влияет на движения? |
|||
2
RomanYS
21.09.15
✎
22:21
|
Если в процессе проведения идет явная запись (Движения.ИмяРегистра.Записать()), то набор очищается (и тебе надо его снова читать).
Иначе запись происходит по завершении проведения (включая подписки) при условии Движения.ИмяРегистра.Записывать = Истина (и ты видишь эти движения в своей подписке) |
|||
3
KSN
21.09.15
✎
22:23
|
В обработке проведения сделай принудительную запись.
|
|||
4
RomanYS
21.09.15
✎
22:26
|
+(2) если во втором случае сделать "прочитать", то набор очистится (прочитаются движения из базы, которых нет).
Это объясняет (0) |
|||
5
Пчелкин
21.09.15
✎
23:06
|
(2) Движения...Записать() нигде в подписке не используется. (4) Как это движений нет?
Разбираю ситуацию: провожу документ, штатный механизм делает движения. Я после этого делаю (в подписке) часть их (по некоторым регистрам) неактивными. Снова провожу документ (документ проведен ранее и часть его движений неактивна), тот же механизм формирует те же движения. Подписка запускается и тут же завершается (по условию ПоказатьДвижения). Только движений (тех самых, которые формирует родной УПП-шный код) почему-то нет. |
|||
6
Пчелкин
21.09.15
✎
23:14
|
Т.е.
1. Пропадают только те движения, которые при прошлом проведении делались неактивными. 2. Пропадают они в том случае, если я никак не пытаюсь к ним обратиться. 3. Пропадают только если после установки движений неактивными (проведение с ПоказатьДвижения=Ложь) и перед проведением с ПоказатьДвижения=Истина форма документа не закрывалась. |
|||
7
RomanYS
21.09.15
✎
23:32
|
(5) "Записать() нигде в подписке не используется"
речь не о твоей подписке, а обо всем алгоритме проведения, включая все подписки. Если Записать() там не используется (рекомендуется делать явную запись только явной при необходимости), то наборы уже содержат движения (сформированные алгоритмом проведения), а твое Прочитать() замещает их пустым набором. Вывод: либо делай Прочитать() только если набор пуст, либо [правильней] делай подписку не на проведение, а на запись наборов регистров |
|||
8
RomanYS
21.09.15
✎
23:33
|
(7) * ПередЗаписью наборов регистров
|
|||
9
Пчелкин
21.09.15
✎
23:37
|
(7) В том-то и дело, что при втором проведении (ПоказатьДвижения=Истина) я ни Прочитать(), ни Записать() -вообще ничего не использую.
Первый раз (ПоказатьДвижения=Ложь) подписка обрабатывает движения. Второй раз (ПоказатьДвижения=Ложь) - подписка не делает вообще ничего. |
|||
10
Пчелкин
21.09.15
✎
23:38
|
Второй раз ПоказатьДвижения=Истина
|
|||
11
RomanYS
21.09.15
✎
23:42
|
(9) ХЗ что там в конкретном случае, по описанию действительно странно, тут только отладчик поможет
Что в принципе "не так" - безусловное Прочитать |
|||
12
Пчелкин
21.09.15
✎
23:45
|
Чем Прочитать() неугодно? Без этого в НаборЗаписей пусто.
|
|||
13
Пчелкин
21.09.15
✎
23:46
|
По этой причине и отлаживать проблематично: после Прочитать() движения появляются.
|
|||
14
RomanYS
21.09.15
✎
23:49
|
(12) "пусто" если было Записать(), иначе пусто станет после Прочитать()
|
|||
15
Пчелкин
21.09.15
✎
23:55
|
Собственно задачу так и решил, поставив проверку
Если Источник.ПоказатьДвижения Тогда Продолжить; КонецЕсли; после НаборЗаписей.Прочитать() Но вопросы остались и такое решение считаю временным. Благо, строк в документе немного. А вообще лишнее чтение ни к чему. Почему так происходит - непонятно. Почему при закрытии-открытии формы всё проводится нормально? Попробую завтра еще поэкспериментировать. |
|||
16
Пчелкин
22.09.15
✎
12:00
|
В подписке Движения[ИмяРегистра] - пустой набор записей, поэтому приходится вызывать Прочитать().
И после завершения подписки в Движения[ИмяРегистра] записи остаются. При последующем проведении из модуля документа вызывается очистка коллекции движений, после чего Движения[ИмяРегистра].Модифицированность() начинает возвращать Истина. Из-за этого, видимо, движения далее не записываются. Вопрос: как сделать так, чтобы после подписки в Движения[ИмяРегистра] записей не оставалось? |
|||
17
Пчелкин
22.09.15
✎
14:45
|
Всем спасибо, поборол:
Для Каждого ИмяРегистра из МассивРегистров Цикл НаборЗаписей = Источник.Движения[ИмяРегистра]; НаборЗаписей.Прочитать(); ТаблицаДвижений = НаборЗаписей.Выгрузить(); НаборЗаписей.Очистить(); НаборЗаписей.Записать(); НаборЗаписей.Загрузить(ТаблицаДвижений); НаборЗаписей.УстановитьАктивность(Ложь); НаборЗаписей.Записать(Ложь); КонецЦикла; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |