Имя: Пароль:
1C
1С v8
пример из книги Радченко!
🠗 (Волшебник 12.11.2019 08:21)
0 programmerDeCo
 
11.11.19
21:44
Ребята остановился на 14 занятии (Автоматический расчет стоимости) книги Радченко.

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

Мне нужно провести документы "ОКАЗАНИЕ УСЛУГ", но выдает:

Ошибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
{Документ.ОказаниеУслуг.МодульОбъекта(68)}: Ошибка при вызове метода контекста (Выполнить)
    РезультатЗапроса = Запрос2.Выполнить();
по причине:
{(3, 24)}: Поле не найдено "НоменклатураДокумента.ВидНоменклатура"
НоменклатураДокумента.<<?>>ВидНоменклатура КАК ВидНоменклатура,

Проверка модуля ошибок не выдает, подскажите чего неправильно сделал? Буду очень признателен!!!
1 Радим1987
 
11.11.19
21:52
НоменклатураДокумента.ВидНоменклатура →НоменклатураДокумента.Номенклатура.ВидНоменклатура
2 BeerHelpsMeWin
 
11.11.19
21:53
ВидНоменклатуры , а не ВидНоменклатура?
3 programmerDeCo
 
11.11.19
22:00
(1) это в каком месте?
4 Радим1987
 
11.11.19
22:07
(2) Он был прав НЕ ВидНоменклатура а ВидНоменклатуры
5 Радим1987
 
11.11.19
22:08
Запрос2.Текст = "ВЫБРАТЬ
                    |    НоменклатураДокумента.Номенклатура КАК Номенклатура,
                    |    НоменклатураДокумента.ВидНоменклатурыКАК ВидНоменклатуры,
                    |    НоменклатураДокумента.КоличествоВДокументе КАК КоличествоВДокументе,
                    |    НоменклатураДокумента.СуммаВДокументе КАК СуммаВДокументе,
                    |    ЕСТЬNULL(СтоимостьМатериаловОстатки.СтоимостьОстаток, 0) КАК Стоимость,
                    |    ЕСТЬNULL(ОстаткиМатериаловОстатки.КоличествоОстаток, 0) КАК Количество
6 Красный рассвет
 
11.11.19
22:08
(3) Это значит самому кодить надо, а не копипастить с диска.
7 Радим1987
 
11.11.19
22:10
(6) это точно, лучше начинать работать с консолью запросов
8 programmerDeCo
 
11.11.19
22:14
(5) Помогло, но теперь ругается на СТОИМОСТЬ МАТЕРИАЛА

Ошибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
{Документ.ОказаниеУслуг.МодульОбъекта(105)}: Поле объекта не обнаружено (СтоимостьМатериала)
        Движение.Стоимость = ВыборкаДетальныеЗаписи.СтоимостьМатериала * ВыборкаДетальныеЗаписи.КоличествоВДокументе;
9 Радим1987
 
11.11.19
22:18
(8) Все мы были когда то молодыми научись пользоваться отладкой, половину проблем сам решишь. А это Поле объекта не обнаружено (СтоимостьМатериала) означает что нет такого поля, с таким наименованием "СтоимостьМатериала".
10 programmerDeCo
 
11.11.19
22:19
Все, разобрался, всех благодарю!

Красный рассвет я обязательно к тебе прислушаюсь ;)
11 programmerDeCo
 
11.11.19
22:20
(9) Радим а может посоветуешь какие видеоуроки, где хорошо объясняют работу с отладкой?
12 Радим1987
 
11.11.19
22:25
(11) таких наверное нету, лично я научился методом тыка каждый шаг смотрел отладкой
13 Chameleon1980
 
12.11.19
04:24
Ндаа. Просят инструкцию к дебагу.
Ужснах
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.