При работе в программах 1С:Комплексная автоматизация 2 и 1С:ERP Управление предприятием пользователи и программисты периодически сталкиваются с необъяснимым поведением системы: документ (например, Выкуп с хранения или Списание товаров) отменен и находится в непроведенном состоянии (помечен на статус «черновика»), но при этом в регистре накопления Резервы товаров организаций по нему продолжают числиться движения. Стандартные операции вроде тестирования и исправления (ТИИ) информационной базы или выгрузки-загрузки файла базы данных (файловый вариант) не приносят никаких результатов.
В этой статье мы подробно разберем, почему возникает данная ситуация, рассмотрим внутреннюю архитектуру распределения запасов в современных конфигурациях 1С, выясним причину зависания движений и изучим пошаговые методики устранения этой проблемы.
Начиная с версий 2.4 в 1С:ERP и 1С:КА была коренным образом переработана схема обеспечения и учета видов запасов. Традиционное представление о том, что регистр Резервы товаров организаций используется исключительно под классическое резервирование товаров клиентами под заказы, больше не актуально. Теперь этот регистр является важным техническим буфером механизма распределения запасов.
Когда вы записываете или пытаетесь провести документ (например, Выкуп товаров с хранения), система должна зафиксировать намерение изменить вид запаса (передать товар от одного владельца или контрагента-давальца к вашей организации). Чтобы параллельные транзакции в многопользовательской среде не «перехватили» этот товар до завершения всех процедур оформления, программа временно резервирует эти позиции. Фиксация происходит именно в регистре Резервы товаров организаций.
Важная особенность этого механизма — асинхронность и фоновое распределение. Движения в регистр могут записываться не стандартным методом платформы Движения.Записать() в процессе транзакции проведения, а через вызовы специального общего модуля РаспределениеЗапасов, который делает прямые записи наборов данных в СУБД. Именно поэтому при обычном интерактивном распроведении документа стандартная очистка движений платформой может не срабатывать, оставляя «зависшие» «хвосты».
Проанализируем основные технические причины, по которым записи в регистре остаются даже после отмены проведения документа:
Поскольку проблема в большинстве случаев связана с несовершенством кода распределения запасов в ранних версиях 2.4, самым надежным решением является обновление вашей базы до актуального релиза. Рассмотрим этот процесс на примере реального кейса:
Выкуп с хранения.Резервы товаров организаций — движения должны успешно удалиться.Если оперативно обновить конфигурацию нет возможности, можно прибегнуть к стандартному административному методу сброса итогов регистра, который заставляет систему пересчитать внутренние таблицы распределения. Выполним следующие действия:
Резервы товаров организаций.В случаях, когда повреждение базы данных или логический сбой не позволяют системе автоматически очистить регистр штатными методами, программист может написать внешнюю обработку для принудительного удаления записей по конкретному регистратору.
Рассмотрим подробнее пример программного кода, который решает эту задачу. Нам необходимо создать пустой набор записей регистра с отбором по нашему проблемному непроведенному документу и записать его в базу данных:
// Создаем объект набора записей для целевого регистра накопления
НаборЗаписей = РегистрыНакопления.РезервыТоваровОрганизаций.СоздатьНаборЗаписей();
// Устанавливаем жесткий отбор по нашему документу-регистратору
НаборЗаписей.Отбор.Регистратор.Установить(ПроблемныйДокументСсылка);
// Записываем пустой набор записей в базу данных (Замещать = Истина по умолчанию)
// Это действие полностью удаляет все физические движения этого документа в регистре
НаборЗаписей.Записать(Истина);
После выполнения этого кода в контексте внешней обработки «зависшие» движения гарантированно исчезнут из регистра накопления, а отчет Движения документа перестанет показывать фантомные резервы.
Иногда корни проблемы лежат в зависшем механизме очередей распределения. Проанализируем состояние регламентных заданий:
Распределение запасов (или схожие задания, отвечающие за межорганизационный учет и распределение взаиморасчетов).Также рекомендуется временно переключить складские настройки распределения. В параметрах системы можно протестировать переключение режима распределения запасов с отложенного (фонового) на оперативный (непосредственно при проведении документов), чтобы транзакция записи всегда выполнялась до конца в рамках одного сеанса пользователя.