Имя: Пароль:
1C
1С v8
Ошибка по книге М. Радченко
0 Fantasista
 
14.06.17
13:55
Учусь программировать по книге М. Радченко "1С:ПРЕДПРИЯТИЕ 8.2 практическое пособие разработчика" и дошел до упражнения 14.
В листинге 14.32 (стр.426) возникает ошибка:

Ошибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
{Документ.ОказаниеУслуги.МодульОбъекта(84)}: Поле объекта не обнаружено (Количество)
        Если ВыборкаДетальныеЗаписи.Количество = 0 Тогда

Текст кода:
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        //-->
        // ОШИБКА тут --> Если ВыборкаДетальныеЗаписи.Количество = 0 Тогда
            СтоимостьМатериала = 0;
        Иначе
            СтоимостьМатериала = ВыборкаДетальныеЗаписи.Стоимость / ВыборкаДетальныеЗаписи.Количество;
        КонецЕсли;
        //<--
        Если ВыборкаДетальныеЗаписи.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда
        // регистр ОстаткиМатериалов Расход
        Движение = Движения.ОстаткиМатериалов.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
        Движение.Период = Дата;
        Движение.Материал = ВыборкаДетальныеЗаписи.Номенклатура;
        Движение.Склад = Склад;
        Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоВДокументе;
        // --Добавленные строки-->
        // регистр СтоимостьМатериалов Расход
        Движение = Движения.СтоимостьМатериалов.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
        Движение.Период = Дата;
        Движение.Материал = ВыборкаДетальныеЗаписи.Номенклатура;
        Движение.Стоимость = ВыборкаДетальныеЗаписи.КоличествоВДокументе * СтоимостьМатериала;
        // <--Дс--
        // --добавленная строка-->
        КонецЕсли;
        // <--дс--
        // --Добавленные строки-->
        // РегистрПродажи
        Движение = Движения.Продажи.Добавить();
        Движение.Период = Дата;
        Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
        Движение.Клиент = Клиент;
        Движение.Мастер = Мастер;
        Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоВДокументе;
        Движение.Выручка = ВыборкаДетальныеЗаписи.СуммаВДокументе;
        Движение.Стоимость = СтоимостьМатериала * ВыборкаДетальныеЗаписи.КоличествоВДокументе;
        // <--Дс--
        
    КонецЦикла;
1 Timon1405
 
14.06.17
13:57
по данной книге есть отдельный форум
http://devtrainingforum.v8.1c.ru/forum/
2 xXeNoNx
 
14.06.17
13:57
(0) Не ошибка
3 Pentosh
 
14.06.17
13:57
ВыборкаДетальныеЗаписи есть поле Количество?
4 xXeNoNx
 
14.06.17
13:59
Ищем ошибку в копипасте запроса
5 Irbis
 
14.06.17
14:00
Скобки поставь после количество()
6 xXeNoNx
 
14.06.17
14:00
(5) Зачем?
7 Pentosh
 
14.06.17
14:06
(5) у выборки нет такого метода
(0) текст запроса в студию, ищите опечатку

Вот мой вариант, все работает.

    #Область ДвиженияДокумента
    Запрос2 = Новый Запрос;
    Запрос2.МенеджерВременныхТаблиц = МенеджерВТ;
    Запрос2.Текст =
        "ВЫБРАТЬ
        |    НоменклатураДокумента.Номенклатура,
        |    НоменклатураДокумента.НаборСвойств,
        |    НоменклатураДокумента.ВидНоменклатуры,
        |    НоменклатураДокумента.КоличествоВДокументе,
        |    НоменклатураДокумента.СуммаВДокументе,
        |    ЕСТЬNULL(СтоимостьМатериаловОстатки.СтоимостьОстаток, 0) КАК Стоимость,
        |    ЕСТЬNULL(ОстаткиМатериаловОстатки.КоличествоОстаток, 0) КАК Количество
        |ИЗ
        |    НоменклатураДокумента КАК НоменклатураДокумента
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(
        |                ,
        |                Материал В
        |                    (ВЫБРАТЬ
        |                        НоменклатураДокумента.Номенклатура
        |                    ИЗ
        |                        НоменклатураДокумента)) КАК СтоимостьМатериаловОстатки
        |        ПО НоменклатураДокумента.Номенклатура = СтоимостьМатериаловОстатки.Материал
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(
        |                ,
        |                Материал В
        |                    (ВЫБРАТЬ
        |                        НоменклатураДокумента.Номенклатура
        |                    ИЗ
        |                        НоменклатураДокумента)) КАК ОстаткиМатериаловОстатки
        |        ПО НоменклатураДокумента.Номенклатура = ОстаткиМатериаловОстатки.Материал";
        
        
    // Установим необходимость блокировки данных в регистрах
    // Стоимость материалов и ОстаткиМатериалов
    Движения.СтоимостьМатериалов.БлокироватьДляИзменения = Истина;
    Движения.ОстаткиМатериалов.БлокироватьДляИзменения = Истина;    
    
    // Запишем пустые наборы записей, чтобы читать остатки без учета данных в документе
    Движения.СтоимостьМатериалов.Записать();
    Движения.ОстаткиМатериалов.Записать();
        
    РезультатЗапроса = Запрос2.Выполнить();
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Если ВыборкаДетальныеЗаписи.Количество = 0 Тогда
            СтоимостьМатериала = 0;    
        Иначе
            СтоимостьМатериала = ВыборкаДетальныеЗаписи.Стоимость / ВыборкаДетальныеЗаписи.Количество;
        КонецЕсли;
        
        Если ВыборкаДетальныеЗаписи.ВидНоменклатуры =
            Перечисления.ВидыНоменклатуры.Материалы Тогда
            
            // регистр ОстаткиМатериалов Расход    
            Движение = Движения.ОстаткиМатериалов.Добавить();
            Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
            Движение.Период = Дата;
            Движение.Материал = ВыборкаДетальныеЗаписи.Номенклатура;
            Движение.НаборСвойств = ВыборкаДетальныеЗаписи.НаборСвойств;
            Движение.Склад = Склад;
            Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоВДокументе;    
            
            // регистр СтоимостьМатериалов Расход
            Движение = Движения.СтоимостьМатериалов.Добавить();
            Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
            Движение.Период = Дата;
            Движение.Материал = ВыборкаДетальныеЗаписи.Номенклатура;
            Движение.Стоимость = ВыборкаДетальныеЗаписи.КоличествоВДокументе * СтоимостьМатериала;                
        КонецЕсли;
        
        // регистр Продажи
        Движение = Движения.Продажи.Добавить();
        Движение.Период = Дата;
        Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
        Движение.Клиент = Клиент;
        Движение.Мастер = Мастер;
        Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоВДокументе;
        Движение.Выручка = ВыборкаДетальныеЗаписи.СуммаВДокументе;
        Движение.Стоимость = СтоимостьМатериала * ВыборкаДетальныеЗаписи.КоличествоВДокументе;    
    КонецЦикла;
    
    Движения.Записать();
    #КонецОбласти
8 youalex
 
14.06.17
14:06
(0) запрос то какой?
9 youalex
 
14.06.17
14:07
(7) >у выборки нет такого метода
чё это? ВыборкаИзЗапроса.Количество() - такого нет?
10 Fantasista
 
14.06.17
14:08
Запрос вот такой:
        Запрос2 = Новый Запрос;
        Запрос2.МенеджерВременныхТаблиц = МенеджерВТ;
        Запрос2.Текст = "ВЫБРАТЬ
                        |    НоменклатураДокумента.Номенклатура,
                        |    НоменклатураДокумента.ВидНоменклатуры,
                        |    НоменклатураДокумента.КоличествоВДокументе,
                        |    НоменклатураДокумента.СуммаВДокументе,
                        |    ЕСТЬNULL(СтоимостьМатериаловОстатки.СтоимостьОстаток, 0) КАК Поле1,
                        |    ЕСТЬNULL(ОстаткиМатериаловОстатки.КоличествоОстаток, 0) КАК Поле2
                        |ИЗ
                        |    НоменклатураДокумента КАК НоменклатураДокумента
                        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(
                        |                ,
                        |                Материал В
                        |                    (ВЫБРАТЬ
                        |                        НоменклатураДокумента.Номенклатура
                        |                    ИЗ
                        |                        НоменклатураДокумента)) КАК СтоимостьМатериаловОстатки
                        |        ПО НоменклатураДокумента.Номенклатура = СтоимостьМатериаловОстатки.Материал
                        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(
                        |                ,
                        |                Материал В
                        |                    (ВЫБРАТЬ
                        |                        НоменклатураДокумента.Номенклатура
                        |                    ИЗ
                        |                        НоменклатураДокумента)) КАК ОстаткиМатериаловОстатки
                        |        ПО НоменклатураДокумента.Номенклатура = ОстаткиМатериаловОстатки.Материал";
    //<--
11 Неверный Параметр И
 
14.06.17
14:08
(7) Чо?
12 xXeNoNx
 
14.06.17
14:09
(7) ;) Есть такой метод!
13 Дмитрий
 
14.06.17
14:09
(10) у вас вместо Количество Поле2
14 Fish
 
14.06.17
14:09
(7) Правда нет? :))
15 Неверный Параметр И
 
14.06.17
14:09
(10) Поле2 переименуй
16 xXeNoNx
 
14.06.17
14:10
По-хорошему бы еще блокировки наложить...
17 Fantasista
 
14.06.17
14:12
Да! Действительно! Поле1 - это стоимость; Поле2 - количество.

Спасибо большое!!!
18 Адинэснег
 
14.06.17
15:02
псц
19 Адинэснег
 
14.06.17
15:03
скоро прибудет