Имя: Пароль:
1C
1С v8
Пропадают движения в подписке проведения
, , ,
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
Всем спасибо, поборол:

    Для Каждого ИмяРегистра из МассивРегистров Цикл
        НаборЗаписей = Источник.Движения[ИмяРегистра];
        НаборЗаписей.Прочитать();
        ТаблицаДвижений = НаборЗаписей.Выгрузить();
        НаборЗаписей.Очистить();
        НаборЗаписей.Записать();
        НаборЗаписей.Загрузить(ТаблицаДвижений);
        НаборЗаписей.УстановитьАктивность(Ложь);
        НаборЗаписей.Записать(Ложь);
    КонецЦикла;
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс