Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
29 ноя 2022, 13:24

Регистр Сведений

Автор zinom, 16 дек 2021, 12:35

0 Пользователей и 1 гость просматривают эту тему.

zinom

Доброго времени суток. Нужна помощь в коде. В общем, мне нужно сделать так, чтобы при создании документа о Расходах, данные брались в Регистре Сведений за выбранный месяц в документе Расходы. Как мне это реализовать?

alexandr_ll

zinom, А какая периодичность регистра сведений? https://helpme1c.ru/registry-svedenij-v-yazyke-1s-8-v-primerax

Регистры сведений в языке 1С 8.3, 8.2 (в примерах)

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

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

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

// Прочитаем все записи регистра сведений "ЦенаНаЕдуДляКлиентов"
// для организации ООО "Ромашка", упорядоченные по дате.

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

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

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

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

Пока Записи.Следующий() Цикл

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

КонецЦикла;

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

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

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

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

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

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

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

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

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

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

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

/// Как получить наиболее ранние записи (срез первых)
/// регистра сведений на указанную дату (включительно)
/// в 1с 8.3, 8.2

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

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

// ! Нужно внимательно вдуматься. СрезПервых получает по каждой
// комбинации измерений наиболее раннюю запись, но НЕ БОЛЕЕ
// РАННЮЮ, чем указанная дата.

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

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

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

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

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

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

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

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

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

// Предположим, у нас есть ссылка на проведенный документ
// "Установка цен на еду" № ВМБП-000001

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

// Мы знаем, что этот документ делает записи в регистр
// сведений "ЦенаНаЕдуДляКлиентов":
// [Организация, Контрагент, Номенклатура] [Цена]

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

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

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

// Получим набор записей этого документа в регистр
// "ЦенаНаЕдуДляКлиентов"

НаборЗаписей = УстановкаЦен.Движения.ЦенаНаЕдуДляКлиентов;

// Прочитаем записи из базы данных.

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

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

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

Запись.Цена = Запись.Цена * 2;

КонецЦикла;

// Добавим новую запись.

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

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

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

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

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

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

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

// Предположим, у нас есть ссылка на проведенный документ
// "Установка цен на еду" № ВМБП-000001

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

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

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

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

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

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

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

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

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

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

// Создавать записи в регистре сведений без привязки
// к документу можно только для регистров, у которых
// выбран режим записи "Независимый". В нашей конфигурации
// таким регистром является "КурсВалют".
// Если бы мы захотели проделать такую же штуку для
// регистра "ЦенаНаЕдуДляКлиентов", то нам бы пришлось
// воспользоваться документом "ОперацияБух" или им подобным
// для ручных операций (см. аналогичный пример в регистрах
// накопления).

// Пример №1.

// Для единичных записей удобно пользоваться менеджером
// записей.

НоваяЗапись = РегистрыСведений.КурсВалют.СоздатьМенеджерЗаписи();
НоваяЗапись.Период = '20140101';
НоваяЗапись.Валюта = Справочники.Валюты.НайтиПоНаименованию("Доллар");
НоваяЗапись.Курс = 30;
НоваяЗапись.Записать(
Истина // замещать, если уже есть запись с такими же измерениями
// и таким же периодом
);

// Пример №2.

// При помощи менеджера можно также легко
// менять или удалять единичные записи.
// Найдём, изменим, а затем удалим созданную запись.

Выборка = РегистрыСведений.КурсВалют.Выбрать('20140101', '20140101');
Если Выборка.Следующий() Тогда
Запись = Выборка.ПолучитьМенеджерЗаписи();
// изменим
Запись.Прочитать();
Запись.Курс = 25;
// запишем
Запись.Записать(Истина);
// и тут же удалим
Запись.Удалить();
КонецЕсли;

// Пример №3.

// Если нужно изменить сразу много записей -
// удобнее всего использовать набор записей.

// Запишем курсы валют за первые 3 дня 2014 года.

Доллар = Справочники.Валюты.НайтиПоНаименованию("Доллар");

НаборЗаписей = РегистрыСведений.КурсВалют.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Валюта.Установить(Доллар);

Запись01 = НаборЗаписей.Добавить();
Запись01.Период = '20140101';
Запись01.Валюта = Доллар;
Запись01.Курс = 30;

Запись02 = НаборЗаписей.Добавить();
Запись02.Период = '20140102';
Запись02.Валюта = Доллар;
Запись02.Курс = 40;

Запись03 = НаборЗаписей.Добавить();
Запись03.Период = '20140103';
Запись03.Валюта = Доллар;
Запись03.Курс = 60;

// Запишем весь набор разом.

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

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

/// Скачать и выполнить эти примеры на компьютере

zinom

alexandr_ll, в пределах месяца

alexandr_ll

zinom, Как вы делаете и что не получается? Не видя конфигурации трудно сказать что-то определенное.
Например, можно использовать событие формы "ПриСозданииНаСервере" и в нем с помощью запроса найти нужные данные из регистра сведений.

zinom

alexandr_ll, первый запрос в котором берутся данные из регистра сведений ЛимитРасходовНаМесяц: https://drive.google.com/file/d/1O9_KkEUwA7I0GJmcHd022v1xQTamRhQN/view?usp=sharing

второй запрос в котором берутся данные из регистра накоплений Расходы:
https://drive.google.com/file/d/1pjJIERRkLIyFeKo4wXIkENqOdhcJ0y82/view?usp=sharing

Реализовать процесс замены остатков за определенный месяц у меня получилось. Но вот сами расходы вычитаются без учёта конкретного месяца. То есть вот на 01.12.2021 есть расход на сумму 300 рублей, если я попробую создать документ к примеру за 01.11.2021, то у меня тот расход который за декабрь будет включаться в остатки, но за ноябрь у меня задан абсолютно другой регистр сведений.

alexandr_ll

zinom, А почему в запросе к регистру накопления не ограничиваете период?

zinom

alexandr_ll, я пытался написать РегистрНакопления.Расходы(НАЧАЛОПЕРИОДА(&Период, МЕСЯЦ)) КАК Расходы, но когда я пытаюсь создать документ и начинаю выбираться вид расхода, то у меня появляется ошибка: "Нельзя задавать параметры для таблицы "РегистрНакопления.Расходы" <<?>> РегистрНакопления.Расходы(НАЧАЛОПЕРИОДА(&Период, МЕСЯЦ)) КАК Расходы"

alexandr_ll

zinom, Можно использовать "Остатки", "Обороты", "Остатки и обороты" https://helpme1c.ru/registry-nakopleniya-v-yazyke-1s-8-v-primerax

Регистры накопления в языке 1С 8.3, 8.2 (в примерах)

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

/// Как прочитать записи регистра накопления в 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;

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

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

/// Скачать и выполнить эти примеры на компьютере

Optiman

Цитата: zinom от 17 дек 2021, 10:36РегистрНакопления.Расходы(НАЧАЛОПЕРИОДА(&Период, МЕСЯЦ)) КАК Расходы
Так можно писать только для СрезПервых или СрезПоследних.


zinom

Optiman, так это регистры накоплений, а не регистры сведений

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск