8.х Как получить последнюю ненулевую цену

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Gulnaz, 28 сен 2010.

  1. TopicStarter Overlay
    Gulnaz
    Offline

    Gulnaz Опытный в 1С

    Регистрация:
    20 сен 2010
    Сообщения:
    81
    Симпатии:
    0
    Баллы:
    26
    Добрый день! Выкладываю функцию, которая возвращает цену (тип= планово-учетная цена), действующую на момент создания документа. Цены выводятся текущие, но необходимо добавить условие, чтобы функция возращала последнюю ненулевую цену.

    Функция ПолучитьТипПлановоУчетнойЦены() Экспорт
    Возврат Константы.ТипЦенПлановойСебестоимостиНоменклатуры.Получить();
    КонецФункции

    Функция ПолучитьПлановоУчетнуюЦену(Номенклатура, Знач МоментВремени, Регистратор = Неопределено) Экспорт

    ТипЦен = ПолучитьТипПлановоУчетнойЦены();
    Если ТипЗнч(МоментВремени) = Тип("МоментВремени") Тогда
    МоментВремени = МоментВремени.Дата;
    КонецЕсли;
    МоментВремени = КонецДня(МоментВремени);


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

    Запрос.Текст =
    "ВЫБРАТЬ Номенклатура, Цена
    |ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&МоментВремени,
    |Номенклатура = &Номенклатура И ТипЦен = &ТипЦены И Регистратор <> &Регистратор)";
    Рез = Запрос.Выполнить().Выбрать();
    Если Рез.Следующий() Тогда
    Возврат Рез.Цена;
    Иначе
    Возврат 0;
    КонецЕсли;
    КонецЕсли;

    КонецФункции
  2. TopicStarter Overlay
    Gulnaz
    Offline

    Gulnaz Опытный в 1С

    Регистрация:
    20 сен 2010
    Сообщения:
    81
    Симпатии:
    0
    Баллы:
    26
    Помогите чайнику! Еще раз на практике убедилась, что данный вопрос мне нужно решить. :angry:
    Здесь тот же самый запрос немного в другом виде.


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

    Запрос.УстановитьПараметр("МоментВремени", КонецДня(ЭтотОбъект.Дата));
    Запрос.УстановитьПараметр("Список", СписокНоменклатуры);
    Запрос.УстановитьПараметр("ТипЦен", Софт_ОбщегоНазначения.ПолучитьТипПлановоУчетнойЦены());
    Запрос.УстановитьПараметр("Регистратор", ЭтотОбъект.Ссылка);

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




    Как в запросе добавить цикл:
    (REPEAT) Уменьшать дату(МоментВремени)
    (UNTIL) до тех пор, пока возвращаемая цена станет неравной 0 или дата="29/02/2008"

    Такое возможно?
  3. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Не пойму что вам надо получить. Еще раз, и если можно с примером.
  4. TopicStarter Overlay
    Gulnaz
    Offline

    Gulnaz Опытный в 1С

    Регистрация:
    20 сен 2010
    Сообщения:
    81
    Симпатии:
    0
    Баллы:
    26
    Запрос нужен для документа собственного производства "Заявки инструментального отдела", в котором работник цеха вводит необходимую номенклатуру для их последующего закупа. В табличной части документа выбирается номенклатура А по типу цены - Планово-учетная цена. Номенклатура А в январе имела плано-учетную цену = 10, в феврале =20, в марте цена установилась 0, т.к. на начало марта не было остатков, в апреле цена тоже равна 0. Пусть в мае вводится документ Заявка ИнО и выбирается наша номенклатура. По действующему запросу выходить плано-учетная цена =0, а мне нужно, чтобы вышла цена = 20, т.е. последняя ненулевая цена.
  5. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Если так:
    Код:
    "ВЫБРАТЬ
    спрНоменклатура.Ссылка,
    ВнутреннийЗапрос.Цена,
    ВнутреннийЗапрос.Период,
    спрНоменклатура.ЭтоГруппа,
    спрНоменклатура.Код
    ИЗ
    Справочник.Номенклатура КАК спрНоменклатура
    ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
    ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
    ЦеныНоменклатурыСрезПоследних.Период КАК Период
    ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
    &Дата,
    Цена > 0
    И ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних) КАК ВнутреннийЗапрос
    ПО спрНоменклатура.Ссылка = ВнутреннийЗапрос.Номенклатура"
    
  6. TopicStarter Overlay
    Gulnaz
    Offline

    Gulnaz Опытный в 1С

    Регистрация:
    20 сен 2010
    Сообщения:
    81
    Симпатии:
    0
    Баллы:
    26
    результат такой же :angry:

    в вашем запросе &Дата- дата документа ведь.
  7. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104

    Вложения:

  8. TopicStarter Overlay
    Gulnaz
    Offline

    Gulnaz Опытный в 1С

    Регистрация:
    20 сен 2010
    Сообщения:
    81
    Симпатии:
    0
    Баллы:
    26
    да, вы правильно поняли
  9. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Ну тогда работает же вроде, пример привел.
    Что у вас не получается, что выдает?
  10. TopicStarter Overlay
    Gulnaz
    Offline

    Gulnaz Опытный в 1С

    Регистрация:
    20 сен 2010
    Сообщения:
    81
    Симпатии:
    0
    Баллы:
    26
    Доброе утро, shurikvz! Я вставила ваш запрос в процедуру:

    Код:
     Процедура ФормаДокументаТабличнаяЧастьПриПолученииДанных(ЭтотОбъект, ЭтаФорма, Элемент, ОформленияСтрок) Экспорт 
    
    ЕстьКод = (ОформленияСтрок[0].Ячейки.Найти("Код")<>Неопределено);     
    ЕстьЕдиницаБИ = (ОформленияСтрок[0].Ячейки.Найти("ЕдиницаИзмерения")<>Неопределено);
    // Вставить содержимое обработчика.
    Если Элемент.Колонки.Софт_ЦенаПлановоУчетная.Видимость = Ложь Тогда 
    Возврат;
    КонецЕсли;
    
    СписокНоменклатуры = Новый Массив;
    
    Для каждого ОформлениеСтроки из ОформленияСтрок Цикл
    СписокНоменклатуры.Добавить(ОформлениеСтроки.ДанныеСтроки.Номенклатура);
    КонецЦикла;
    
    Запрос = Новый Запрос;
    Запрос.Текст = 	
    "ВЫБРАТЬ
    |	спрНоменклатура.Ссылка КАК Номенклатура,
    |	ВнутреннийЗапрос.Цена,
    |	ВнутреннийЗапрос.Период,
    |	спрНоменклатура.ЭтоГруппа,
    |	спрНоменклатура.Код
    |ИЗ
    |	Справочник.Номенклатура КАК спрНоменклатура
    |		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    |			ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
    |			ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
    |			ЦеныНоменклатурыСрезПоследних.Период КАК Период
    |		ИЗ
    |			РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
    |					&Дата,
    |					Цена > 0
    |						И ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних) КАК ВнутреннийЗапрос
    |		ПО спрНоменклатура.Ссылка = ВнутреннийЗапрос.Номенклатура";
    
    Запрос.УстановитьПараметр("Дата", КонецДня(ЭтотОбъект.Дата));
    Запрос.УстановитьПараметр("Список", СписокНоменклатуры);
    Запрос.УстановитьПараметр("ТипЦен", Софт_ОбщегоНазначения.ПолучитьТипПлановоУчетнойЦены());
    Запрос.УстановитьПараметр("Регистратор", ЭтотОбъект.Ссылка);
    
    Реквизиты = Запрос.Выполнить().Выгрузить();
    
    Реквизиты.Индексы.Добавить("Номенклатура"); 	
    Для каждого ОформлениеСтроки из ОформленияСтрок Цикл
    СтрокаТЗ = Реквизиты.Найти(ОформлениеСтроки.ДанныеСтроки.Номенклатура, "Номенклатура");
    Если СтрокаТЗ = Неопределено Тогда
    Продолжить;
    КонецЕсли;
    Если СтрокаТЗ.Цена <> ОформлениеСтроки.ДанныеСтроки.Софт_ЦенаПлановоУчетная Тогда 
    ОформлениеСтроки.Ячейки.Софт_ЦенаПлановоУчетная.ЦветФона 	= WebЦвета.СветлоРозовый;
    КонецЕсли;
    
    дополнительные реквизиты... (нужно будет переписать этот код есть сомнения по-быстрому отображению)
    Если ЕстьКод Тогда 
    ОформлениеСтроки.Ячейки.Код.УстановитьТекст(СтрокаТЗ.Код);
    КонецЕсли;
    
    Если СтрокаТЗ <> Неопределено Тогда 
    Если ЕстьЕдиницаБИ Тогда 
    ОформлениеСтроки.Ячейки.ЕдиницаИзмерения.УстановитьТекст(СтрокаТЗ.БазоваяЕИ);
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;   		
    
    КонецПроцедуры
    
    
    Результать запроса на прикрепленном файле. Красным линиями выделено то, как программа работает, а зеленым- как доложно быть. Посмотреть вложение 5529

    Вложения:

  11. x_under
    Offline

    x_under Модераторы Команда форума Модератор

    Регистрация:
    25 апр 2007
    Сообщения:
    2.576
    Симпатии:
    13
    Баллы:
    29
    Как-то все не совсем прозрачно у вас получается. Начнем с задачи: есть документ, в котором при выборе номенклатуры необходимо получать последнюю цену определенного типа. вопрос: "а зачем вы фиксируете цены равные нулю", мы опустим.
    Вопросы, которые меня интересуют:
    1. Почему используется процедура при получении данных? Почему не использовать "ПриИзменении"?
    2. Зачем использовать соединение со справочником?

    Вам просто привели пример, но его нужно было осмыслить и переделать. И опишите еще раз задачу в целом, а не конкретную проблему.
  12. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    x_under я кажется теперь догадываюсь в чем там смысл (судя по коду): ТС надо не вывести планово-учетную цену, а подсветить ячейку другим цветом если цена в ней (установленная при подборе) отличается от установленной на данный момент в системе планово-учетной.
    Gulnaz, на мой взгляд у вас как раз таки все работает. У вас последняя не нулевая цена - 15 рублей. Посмотрите на свой код: в табличной части документа у вас для этой позиции стоит 0, в коде вы находите последнюю вашу ненулевую цену:
    Код:
    СтрокаТЗ.Цена <> ОформлениеСтроки.ДанныеСтроки.Софт_ЦенаПлановоУчетная
    //СтрокаТЗ.Цена = 15
    //ОформлениеСтроки.ДанныеСтроки.Софт_ЦенаПлановоУчетная = 0
    
    
    
    и теперь согласно вашему коду эта ячейка просто подсвечена светло-розовым цветом. Все. Вы же нигде не присваиваете ей значение. Как написали, все так и работает.
    x_under правильно сказал: если это не то что вы хотите, то озвучьте полностью задание.

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