1С 8.3 Регистры накопления - Программист 1С Минск. Автоматизация бизнеса.

Перейти к контенту

1С 8.3 Регистры накопления

Данные > Примеры кода 1С > 1С 8.3 Регистры накопления
Регистр накопления в 1С 8.3 - это объект конфигурации, который образует многомерную систему измерений и позволяет накапливать числовые данные в разрезе нескольких измерений. Используется для учета движения средств (денежных, товарно-материальных ценностей, основных средств т. д.).

Подходит для автоматизации таких направлений, как складской учет, касса, взаиморасчеты, бюджетирование, планирование. С помощью такого регистра можно накапливать информацию об объемах продаж в разрезе номенклатуры и подразделения компании или об остатках товаров в разрезе номенклатуры и склада или о движении основных средств в разрезе объектов.
Чтение записей регистра накопления в 1С 8.3:
&НаСервере
Процедура ЧтениеЗаписиРегистраНакопленияНаСервере()

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

   
Запрос.УстановитьПараметр("ВыбОрганизация",Справочники.Организации.НайтиПоНаименованию("ООО ""Сделай сам"""));
   
Запрос.УстановитьПараметр("НачалоДата", '20200101000000');// начальная дата - 1 января 2020 года
   
Запрос.УстановитьПараметр("КонецДата", '20200331235959');// конечная дата - 31 марта 2020 года 23 часа 59 минут 59 секунд
   
РезультатЗапроса = Запрос.Выполнить();

   
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Пока
ВыборкаДетальныеЗаписи.Следующий() Цикл
       
Сообщить("за " + ВыборкаДетальныеЗаписи.Период + " (" + ВыборкаДетальныеЗаписи.Регистратор + ") " +
       
ВыборкаДетальныеЗаписи.Материалы + " " + ВыборкаДетальныеЗаписи.Количество + " шт. ");
    КонецЦикла;

КонецПроцедуры
Чтение записей документа запросом в регистре накопления в 1С 8.3:
// Такая процедура используется, если не требуется изменять найденные записи.
&НаСервере
Процедура ЧтениеЗаписиДокументаЗапросомВРегистреНакопленияНаСервере()

   
// Например у нас есть ссылка на проведенный документ Поступление на склад № МРБ-000123
   
ПоступлениеСсылка = Документы.ПоступлениеНаСклад.НайтиПоНомеру("МРБ-000123", '20200101');

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

   
Запрос.УстановитьПараметр("ВыбРегистратор",ПоступлениеСсылка);
   
РезультатЗапроса = Запрос.Выполнить();

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

КонецПроцедуры
Получение остатков по регистру накопления в 1С 8.3:
&НаСервере
Процедура ПолучениеОстатковПоРегиструНакопленияНаСервере()

   
// За получение остатков по регистру накопления в разрезе аналитики отвечает виртуальная таблица Остатки,
    // У неё есть следующие параметры:
    // 1. Период, на который считаем остатки, исключая саму дату.   Если нужны остатки на дату включительно - используем
    //    тип Граница.
    // 2. Условие (например, Организация = &ВыбОрганизация)

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

   
Запрос.УстановитьПараметр("ВыбДата",Новый Граница('20200331235959', ВидГраницы.Включая));
   
Запрос.УстановитьПараметр("ВыбМестоХранения",Справочники.МестоХраненияы.НайтиПоНаименованию("Основной"));
   
Запрос.УстановитьПараметр("ВыбМатериалы",Справочники.Материалы.НайтиПоНаименованию("Доска обрезная"));
   
РезультатЗапроса = Запрос.Выполнить();

   
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Пока
ВыборкаДетальныеЗаписи.Следующий() Цикл
       
Сообщить("Остатки " + " " + ВыборкаДетальныеЗаписи.Материалы + " на складе " + ВыборкаДетальныеЗаписи.МестоХранения
        + " на дату 31.03.2020 (включительно) составляют " + ВыборкаДетальныеЗаписи.КоличествоОстаток + " шт.");
    КонецЦикла;

КонецПроцедуры
Получение оборотов по регистру накопления в 1С 8.3:
&НаСервере
Процедура ПолучениеОборотовПоРегиструНапопленияНаСервере()

   
// За получение оборотов по регистру накопления за произвольный период с заданной периодичностью
    // в различных разрезах аналитики отвечает виртуальная таблица Обороты,
    // У неё есть следующие параметры:
    // 1. Начало периода (включая)
    // 2. Конец периода (включая)
    // 3. Периодичность (например, Период, Запись, Год, Месяц...)
    // 4. Условие (например, Организация = &ВыбОрганизация)

    // Пример №1 Посчитаем сколько и каких материалов было заказано за 1 квартал 2020 года в организации ООО "Сделай сам".
   
Запрос = Новый Запрос;
   
Запрос.Текст =
   
"ВЫБРАТЬ
    |   ЗаказыКонтрагентовОбороты.Материалы,
    |   ЗаказыКонтрагентовОбороты.Организация,
    |   ЗаказыКонтрагентовОбороты.КоличествоОборот
    |ИЗ
    |   РегистрНакопления.ЗаказыКонтрагентов.Обороты(
    |       ДАТАВРЕМЯ(2020, 01, 01, 00, 00, 00),
    |       ДАТАВРЕМЯ(2020, 03, 31, 23, 59, 59), Период,
    |       Организация = &ВыбОрганизация) КАК ЗаказыКонтрагентовОбороты
    |УПОРЯДОЧИТЬ ПО
    |   ЗаказыКонтрагентовОбороты.Материалы"
;

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

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

   
// Пример №2 Посчитаем сколько доски обрезной было заказано за каждый месяц в 1 квартале 2020 года в организации "Сделай сам".
   
Запрос = Новый Запрос;
   
Запрос.Текст =
   
"ВЫБРАТЬ
    |   ЗаказыКонтрагентовОбороты.Период,
    |   ЗаказыКонтрагентовОбороты.Материалы,
    |   ЗаказыКонтрагентовОбороты.Организация,
    |   ЗаказыКонтрагентовОбороты.КоличествоОборот
    |ИЗ
    |   РегистрНакопления.ЗаказыКонтрагентов.Обороты(
    |       &НачалоПериода,&КонецПериода,Месяц,
    |       Организация = &ВыбОрганизация И
    |       Материалы = &ВыбМатериалы) КАК ЗаказыКонтрагентовОбороты
    |УПОРЯДОЧИТЬ ПО
    |   ЗаказыКонтрагентовОбороты.Период"
;

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

   
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Пока
ВыборкаДетальныеЗаписи.Следующий() Цикл
       
Сообщить("За " + Формат(ВыборкаДетальныеЗаписи.Период, "ДФ=ММММ") + " заказали " +
       
ВыборкаДетальныеЗаписи.КоличествоОборот + " шт. " + ВыборкаДетальныеЗаписи.Материалы);
    КонецЦикла;

КонецПроцедуры
Получение одновременно остатков и оборотов по регистру накопления в 1С 8.3:
&НаСервере
Процедура ПолучениеОдновременноОстатковИОборотовПоРегиструНакопленияНаСервере()

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

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

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

   
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Пока
ВыборкаДетальныеЗаписи.Следующий() Цикл

       
Сообщить(Формат(ВыборкаДетальныеЗаписи.Период, "ДФ=ММММ") + " " + ВыборкаДетальныеЗаписи.Материалы + " " + "нач. остаток " +
       
ВыборкаДетальныеЗаписи.КоличествоНачальныйОстаток + " приход " + ВыборкаДетальныеЗаписи.КоличествоПриход + ", расход " +
       
ВыборкаДетальныеЗаписи.КоличествоРасход + " кон. остаток " + ВыборкаДетальныеЗаписи.КоличествоКонечныйОстаток);

    КонецЦикла;

КонецПроцедуры
Поиск и программное изменение записи в регистр накопления документа (регистратора) в 1С 8.3:
&НаСервере
Процедура ПоискИПрограммноеИзменениеЗаписиВРегистрНакопленияДокументаНаСервере()

   
// Предположим у нас есть ссылка на проведенный документ Поступление на склад № МРБ-000123
   
ПоступлениеСсылка = Документы.ПоступлениеНаСклад.НайтиПоНомеру("МРБ-000123", '20201231');

   
// Мы знаем, что этот документ делает следующие записи в регистр накопления "МестоХраненияМатериалов":
    // Приход [Организация, МестоХранения, Материалы]  [Количество]

    // Наша задача: найти эти записи и изменить их (например, утроим количество поступившего товара)
    // и записать вместо старых.

    // Используем объектную технику получения записей, потому что  мы будем их изменять.
   
Поступление = ПоступлениеСсылка.ПолучитьОбъект();

   
// Получим набор записей этого документа в регистр "МестоХраненияМатериалов".
   
НаборЗаписей = Поступление.Движения.МестоХраненияМатериалов;

   
// Прочитаем записи из базы данных.
   
НаборЗаписей.Прочитать();
    Для Каждого
Запись Из НаборЗаписей Цикл

       
// Выведем старые значения.
       
Сообщить(Запись.Организация + ", " +Запись.МестоХранения + ", " + Запись.Материалы + " = " + Запись.Количество + "]");

       
// Утроим количество.
       
Запись.Количество = 3 * Запись.Количество;

    КонецЦикла;

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

   
НаборЗаписей.Записать(Истина); // удалим старые записи и запишем вместо них новые

    // Теперь записи регистра МестоХраненияМатериалов по документу № МРБ-000123, отличаются от тех,
    // что были записаны документом при проведении. Чтобы вернуть их к начальному виду - нужно перепровести документ.

КонецПроцедуры
Создание записи регистра накопления без привязки к документу в 1С 8.3:
&НаСервере
Процедура СозданиеЗаписиРегистраНакопленияБезПривязкиКДокументуНаСервере()

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

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

КонецПроцедуры
📰 Актуальные новости с тегом #Регистры накопления:
  • В версии 8.3.26 разработано новое значение перечисления РежимЗамещения.Обновление в методы РегистрСведенийНаборЗаписей.<Имя регистра сведений>. Записать(<Замещение>) и РегистрНакопленийНаборЗаписей.<Имя регистра сведений>. Записать(<Замещение>). В качестве параметра Замещение может передаваться одно из значений перечисления РежимЗамещения.  
    В перечисление РежимЗамещения к существующим элементам Добавление, Замещение, Слияние, Удаление добавляется новый элемент Обновление. В отличие от режима Слияние в режиме Обновление производится только обновление существующих записей регистра, совпадающих по значениям ключевых полей с записями набора записей. Добавление новых записей в регистр не производится, что существенно ускоряет процедуру записи. Будет полезно например при свертке остатков.
0
комментарии
____________________
Copyright©, «Программист 1С в г.Минске», 16.03.2020
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Яндекс.Метрика
Защищенное соединение ssl
visa
mastercard
Maestro
Яндекс деньги
Назад к содержимому