Ловушка кэширования структур
При разработке собственного партионного учета для УНФ столкнулся с ошибкой, которая подвергла меня в уныние. Я уже думал, не разберусь в причинах, настолько она была непредсказуемой.
Я локализовал ее на конкретном примере — документ отчет переработчика ставил приход не на партию своего документа, а на другой отчет переработчика. Непредсказуемым образом.
Причем если переформировать движения по одному документ, партии корректно проставлялись. А если запустить обработку движений за период, получал ошибку.
Выделил все такие ошибки запросом:
ВЫБРАТЬ ПЕРВЫЕ 100 Запасы.ВидДвижения КАК ВидДвижения, Запасы.Регистратор КАК Регистратор, Запасы.Партия.кпу_Документ КАК Партиякпу_Документ ИЗ РегистрНакопления.Запасы КАК Запасы ГДЕ Запасы.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) И Запасы.Регистратор ССЫЛКА Документ.ОтчетПереработчика И Запасы.Партия.кпу_Документ <> Запасы.Регистратор УПОРЯДОЧИТЬ ПО Запасы.Период
Начал перепроводить документы с ошибками. И тут мне повезло. Ошибка начала воспроизводиться.
Посмотрел отладчиком и увидел страшное.
Дело в том, что для вида документа я кэшировал структуру параметров, чтобы ее не формировать постоянно заново. И вот тут и заключалась главная проблема.
Я ожидал, что раз вернув структуру по параметру от вида документа, 1С всегда будет возвращать эту структуру. Но кэширование структур в 1С работает не так!
1С просто для заданного параметра запоминает в памяти структуру и возвращает ссылку на нее. Если эту структуру поменять в процессе работы, то при следующем вызове вернется уже измененная структура, ведь кэшируется только ссылка на структуру!
А в эту структуру я помещал, по сути, весь контекст выполнения расчета. В том числе и партию.
У меня был алгоритм — если партия уже заполнена в параметрах, она заново не расчитывается. Первый проведенный документ подставлял в структуру партию, она запоминалась и штамповалась во все последующие документы.
Таким образом, я смог увидеть ошибку только при проведении нескольких документов!
Вывод: в структуру, полученную из кэша ничего записывать нельзя!
Друзья, бойтесь кэширования в 1С. Это занятие не для слабонерных!
Среда: Платформа 8.3.24.1586, УНФ 3.0.8.91
Свежие комментарии