Почему остаются движения по регистру «Резервы товаров организаций» у непроведенных документов в 1С:КА 2 и 1С:ERP, и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1С:Комплексная автоматизация Управленческий учет Торговля и дистрибуция
← На главную

При работе в программах 1С:Комплексная автоматизация 2 и 1С:ERP Управление предприятием пользователи и программисты периодически сталкиваются с необъяснимым поведением системы: документ (например, Выкуп с хранения или Списание товаров) отменен и находится в непроведенном состоянии (помечен на статус «черновика»), но при этом в регистре накопления Резервы товаров организаций по нему продолжают числиться движения. Стандартные операции вроде тестирования и исправления (ТИИ) информационной базы или выгрузки-загрузки файла базы данных (файловый вариант) не приносят никаких результатов.

В этой статье мы подробно разберем, почему возникает данная ситуация, рассмотрим внутреннюю архитектуру распределения запасов в современных конфигурациях 1С, выясним причину зависания движений и изучим пошаговые методики устранения этой проблемы.

Архитектурная причина: Новая концепция распределения запасов

Начиная с версий 2.4 в 1С:ERP и 1С:КА была коренным образом переработана схема обеспечения и учета видов запасов. Традиционное представление о том, что регистр Резервы товаров организаций используется исключительно под классическое резервирование товаров клиентами под заказы, больше не актуально. Теперь этот регистр является важным техническим буфером механизма распределения запасов.

Когда вы записываете или пытаетесь провести документ (например, Выкуп товаров с хранения), система должна зафиксировать намерение изменить вид запаса (передать товар от одного владельца или контрагента-давальца к вашей организации). Чтобы параллельные транзакции в многопользовательской среде не «перехватили» этот товар до завершения всех процедур оформления, программа временно резервирует эти позиции. Фиксация происходит именно в регистре Резервы товаров организаций.

Важная особенность этого механизма — асинхронность и фоновое распределение. Движения в регистр могут записываться не стандартным методом платформы Движения.Записать() в процессе транзакции проведения, а через вызовы специального общего модуля РаспределениеЗапасов, который делает прямые записи наборов данных в СУБД. Именно поэтому при обычном интерактивном распроведении документа стандартная очистка движений платформой может не срабатывать, оставляя «зависшие» «хвосты».

Почему движения «зависают» в непроведенных документах?

Проанализируем основные технические причины, по которым записи в регистре остаются даже после отмены проведения документа:

  1. Ошибки и баги конкретных релизов. В релизах ветки 2.4.3.х (в частности, в 2.4.3.167) существовала зарегистрированная ошибка платформенного и прикладного характера: при отмене проведения документов распределения запасов очистка движений по некоторым техническим регистрам не вызывалась или завершалась аварийно без отката транзакции.
  2. Сбои в регламентных и фоновых заданиях. Финализация и «схлопывание» движений в регистре резервов часто делегируются фоновому заданию распределения запасов. Если это регламентное задание зависает, отключено или выполняется с ошибками, движения «зависают» на неопределенный срок.
  3. Блокировки СУБД в многопользовательском режиме. При высокой интенсивности работы фоновый процесс распределения может не успеть обработать операцию отмены проведения из-за конфликта блокировок, оставляя запись сиротой.

Способ 1. Обновление конфигурации (Рекомендуемый способ)

Поскольку проблема в большинстве случаев связана с несовершенством кода распределения запасов в ранних версиях 2.4, самым надежным решением является обновление вашей базы до актуального релиза. Рассмотрим этот процесс на примере реального кейса:

  1. Выполните резервное копирование информационной базы.
  2. Обновите конфигурацию 1С:Комплексная автоматизация 2 (или 1С:ERP) до релиза 2.4.3.172 или выше.
  3. После успешного обновления зайдите в систему, найдите проблемные документы Выкуп с хранения.
  4. Если они проведены — распроведите их. Если они уже были непроведенными, но движения оставались, проведите их заново и снова отмените проведение.
  5. Проверьте регистр Резервы товаров организаций — движения должны успешно удалиться.

Способ 2. Управление итогами регистра накопления

Если оперативно обновить конфигурацию нет возможности, можно прибегнуть к стандартному административному методу сброса итогов регистра, который заставляет систему пересчитать внутренние таблицы распределения. Выполним следующие действия:

  1. Откройте меню Функции для технического специалиста (или «Все функции»).
  2. Перейдите в раздел Стандартные и выберите пункт Управление итогами.
  3. Найдите в списке регистр накопления Резервы товаров организаций.
  4. Отключите использование итогов для данного регистра (это очистит агрегированные таблицы).
  5. Включите использование итогов обратно и выполните полный пересчет итогов.

Способ 3. Программная очистка движений документа

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

Рассмотрим подробнее пример программного кода, который решает эту задачу. Нам необходимо создать пустой набор записей регистра с отбором по нашему проблемному непроведенному документу и записать его в базу данных:


// Создаем объект набора записей для целевого регистра накопления
НаборЗаписей = РегистрыНакопления.РезервыТоваровОрганизаций.СоздатьНаборЗаписей();

// Устанавливаем жесткий отбор по нашему документу-регистратору
НаборЗаписей.Отбор.Регистратор.Установить(ПроблемныйДокументСсылка);

// Записываем пустой набор записей в базу данных (Замещать = Истина по умолчанию)
// Это действие полностью удаляет все физические движения этого документа в регистре
НаборЗаписей.Записать(Истина);

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

Способ 4. Проверка и перезапуск фоновых заданий

Иногда корни проблемы лежат в зависшем механизме очередей распределения. Проанализируем состояние регламентных заданий:

  1. Перейдите в раздел НСИ и администрирование — Обслуживание — Регламентные операции — Регламентные и фоновые задания.
  2. Найдите регламентное задание Распределение запасов (или схожие задания, отвечающие за межорганизационный учет и распределение взаиморасчетов).
  3. Убедитесь, что задание выполняется по расписанию и в колонке «Состояние» нет ошибок выполнения.
  4. Если задание зависло в состоянии «Выполняется» слишком долго, выделите его и перезапустите (или отмените выполнение и запустите вручную через команду «Выполнить сейчас»).

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

← На главную