Заказать консультацию специалиста 1С

ИнфоСофт использует файлы «cookie» с целью персонализации сервисов и повышения удобства пользования веб-сайтом. Вы можете запретить обработку сookies в настройках браузера. Пожалуйста, ознакомьтесь с политикой использования cookies.
Оставаясь на сайте, вы соглашаетесь с политикой использования cookies.

Как новые механизмы регистров Обновление, Удаление и Слияние ускоряют обработку данных

Власов Денис Посмотреть все статьи >> Технический лидер группы партнёрской сети «ИнфоСофт».
09.09.2026
398
Время прочтения - 16 мин.
Заказать консультацию

Практически у каждого специалиста, кто обслуживает рабочую базу 1С с внушительным объемом исторических данных, рано или поздно встаёт одна и та же задача: поправить то, что уже записано в регистр. Причины разные — решили хранить дополнительный показатель, нашли ошибку в расчёте движений, нужно подчистить не актуальные записи или свернуть остатки за прошлые годы. Механика при этом всегда одна: регистр уже наполнен данными, и менять его приходится «по живому», на работающей системе.

Проблема в том, что долгое время у платформы не было удобного инструмента для таких правок. Всё сводилось к обходу регистратора за регистратором и перезаписи наборов записей в цикле. На небольших объёмах это ещё терпимо, но, когда счёт идёт на сотни тысяч и миллионы строк, операция растягивается на часы и блокирует пользователей. Ниже разберём, как эту задачу решать сейчас — без циклов и лишних обращений к базе.

Что изменилось в платформе

С версий 8.3.25-8.3.26-8.3.27 у наборов записей появился механизм, позволяющий обрабатывать регистры пакетно. Если раньше подчинённый регистратору регистр умел только «добавить» или «целиком заменить» записи в рамках одного документа, то теперь можно массово обновлять и удалять записи по ключам, не привязываясь к одному регистратору.

Конкретнее, платформа стала поддерживать расширенные режимы замещения:

  • Удаление — доступны с версии 8.3.26;
  • Слияние для независимых регистров сведений - доступны с версии 8.3.25
  • Обновление — с версии 8.3.27;
  • запись подчинённого регистра в режиме Добавление без отбора по регистратору — с версии 8.3.26, при этом номера строк проставляются платформой.

Главная идея — избавить разработчика от циклов. Вместо тысячи отдельных вызовов записи платформа упаковывает весь набор в промежуточную таблицу и обращается к СУБД одним пакетным запросом, для единоразовой записи всего пакета, а не поочередной записи каждого набора по-отдельности. Это и даёт основной прирост скорости.

Два типа регистров — два сценария

Прежде чем идти дальше, важно разделить регистры на два типа — подчинённые и независимые. От типа регистра зависит, как включать новые режимы, что считать ключом записи и какие режимы вообще доступны. Определите, с каким регистром работаете вы, и обращайтесь к нужной колонке.

Подчинённый регистр (накопления, бухгалтерия, расчёт, подчинённый регистр сведений) Независимый регистр сведений
Как включить новые режимы РасширенныеРежимыЗамещения = Истина; Отбор.Сбросить(); Ничего включать не нужно
Ключ записи Регистратор + НомерСтроки (+ разделители) измерения (+ Период, если периодический) (+ разделители)
Номер строки заполняется вручную отсутствует
Основные режимы из статьи Обновление, Удаление Слияние

Как включить и что важно понимать

Подчинённые регистры: включаем расширенные режимы

Чтобы новые режимы заработали, у набора записей нужно выставить свойство РасширенныеРежимыЗамещения в Истина. У подчинённого регистра по умолчанию включён отбор по Регистратору — в новых режимах он не нужен, поэтому его сбрасывают:

Набор = РегистрыНакопления.Доставки.СоздатьНаборЗаписей();
Набор.РасширенныеРежимыЗамещения = Истина;
Набор.Отбор.Сбросить();

Независимые регистры сведений: включать нечего

Для независимого регистра сведений ничего включать не нужно: расширенные режимы там не требуются, а отбор и так пустой. Достаточно заполнить набор по измерениям и записать его нужным режимом — подробнее в разделе «Три режима».

Ключ записи

Раз записи адресуются по ключам, важно понимать, что в этом качестве выступает:

  • для подчинённого регистра (движения документа) — связка Регистратор + НомерСтроки плюс разделители. Поле Период ключом не является, его тоже можно менять;
  • для независимого регистра сведений — все измерения, а для периодического ещё и Период, плюс разделители.

Номера строк становятся «ручными» (для подчинённых регистров)

Побочный эффект включения расширенных режимов: платформа перестаёт сама управлять НомерСтроки, и заполнять его приходится вручную. Раньше этот момент был скрыт от разработчика, теперь же номер строки — это обычное поле ключа, которое нужно указать, чтобы платформа поняла, какую именно строку обновлять или удалять. Поэтому и относиться к нему стоит как к техническому счётчику, а не как к значимому для бизнеса значению.

Три режима — что каждый из них делает

Режимы ниже сгруппированы по типу регистра. Обновление и Удаление — рабочие инструменты подчинённых регистров (для независимых регистров сведений они не требуют включения расширенных режимов), а Слияние работает только для независимых регистров сведений.

Для подчинённых регистров: Обновление и Удаление

Обновление

Обновляет только те записи, которые нашлись в регистре по ключам. Новые записи не создаёт. Подходит, когда нужно пересчитать или дополнить значения в уже существующих строках — например, заполнить новый ресурс по формуле.

Удаление

Удаляет записи, совпавшие по ключам. После удаления платформа сама приводит нумерацию строк к сплошной в пределах каждого регистратора, чтобы не оставалось «дыр». Удобно для разовой зачистки ошибочных или пустых движений.

Для независимых регистров сведений

Слияние

Действует в два шага: совпавшие по ключам записи обновляет, недостающие — добавляет. Работает только для независимых регистров, для подчинённых регистратору запрещён. Идеален, когда нужно актуализировать срез, где часть позиций обновилась, а часть появилась впервые.

Режим Совпавшие строки Новые строки Подчинённый регистр Типовая задача
Обновление обновляются не добавляются да дорассчитать поле
Удаление удаляются — да вычистить лишние строки
Слияние обновляются добавляются нет сверить срез с внешними данными

Примеры применения

Заполняем новый ресурс через Обновление

Возьмём оборотный регистр накопления Доставки (движения по отгрузкам) с измерениями «Склад», «Товар» и ресурсами «Количество», «Стоимость». Допустим, бизнес попросил учитывать ещё и вес перевезённого товара. В структуру добавили ресурс Вес, теперь его нужно заполнить по накопленным данным. Вес считается как количество, умноженное на вес единицы из карточки товара.

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

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|	Доставки.Регистратор КАК Регистратор,
|	Доставки.НомерСтроки КАК НомерСтроки,
|	Доставки.Период КАК Период,
|	Доставки.Склад КАК Склад,
|	Доставки.Товар КАК Товар,
|	Доставки.Количество КАК Количество,
|	Доставки.Стоимость КАК Стоимость,
|	Доставки.Количество * Доставки.Товар.Вес КАК Вес
|ИЗ
|	РегистрНакопления.Доставки КАК Доставки"; 

Выборка = Запрос.Выполнить().Выбрать(); 
Набор = РегистрыНакопления.Доставки.СоздатьНаборЗаписей();
Набор.РасширенныеРежимыЗамещения = Истина;
Набор.Отбор.Сбросить(); 

Пока Выборка.Следующий() Цикл
	Запись = Набор.Добавить();
	ЗаполнитьЗначенияСвойств(Запись,Выборка);
КонецЦикла; 

Набор.Записать(РежимЗамещения.Обновление);

Два момента, на которые стоит обратить внимание. Во-первых, в выборке обязательно должны быть Регистратор и НомерСтроки — без ключей обновление не найдёт строки. Во-вторых, передать нужно все поля записи целиком: выборочно обновить только одно поле не получится.

Далее привожу результаты замеров заполнения нового ресурса «Вес» для +-35 000 записей в регистре накопления «По старому» и «По новому».

1.png
Рисунок 1. Результаты замеров заполнения нового ресурса «Вес»

Вычищаем пустые строки через Удаление

Другой частый случай: в регистре скопились строки с нулевым количеством — результат старой ошибки в алгоритме проведения. Их нужно убрать. Формируем набор из ключей таких строк и удаляем одной командой:

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|	Доставки.Регистратор КАК Регистратор,
|	Доставки.НомерСтроки КАК НомерСтроки
|ИЗ
|	РегистрНакопления.Доставки КАК Доставки
|ГДЕ
|	Доставки.Количество = 0"; 

Выборка = Запрос.Выполнить().Выбрать();
Набор = РегистрыНакопления.Доставки.СоздатьНаборЗаписей();
Набор.РасширенныеРежимыЗамещения = Истина;
Набор.Отбор.Сбросить(); 

Пока Выборка.Следующий() Цикл
	Запись = Набор.Добавить();
	ЗаполнитьЗначенияСвойств(Запись, Выборка);
КонецЦикла; 

Набор.Записать(РежимЗамещения.Удаление);

После выполнения нумерация оставшихся строк в каждом документе станет сплошной — об этом платформа позаботится сама.

