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

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

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

Власов Денис Посмотреть все статьи >> Технический лидер группы партнёрской сети «ИнфоСофт».
09.09.2026
46
Время прочтения - 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С:Предприятие
Вам может быть интересно: