Программная работа с регистром накопления в 1С 8.3

Jul 18, 2022 20:16


/// Как прочитать записи регистра накопления в 1с 8.3, 8.2

&НаСервере
Процедура КакПрочитатьЗаписиРегистраНакопленияНаСервере()

// Получим все записи регистра накопления ЗаказыКлиентов
// по организации ООО "Ромашка" за 1 квартал 2014 года,
// упорядочив их по возрастанию даты.

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

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

РезультатЗапроса = Запрос.Выполнить();

Записи = РезультатЗапроса.Выбрать();

Пока Записи.Следующий() Цикл
Сообщить(
"[" + Записи.Период + "] " +
Записи.Номенклатура + " " +
Записи.Количество + " шт." +
" (" + Записи.Регистратор + ")"
);
КонецЦикла;

КонецПроцедуры


/// Как получить обороты по регистру накопления в 1с 8.3, 8.2

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

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

// Пример №1
Сообщить("Пример №1");

// Посчитаем сколько и каких продуктов было заказано за 1 квартал
// 2014 года в организации ООО "Ромашка".

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

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

РезультатЗапроса = Запрос.Выполнить();

Записи = РезультатЗапроса.Выбрать();

Пока Записи.Следующий() Цикл
Сообщить(
"За 1 кв. 2014 года заказали " +
Записи.КоличествоОборот + " шт. " +
Записи.Номенклатура
);
КонецЦикла;

// Пример №2
Сообщить("Пример №2");

// Посчитаем сколько бананов было заказано за каждый месяц
// в 1 квартале 2014 года в организации "Ромашка".

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

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

РезультатЗапроса = Запрос.Выполнить();

Записи = РезультатЗапроса.Выбрать();

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

КонецПроцедуры

/// Как получить остатки по регистру накопления в 1с 8.3, 8.2

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

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

// Получим остатки бананов на основном складе в организации
// ООО "Ромашка" на 31 марта 2014 года (включительно)

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

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

РезультатЗапроса = Запрос.Выполнить();

Записи = РезультатЗапроса.Выбрать();

Пока Записи.Следующий() Цикл
Сообщить(
"Остатки " + " " + Записи.Номенклатура +
" на складе " + Записи.Склад + " на дату " +
"31.03.2014 (включительно) " +
" составляют " + Записи.КоличествоОстаток + " шт.");
КонецЦикла;

КонецПроцедуры

/// Как получить сразу остатки и обороты по регистру
/// накопления в 1с 8.3, 8.2

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

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

// Для примера получим начальный остаток, приход, расход и конечный остаток
// банана на всех складах за каждый месяц 2014 года для
// организация ООО "Ромашка".

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

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

РезультатЗапроса = Запрос.Выполнить();

Записи = РезультатЗапроса.Выбрать();

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

КонецПроцедуры

/// Как найти и изменить программно записи в регистр накопления
/// документа (регистратора) в 1с 8.3, 8.2

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

// Предположим у нас есть ссылка на проведенный документ
// поступления еды № ВМБП-000002

ПоступлениеСсылка =
Документы.ПоступлениеЕды.НайтиПоНомеру(
"ВМБП-000002", '20141231'
);

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

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

// Используем объектную технику получения записей,
// ведь мы будем их изменять.

Поступление = ПоступлениеСсылка.ПолучитьОбъект();

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

// Прочитаем записи из базы данных.
НаборЗаписей.Прочитать();

Для Каждого Запись Из НаборЗаписей Цикл

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

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

КонецЦикла;

// Добавим новую запись в регистр накопления.

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

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

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

КонецПроцедуры

/// Как прочитать записи документа в регистр накопления
/// запросом в 1с 8.3, 8.2

&НаСервере
Процедура КакПрочитатьЗаписиДокументаЗапросомНаСервере()

// Этот приём используется, если не требуется изменять
// найденные записи.

// Предположим у нас есть ссылка на проведенный документ
// поступления еды № ВМБП-000002

ПоступлениеСсылка =
Документы.ПоступлениеЕды.НайтиПоНомеру(
"ВМБП-000002", '20141231'
);

// Мы значем, что этот документ делает записи
// в регистр накопления "ЗапасыЕды".
// Прочитаем эти записи запросом.

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

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

РезультатЗапроса = Запрос.Выполнить();

Записи = РезультатЗапроса.Выбрать();

Пока Записи.Следующий() Цикл
Сообщить(
"[" + Записи.Организация + ", " +
Записи.Склад + ", " +
Записи.Номенклатура + "] " +
"[" + Записи.Количество + "]"
);
КонецЦикла;

КонецПроцедуры

/// Как создать записи регистра накопления без привязки
/// к документу в 1с 8.3, 8.2

&НаСервере
Процедура КакСоздатьЗаписиБезДокументаНаСервере()

// В нашей тестовой конфигурации нет документа
// "ОперацияБух", который присутствует в бухгалтерской базе.

Сообщить("Этот пример нельзя выполнить в этой базе.");
Возврат;

// Записи регистра накопления обязательно
// должны быть привязаны к документу, в данном случае
// этим документом будет документ "ОперацияБух",
// задуманный как раз для ручных операций.

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

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

НаборЗаписей.Записать(Истина);

КонецПроцедуры

Смотрите также:
Электронный учебник по программированию в 1С
Рекомендации по изучению программирования 1С с нуля
Игра "Кто хочет стать миллионером?" с вопросами на определенную тематику (язык программирования JavaScript, английские, немецкие, французские, испанские, португальские, ни­дер­ландские, итальянские слова, электробезопасность, промышленная безопасность, бокс и т.п.), написанная на 1С
Программирование в 1С 8.3 с нуля - краткий самоучитель
Комплексная подготовка программистов 1С:Предприятие 8.2
Сайты с уроками программирования и со справочниками
Youtube-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки

программирование

Previous post Next post
Up