Версия для печати темы (https://pro1c.org.ua/index.php?s=d8721e97f1ccd473ec596043141ee540&showtopic=52131)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование управляемых форм 1С 8.2 _ Изменить данные регистра накопления

Автор: Constantus 22.05.19, 13:36

Приветствую, Форумчане!

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

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

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

КонецЦикла;

Что-то намудрил с циклом, уходит в вечность. Мне нужно найти реквизит "Размеры" по неверному коду из справочника и установить вместо неправильного на правильный.
Подскажите как правильно изменить код...

Автор: Vofka 22.05.19, 14:14

Внутренний или внешний цикл? Почему решили, что в бесконечность, может просто долго выполняется?

Автор: Constantus 22.05.19, 14:34

Vofka @ Сегодня, 17:14 * ,

В том то и дело, проверил на консоле, записей в регистре не так много, около 40

Код правильный?

Автор: Vofka 22.05.19, 14:44

Constantus, на первый взгляд вроде нормальный (если не считать, что если в одном регистраторе несколько строк, то они будут повторно обрабатываться, но на бесконечность цикла это не влияет, в принципе). 40 строк вполне посильно обойти отладчиком.

Автор: Constantus 22.05.19, 15:03

Vofka @ Сегодня, 17:44 * ,


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


Когда делаю отбор по регистратору

НаборЗаписей.Отбор.Регистратор.Значение = Выборка.Регистратор;


То выходит много записей, причем попытка:

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


Не дала никакого уменьшения списка почему-то. "Сообщить" выдает все номенклатуры, а не , которые ограничены
Если Запись.Номенклатура = Справочники.Номенклатура.БалкаЦветника


Если вывести данные только по запросу выводит всего 40 строк из Регистра, которые и нужно изменить, а полный код уходит в уйму записей, причем Запись.Номенклатура показывает все номенклатуры..


Автор: Vofka 23.05.19, 8:25

Constantus, если регистр подчинен регистратору (а в случае регистра накопления по другому нельзя), то прочитать набор записей можно только по регистратору. То есть вам надо получить список уникальных регистраторов по которым есть хотя бы одна запись, соответствующая набору

"ВЫБРАТЬ РАЗЛИЧНЫЕ
|    ДвижениеТМЦ.Регистратор
|ИЗ
|    РегистрНакопления.ДвижениеТМЦ КАК ДвижениеТМЦ
|ГДЕ
|    ДвижениеТМЦ.Номенклатура = &Номенклатура
|    И ДвижениеТМЦ.Размеры = &Размеры
|    И ДвижениеТМЦ.Склад = &Склад";


читать набор записей и внутри набора записей менять уже конкретные записи и записывать набор обратно в базу

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

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

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

Автор: Constantus 24.05.19, 16:20

Vofka @ Вчера, 12:25 * ,

Шайтан!!!

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua