Ошибка при выполнении обработчика ОбработкаПроведения в 1С: решение
- Ошибка
Ошибка при выполнении обработчика ОбработкаПроведенияпри проведении документов. - Сообщения о нехватке остатков:
Недостаточно товара на складе / Отрицательный остаток по регистру. - Ошибки
Превышено время ожидания предоставления блокировкипри параллельном проведении документов несколькими пользователями. - Исключения времени выполнения в сложных расчетных модулях себестоимости и взаиморасчетов.
1. Переход на методику проведения «по новой схеме» (с контролем остатков)
Устаревшая («старая») методика сначала читает остатки запросом, а затем формирует движения, что приводит к дедлокам. Современная методика формирует движения сразу, а затем проверяет остатки одним запросом с блокировкой ДЛЯ ИЗМЕНЕНИЯ:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// 1. Очистка старых движений при перепроведении
Движения.ОстаткиТоваров.Очистить();
Движения.ОстаткиТоваров.Записывать = Истина;
// 2. Формирование движений по табличной части
Для Каждого Стр Из ТабличнаяЧасть Цикл
Движение = Движения.ОстаткиТоваров.ДобавитьРасход();
Движение.Период = Дата;
Движение.Номенклатура = Стр.Номенклатура;
Движение.Количество = Стр.Количество;
КонецЦикла;
// 3. Запись движений в транзакции
Движения.ОстаткиТоваров.Записать();
// 4. Контроль остатков запросом по фактическим отрицательным итогам
Запрос = Новый Запрос(
"ВЫБРАТЬ Номенклатура, КоличествоОстаток
|ИЗ РегистрНакопления.ОстаткиТоваров.Остатки(&Момент, Номенклатура В (&МассивНоменклатуры))
|ГДЕ КоличествоОстаток < 0");
// Если есть записи < 0, Отказ = Истина и вывод понятного сообщения пользователю
КонецПроцедуры2. Использование управляемых блокировок (БлокировкаДанных)
Перед чтением остатков установите явную управляемую блокировку пространства данных:
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиТоваров");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.УстановитьЗначение("Склад", ЭтотОбъект.Склад);
Блокировка.Заблокировать(); Частые вопросы (FAQ)
Почему при оперативном проведении документов возникают блокировки LCK_M_X в СУБД?
В автоматическом режиме блокировок СУБД блокирует целые диапазоны страниц индексов. Переведите конфигурацию в режим 'Управляемые блокировки' для обеспечения точечных строчных блокировок.
В чем разница между оперативным и неоперативным проведением?
Оперативное проведение выполняется строго текущим моментом времени с актуальным контролем остатков. Неоперативное проведение позволяет проводить документы задним числом без жесткой блокировки границы времени.
Что делать, если при проведении документа вылетает ошибка 'Деление на 0' при расчете себестоимости?
Добавьте в алгоритм проверку на нулевое количество списания перед вычислением средней цены (ЕСТЬNULL(Сумма / NULLIF(Количество, 0), 0)).
Как найти конкретный запрос, вызвавший падение в ОбработкеПроведения?
Настройте сбор технологического журнала по событиям SDBL и EXCP с отбором по имени документа и длительности выполнения.