Помогите с отчетом

Тема в разделе "1C и всё что с ней связано", создана пользователем Renat11111, 28 апр 2008.

  1. Renat11111

    Renat11111 Well-Known Member

    Регистрация:
    20 апр 2008
    Сообщения:
    123
    Симпатии:
    0
    В отчете все работает верно за исключением регистра продаж упорно не записывает данные в ресурс стоимость, сразу скажу что условие
    Если ВыборкаРезультатаЗапроса.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал выполняется. Заранее спасибо.


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


    //Сформировать движения

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

    // регистр СтоимостьМатериалов Расход
    Движение = Движения.СтоимостьМатериалов.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
    Движение.Период = Дата;
    Движение.Материал = ВыборкаРезультатаЗапроса.Номенклатура;
    //расчитать стоимость материала
    СтоимостьМатериала = ?(ВыборкаРезультатаЗапроса.КоличествоОстаток = Null, 0,
    ВыборкаРезультатаЗапроса.СтоимостьОстаток / ВыборкаРезультатаЗапроса.КоличествоОстаток);
    Движение.Стоимость = СтоимостьМатериала * ВыборкаРезультатаЗапроса.Количество;
    КонецЕсли;
    // регистр Продажи
    Движение = Движения.Продажи.Добавить();
    Движение.Период = Дата;
    Движение.Номенклатура = ВыборкаРезультатаЗапроса.Номенклатура;
    Движение.Клиент = Клиент;
    Движение.Мастер = Мастер;
    Движение.Количество = ВыборкаРезультатаЗапроса.Количество;
    Движение.Выручка = ВыборкаРезультатаЗапроса.Сумма;
    Если ВыборкаРезультатаЗапроса.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда
    Движение.Стоимость = СтоимостьМатериала * ВыборкаРезультатаЗапроса.Количество;
    Иначе
    Движение.Стоимость = 0;
    КонецЕсли;
    КонецЦикла;

    // записать движения регистров
    Движения.ОстаткиМатериалов.Записать();
    Движения.СтоимостьМатериалов.Записать();
    Движения.Продажи.Записать();
     
  2. Гость

    Во-первых много лишнего кода, нет оформления отступов. Где запрос сам? У тебя тут в результате есть поле "количество", а есть "Количество остаток". Насколько я понял ты запутался с данными. ибо при таком коде не мудрено.
    Попробуем разобраться:

    Если ВыборкаРезультатаЗапроса.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда
    // регистр СтоимостьМатериалов Расход
    ...
    Движение.Стоимость = СтоимостьМатериала * ВыборкаРезультатаЗапроса.Количество;
    КонецЕсли;

    // регистр Продажи
    Если ВыборкаРезультатаЗапроса.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда
    Движение.Стоимость = СтоимостьМатериала * ВыборкаРезультатаЗапроса.Количество;
    Иначе
    Движение.Стоимость = 0;
    КонецЕсли;

    Ты хочешь сказать что в первом случае условие проходит и считает стоимость, а во-втором регистре он условие не проходит и не считает стоимость?

    Вообще спорный код. Перемудрил Имхо.
     
  3. Renat11111

    Renat11111 Well-Known Member

    Регистрация:
    20 апр 2008
    Сообщения:
    123
    Симпатии:
    0
    Ну код не мой.... я просто учусь по книге. да именно как ты сказал в первом случае проходит условие во втором нет, если не лень можешь просто закоментировать те моменты коды, которые лишние с небольшим комментарием. вот полный код:
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("СкладВДокументе",Склад);

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

    КонецЕсли;
    Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
    Запрос.УстановитьПараметр("СписокНоменклатурыДокумента", ПереченьНоменклатуры.ВыгрузитьКолонку("Номенклатура"));
    Запрос.УстановитьПараметр("Ссылка",Ссылка);

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

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


    //Сформировать движения

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

    // регистр СтоимостьМатериалов Расход
    Движение = Движения.СтоимостьМатериалов.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
    Движение.Период = Дата;
    Движение.Материал = ВыборкаРезультатаЗапроса.Номенклатура;
    //расчитать стоимость материала
    СтоимостьМатериала = ?(ВыборкаРезультатаЗапроса.КоличествоОстаток = Null, 0,
    ВыборкаРезультатаЗапроса.СтоимостьОстаток / ВыборкаРезультатаЗапроса.КоличествоОстаток);
    Движение.Стоимость = СтоимостьМатериала * ВыборкаРезультатаЗапроса.Количество;
    КонецЕсли;
    // регистр Продажи
    Движение = Движения.Продажи.Добавить();
    Движение.Период = Дата;
    Движение.Номенклатура = ВыборкаРезультатаЗапроса.Номенклатура;
    Движение.Клиент = Клиент;
    Движение.Мастер = Мастер;
    Движение.Количество = ВыборкаРезультатаЗапроса.Количество;
    Движение.Выручка = ВыборкаРезультатаЗапроса.Сумма;
    Если ВыборкаРезультатаЗапроса.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда
    Движение.Стоимость = СтоимостьМатериала * ВыборкаРезультатаЗапроса.Количество;
    Иначе
    Движение.Стоимость = 0;
    КонецЕсли;
    КонецЦикла;

    // записать движения регистров
    Движения.ОстаткиМатериалов.Записать();
    Движения.СтоимостьМатериалов.Записать();
    Движения.Продажи.Записать();
     
Загрузка...

Поделиться этой страницей