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