Имя: Пароль:
1C
1С v8
Изменить значения в документах
,
0 Len1vec
 
06.05.16
08:44
Добрый день, форумчане. Не так давно начал изучать 1С.
Дали задачку: изменить единицы измерения во всех документах у конкретной номенклатуры.
И столкнулся с проблемой для себя: не могу обратиться к документам.

Прилагаю код, который накарябал:
Процедура ИзменитьЕдиницуИзмеренияВДокументе()
    Для каждого Документ Из Документы.ПеремещениеТоваров Цикл
        Док = Документы.ПеремещениеТоваров.Выбрать();
        Для каждого Продукция Из Док.Продукция Цикл
            Номенклатура = Продукция.Номенклатура;
            Если Номенклатура = Объект.Номенклатура Тогда
                Если Продукция.ЕдиницаИзмерения = Объект.ЕдИзмСейчас Тогда
                    Продукция.ЕдиницаИзмерения = Объект.ЕдИзмНовая;
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
        Док.Проведен();
    КонецЦикла;
КонецПроцедуры

Поясню, что пытался сделать: пройтись по документам "Перемещение Товаров", если документ содержит в себе указанную на форме номенклатуру, то проверить единицы измерения и при необходимости изменить. Проблема в том, что выполнении данного кода возникает ошибка:
{Форма.Форма.Форма(22)}: Итератор для значения не определен
Для каждого Документ Из Документы.ПеремещениеТоваров Цикл
1 ДенисЧ
 
06.05.16
08:49
А где ты прочитал, что документы можно перебирать ДляКаждого?
2 Len1vec
 
06.05.16
08:57
Думал, что так можно, но понимаю, что надо перебирать запросом, да?
3 ДенисЧ
 
06.05.16
08:59
Выбрать/ пока следующий
если уж хочешь выборкой обходить

но можно и запросом, если документов под условие попадает немного
4 Len1vec
 
06.05.16
09:04
Так будет корректнее?

Процедура ИзменитьЕдиницуИзмеренияВОПЗС()
    Запрос = Новый Запрос;
    Запрос.Текст=  
    "ВЫБРАТЬ
    |    ОтчетПроизводстваЗаСменуПродукция.Номенклатура
    |ИЗ
    |    Документ.ОтчетПроизводстваЗаСмену.Продукция КАК ОтчетПроизводстваЗаСменуПродукция
    |ГДЕ
    |    ОтчетПроизводстваЗаСменуПродукция.Номенклатура = &Номенклатура"
    ;
    Запрос.УстановитьПараметр("Номенклатура", Объект.Номенклатура);
    Рез = Запрос.Выполнить();
    Выборка=Рез.Выбрать();
    
    Пока Выборка.Следующий() Цикл
        Документ = Выборка.Ссылка;
        ДокументИзменяемый = Документ.ПолучитьОбъект();
        Для каждого Продукция Из ДокументИзменяемый.Продукция Цикл
            Номенклатура = Продукция.Номенклатура;
            Если Номенклатура = Объект.Номенклатура Тогда
                Если Продукция.ЕдиницаИзмерения = Объект.ЕдИзмСейчас Тогда
                    Продукция.ЕдиницаИзмерения = Объект.ЕдИзмНовая;
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
        ДокументНов.Записать();
    КонецЦикла;  
КонецПроцедуры
5 DDwe
 
06.05.16
09:06
(4) "ДокументНов" это кто?
6 Рэйв
 
06.05.16
09:09
(4)Запрос неправильный
7 Рэйв
 
06.05.16
09:10
(0)
как то так

        Запрос=Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ
        |    ПеремещениеТоваровТовары.Ссылка Док
        |ИЗ
        |    Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
        |ГДЕ
        |    ПеремещениеТоваровТовары.Номенклатура = &Номенклатура"    );
        Нужная=Объект.Номенклатура;
        Запрос.УстановитьПараметр("Номенклатура",Нужная);
        Выборка=Запрос.Выполнить().Выбрать();
        Пока Выборка.Следующий() Цикл
            Об=Выборка.Док.ПолучитьОбъект();
            Для Каждого Стр из Об.Товары Цикл
                Если Стр.Номенклатура=Нужная Тогда
                     Стр.ЕдиницаИзмерения=Объект.ЕдИзмСейчас;
                     Об.Записать();
                КонецЕсли;    
                    
            Конеццикла;    
        Конеццикла;
8 2S
 
06.05.16
09:11
Записать в цикле тч, да Вы самоубивец, батенька
9 Рэйв
 
06.05.16
09:12
да, косяк:-)  За циклом
10 Рэйв
 
06.05.16
09:12
надо
11 Звездец
 
06.05.16
09:14
Только лучше выборку делать сразу по условию ТЧ, что бы потом перебирать только нужные доки и перезаписывать
12 Рэйв
 
06.05.16
09:15
(11)в (7) выбираются только нужные доки
13 Len1vec
 
06.05.16
09:16
Сделал пока следующее. Корректно ли?

Процедура ИзменитьЕдиницуИзмеренияВПеремещении()

    Запрос = Новый Запрос;
    Запрос.Текст=  
    "ВЫБРАТЬ
    |    ПеремещениеТоваровТовары.Номенклатура
    |ИЗ
    |    Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
    |ГДЕ
    |    ПеремещениеТоваровТовары.Номенклатура = &Номенклатура"
    ;
    Запрос.УстановитьПараметр("Номенклатура", Объект.Номенклатура);
    Рез = Запрос.Выполнить();
    Выборка=Рез.Выбрать();
    
    Пока Выборка.Следующий() Цикл
        Документ = Выборка.Ссылка;
        ДокументИзменяемый = Документ.ПолучитьОбъект();
        Для каждого Продукция Из ДокументИзменяемый.Товары Цикл
            Номенклатура = Продукция.Номенклатура;
            Если Номенклатура = Объект.Номенклатура Тогда
                Если Продукция.ЕдиницаИзмерения = Объект.ЕдИзмСейчас Тогда
                    Продукция.ЕдиницаИзмерения = Объект.ЕдИзмНовая;
                    ДокументИзменяемый.Записать();
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
        ДокументИзменяемый.Записать();
    КонецЦикла;
КонецПроцедуры
14 Рэйв
 
06.05.16
09:16
(13)уже послало на моменте "Документ = Выборка.Ссылка;"?:-)
15 Звездец
 
06.05.16
09:17
(12) ну да, я ещё глядя на (4) писал
16 Звездец
 
06.05.16
09:20
Убери запись в цикле(13)
17 13_Mult
 
06.05.16
09:24
(0) А какой тип у ед.изм. в документе?
18 Len1vec
 
06.05.16
09:43
(17) Тип: СправочникСсылка.ЕдиницыИзмерения (16) ДокументИзменяемый.Записать(); - эту?
19 Len1vec
 
06.05.16
15:20
Всем спасибо! С меня пиво живое! :)