Как исправить ошибку «Значение поля "Документ" не может быть пустым» в рабочем потоке распределения запасов в 1С:УТ 11.5.20?

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

После обновления конфигураций «Управление торговлей» до версии 11.5.20.85 (или аналогичных версий ERP 2.5.20) многие пользователи столкнулись с критической проблемой: фоновое задание «Распределение запасов» начинает выдавать ошибку и зацикливается — есть мониторинг регламентных заданий и уведомление о сбоях. Это приводит к лавинообразному росту потребления оперативной памяти на сервере и невозможности корректного резервирования товаров.

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

Анализируем причину возникновения ошибки

Давайте проанализируем технический контекст. Ошибка возникает в общем модуле ОтложенныеЗадания при попытке записи в регистр сведений ЗаданияКОтражениюСостоянияЗаказов. Типичный текст ошибки в журнале регистрации выглядит следующим образом:


Ошибка при вызове метода контекста (Записать)
{ОбщийМодуль.ОтложенныеЗадания.Модуль(189)}:ИсточникЗаданий.Записать(Ложь);
[ОшибкаВоВремяВыполненияВстроенногоЯзыка] по причине:
Запись не верна! Значение поля "Документ" не может быть пустым!: ЗаданияКОтражениюСостоянияЗаказов: ...

Выясним причину: в новых релизах ветки 11.5.20 компания 1С провела масштабный рефакторинг механизмов распределения запасов. Теперь система гораздо жестче контролирует заполнение измерений в служебных регистрах. Ошибка провоцируется использованием документа «Корректировка регистров» для изменения остатков или резервов в регистре накопления ЗапасыИПотребности.

Когда фоновый процесс РаспределениеЗапасов.ВыполнитьРаспределениеВФоне видит новые движения в регистре ЗапасыИПотребности, он пытается обновить состояние обеспечения. Однако, если движения сделаны «Корректировкой регистров» (особенно программно через расширения), у этих записей отсутствует ссылка на «Заказ» (объект следования состоянию). Механизм пытается передать в регистр заданий пустое значение или Неопределено, что блокируется платформой на уровне проверки записи.

Последствия для производительности сервера

Рассмотрим важный нюанс, связанный с системным администрированием. Поскольку распределение запасов выполняется в фоновом режиме, при возникновении ошибки транзакция откатывается, но само задание не помечается как «завершенное с ошибкой» навсегда. Система пытается выполнить его снова и снова. Каждая итерация порождает новые записи в журнале регистрации и «забивает» очередь сеансов (количество сессий может переваливать за сотни тысяч). Это приводит к тому, что менеджер памяти сервера 1С перестает справляться, и rphost потребляет до 96–100% доступных ресурсов.

Способ №1: Ручная очистка и исправление данных

Если работа предприятия встала из-за нехватки памяти, разберем алгоритм экстренного восстановления по шагам:

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

Способ №2: Корректировка программного кода (для разработчиков)

Если вы используете расширения или внешние обработки для «виртуального резервирования», проанализируем ситуацию программно. В модуле менеджера регистра ЗаданияКОтражениюСостоянияЗаказов или в местах вызова РаспределениеЗапасов.ДобавитьЗаданияКОтражениюСостоянияЗаказов теперь необходимо гарантировать, что передаваемый объект не равен Неопределено.

Чтобы система игнорировала корректировки регистров и не пыталась обновлять по ним состояния заказов, можно воспользоваться следующим приемом при заполнении движений в коде:


// В коде программного создания движений регистра ЗапасыИПотребности
Движение = НаборДвижений.Добавить();
Движение.Период = ДатаДокумента;
// ... заполнение остальных полей ...
// Убедитесь, что Заказ заполнен корректной ссылкой, входящей в определяемый тип ОбъектСледованияСостояниюЗаказов
// Если заказа нет, такие движения в 11.5.20 могут вызывать сбой в типовом механизме распределения.

Важный совет: Если ваша бизнес-логика подразумевает резервирование без заказов, рассмотрите возможность использования других регистров или добавления исключений в общем модуле СостоянияДокументов через &Вместо, чтобы система не пыталась регистрировать задания для документов типа ДокументСсылка.КорректировкаРегистров.

Способ №3: Официальные исправления и патчи

Поскольку данная проблема признана массовой («баг» типовой конфигурации), проанализируем пути официального решения. Фирма 1С выпустила ряд исправлений для релизов 11.5.20.85 и 11.5.20.93.

Рекомендуем выполнить следующие действия:

Резюме по решению проблемы

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

← На главную