Добавить в корзинуПозвонить
Найти в Дзене

❓ Рубрика: Вопросы на собеседовании #вопросынасобесах

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

❓ Рубрика: Вопросы на собеседовании #вопросынасобесах

№118

На позицию: Программист 1С

Вопрос:

Пользователи жалуются, что при проведении документа возникают отрицательные остатки, хотя есть код где «всё проверяется». В коде он выглядит так:

ВЫБРАТЬ

ОстаткиТоваров.Номенклатура,

ОстаткиТоваров.Склад,

ОстаткиТоваров.КоличествоОстаток

ИЗ

РегистрНакопления.ТоварыНаСкладах.Остатки(&МоментВремени, Номенклатура В (&СписокНоменклатуры)) КАК ОстаткиТоваров

ДЛЯ ИЗМЕНЕНИЯ

Конфигурация работает в режиме управления блокировками «Управляемый». Что не так с этим кодом и как сделать правильно?

Ответ:

В управляемом режиме конструкция ДЛЯ ИЗМЕНЕНИЯ в языке запросов не работает — она тихо игнорируется платформой. Разработчик ничего не блокирует, и между чтением остатка и записью движений другой сеанс успевает списать тот же товар. Отсюда и «плавающие» отрицательные остатки.

В автоматическом режиме ДЛЯ ИЗМЕНЕНИЯ действительно повышает уровень изоляции на СУБД до Serializable. Но в управляемом режиме блокировки на уровне СУБД минимальные (Read Committed), а параллельностью надо управлять через объект БлокировкаДанных.

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

// 1. Сначала ставим управляемую блокировку

Блокировка = Новый БлокировкаДанных;

ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ТоварыНаСкладах");

ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;

ЭлементБлокировки.ИсточникДанных = Документ.Товары;

ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");

ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Склад", "Склад");

Блокировка.Заблокировать();

// 2. Только после этого читаем актуальные остатки

// 3. И записываем движения

Ключевые тезисы:

🔹 В управляемом режиме ДЛЯ ИЗМЕНЕНИЯ не имеет смысла и игнорируется.

🔹 Блокировать нужно до чтения и до записи, по конкретным значениям измерений — не «весь регистр».

🔹 Уровень изоляции на СУБД в управляемом режиме — Read Committed; параллельность обеспечивает платформа через объект БлокировкаДанных.

❗️ Есть что добавить, пиши в комментариях.

Подпишись на канал | Подпишись в max