Далее привожу результаты замеров удаления записей из регистра с нулевым количеством «По старому» и «По новому», по факту это каждая вторая запись.

2.png
Рисунок 2. Результаты замеров удаления записей из регистра с нулевым количеством «По старому» и «По новому»

Актуализируем прайс через Слияние

Теперь независимый регистр сведений. Представьте регистр сведений ЦеныПоставщиков с измерениями «Поставщик», «Товар» и ресурсом «Цена». Поставщик прислал обновлённый прайс: часть позиций подешевела, часть появилась впервые. Режим Слияние решает задачу одним вызовом — старые цены обновятся, новые позиции добавятся:

Набор = РегистрыСведений.ЦеныПоставщиков.СоздатьНаборЗаписей();
// Для Слияния расширенные режимы включать не нужно, отбор и так пустой 

// ... заполняем набор позициями из нового прайса 

Набор.Записать(РежимЗамещения.Слияние);

Такой подход заменяет связку из «прочитать существующие → найти расхождения → удалить лишнее → записать новое» одной строчкой.

Также привожу результаты замеров слияние записей из регистра Цены поставщика для нового прайса «По старому» и «По новому».

3.png
Рисунок 3. Результаты замеров слияние записей из регистра Цены поставщика для нового прайса «По старому» и «По новому»

Свёртка остатков

Отдельная история — свёртка регистра накопления остатков. Смысл в том, чтобы движения за периоды до даты свёртки заменить одной записью, которая играет роль начального остатка. По сути, это комбинация уже разобранных режимов: сначала пакетно удаляем сворачиваемые движения, затем одним набором добавляем итоговые остатки по измерениям.

// Шаг 1: удаляем движения, подлежащие свёртке
НаборУдаления = РегистрыНакопления.ОстаткиТоваров.СоздатьНаборЗаписей();
НаборУдаления.РасширенныеРежимыЗамещения = Истина;
НаборУдаления.Отбор.Сбросить();
// ... заполняем ключами удаляемых записей
НаборУдаления.Записать(РежимЗамещения.Удаление); 

// Шаг 2: добавляем свёрнутые остатки на дату свёртки
НаборОстатков = РегистрыНакопления.ОстаткиТоваров.СоздатьНаборЗаписей();
НаборОстатков.РасширенныеРежимыЗамещения = Истина;
НаборОстатков.Отбор.Сбросить();
// ... заполняем итоговыми остатками в разрезе измерений
НаборОстатков.Записать(РежимЗамещения.Добавление);

Здесь важно, что количество обращений к базе больше не зависит от числа документов за свёртываемый период — раньше именно из-за этой зависимости свёртка была многочасовой операцией.

На что обратить внимание

  • Номер строки для подчиненных регистров — теперь ваша забота. В расширенном режиме платформа не назначает номера строк, их заполняет разработчик. А поскольку это технический счётчик, строить на нём бизнес-логику не стоит.
  • Обновить одно поле не выйдет. Режим Обновление требует полный набор полей записи. Забыли какое-то значение — получите его в пустом/неверном виде.
  • Блокировки могут эскалироваться. На больших объёмах платформа блокирует записи по ключам, и при превышении порога блокировка разрастается до всей таблицы, что приведет к невозможности работы пользователей. Запускайте такие правки в технологическое окно.
  • Отбор больше не работает как раньше. В новых режимах набор адресует записи по ключам, а не по отбору. Привычка выставлять Отбор.Регистратор здесь не поможет — отбор нужно сбрасывать.
  • Слияние — только для независимых. Подчинённым регистрам доступны лишь Обновление и Удаление.
  • Не работает в режиме загрузки. Совмещение расширенных режимов с ОбменДанными.Загрузка = Истина приводит к ошибке — платформа такое сочетание не допускает.

Шпаргалка: что выбрать

Задача Тип регистра Режим
Просто добавить записи в пустой регистр любой Добавление
Пересчитать/дополнить значения существующих строк любой Обновление
Удалить набор строк (пустые, ошибочные) любой Удаление
Сверить срез: часть обновить, часть добавить независимый Слияние
Свёртка остатков накопления Удаление + Добавление

Подведем итог

Расширенные режимы замещения убирают главную причину медленных массовых операций с регистрами — цикл по регистратору. Вместо него появляется пакетная запись одним набором, что особенно заметно на больших базах. Достаточно запомнить три вещи: держать под контролем ключи (особенно НомерСтроки), передавать все поля записи целиком и не забывать про блокировки с длиной транзакции. Остальное платформа возьмёт на себя.


Заказать консультацию специалиста 1С

Оставьте заявку и наши эксперты проконсультируют вас по данной статье
Рассказать друзьям
1С:Предприятие
Вам может быть интересно: