Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
ERR_1C_POSTING_HANDLER_FAIL 1С:Предприятие и СУБД

Ошибка при выполнении обработчика ОбработкаПроведения в 1С: решение

Обновлено: 25.08.2026  ·  Официальная база знаний
  • Ошибка Ошибка при выполнении обработчика ОбработкаПроведения при проведении документов.
  • Сообщения о нехватке остатков: Недостаточно товара на складе / Отрицательный остаток по регистру.
  • Ошибки Превышено время ожидания предоставления блокировки при параллельном проведении документов несколькими пользователями.
  • Исключения времени выполнения в сложных расчетных модулях себестоимости и взаиморасчетов.

1. Переход на методику проведения «по новой схеме» (с контролем остатков)

Устаревшая («старая») методика сначала читает остатки запросом, а затем формирует движения, что приводит к дедлокам. Современная методика формирует движения сразу, а затем проверяет остатки одним запросом с блокировкой ДЛЯ ИЗМЕНЕНИЯ:

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    // 1. Очистка старых движений при перепроведении
    Движения.ОстаткиТоваров.Очистить();
    Движения.ОстаткиТоваров.Записывать = Истина;
    
    // 2. Формирование движений по табличной части
    Для Каждого Стр Из ТабличнаяЧасть Цикл
        Движение = Движения.ОстаткиТоваров.ДобавитьРасход();
        Движение.Период = Дата;
        Движение.Номенклатура = Стр.Номенклатура;
        Движение.Количество = Стр.Количество;
    КонецЦикла;
    
    // 3. Запись движений в транзакции
    Движения.ОстаткиТоваров.Записать();
    
    // 4. Контроль остатков запросом по фактическим отрицательным итогам
    Запрос = Новый Запрос(
        "ВЫБРАТЬ Номенклатура, КоличествоОстаток
        |ИЗ РегистрНакопления.ОстаткиТоваров.Остатки(&Момент, Номенклатура В (&МассивНоменклатуры))
        |ГДЕ КоличествоОстаток < 0");
    // Если есть записи < 0, Отказ = Истина и вывод понятного сообщения пользователю
КонецПроцедуры

2. Использование управляемых блокировок (БлокировкаДанных)

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

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиТоваров");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.УстановитьЗначение("Склад", ЭтотОбъект.Склад);
Блокировка.Заблокировать();
Практический опыт инженера: Никогда не выполняйте запросы внутри циклов в процедуре ОбработкаПроведения. Все исходные данные табличных частей должны выгружаться в массив и передаваться в единственный пакетный запрос с временными таблицами.

Частые вопросы (FAQ)

Почему при оперативном проведении документов возникают блокировки LCK_M_X в СУБД?

В автоматическом режиме блокировок СУБД блокирует целые диапазоны страниц индексов. Переведите конфигурацию в режим 'Управляемые блокировки' для обеспечения точечных строчных блокировок.

В чем разница между оперативным и неоперативным проведением?

Оперативное проведение выполняется строго текущим моментом времени с актуальным контролем остатков. Неоперативное проведение позволяет проводить документы задним числом без жесткой блокировки границы времени.

Что делать, если при проведении документа вылетает ошибка 'Деление на 0' при расчете себестоимости?

Добавьте в алгоритм проверку на нулевое количество списания перед вычислением средней цены (ЕСТЬNULL(Сумма / NULLIF(Количество, 0), 0)).

Как найти конкретный запрос, вызвавший падение в ОбработкеПроведения?

Настройте сбор технологического журнала по событиям SDBL и EXCP с отбором по имени документа и длительности выполнения.