Примеры работы с регистром накопления

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

Запись в регистр накопления

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

Пакетная запись движений

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

Получение остатков на дату

// Получение остатков товаров на определенную дату
Функция ПолучитьОстаткиТоваровНаДату(ДатаОстатков, Товар = Неопределено, Склад = Неопределено)
    
    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ
    |   ОстаткиТоваровОстатки.Товар,
    |   ОстаткиТоваровОстатки.Склад,
    |   СУММА(ОстаткиТоваровОстатки.Количество) КАК Количество
    |ИЗ
    |   РегистрНакопления.ОстаткиТоваров.Остатки(&ДатаОстатков,) КАК ОстаткиТоваровОстатки
    |ГДЕ
    |   ИСТИНА";
    
    // Добавляем условия при необходимости
    Если Товар <> Неопределено Тогда
        Запрос.Текст = Запрос.Текст + "
        |   И ОстаткиТоваровОстатки.Товар = &Товар";
    КонецЕсли;
    
    Если Склад <> Неопределено Тогда
        Запрос.Текст = Запрос.Текст + "
        |   И ОстаткиТоваровОстатки.Склад = &Склад";
    КонецЕсли;
    
    Запрос.Текст = Запрос.Текст + "
    |СГРУППИРОВАТЬ ПО
    |   ОстаткиТоваровОстатки.Товар,
    |   ОстаткиТоваровОстатки.Склад";
    
    Запрос.УстановитьПараметр("ДатаОстатков", ДатаОстатков);
    
    Если Товар <> Неопределено Тогда
        Запрос.УстановитьПараметр("Товар", Товар);
    КонецЕсли;
    
    Если Склад <> Неопределено Тогда
        Запрос.УстановитьПараметр("Склад", Склад);
    КонецЕсли;
    
    Результат = Запрос.Выполнить().Выгрузить();
    
    Возврат Результат;
    
КонецФункции

Получение оборотов за период

// Получение оборотов товаров за период
Функция ПолучитьОборотыТоваровЗаПериод(ДатаНачала, ДатаОкончания, Товар = Неопределено)
    
    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ
    |   ОстаткиТоваровОбороты.Товар,
    |   ВЫБОР
    |       КОГДА ОстаткиТоваровОбороты.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
    |           ТОГДА ""Приход""
    |       ИНАЧЕ ""Расход""
    |   КОНЕЦ КАК ВидДвижения,
    |   СУММА(ОстаткиТоваровОбороты.Количество) КАК Количество
    |ИЗ
    |   РегистрНакопления.ОстаткиТоваров.Обороты(&ДатаНачала, &ДатаОкончания,,) КАК ОстаткиТоваровОбороты
    |ГДЕ
    |   ИСТИНА";
    
    Если Товар <> Неопределено Тогда
        Запрос.Текст = Запрос.Текст + "
        |   И ОстаткиТоваровОбороты.Товар = &Товар";
    КонецЕсли;
    
    Запрос.Текст = Запрос.Текст + "
    |СГРУППИРОВАТЬ ПО
    |   ОстаткиТоваровОбороты.Товар,
    |   ОстаткиТоваровОбороты.ВидДвижения";
    
    Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
    Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
    
    Если Товар <> Неопределено Тогда
        Запрос.УстановитьПараметр("Товар", Товар);
    КонецЕсли;
    
    Результат = Запрос.Выполнить().Выгрузить();
    
    Возврат Результат;
    
КонецФункции

Удаление движений регистра

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

Корректировка записей регистра

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

Пример использования временных таблиц для работы с регистрами

// Использование временных таблиц для сложных расчетов
Процедура РасчетОстатковСВременнымиТаблицами()
    
    ВременнаяТаблица = Новый ТаблицаЗначений;
    ВременнаяТаблица.Колонки.Добавить("Товар", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
    ВременнаяТаблица.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
    
    // Заполняем временную таблицу данными
    // ...
    
    // Используем временную таблицу в запросе к регистру
    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ
    |   т.Товар,
    |   т.Количество КАК ПланируемоеКоличество,
    |   ЕСТЬNULL(Остатки.Количество, 0) КАК ФактическоеКоличество
    |ПОМЕСТИТЬ ВТ_Сравнение
    |ИЗ
    |   &ВременнаяТаблица КАК т
    |       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(&ДатаОстатков,) КАК Остатки
    |       ПО т.Товар = Остатки.Товар";
    
    Запрос.УстановитьПараметр("ВременнаяТаблица", ВременнаяТаблица);
    Запрос.УстановитьПараметр("ДатаОстатков", ТекущаяДата());
    
    Результат = Запрос.Выполнить().Выгрузить();
    
    // Дальнейшая обработка результата
    // ...
    
КонецПроцедуры

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

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