❓ Рубрика: Вопросы на собеседовании #вопросынасобесах №118 На позицию: Программист 1С Вопрос: Пользователи жалуются, что при проведении документа возникают отрицательные остатки, хотя есть код где «всё проверяется». В коде он выглядит так: ВЫБРАТЬ ОстаткиТоваров.Номенклатура, ОстаткиТоваров.Склад, ОстаткиТоваров.КоличествоОстаток ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(&МоментВремени, Номенклатура В (&СписокНоменклатуры)) КАК ОстаткиТоваров ДЛЯ ИЗМЕНЕНИЯ
Конфигурация работает в режиме управления блокировками «Управляемый». Что не так с этим кодом и как сделать правильно?
Ответ: В управляемом режиме конструкция ДЛЯ ИЗМЕНЕНИЯ в языке запросов не работает — она тихо игнорируется платформой. Разработчик ничего не блокирует, и между чтением остатка и записью движений другой сеанс успевает списать тот же товар. Отсюда и «плавающие» отрицательные остатки.
В автоматическом режиме ДЛЯ ИЗМЕНЕНИЯ действительно повышает уровень изоляции на СУБД до Serializable. Но в управляемом режиме блокировки на уровне СУБД минимальные (Read Committed), а параллельностью надо управлять через объект БлокировкаДанных.
Правильная последовательность для проведения: // 1. Сначала ставим управляемую блокировку Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ТоварыНаСкладах"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = Документ.Товары; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Склад", "Склад"); Блокировка.Заблокировать();
// 2. Только после этого читаем актуальные остатки // 3. И записываем движения Ключевые тезисы: 🔹 В управляемом режиме ДЛЯ ИЗМЕНЕНИЯ не имеет смысла и игнорируется. 🔹 Блокировать нужно до чтения и до записи, по конкретным значениям измерений — не «весь регистр». 🔹 Уровень изоляции на СУБД в управляемом режиме — Read Committed; параллельность обеспечивает платформа через объект БлокировкаДанных.
❗️ Есть что добавить, пиши в комментариях. Подпишись на канал | Подпишись в max
В этом посте были ссылки, но мы их удалили по правилам Сетки