1с регистр накопления реквизит в запросе 1с

Реквизит в запросе регистра накопления

Я
   severbap

08.12.09 — 11:10

Как получить что хранится в реквизите регистра накопления через запрос и можно ли в запросе поставить отбор по этому реквизиту? У кого-нибудь есть простой и понятный пример?

  

Партнерская программа EFSOL Oblako

   Михей

1 — 08.12.09 — 11:13

ВЫБРАТЬ

     Регистр.Измерение

ИЗ

    РегистрНакопления.ТвойРегистр КАК Регистр

ГДЕ

     Регистр.ТвойРеквизит = &ТвойРеквизит

   IronDemon

2 — 08.12.09 — 11:15

ВЫБРАТЬ РАЗРЕШЕННЫЕ
   ПартииТоваровНаСкладах.Склад,
   СУММА(ПартииТоваровНаСкладах.Стоимость) КАК Стоимость
ИЗ
   РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
ГДЕ
   ПартииТоваровНаСкладах.Период МЕЖДУ &НачПериода И &КонПериода
   И ПартииТоваровНаСкладах.КодОперации В(&КодОперации)

СГРУППИРОВАТЬ ПО
   ПартииТоваровНаСкладах.Склад

   Loyt

3 — 08.12.09 — 11:19

(0) Не используй виртуальные таблицы, используй таблицу «РегистрНакопления.НазваниеРегистра». Он там будет, можно использовать так же, как и измерение.

   severbap

4 — 08.12.09 — 11:33

Михей у тебя будет Регистр.<?>ТвойРеквизит = &ТвойРеквизит — поле не найдено!

   Михей

5 — 08.12.09 — 11:36

(4) чего это?

   IronDemon

6 — 08.12.09 — 11:38

(4) Это твой первый запрос?

   severbap

7 — 08.12.09 — 11:40

Вот допустим у меня регистр накопления: измерение Номенклатура, ресурс Количество, реквизит Контрагент.

Запрос=Новый Запрос;

Запрос.Текст=

«ВЫБРАТЬ

| Регистр.КоличествоКонечныйОстаток

|ИЗ

| РегистрНакопления.ПартииНоменклатуры.ОстаткиИОбороты КАК Регистр»;

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

Для Каждого Партия Из РезультатЗапроса Цикл

   Сообщить(Строка(Партия.Контрагент));

КонецЦикла;

Будет ошибка итератора!!!

   73

8 — 08.12.09 — 11:44

-Содержание справки

-1С Предприятие

 -Встроенный язык

  -Работа с запросами

    -Выполнение и работа с запросами во встроенном языке

      -Основные приемы работы

   severbap

9 — 08.12.09 — 11:44

Запрос=Новый Запрос;

Запрос.Текст=

«ВЫБРАТЬ

|    Регистр.КоличествоКонечныйОстаток

|ИЗ

|    РегистрНакопления.ПартииНоменклатуры.ОстаткиИОбороты КАК Регистр

| ГДЕ

| Регистр.Контрагент = &Контрагент»;

Запрос.УстановитьПараметр(«Контрагент»,Контрагент);

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

Для Каждого Партия Из РезультатЗапроса Цикл

   Сообщить(Строка(Партия.КоличествоКонечныйОстаток));

КонецЦикла;

Регистр.<?>Контрагент = &Контрагент»; — поле не найдено! — как предложил михей!

   Ненавижу 1С

10 — 08.12.09 — 11:46

(9) конечно, откуда в партиях контрагент?

   hhhh

11 — 08.12.09 — 11:47

(9) чукча не читатель, чукча писатель? Сравни свой запрос с запросом михея и найди 10 отличий.

   severbap

12 — 08.12.09 — 11:50

hhhh — мой последний проверь и результат такой же!

   severbap

13 — 08.12.09 — 11:54

Запрос=Новый Запрос;

Запрос.Текст=

«ВЫБРАТЬ

| Регистр.Номенклатура

|ИЗ

| РегистрНакопления.ПартииНоменклатуры КАК Регистр

|ГДЕ

| Регистр.Контрагент = &Контрагент»;

Запрос.УстановитьПараметр(«Контрагент»,Контрагент);

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

Для Каждого Партия Из РезультатЗапроса Цикл

   Сообщить(Строка(Партия.Номенклатура));

КонецЦикла;

ИТЕРАТОР не определен!

   Михей

14 — 08.12.09 — 11:56

(13) у результатзапроса его и нету, выборку сделай

   severbap

15 — 08.12.09 — 11:57

Михей как?

   Михей

16 — 08.12.09 — 11:57

Запрос=Новый Запрос;

Запрос.Текст=

«ВЫБРАТЬ

| Регистр.Номенклатура

|ИЗ

| РегистрНакопления.ПартииНоменклатуры КАК Регистр

|ГДЕ

| Регистр.Контрагент = &Контрагент»;

Запрос.УстановитьПараметр(«Контрагент»,Контрагент);

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

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

Пока Выборка.Следующий() Цикл

   Сообщить(Строка(Выборка.Номенклатура));

КонецЦикла;

   severbap

17 — 08.12.09 — 12:00

Реально — выводит номенклатуру!

   severbap

18 — 08.12.09 — 12:01

Как тогда получить ресурсы (остатки)?

   Михей

19 — 08.12.09 — 12:02

(18) есе тебе по реквизиту отбор нужен и еще остатки то тока через ЖПО

   severbap

20 — 08.12.09 — 12:03

?????

   Михей

21 — 08.12.09 — 12:04

примерно так

ВЫБРАТЬ

    СУММА(ВЫБОР    

       КОГДА Регистр.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) ТОГДА

            Регистр.Количество

        ИНАЧЕ

            — Регистр.Количество

    КОНЕЦ) КАК КоличествоКонечныйОстаток

ИЗ

    РегистрНакопления.ТвойРегистр КАК Регистр

ГДЕ

     Регистр.ТвойРеквизит = &ТвойРеквизит

   severbap

22 — 08.12.09 — 12:09

Запрос=Новый Запрос;

Запрос.Текст=

«ВЫБРАТЬ

|СУММА(ВЫБОР КОГДА Регистр.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) ТОГДА Регистр.Количество ИНАЧЕ -Регистр.Количество КОНЕЦ) КАК Количество

|ИЗ

| РегистрНакопления.ПартииНоменклатуры КАК Регистр

|ГДЕ

| Регистр.Контрагент = &Контрагент»;

Запрос.УстановитьПараметр(«Контрагент»,Контрагент);

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

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

Пока Выборка.Следующий() Цикл

   Сообщить(Строка(Выборка.Количество));

КонецЦикла;

Выводит правильно!!!

СПАСИБО!!!!!!!!!!!!!!!!! ОГРОМНОЕ!!!!!!!

   severbap

23 — 08.12.09 — 12:10

А улучшить его никак нельзя?

   Михей

24 — 08.12.09 — 12:11

(23) вряд ли, ты ж по реквизиту хочешь, а в разрезе него остатки не хранятся

   severbap

25 — 08.12.09 — 12:13

Да, у нас просто перекинули два измерения в реквизиты (Поставщик, документПрихода) в регистре ПартииНоменклатуры!

Так что я все поправлять буду! Теперь я понял как!

   hhhh

26 — 08.12.09 — 12:37

(25) это они лоханулись.

   severbap

27 — 08.12.09 — 12:52

Теперь полностью ничего не получается вытащить кроме как одно количество!!!

Как исправить?

   severbap

28 — 08.12.09 — 12:58

Исправил:

Запрос=Новый Запрос;

Запрос.Текст=

«ВЫБРАТЬ

|    СУММА(ВЫБОР

|            КОГДА Регистр.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)

|                ТОГДА Регистр.Количество

|            ИНАЧЕ -Регистр.Количество

|        КОНЕЦ) КАК Количество,

|    Регистр.Номенклатура,

|    Регистр.ДокументПрихода

|ИЗ

|    РегистрНакопления.ПартииНоменклатуры КАК Регистр

|ГДЕ

|    Регистр.Контрагент = &Контрагент

|    И Регистр.Период МЕЖДУ &ДатаНачала И &ДатаКонца

|

|СГРУППИРОВАТЬ ПО

|    Регистр.Номенклатура,

|    Регистр.ДокументПрихода»;

Запрос.УстановитьПараметр(«Контрагент»,Контрагент);

Запрос.УстановитьПараметр(«ДатаНачала», НачалоДня(НачПериода));

Запрос.УстановитьПараметр(«ДатаКонца», КонецДня(КонПериода));

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

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

Пока Выборка.Следующий() Цикл

   Сообщить(Строка(Выборка.ДокументПрихода));

КонецЦикла;

  

severbap

29 — 08.12.09 — 13:12

как насчет прихода и расхода?

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 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;	
 
    НаборЗаписей.Записать(Истина);
 
КонецПроцедуры
 
/// Скачать и выполнить эти примеры на компьютере

0 / 0 / 0

Регистрация: 14.09.2007

Сообщений: 428

1

22.11.2009, 14:39. Показов 28629. Ответов 11


Вообщем ситуация простая: необходимо переписать типовой отчет «Остатки товаров» так как в регистре накопления убрали из измерений Контрагент и ДокументПрихода, перенесли в реквизиты! Отчет впринципе работает без отбора по этим (Контрагент и ДокументПрихода). Я :google: и толком ничего не нашел как можно реализовать СОЕДИНЕНИЕ такого » ;) » в такой поставленой задачи.??
Вот код генерации запроса:
Код удален модератором раздела. Причина: опубликуете код, если вас попросят. Внимательно читайте правила!
Да еще скорее всего это потом переконвертируют в 8.1
подскажите где тут рыть яму! :KillMe:



0



0 / 0 / 0

Регистрация: 24.12.2008

Сообщений: 1,399

22.11.2009, 20:48

2

Видимо придется делать запрос по движениям с последующей группировкой, что существенно замедлит выполнение. Копать, мне кажется лучше в сторону выбора подходящего регистра — например партий.



0



0 / 0 / 0

Регистрация: 14.09.2007

Сообщений: 428

23.11.2009, 08:30

3

уже давно определились! Я же написал что поменялся регистр накопления партии номенклатуры, перемещены контрагент и документ прихода в реквизиты … нужно просто переписать запрос в отчете нужно как-то написать что бы при указании партии и поставщика он делал отбор по реквизиту (ведь теперь это не измерение а реквизит — и это усложняет так как я незнаю в какую сторону рыть) :crash:



0



0 / 0 / 0

Регистрация: 24.12.2008

Сообщений: 1,399

23.11.2009, 21:32

4

Пример: «ВЫБРАТЬ
РозничнаяВыручка.Подразделение КАК Подразделение,
СУММА(РозничнаяВыручка.Сумма) КАК Сумма
ИЗ
РегистрНакопления.РозничнаяВыручка КАК РозничнаяВыручка
ГДЕ
РозничнаяВыручка.Период >= &НачДата
И РозничнаяВыручка.Период <= &КонДата
И РозничнаяВыручка.Подразделение = &Подразделение

СГРУППИРОВАТЬ ПО
РозничнаяВыручка.Подразделение»
(Подразделение — реквизит.)

Только вот не понятно, зачем вы убрали Партию из измерений регистра партий. По партиям обычно еще и остатки получают.



0



0 / 0 / 0

Регистрация: 14.09.2007

Сообщений: 428

06.12.2009, 14:29

5

unknown181538 одна партийка должна быть!



0



0 / 0 / 0

Регистрация: 14.09.2007

Сообщений: 428

06.12.2009, 15:41

6

Ошибка будет, РозничнаяВыручка.<??>Подразделение = &Подразделение — Типа не найдено!



0



0 / 0 / 0

Регистрация: 14.09.2007

Сообщений: 428

07.12.2009, 09:44

7

как в 8.1 это можно замутить?



0



0 / 0 / 0

Регистрация: 14.09.2007

Сообщений: 428

07.12.2009, 12:45

8

Код

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

как можно замуть с приходом и расходом?



0



0 / 0 / 0

Регистрация: 24.12.2008

Сообщений: 1,399

08.12.2009, 16:28

9

Цитата
Сообщение от Bap

Ошибка будет, РозничнаяВыручка.<??>Подразделение = &Подразделение

Может нету такого реквизита в вашей конфе?

Цитата
Сообщение от Bap

как можно замуть с приходом и расходом?

Не понял вопроса.



0



0 / 0 / 0

Регистрация: 14.09.2007

Сообщений: 428

08.12.2009, 17:12

10

unknown181538 все нормально разобрался, вот только остается понять как надо написать что бы можно было получать начальныйостатокКоличество!



0



0 / 0 / 0

Регистрация: 24.12.2008

Сообщений: 1,399

08.12.2009, 21:06

11

1)Получить обороты до начальной даты в отдельной таблице и соединить таблицы.
2) Сделать чтобы в одно поле запроса попадали движения ДО начДаты, в другое после. Одно будет остатками, другое оборотами.



0



0 / 0 / 0

Регистрация: 14.09.2007

Сообщений: 428

09.12.2009, 08:52

12

:please: счас попробую!



0



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


  2. lazy

    Offline

    lazy
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    1 сен 2007
    Сообщения:
    2.127
    Симпатии:
    4
    Баллы:
    29

    Физически не ощущаю проблемы.

    ВЫБРАТЬ
    ТоварыНаСкладах.КодОперации,
    ТоварыНаСкладах.Склад,
    ТоварыНаСкладах.Номенклатура,
    ТоварыНаСкладах.ХарактеристикаНоменклатуры,
    ТоварыНаСкладах.СерияНоменклатуры,
    ТоварыНаСкладах.Качество,
    ТоварыНаСкладах.Количество
    ИЗ
    РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
    

    Здесь КодОперации — реквизит регистра накопления ТоварыНаСкладах. Успешно выдается при выполнении запроса…

  3. Забыл уточнить: регистр накопления обороты)


  4. lazy

    Offline

    lazy
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    1 сен 2007
    Сообщения:
    2.127
    Симпатии:
    4
    Баллы:
    29

    Хм, не интересовался таким делом, но подозреваю, что тебе придется расчитывать все это дело через группировки.
    Т.е. обращаемся непосредственно к таблице регистра, и группируем по интересующим нас измерениям и реквизитам. Через виртуальные таблицы это кажется сделать не поулчится. Т.е. нечто вроде:

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

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

    Этот запрос выбирает из регистра записи по условиям (даты, организация, счет).
    Вопрос: Почему он выдает кроме строк подходящих по условию еще и другие строки, которые не подходят. Неправильные строки он выдает пустыми т.е. в отчет добавляется пустая строка. Анализ показал что количество пустых строк вроде как равно всем не попавшим в условие + группирвки какието по ходу.
    Написал сам не пойму что, но может кто подскажет что.


  6. LordKim

    Offline

    LordKim
    Опытный в 1С

    Регистрация:
    11 мар 2008
    Сообщения:
    118
    Симпатии:
    0
    Баллы:
    26


    Это:

    |ИЗ
    |    РегистрНакопления.ВнеоборотныеАктивы.ОстаткиИОбороты(&НачДата, &КонДата, Запись, ,
    "+?(пусто(Организация),"","Организация = &Организация И ")+"
    |    "+?(пусто(Капвлож),"","ВнеоборотныйАктив = &Капвлож И ")+"СчетКВ в Иерархии (&СчетКВ) ) 
    КАК ВнеоборотныеАктивыОстаткиИОбороты
    
    
    

    Попробуй заменить на это:

    |ИЗ
    |    РегистрНакопления.ВнеоборотныеАктивы.ОстаткиИОбороты(&НачДата, &КонДата, Запись)
    |ГДЕ
    |    СчетКВ в Иерархии (&СчетКВ)
    |    "+?(пусто(Капвлож), "", "И ВнеоборотныйАктив = &Капвлож")+" 
    |    "+?(пусто(Организация), "", "И Организация = &Организация")+" 
    КАК ВнеоборотныеАктивыОстаткиИОбороты
    
    
    
  7. Спасибо, но нет. От того что вынесли условие ниче не изменилось, да и так делать не рекомендуют. Что то другое…


  8. LordKim

    Offline

    LordKim
    Опытный в 1С

    Регистрация:
    11 мар 2008
    Сообщения:
    118
    Симпатии:
    0
    Баллы:
    26

    Не рекомендуют?)
    Кто? Где? Можно почитать рекомендации?


  9. BabySG

    Offline

    BabySG
    Администраторы
    Команда форума
    Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    18
    Баллы:
    29

    LordKim,
    Использование условий в ГДЕ и в параметрах вирт таблиц — это разные вещи. В 99,9% случаев нужно использовать условия в параметрах.


  10. LordKim

    Offline

    LordKim
    Опытный в 1С

    Регистрация:
    11 мар 2008
    Сообщения:
    118
    Симпатии:
    0
    Баллы:
    26

    Почему?
    Дай тему или параметры для поиска, почитаю)


  11. BabySG

    Offline

    BabySG
    Администраторы
    Команда форума
    Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    18
    Баллы:
    29

    Первый запрос:

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

    Второй запрос:

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

    В первом варианте накладывается фильтр на таблицу остатков, после чего выдается остаток по фильтру.
    Во втором варианте сначала выбирается ВСЯ таблица остатков и только потом накладывается фильтр и получается остаток.

    В случае больших таблиц разница во времени исполнения может достигать несколько ДЕСЯТКОВ порядков. В частности, я сталкивался со случаями, когда первый запрос выполнялся за 0.02 секунды, когда второй выполнялся за 18…

    PS. Также, в связи с этой особенностью, иногда могут получаться различные результаты работы запросов.
    PPS. На ИТС, вроде, было описание…


  12. BabySG

    Offline

    BabySG
    Администраторы
    Команда форума
    Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    18
    Баллы:
    29

    :unsure:
    Akuji,
    Сорри за оффтоп :)


  13. LordKim

    Offline

    LordKim
    Опытный в 1С

    Регистрация:
    11 мар 2008
    Сообщения:
    118
    Симпатии:
    0
    Баллы:
    26


1C-pro.ru - форум по 1С:Предприятию 7.7, 8.0, 8.1, 8.2, 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;
   
НаборЗаписей.Записать(Истина);

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

💡 Шаблоны (готовые модели) кода 1С 8.3 с тегом #Регистры накопления:

Copyright©, «Программист 1С в г.Минске», 16.03.2020

Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник

| 22 января 2017 | Программируем в 1С |

 В этой статье я хочу рассмотреть такой механизм 1С:Предприятия 8, как регистры накопления. Этот механизм позволяет нам накапливать числовые показатели о деятельности фирмы, причем эти показатели он обрабатывает, рассчитывает итоги и позволяет нам получать остатки и обороты по этим показателям. В качестве примера приведу регистр накопления ТоварыНаСкладах из конфигурации «Управление торговлей”

Этот регистр используется для хранения остатков товаров на складах компании в разрезе номенклатуры, характеристики номенклатуры, серии и качества товара. Т.е. в любой момент мы можем посмотреть, сколько на конкретном складе, например «Центральный склад” у нас хранится номенклатуры «Ботинки мужские”, с характеристикой «43 размер”, серией от «20.08.2011” и качеством «новый”.

А чтобы это было возможным, в регистр нужно записывать данные. Платформа 1С:Предприятие так устроена, что записывать данные в регистр, можно только с привязкой к документам. Т.е. если в регистре что-то меняется (приход товара, или его продажа) должен быть обязательно указан документ, который это сделал. Обычно данные в регистр записываются, когда документ проводится. В модуле документа, есть предопределенная процедура ОбработкаПроведения, в которой разработчик и описывает алгоритм, по которому формуруются записи в регистрах накопления.Давайте рассмотрим процесс создания регистра с самого начала. Как вы помните, мы создавали конфигурацию, в которой у нас уже есть справочники и документы. Сейчас мы добавим к ней регистр накопления. Добавляем регистр накопления, название «ТоварыНаСкладах”, вид регистра «Остатки”. Вид регистра «Обороты” мы рассмотрим позже. На закладке данные добавляем измерение «Номенклатура” типа «Справочник.Номенклатура” и добавляем ресурс «Количество” типа число(15,3).

Теперь, нужно обеспечить формирование записей регистра при проведении документа. Но из документов у нас только «ПриходныйКассовыйОрдер” и «РасходнаяНакладная”. Документа, который делал бы приходные движения в наш регистр у нас нет. Давайте создадим его. Создаем документ, название «Оприходование товаров”, на закладке данные добавляем табличную часть «Товары”, в ней реквизиты «Номенклатура” и «Количество”.

Чтобы наш документ делал движения по регистру накопления «ТоварыНаСкладах” на закладке Движения отметим его (регистр) галочкой и нажмем кнопку «Конструктор движений”. Этот конструктор помогает нам написать алгоритм формирования записей регистров, который находится в уже упомянутой процедуре «ОбработкаПроведения”.В конструкторе вид движения регистра оставляем «Приход”, в поле Табличная часть выбираем «Товары”,нажимаем кнопку «Заполнить выражения” и затем кнопку ОК.

Откроется модуль документа, в котором уже создана процедура ОбработкаПроведения.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

Процедура ОбработкаПроведения(Отказ, Режим)

//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

// Данный фрагмент построен конструктором.

// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

// регистр ТоварыНаСкладах Приход

Движения.ТоварыНаСкладах.Записывать = Истина;

Движения.ТоварыНаСкладах.Очистить();

Для Каждого ТекСтрокаТовары Из Товары Цикл

Движение = Движения.ТоварыНаСкладах.Добавить();

Движение.ВидДвижения = ВидДвиженияНакопления.Приход;

Движение.Период = Дата;

Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;

Движение.Количество = ТекСтрокаТовары.Количество;

КонецЦикла;

//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

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

Теперь давайте запустим режим Предприятие и создадим несколько документов. У документов в верхней панели появилось подменю «Перейти”, по которому можно посмотреть созданные документов движения в регистрах.

Чтобы посмотреть какие же товары есть у нас на складе мы сделаем отчет, который будет показывать остатки по регистру «ТоварыНаСкладах”.
Переходим в режим Конфигуратор и создаем отчет. Название устанавливаем «ОстаткиТоваров”. На закладе формы создаем новую форму отчета, и назначаем ее основной. Добавляем на форму ПолеТабличногоДокумента, это можно через меню «Форма-Вставить элемент управления” и выбрать вид элемента — поле табличного документа, назначить ему имя ТабДок и расположить на всю форму.

Затем переходим в обработчик кнопки «Сформировать”, удаляем находящийся там комментарий, устанавливаем курсор в тексте процедуры обработчика события, щелкаем правой кнопкой мыши и выбираем «Конструктор запроса с обработкой результата”. Это позволит нам создать запрос и сразу вывести его результат в отчет.
На закладке Обработка результата выбираем «Вывод в табличный документ”, переходим на закладку «Таблицы и поля”. Видим, что таблица ТоварыНаСкладах представление в виде четырех таблиц.

Первая таблица — это список записей, которые мы формировали в обработке проведения документов, остальные это виртуальные таблицы, которые платформа создает сама. Эти таблицы позволяют нам получить обработанные данные по регистру — обороты за период, остатки на дату, или остатки и обороты в одной таблице. Мы хотим вывести остатки, поэтому выбираем таблицу Остатки. Из этой таблицы выбираем все поля Номенклатура и КоличествоОстаток. Нажимаем кнопку ОК.
Конструктор сформировал алгоритм, который выведет нам отчет по остаткам, нам лишь нужно указать куда вывести отчет.
Добавим строку:
«ТабДок = ЭлементыФормы.ТабДок;” перед текстом, сформированным конструктором.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

ТабДок = ЭлементыФормы.ТабДок;

//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

// Данный фрагмент построен конструктором.

// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

Макет = Отчеты.ОстаткиТоваров.ПолучитьМакет(«Макет»);

Запрос = Новый Запрос;

Запрос.Текст =

«ВЫБРАТЬ

| ТоварыНаСкладахОстатки.Номенклатура,

| ПРЕДСТАВЛЕНИЕ(ТоварыНаСкладахОстатки.Номенклатура),

| ТоварыНаСкладахОстатки.КоличествоОстаток

|ИЗ

| РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки»;

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

ОбластьЗаголовок = Макет.ПолучитьОбласть(«Заголовок»);

ОбластьПодвал = Макет.ПолучитьОбласть(«Подвал»);

ОбластьШапкаТаблицы = Макет.ПолучитьОбласть(«ШапкаТаблицы»);

ОбластьПодвалТаблицы = Макет.ПолучитьОбласть(«ПодвалТаблицы»);

ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть(«Детали»);

ТабДок.Очистить();

ТабДок.Вывести(ОбластьЗаголовок);

ТабДок.Вывести(ОбластьШапкаТаблицы);

ТабДок.НачатьАвтогруппировкуСтрок();

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

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

ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетальныеЗаписи);

ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетальныеЗаписи.Уровень());

КонецЦикла;

ТабДок.ЗакончитьАвтогруппировкуСтрок();

ТабДок.Вывести(ОбластьПодвалТаблицы);

ТабДок.Вывести(ОбластьПодвал);

//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

Запустим режим 1С:Предприятие и посмотрим работу отчета.

Как видим, что-то более-менее приемлемое конструктор нам создал.
Еще у нас есть «Реализация товаров”, которая должна уменьшать наши остатки. Давайте сделаем так, чтобы она тоже формировала движения по регистру.
Открываем документ, на закладке Движения устанавливаем «галочку” напротив нашего регистра, и нажимаем кнопку «Конструктор движений”.Тип движение регистра ставим расход, выбираем табличную часть «Товары”, нажимаем «Заполнить выражения” и «ОК”. Конструктор сформировал алгоритм проведения документа, давайте его проверим. Для этого вновь запустим режим 1С:Предприятие и перепроведем созданные документы «РеализацияТоваров”.
Затем снова сформируем отчет по остаткам.

Как видите, остатки уменьшились, даже по некоторым позициям ушли в минус. Это происходит потому, что мы не контролируем наличие остатков при реализации товаров.
Наш регистр «ТоварыНаСкладах” типичный пример регистра остатков, у него есть движения как приходные, так и расходные. Но в системе 1С еще есть регистры оборотов.
В качестве примера, приведу регистр «Продажи”. Каждый раз при продаже товара клиенту, мы записываем кто, чего и сколько у нас купил. А затем в отчете мы можем посмотреть, а сколько товара у нас купил тот-то. В этот регистр не будут записываться движения отдельно приход или расход. Движения будут равнозначные. В этих случаях и используется регистр оборотов.Давайте и в нашей конфигурации создадим такой регистр. Добавим новый регистр накопление, название «Продажи”, тип регистра «Обороты”, на закладке данные добавим измерение «Клиент” и «Номенклатура”, ресурсы «Количество” и «Сумма”.

Вернемся к документу «РеализацияТоваров”, на закладе движения установим «галочку” напротив регистра «Продажи”, и нажмем кнопку «Конструктор движений”. Нажмем кнопку (+) (добавить) и выберем регистр «Продажи”, дальше как обычно выбираем табличную часть и нажимаем «Заполнить выражения”. «ОК”.

// регистр Продажи

Движения.Продажи.Записывать = Истина;

Движения.Продажи.Очистить();

Для Каждого ТекСтрокаТовары Из Товары Цикл

Движение = Движения.Продажи.Добавить();

Движение.Период = Дата;

Движение.Клиент = Клиент;

Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;

Движение.Количество = ТекСтрокаТовары.Количество;

Движение.Сумма = ТекСтрокаТовары.Сумма;

КонецЦикла;

Запускаем 1С в режим Предприятие, перепроводим документы «РеализацияТоваров”, проверяем сформированы ли движения. Отчет вы можете сформировать сами, делается это все по такому же принципу как и прошлый отчет, таблицу нужно выбирать «Продажи.Обороты”.А теперь давайте в нашу конфигурацию добавим интерфейс, чтобы не приходлось документы открывать через меню «Операции”. Открываем в конфигураторе ветку «Общие”, ищем в ней Интерфейсы и добавляем новый. Откроется конструктор интерфейсов, в нем нажимаем кнопку «Построить”. Все. Упрощенный интерфейс готов. Чтобы он открывался по умолчанию нужно в свойствах конфигурации (правой кнопкой по самому верхнему элементу дерева конфигурации — Свойства) установить в качестве основного интерфейса, созданный нами интерфейс.
Получиться такой вид:

Вот и все, что хотел рассказать сегодня о регистрах накопления. Если будут вопросы пишите, буду рад помочь.

Если Вы хотите больше узнать о программировании в 1С, тогда регистрируйтесь на курс: 1С 8.3 Старт >>>

Изображение

Понравилась статья? Поделить с друзьями:
  • 1с бсп получить реквизит объекта на клиенте
  • 1с реквизит табличной части список значений
  • Ярд транспортная компания отзывы водителей
  • 1с бсп установить свойство реквизитов формы
  • 1с скд дополнительные реквизиты справочника