Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

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

PERF_RECORDSET_WRITE_LOCK 1С:Предприятие и СУБД

Гайд 1С: Оптимизация записи наборов записей регистров с отбором по регистратору

Обновлено: 26.08.2026 · Официальная документация ↗
  • Ошибки Конфликт блокировок при выполнении транзакции при одновременном проведении разнородных документов.
  • Эскалация блокировок СУБД с уровня отдельных строк до полной блокировки таблицы регистра.
  • Длительное время выполнения метода НаборЗаписей.Записать().

1. Обязательный отбор по Регистратору

При записи наборов записей подчиненных регистров накопления, бухгалтерии и сведений отбор по регистратору должен устанавливаться всегда строго перед операцией чтения или очистки:

// ПРАВИЛЬНЫЙ ШАБЛОН ЗАПИСИ НАБОРА
Набор = РегистрыНакопления.Взаиморасчеты.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(СсылкаНаДокумент);

// Заполнение данных набора
Для Каждого СтрокаТЧ Из ТабличнаяЧасть Цикл
    Движение = Набор.Добавить();
    Движение.Период = Дата;
    Движение.Регистратор = СсылкаНаДокумент;
    Движение.Контрагент = СтрокаТЧ.Контрагент;
    Движение.Сумма = СтрокаТЧ.Сумма;
КонецЦикла;

// Запись без очистки чужих блокировок
Набор.Записать(Истина); // Замещать = Истина

2. Очистка движений документа без чтения в память

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

Набор = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(СсылкаНаДокумент);
Набор.Записать(Истина); // Мгновенное удаление на уровне СУБД (DELETE WHERE Recorder = @P1)

3. Разделение итогов регистров накопления

В свойствах метаданных регистра накопления включите свойство Разрешить разделение итогов. Это исключает взаимоблокировки документов при одновременной записи движений по одним и тем же измерениям.

💡 Практика специалистов: Никогда не записывайте движения в цикле поштучно по одной строке — формируйте весь массив записей документа в памяти и выполняйте единый вызов метода НаборЗаписей.Записать() в конце транзакции.

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

Почему возникает взаимоблокировка при записи без флага Замещать = Истина?

При Замещать = Ложь платформа пытается выполнить объединение существующих записей в СУБД с новыми, что требует наложения предикатных S-блокировок и последующего их повышения до X-блокировок, вызывая классический Deadlock.

Как механизм разделения итогов устраняет взаимоблокировки?

Платформа добавляет скрытое поле 'НомерЗаписи/Разделитель' в таблицу итогов, позволяя разным сессиям параллельно увеличивать или уменьшать итог по одинаковым измерениям в разных физических строках таблицы.

Нужно ли считывать существующий набор (Набор.Прочитать()), если нужно просто добавить одну запись?

Если набор большой, вычитывать его в память rphost неоптимально. Лучше использовать независимые регистры сведений с точечным отбором или формировать движения через перепроведение документа.

Что генерирует СУБД при записи набора с флагом Замещать = Истина?

СУБД выполняет быструю атомарную операцию DELETE по кластерному индексу регистратора и последующую пакетную вставку новых строк через BULK INSERT.

Полезные материалы
Рекомендуем