Как изменить записи регистра накопления 1с программно

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

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

Я
   quazare

20.05.09 — 07:02

Народ, возможно ли программно изменить запись движения в регистре накопления?

Например — есть такая запись:

Регистратор… количество

документ1      5              — было

документ1      2              — стало

   Shurjk

1 — 20.05.09 — 07:04

(0) Да

   Irbis

2 — 20.05.09 — 07:07

(0) Ты не поверишь…

   Нуф-Нуф

3 — 20.05.09 — 07:18

товар тырим батенька?

   quazare

4 — 20.05.09 — 07:27

а в каких случаях это необходимо?

партионный учет считается очень медленно — партий более 70 тыс.

приходит заявка — формируется отгрузка — документ с партиями (количество в которых не равно нулю)

пересчет количества номенклатуры на текущий момент — затруднительно.

думаю сделать просто «вычет» количества по партии, а не создавать движение «расход».

или подскажите как сделать по-другому. каждая партия имеет свой уникальный ид.

   Irbis

5 — 20.05.09 — 07:31

(4) На одну позицию номенлатуры 70 тысяч партий? Вы чем торгуете? Может в подходе ошибка?

   Леха Дум

6 — 20.05.09 — 07:40

(0) А вариант с отложенным проведением не устраивает?

   quazare

7 — 20.05.09 — 07:46

Номенклатуры порядка 10-15 тыс. на момент внесения остатков (точка «старта») — внесено более 70 тыс партий.(приход).

после этого — пользователь загружает заявку (около 150-200 позиций номенклатуры с заданными количествами) и программа начинает автоматом «набирать» из существующих непустых партий (считаем по остаткам) необходимое количество по учету фифо и сроку годности.

Сейчас все это я реализовал через подсчет остатков приход/расход, работает достаточно медленно.

Сначала я определяю все партии этой номенклатуры, затем определяю для каждой партии пустая она или нет (есть ли движения по ид), выбираю «непустые» — делаю расход по ид этих партий… и так для каждой из 150-200 позиций.

думаю, если не считать остатки по приходу/расходу, а сразу вносить изменения в «приход» при проведении документа реализации, то можно будет сразу выбирать непустые партии и набирать количество…

   Wist

8 — 20.05.09 — 07:58

(1) А разве изменять регистр накопления можно не регистратором?

   Shurjk

9 — 20.05.09 — 08:00

(8) Можно но регистратор все равно указать придеться

   quazare

10 — 20.05.09 — 08:05

(9)Подскажи как программно сделать запись в документе «расхода», чтобы «проведение» только изменяло параметр в регистре строчке записи партии — не могу пока найти ни в книге, ни в инете…

Или хотя бы как вообще программно поменять запись в регистре (не меняя регистратора)

Вообще была идея сделать это через регистр сведений… не столько важна «история» системы, сколько быстрая работа …

   Shurjk

11 — 20.05.09 — 08:06

(10) Смотри — НаборЗаписей

   Wist

12 — 20.05.09 — 08:08

Хмм… посмотрел, действительно набор записей для РН создается и записывается. А в случае перепроведения регистратора, который был указан для программной записи, что произойдет? Я так понимаю, если стоит «удалять движения автоматически» (а так стоит практически везде), то программная запись «потеряется»?

   NcSteel

13 — 20.05.09 — 08:08

(10) Думаю достаточн тот код который ты навоял оптимизировать. В студию его.

   Shurjk

14 — 20.05.09 — 08:11

(12) Ага удалится…

   Wist

15 — 20.05.09 — 08:15

(14) Интересно, кто-нибудь кроме личностей «а после меня хоть потоп» использует эту фичу в работе… ИМХО это будет похуже пресловутого go to в коде, за такое надо сразу убивать.

   quazare

16 — 20.05.09 — 08:20

(12) ты говоришь, о том, что если я сначала ввожу партию «документ 1» (кол-во 10), затем «как-то программно» сокращаю эту партию до (кол-во 2), а потом перепровожу «документ 1» — количество становиться опять 10?

(14) Особенность партионного учета — если ты перепроводишь какой-то документ внесенный раннее — нужно перепровести все документы (прочитал где-то, да это и понятно, иначе последовательности пропадут);

   Shurjk

17 — 20.05.09 — 08:22

(15) Не разу не встречал…

   Shurjk

18 — 20.05.09 — 08:24

(16) Да. Я же говорю посмотри НаборЗписей и поймешь почему так происходит…

   quazare

19 — 20.05.09 — 09:32

НаборЗаписей — такого не нашел в СП.

Нашел

РегистрНакопленияНаборЗаписей.<Имя регистра накопления> (AccumulationRegisterRecordSet.<Имя регистра накопления>)

Выгрузить (Unload)

Синтаксис:

Выгрузить(<Строки>, <Колонки>)

Параметры:

<Строки> (необязательный)

Тип: Массив. Массив строк для выгрузки. Если не указан, выгружаются все строки набора записей.

<Колонки> (необязательный)

Тип: Строка. Список колонок для выгрузки в формате: «Колонка1, Колонка2…». Если список не задан, то будут выгружены все колонки.

Возвращаемое значение:

Тип: ТаблицаЗначений.

Описание:

Создает таблицу значений и копирует в нее записи набора. Структура полученной таблицы совпадает со структурой набора записей.

Пример:

Рег = РегистрыНакопления.Затраты;

НаборЗаписей = Рег.СоздатьНаборЗаписей();

НаборЗаписей.Отбор.Документ.Значение = Ссылка;

ОсновныеДанные = НаборЗаписей.Выгрузить();

где-бы взять примерчик по понятнее…

и в общем — возможен ли другой подход для убыстрения работы?

   quazare

20 — 20.05.09 — 12:34

ауу народ, есть еще мысли по этому вопросу?

   DrWatson

21 — 20.05.09 — 12:41

Пример (7) напиши подробнее. Что значит «набирать» в заказе? Почему и где нужно менять количество в партиях?

   Loser

22 — 20.05.09 — 12:42

НаборЗаписей=РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();

   //

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

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

     «ВЫБРАТЬ

    |    ТоварыНаСкладах.Период как Период,

    |    ТоварыНаСкладах.Регистратор как Регистратор,

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

    |ИЗ

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

    | ГДЕ

    | ТоварыНаСкладах.Период МЕЖДУ &ДатаНачала И &ДатаОкончания

    |И  ТоварыНаСкладах.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг «;

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

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

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

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

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

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

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

    КонецЦИкла;

   Loser

23 — 20.05.09 — 12:43

НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДок);

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

// ищешь нужную строку в наборе и правишь

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

   Loser

24 — 20.05.09 — 12:46

НаборЗаписей=РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();

   //

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

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

     «ВЫБРАТЬ

    |    ТоварыНаСкладах.Период как Период,

    |    ТоварыНаСкладах.Регистратор как Регистратор,

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

    |ИЗ

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

    | ГДЕ

    | ТоварыНаСкладах.Период МЕЖДУ &ДатаНачала И &ДатаОкончания

    |И  ТоварыНаСкладах.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг «;

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

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

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

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

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

          НаборЗаписей.Отбор.Регистратор.Установить(ВыборкаРегистратор);

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

           НаборЗаписей.Количество=5;

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

    КонецЦИкла;

   Loser

25 — 20.05.09 — 12:53

нет, так не получатся.

Как прочитать ресурс Количество в Наборе записей и изменить его?

 НаборЗаписей.Количество=5; — это не правильно

   Loser

26 — 20.05.09 — 13:26

НаборЗаписей=РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();

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

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

     «ВЫБРАТЬ

    |    ТоварыНаСкладах.Период как Период,

    |    ТоварыНаСкладах.Регистратор как Регистратор,

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

    |ИЗ

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

    | ГДЕ

    | ТоварыНаСкладах.Период МЕЖДУ &ДатаНачала И &ДатаОкончания

    |И  ТоварыНаСкладах.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг «;

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

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

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

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

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

          НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор);

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

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

           Движ.Количество=5;

               КонецЦИкла;

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

       КонецЦИкла;

   quazare

27 — 20.05.09 — 13:48

ВыборСуществующихПартий = Новый Запрос(«ВЫБРАТЬ

                                              |    СкладскойРегистр.Ид КАК Ид,

                                              |    СкладскойРегистр.Количество КАК Колво

                                              |ИЗ

                                              |    РегистрНакопления.СкладскойРегистр КАК СкладскойРегистр

                                              |ГДЕ

                                              |    СкладскойРегистр.Артикул = &Артикул

                                              |    И СкладскойРегистр.ВидДвижения = &ВидДвижения

                                              |    И СкладскойРегистр.Количество > 0

                                              |

                                              |УПОРЯДОЧИТЬ ПО

                                              |    СкладскойРегистр.СрокГодности»);

                                           
ВыборСуществующихПартий.УстановитьПараметр(«Артикул»,ВыбранныйАртикул);

ВыборСуществующихПартий.УстановитьПараметр(«ВидДвижения», ВидДвиженияНакопления.Приход);

Результат = ВыборСуществующихПартий.Выполнить().Выбрать();

НаборЗаписей=РегистрыНакопления.СкладскойРегистр.СоздатьНаборЗаписей();

//=====================================================

Пока Результат.Следующий() Цикл

   //Сообщить(Результат.Ид+», «+Результат.Колво);

   НаборЗаписей.Отбор.Ид.Установить(Результат.Ид);

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

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

       
       Движ.Количество=100;

   
   КонецЦикла;

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

   
   
КонецЦикла;

пишет, что «поле объекта не обнаружено (Ид)» — странно :(

   DrWatson

28 — 20.05.09 — 14:02

(27) см (23). Отбор только по регистратору.

   BICO

29 — 20.05.09 — 14:33

(0) а как отработает ситуация отмены проведения или повторного проведения твоя система ??

  

quazare

30 — 20.05.09 — 14:41

(29) полное перепроведение как при любом партионном учете.

(28) бред какой-то:

1. я делаю выборку партий, которые меня интересуют, запросом указанным выше.

мне нужно ид партии и его количество.

Теперь при определенном ид — нужно просто поменять количество и все. возможно это сделать запросом??? типа update????

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

Добавление записей в регистр накопления

Для добавления движения в регистр накопления необходимо создать набор записей, установить отбор по регистратору, добавить запись и заполнить значениями. Если требуется добавить несколько записей – добавление производится в цикле.



ТабличнаяЧасть = ДокументСсылка.Материалы;

НаборЗаписей = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ДокументСсылка);

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

  ЗаполнитьЗначенияСвойств(Запись, Строка);
  Запись.Период = ДокументСсылка.Дата; 
КонецЦикла;

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

Удаление записей из регистра накопления

Удаление всех записей по регистратору

Для удаления всех записей из регистра накоплений по регистратору необходимо создать пустой набор записей, установить отбор по регистратору и записать его.

НаборЗаписей = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ДокументСсылка);
НаборЗаписей.Записать();

Удаление части записей по регистратору

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

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


Для Каждого Запись Из НаборЗаписей Цикл
  Склад = Запись.Склад;
  Если Склад.Наименование = "Основной" Тогда
    НаборЗаписей.Удалить(Запись);
  КонецЕсли;
КонецЦикла;

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

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

Изменение записи по регистратору аналогично удалению части записей, только запись не удаляется, а изменяется.

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


Для Каждого Запись Из НаборЗаписей Цикл
  Склад = Запись.Склад;
  Если Склад.Наименование = "Основной" Тогда
    Запись.Количество = 10; 
  КонецЕсли;
КонецЦикла;

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

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

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

Добавление записей в регистр накопления

Для добавления движения в регистр накопления необходимо создать набор записей, установить отбор по регистратору, добавить запись и заполнить значениями. Если требуется добавить несколько записей – добавление производится в цикле.

Удаление записей из регистра накопления

Удаление всех записей по регистратору

Для удаления всех записей из регистра накоплений по регистратору необходимо создать пустой набор записей, установить отбор по регистратору и записать его.

Удаление части записей по регистратору

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

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

Изменение записи по регистратору аналогично удалению части записей, только запись не удаляется, а изменяется.

Чтобы изменить запись регистра накопления нужно использовать функцию СоздатьНаборЗаписей ();

Пример:

НаборЗаписей = РегистрыНакопления.РасчетыНалоговыхАгентовСБюджетомПоНДФЛ.СоздатьНаборЗаписей(); //Выбираем нужный регистр

НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор);
НаборЗаписей.Прочитать();

Для Каждого СтрокаТаблицы Из НаборЗаписей Цикл

СтрокаТаблицы.РеквизитыПлатежногоПоручения = «Новое значение»; //устанавливаем нужное значение реквизита

КонецЦикла;

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

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

Бывают ситуации, когда нужно изменить движения какого-то документа в регистре накопления или регистре сведений, для которого документ является регистратором.

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

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

При изменении записей регистра можно использовать набор записей, входящий в коллекцию движений документа (свойство Движения объекта ДокументОбъект), либо можно использовать набор записей, созданный с помощью менеджера регистра.

Итак, чтобы изменить записи регистра нужно:

– Создать набор записей;
– Установить отбор по определенному регистратору;
– Прочитать набор;
– Изменить записи набора;
– Записать набор.

Например, изменим записи в регистре накопления «Данные о начислениях».

Документ , ФизическоеЛицоВыбранноеЗначение , ФизическоеЛицоНовоеЗначение – это реквизиты формы внешней обработки, с помощью которой мы изменяем записи регистра.

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

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Как изменить записи на сайте
  • Как изменить запах шампуня
  • Как изменить запах феромонов
  • Как изменить запах тела что кушать
  • Как изменить запах тела мужчины

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии