Ловушка кэширования структур

При разработке собственного партионного учета для УНФ столкнулся с ошибкой, которая подвергла меня в уныние. Я уже думал, не разберусь в причинах, настолько она была непредсказуемой.

Я локализовал ее на конкретном примере — документ отчет переработчика ставил приход не на партию своего документа, а на другой отчет переработчика. Непредсказуемым образом.

Причем если переформировать движения по одному документ, партии корректно проставлялись. А если запустить обработку движений за период, получал ошибку.

Выделил все такие ошибки запросом:

ВЫБРАТЬ ПЕРВЫЕ 100
	Запасы.ВидДвижения КАК ВидДвижения,
	Запасы.Регистратор КАК Регистратор,
	Запасы.Партия.кпу_Документ КАК Партиякпу_Документ
ИЗ
	РегистрНакопления.Запасы КАК Запасы
ГДЕ
	Запасы.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
	И Запасы.Регистратор ССЫЛКА Документ.ОтчетПереработчика
	И Запасы.Партия.кпу_Документ <> Запасы.Регистратор

УПОРЯДОЧИТЬ ПО
	Запасы.Период

Начал перепроводить документы с ошибками. И тут мне повезло. Ошибка начала воспроизводиться.

Посмотрел отладчиком и увидел страшное.

Дело в том, что для вида документа я кэшировал структуру параметров, чтобы ее не формировать постоянно заново. И вот тут и заключалась главная проблема.

Я ожидал, что раз вернув структуру по параметру от вида документа, 1С всегда будет возвращать эту структуру. Но кэширование структур в 1С работает не так!

1С просто для заданного параметра запоминает в памяти структуру и возвращает ссылку на нее. Если эту структуру поменять в процессе работы, то при следующем вызове вернется уже измененная структура, ведь кэшируется только ссылка на структуру!

А в эту структуру я помещал, по сути, весь контекст выполнения расчета. В том числе и партию.

У меня был алгоритм — если партия уже заполнена в параметрах, она заново не расчитывается. Первый проведенный документ подставлял в структуру партию, она запоминалась и штамповалась во все последующие документы.

Таким образом, я смог увидеть ошибку только при проведении нескольких документов!

Вывод: в структуру, полученную из кэша ничего записывать нельзя!

Друзья, бойтесь кэширования в 1С. Это занятие не для слабонерных!

Среда: Платформа 8.3.24.1586, УНФ 3.0.8.91

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *