Примеры работы с набором записей регистра

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

Создание набора записей регистра сведений

// Создание и заполнение набора записей регистра сведений "КурсыВалют"
Процедура ЗаписатьКурсыВалют()

    НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Валюта.Установить(Справочники.Валюты.НайтиПоКоду("USD"));
    НаборЗаписей.Отбор.Период.Установить(НачалоМесяца(ТекущаяДата()));
    
    НоваяЗапись = НаборЗаписей.Добавить();
    НоваяЗапись.Период = ТекущаяДата();
    НоваяЗапись.Валюта = Справочники.Валюты.НайтиПоКоду("USD");
    НоваяЗапись.Курс = 98.50;
    НоваяЗапись.Кратность = 1;
    
    НаборЗаписей.Записать();
    
КонецПроцедуры

Работа с набором записей регистра накопления

// Формирование движений по регистру накопления "Продажи" в документе
Процедура ОбработкаПроведения(Отказ, Режим)

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

Чтение существующих записей через набор

// Получение и модификация существующих записей регистра сведений
Процедура ИзменитьКурсыВалют()

    НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Валюта.Установить(Справочники.Валюты.НайтиПоКоду("EUR"));
    НаборЗаписей.Отбор.Период.Установить(Диапазон(Дата(2025,1,1), Дата(2025,1,31)));
    
    НаборЗаписей.Прочитать();
    
    Для Каждого Запись Из НаборЗаписей Цикл
        Запись.Курс = Запись.Курс * 1.05;
    КонецЦикла;
    
    НаборЗаписей.Записать();
    
КонецПроцедуры

Условная запись с проверкой существования

// Добавление записи только если её ещё нет
Процедура ЗаписатьЕслиНет(Период, Валюта, Курс)

    НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Период.Установить(Период);
    НаборЗаписей.Отбор.Валюта.Установить(Валюта);
    НаборЗаписей.Прочитать();
    
    Если НаборЗаписей.Количество() = 0 Тогда
        НоваяЗапись = НаборЗаписей.Добавить();
        НоваяЗапись.Период = Период;
        НоваяЗапись.Валюта = Валюта;
        НоваяЗапись.Курс = Курс;
        НоваяЗапись.Кратность = 1;
        НаборЗаписей.Записать();
        Сообщить("Запись добавлена");
    Иначе
        Сообщить("Запись уже существует");
    КонецЕсли;
    
КонецПроцедуры

Удаление записей через набор

// Удаление всех записей регистра за указанный период
Процедура ОчиститьРегистрЗаПериод(ДатаНач, ДатаКон)

    НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Период.Установить(Диапазон(ДатаНач, ДатаКон));
    НаборЗаписей.Прочитать();
    
    Пока НаборЗаписей.Количество() > 0 Цикл
        НаборЗаписей.Удалить(0);
    КонецЦикла;
    
    НаборЗаписей.Записать();
    Сообщить("Удалено записей: " + Строка(КоличествоУдаленных));
    
КонецПроцедуры

Копирование записей между наборами

// Копирование записей с изменением периода
Процедура СкопироватьНаборНаДату(НовыйПериод)

    СтарыйНабор = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
    СтарыйНабор.Отбор.Период.Установить(Диапазон(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата())));
    СтарыйНабор.Прочитать();
    
    НовыйНабор = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
    НовыйНабор.Отбор.Период.Установить(НовыйПериод);
    НовыйНабор.Прочитать();
    
    Для Каждого СтараяЗапись Из СтарыйНабор Цикл
        Копия = НовыйНабор.Добавить();
        ЗаполнитьЗначенияСвойств(Копия, СтараяЗапись);
        Копия.Период = НовыйПериод;
    КонецЦикла;
    
    НовыйНабор.Записать(Ложь); // Ложь - не замещать существующие записи
    
КонецПроцедуры

Использование менеджера движений для пакетной записи нескольких регистров

// Запись движений в несколько регистров в рамках одной транзакции
Процедура ПровестиДокументПоРегистрам()

    МенеджерДвижений = Новый МенеджерДвижений;
    
    // Регистр "Продажи"
    НаборПродажи = МенеджерДвижений.РегистрыНакопления.Продажи;
    Запись1 = НаборПродажи.Добавить();
    Запись1.Период = Дата;
    Запись1.Номенклатура = Товар;
    Запись1.Количество = 10;
    Запись1.ВидДвижения = ВидДвиженияНакопления.Расход;
    
    // Регистр "Заказы"
    НаборЗаказы = МенеджерДвижений.РегистрыНакопления.Заказы;
    Запись2 = НаборЗаказы.Добавить();
    Запись2.Период = Дата;
    Запись2.Контрагент = Контрагент;
    Запись2.Сумма = 50000;
    Запись2.ВидДвижения = ВидДвиженияНакопления.Приход;
    
    МенеджерДвижений.Записать();
    
КонецПроцедуры

Примечания

// Важные особенности работы с набором записей:
// 1. Набор записей читает данные в соответствии с установленным отбором
// 2. Метод Прочитать() загружает существующие записи в набор
// 3. Метод Записать() сохраняет все изменения (добавления, изменения, удаления)
// 4. При работе с регистрами накопления обязательно указывать ВидДвижения
// 5. МенеджерДвижений позволяет атомарно записывать движения в несколько регистров
// 6. Диапазон в отборе задается через Функция Диапазон(Начало, Конец)

Поделиться с друзьями
Smirnov code
Добавить комментарий