Неоднозначный результат запроса к Регистру накопления

1. sm.artem 16 19.03.18 13:29 Сейчас в теме
Уже не первый час бьюсь над проблемой, понять не могу в чем дело.
Конфигурация 1С:ERP. Там есть типовой РН -ТрудозатратыНезавершенногоПроизводства. В модуле набора записей регистра есть два события "ПередЗаписью" и "ПриЗаписи".
В рассматриваемом варианте оба события вызываются при проведение одного из регистраторов данного регистра.
Так вот, в первом событии ("ПередЗаписью") в запросе формируется временная таблица содержащая записи данного регистра по регистратору:

Запрос.МенеджерВременныхТаблиц = СтруктураВременныеТаблицы.МенеджерВременныхТаблиц;
   Запрос = Новый Запрос("
	|ВЫБРАТЬ
	|	Затраты.Период,
	|	Затраты.Регистратор,
	|	Затраты.Организация,
	|	Затраты.Подразделение,
	|	Затраты.ЗаказНаПроизводство,
	|	Затраты.КодСтрокиПродукция,
	|	Затраты.Этап,
	|	Затраты.СтатьяКалькуляции,
	|	Затраты.ВидРабот,
	|	Затраты.ГруппаПродукции,
	|
	|	Затраты.Количество,
	|	Затраты.НормативнаяСтоимость,
	|	Затраты.Стоимость,
	|	Затраты.СтоимостьРегл
	|ПОМЕСТИТЬ ТрудозатратыНезавершенногоПроизводстваПередЗаписью
	|ИЗ
	|	РегистрНакопления.ТрудозатратыНезавершенногоПроизводства КАК Затраты
	|ГДЕ
	|	Затраты.Регистратор = &Регистратор
	|");
	
	СтруктураВременныеТаблицы = ДополнительныеСвойства.ДляПроведения.СтруктураВременныеТаблицы;
	
	Запрос.МенеджерВременныхТаблиц = СтруктураВременныеТаблицы.МенеджерВременныхТаблиц;
	Запрос.УстановитьПараметр("Регистратор", Отбор.Регистратор.Значение);
	
	Запрос.Выполнить();
Показать




Код второго события ("ПриЗаписи") сделал примерно такой же (через расширение модуля, упростил для целей отладки).
Только вместо временной таблицы результат запроса выгружаю в ТЗ.

Запрос = Новый Запрос("ВЫБРАТЬ
                          |    Затраты.Период КАК Период,
                          |    Затраты.Регистратор КАК Регистратор,
                          |    Затраты.Организация КАК Организация,
                          |    Затраты.Подразделение КАК Подразделение,
                          |    Затраты.ЗаказНаПроизводство КАК ЗаказНаПроизводство,
                          |    Затраты.КодСтрокиПродукция КАК КодСтрокиПродукция,
                          |    Затраты.Этап КАК Этап,
                          |    Затраты.СтатьяКалькуляции КАК СтатьяКалькуляции,
                          |    Затраты.ВидРабот КАК ВидРабот,
                          |    Затраты.ГруппаПродукции КАК ГруппаПродукции,
                          |    Затраты.Количество КАК Поле1,
                          |    Затраты.НормативнаяСтоимость КАК Поле2,
                          |    Затраты.Стоимость КАК Поле3,
                          |    Затраты.СтоимостьРегл КАК Поле4
                          |ИЗ
                          |    РегистрНакопления.ТрудозатратыНезавершенногоПроизводства КАК Затраты
                          |ГДЕ
                          |    Затраты.Регистратор = &Регистратор");

    
    
    //СтруктураВременныеТаблицы = ДополнительныеСвойства.ДляПроведения.СтруктураВременныеТаблицы;

    
    //Запрос.МенеджерВременныхТаблиц = СтруктураВременныеТаблицы.МенеджерВременныхТаблиц;

    Регистратор = Документы.ЭтапПроизводства2_2.НайтиПоНомеру("23-17 ОЙЛ-ВН.448.1", Дата(2017, 03, 10, 15, 09, 17)); 
    //Запрос.УстановитьПараметр("Регистратор", Отбор.Регистратор.Значение);

    Запрос.УстановитьПараметр("Регистратор", Регистратор);
    
    Результат = Запрос.Выполнить().Выгрузить();
Показать



После выполнения второго события в Таблице значений (результат) пусто.
При этом, если до выполнения второго запроса в процедуре события, выполнить этот запрос например в консоли, то результат будет содержать запись из регистра.

Не могу понять, почему один и тот же запрос выдает разные результаты?
Сама запись в регистре есть, ее даже визуально можно отобрать из списка.

Прошу помощи!
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. palsergeich 19.03.18 13:36 Сейчас в теме
А то что регистры в текстах запросов разные, хотя в шапке говорится, что запрос к одному и тому же регистру, это не страшно?
1)
ИЗ
| РегистрНакопления.ТрудозатратыКОформлению КАК Таблица
2)
|ИЗ
| РегистрНакопления.ТрудозатратыНезавершенногоПроизводства КАК Затраты
3. sm.artem 16 19.03.18 13:39 Сейчас в теме
(2) Извиняюсь... опечатался...
Один регистр "ТрудозатратыНезавершенногоПроизводства" в тексте исправил

По сути один и тот же запрос, но вызываемый в разных событиях последовательно.
4. antz 19.03.18 13:43 Сейчас в теме
7. sm.artem 16 19.03.18 13:51 Сейчас в теме
(4)
Регистратор находит?


Да, регистратор находит. Это я уже здесь принудительно для отладки указал. А так вообще в качестве регистратора ссылка на проводимый документ
5. palsergeich 19.03.18 13:45 Сейчас в теме
Посмотрите, что лежит в ЭтотОбъект в событии передЗаписью. По логике системы - В ПриЗаписи в таблице БД (и соответственно в результате запроса) будет лежать то, что лежит в ЭтотОбъект в событии ПередЗаписью (если мы говорим о модуле набора записей регистра)
8. sm.artem 16 19.03.18 13:55 Сейчас в теме
(5)
Посмотрите, что лежит в ЭтотОбъект в событии передЗаписью. По логике системы - В ПриЗаписи в таблице БД (и соответственно в результате запроса) будет лежать то, что лежит в ЭтотОбъект в событии ПередЗаписью (если мы говорим о модуле набора записей регистра)


В ЭтотОбъект лежит набор записей данного регистра отобранного по регистратору.
Смотрел через предварительный вызов
ЭтотОбъект.Прочитать()

Если смотреть по отладке, получается, что в ЭтотОбъект в процедуре "ПередЗаписью" и в "ПриЗаписи" один и тот же набор.

(6)
Но еще могут быть всякие коварства в подписках на события, которые могут переопределять, например, состав коллекции движений после предопределенного события модуля набора записей. Или коварства в расширениях.


События тоже есть конечно, но в них изменений нет по набору записей.
6. palsergeich 19.03.18 13:50 Сейчас в теме
Но еще могут быть всякие коварства в подписках на события, которые могут переопределять, например, состав коллекции движений после предопределенного события модуля набора записей. Или коварства в расширениях.
Проверить просто:
Состав коллекции ЭтотОбъект в событиях ПередЗаписью и ПриЗаписи должен совпадать.
9. uk09 19.03.18 13:57 Сейчас в теме
Артем, добрый день!

Откройте РН в программе. Сделайте отбор по регистратору.
Отмените проведение документа. Убедитесь, что отбор - пустой

После выполнения второго события в Таблице значений (результат) пусто.


Либо документ - не проведен, либо регистратор не выбирает
10. antz 19.03.18 14:20 Сейчас в теме
11. sm.artem 16 19.03.18 14:33 Сейчас в теме
(10) Спасибо за ссылку. Видел я ее. Только у меня вопрос: а регистр накопления ведет себя также. Я имею ввиду, что событие ПриЗаписи должно вызываться два раза?

Пытался найти ответ и в лекциях Чистова и книгах по разработке, но так и не нашел ответа. Или не увидел...
12. antz 19.03.18 14:38 Сейчас в теме
(11) Так же, я проверил) Первый вызов - движения пустые, второй - не пустые.
15. sm.artem 16 20.03.18 05:39 Сейчас в теме
(12) Странно, смотрю по отладке... В процессе проведения по одному разу только проходит...
Буду разбиратся
14. palsergeich 19.03.18 14:58 Сейчас в теме
(11)
(10) Спасибо за ссылку. Видел я ее. Только у меня вопрос: а регистр накопления ведет себя также. Я имею ввиду, что событие ПриЗаписи должно вызываться два раза?

Зависит от свойств регистратора "Удалять автоматически при отмене проведения", поищите в документации зачем это.
16. sm.artem 16 20.03.18 05:41 Сейчас в теме
(14)
Зависит от свойств регистратора "Удалять автоматически при отмене проведения", поищите в документации зачем это.


В данном случае у регистратора указано "Не удалять автоматически". Вообще значения свойства "Удаление движений" посмотрел, но там ответа не нашел. Тем более значение данного свойства, которое указано в регистраторе вообще не предполагает удаление записей автоматически.
13. uk09 19.03.18 14:55 Сейчас в теме
Артем, а какая версия ERP ?

У меня в ERP (2.4.1.261) этот запрос (ПриЗаписи) вот так выглядит:
Запрос = Новый Запрос("
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| НАЧАЛОПЕРИОДА(Таблица.Период, МЕСЯЦ) КАК МЕСЯЦ,
| Таблица.Организация КАК Организация,
| Таблица.Регистратор КАК Документ,
| ЛОЖЬ КАК ИзмененыДанныеДляПартионногоУчетаВерсии21
|ПОМЕСТИТЬ ТрудозатратыНезавершенногоПроизводстваЗаданияКРасчетуСебесто­имости
|ИЗ
| (ВЫБРАТЬ
| Затраты.Период,
| Затраты.Регистратор,
| Затраты.Организация,
| Затраты.Подразделение,
| Затраты.ЗаказНаПроизводство,
| Затраты.КодСтрокиПродукция,
| Затраты.Этап,
| Затраты.СтатьяКалькуляции,
| Затраты.ВидРабот,
| Затраты.ГруппаПродукции,
|
| Затраты.Количество,
| Затраты.НормативнаяСтоимость,
| Затраты.Стоимость,
| Затраты.СтоимостьРегл
| ИЗ
| ТрудозатратыНезавершенногоПроизводстваПередЗаписью КАК Затраты
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| Затраты.Период,
| Затраты.Регистратор,
| Затраты.Организация,
| Затраты.Подразделение,
| Затраты.ЗаказНаПроизводство,
| Затраты.КодСтрокиПродукция,
| Затраты.Этап,
| Затраты.СтатьяКалькуляции,
| Затраты.ВидРабот,
| Затраты.ГруппаПродукции,
|
| -Затраты.Количество,
| -Затраты.НормативнаяСтоимость,
| -Затраты.Стоимость,
| -Затраты.СтоимостьРегл
| ИЗ
| РегистрНакопления.ТрудозатратыНезавершенногоПроизводства КАК Затраты
| ГДЕ
| Затраты.Регистратор = &Регистратор
| ) КАК Таблица
|СГРУППИРОВАТЬ ПО
| НАЧАЛОПЕРИОДА(Таблица.Период, МЕСЯЦ),
| Таблица.Период,
| Таблица.Регистратор,
| Таблица.Организация,
| Таблица.Подразделение,
| Таблица.ЗаказНаПроизводство,
| Таблица.КодСтрокиПродукция,
| Таблица.Этап,
| Таблица.СтатьяКалькуляции,
| Таблица.ВидРабот,
| Таблица.ГруппаПродукции
|ИМЕЮЩИЕ
| СУММА(Таблица.Количество) <> 0
| ИЛИ СУММА(Таблица.НормативнаяСтоимость) <> 0
| ИЛИ СУММА(Таблица.Стоимость) <> 0
| ИЛИ СУММА(Таблица.СтоимостьРегл) <> 0
|;
|////////////////////////////////////////////////////////////­////////////////////
|УНИЧТОЖИТЬ ТрудозатратыНезавершенногоПроизводстваПередЗаписью
|");
17. sm.artem 16 20.03.18 05:46 Сейчас в теме
(13) Добрый день!

У нас версия 2.4.2.139, но типовой код абсолютно такой же, как и Вашем случае. Единственное его предназначение в том, чтобы проверять - были ли изменения в записях регистра при проведении и если да, по записывать новое задание на расчет себестоимости в указанном периоде.
С этого все и началось: то есть при изменении (например, материала) удалялись движения из регистра ТрудозатратыНезавершенногоПроизводства, то есть появлялась разница между записями в событии "ПередЗаписью" и в событии "ПриЗаписи", что и приводит к бесконечному пересчету того периода, где был оформлен выпуск. Начал смотреть и обнаружил, что почему-то удаляется запись... Хотя явных указаний в коде на удаление записи я не нашел...
Оставьте свое сообщение

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