1С 8.3 РежимЗамещения.Слияние; Удаление; Обновление
Данные > Примеры кода 1С > 1С 8.3 Регистры сведений
Перейти в раздел примеры кода 1С 8.3:

Для набора записей независимого регистра сведений реализована возможность обновления записей регистра сведений, совпадающих по ключевым полям с записями. Возможно не все в курсе, но в 8.3.26 подвезли несколько новых методов при записи набора записей регистра сведений методом ‘’НаборЗаписей.Записать(Признак)". Ранее была возможность передать только признак "Истина/Ложь", что означало либо добавление новых записей, либо перезапись. Во время перезаписи все значения сначала удалялись, затем записывались новые. Теперь вместо булевого признака можно передадавать "РежимЗамещения" (Добавление , Замещение , Слияние, Удаление и в 8.3.27 добавили "Обновление").
Какой кейс оно решает? Например, добавили новый ресурс в регистр сведений и хотим заполнить только его без перезаписи всех записей, тогда можно использовать этот механизм.
📌 Что значит метод "удаление": Суть в том, что раньше, до эпохи исторического материализма, записи в регистрах сведений нужно было удалять в цикле. Что, как вы понимаете, не комильфо. Понимаете? Например, нужно удалить 100.000 записей из регистра сведений. Это нужно 100.000 раз дергать сервер, что долго и ресурсоёмко. Теперь одним взмахом руки можно удалить всю тысячу.
Пример в 1С 8.5.1:
НачатьТранзакцию();
Попытка
Блокировка.Заблокировать();
РезультатыЗапроса = Запрос.ВыполнитьПакет();
Если Не РезультатыЗапроса[0].Пустой() Тогда
НаборЗаписей = РегистрыСведений.СоставыГруппПользователей.СоздатьНаборЗаписей();
НаборЗаписей.Загрузить(РезультатыЗапроса[0].Выгрузить());
НаборЗаписей.Записать(РежимЗамещения.Удаление); // с версии 8.3.26
// Будут удалены записи, совпадающие по значению ключевых полей с записями в наборе записей.
КонецЕсли;
Если Не РезультатыЗапроса[1].Пустой() Тогда
НаборЗаписей = РегистрыСведений.СоставыГруппПользователей.СоздатьНаборЗаписей();
НаборЗаписей.Загрузить(РезультатыЗапроса[1].Выгрузить());
НаборЗаписей.Записать(РежимЗамещения.Слияние); // с версии 8.3.26
//Будет выполнено слияние записей из набора записей с существующими записями регистра:
//* Существующие записи регистра, совпадающие по значениям ключевых полей с записями
// из набора записей, будут перезаписаны.
//* Записи набора, для которых нет соответствия среди существующих записей регистра,
// будут добавлены.
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
// Обновление существующих записей регистра, совпадающих по значениям ключевых полей с записями,
// содержащимися в наборе записей. Добавление новых записей не выполняется.
НачатьТранзакцию();
Попытка
БлокировкаДанных.Заблокировать();
Выгрузка = Запрос.Выполнить().Выгрузить();
НаборЗаписей = РегистрыСведений.ДанныеБизнесПроцессов.СоздатьНаборЗаписей();
НаборЗаписей.Загрузить(Выгрузка); // с версии 8.3.27
ОбновлениеИнформационнойБазы.ЗаписатьНаборЗаписей(НаборЗаписей, РежимЗамещения.Обновление);
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
//...
КонецПопытки;
Попытка
Блокировка.Заблокировать();
РезультатыЗапроса = Запрос.ВыполнитьПакет();
Если Не РезультатыЗапроса[0].Пустой() Тогда
НаборЗаписей = РегистрыСведений.СоставыГруппПользователей.СоздатьНаборЗаписей();
НаборЗаписей.Загрузить(РезультатыЗапроса[0].Выгрузить());
НаборЗаписей.Записать(РежимЗамещения.Удаление); // с версии 8.3.26
// Будут удалены записи, совпадающие по значению ключевых полей с записями в наборе записей.
КонецЕсли;
Если Не РезультатыЗапроса[1].Пустой() Тогда
НаборЗаписей = РегистрыСведений.СоставыГруппПользователей.СоздатьНаборЗаписей();
НаборЗаписей.Загрузить(РезультатыЗапроса[1].Выгрузить());
НаборЗаписей.Записать(РежимЗамещения.Слияние); // с версии 8.3.26
//Будет выполнено слияние записей из набора записей с существующими записями регистра:
//* Существующие записи регистра, совпадающие по значениям ключевых полей с записями
// из набора записей, будут перезаписаны.
//* Записи набора, для которых нет соответствия среди существующих записей регистра,
// будут добавлены.
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
// Обновление существующих записей регистра, совпадающих по значениям ключевых полей с записями,
// содержащимися в наборе записей. Добавление новых записей не выполняется.
НачатьТранзакцию();
Попытка
БлокировкаДанных.Заблокировать();
Выгрузка = Запрос.Выполнить().Выгрузить();
НаборЗаписей = РегистрыСведений.ДанныеБизнесПроцессов.СоздатьНаборЗаписей();
НаборЗаписей.Загрузить(Выгрузка); // с версии 8.3.27
ОбновлениеИнформационнойБазы.ЗаписатьНаборЗаписей(НаборЗаписей, РежимЗамещения.Обновление);
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
//...
КонецПопытки;
0
комментарии
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник