Запрос Показывающий Остатки В Разрезе Дат Поступления.

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

  1. Helen234423

    Helen234423 New Member

    Регистрация:
    19 сен 2013
    Сообщения:
    1
    Симпатии:
    0
    Добрый день.
    Есть такой вопрос.. Конфигурация УТ 10. В заказе поставщику добавлен реквизит в табличную часть товары "планируемая дата поступления". Нужен запрос, который будет показывать остаток по всем датам поступления для конкретного заказа поставщику. Проблема в том, что изменять регистр заказа поставщикам НЕЛЬЗЯ!.
    Пример вопроса: Мы ожидаем поступление товаров -
    Товар1 в кол-ве 12 шт 23.09.2013
    Товар1 в кол-ве 10 шт 29.09.2013
    Документом поступления товаров зафиксирован приход 14 шт Товара1 25.09.2013.
    Запрос должен показать, что осталось получить 8 шт 29.09.2013.

    Буду благодарна за любую подсказку в этом направлении.
     
  2. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Боюсь что запросом вы сможете вытащить только максимальную дату. Для отработки других вариантов проще сделать постобработку результатов запроса. например тот случай что вы описали:

    Код ( (Unknown Language)):
        Тз = Новый таблицаЗначений;
    Тз.Колонки.Добавить("заказ");
    Тз.Колонки.Добавить("номенклатура");
    Тз.Колонки.Добавить("Количество");
    Тз.Колонки.Добавить("ПланДата");
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |   ЗаказыПоставщикамОстатки.ЗаказПоставщику,
    |   ЗаказыПоставщикамОстатки.КоличествоОстаток,
    |   ЗаказыПоставщикамОстатки.Номенклатура
    |ИЗ
    |   РегистрНакопления.ЗаказыПоставщикам.Остатки(&ДатаЗапроса, ) КАК ЗаказыПоставщикамОстатки"$
    Запрос.Параметры.Вставить("ДатаЗапроса",ДатаЗапроса);
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
    ЗапросЗак = Новый Запрос;
    ЗапросЗак.Текст = "ВЫБРАТЬ
    |   ЗаказПоставщикуТовары.ПланДатаПост КАК ПланДатаПост,
    |   ЗаказПоставщикуТовары.Количество
    |ИЗ
    |   Документ.ЗаказПоставщику.Товары КАК ЗаказПоставщикуТовары
    |ГДЕ
    |   ЗаказПоставщикуТовары.Ссылка = &Заказ
    |   И ЗаказПоставщикуТовары.Номенклатура = &Номенклатура
    |
    |УПОРЯДОЧИТЬ ПО
    |   Цена ПланДатаПост";
    ЗапросЗак.Параметры.Вставить("Заказ",Выборка.ЗаказПоставщику);
    ЗапросЗак.Параметры.Вставить("Номенклатура",Выборка.Номенклатура);
    ВыборкаЗак = ЗапросЗак.Выполнить().Выбрать();
    ВсегоОсталось = Выборка.КолчествоОстаток;
    Пока ВыборкаЗак.Следующий() Цикл
    Закрыли =Мин(ВсегоОсталось,ВыборкаЗак.Количество);
    ВсегоОсталось = ВсегоОсталось - Закрыли;
    стр = Тз.Добавить();
    Стр.Номенклатура = выборка.Номенклатура;
    Стр.Заказ = Выборка.ЗаказПоставщику;
    Стр.количество = Закрыли;
    Стр.ПланДата = ВыборкаЗак.ПланДатаПост;
    Если ВсегоОсталось = 0 Тогда
    прервать;
    КонецЕсли;
    КонецЦикла;
    Если ВсегоОсталось > 0 Тогда //Если была корректировка, выводим с пустой датой что осталось
    стр = Тз.Добавить();
    Стр.Номенклатура = выборка.Номенклатура;
    Стр.Заказ = Выборка.ЗаказПоставщику;
    Стр.количество = ВсегоОсталось;
    КонецЕсли;

    КонецЦикла;
    С полученной тз можно делать что угодно - перебирать, скормить СКД.

    Запрос не оптимален ( просто мне так быстрее писать было и идея понагляднее), можно сделать и одним зпроосом, с последующим обходам по группировкам, где проводить такие-же действия с ТЗ.

    Еще можно поиграться с ВычислитьВыражение в СКД - там можно проводить подобные циклические действия, но тут гораздо больше времени писать.

    И кстати - для чего это надо?
     
Загрузка...

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