Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 23:10

резервирование товаров

Автор gaara2046, 06 сен 2015, 10:53

0 Пользователей и 1 гость просматривают эту тему.

gaara2046

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

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

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

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

 
    //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

Документ не проводится во всех случаях.Версия 1С 8.2

Artem6237

Возможно у вас нет остатков по нужной позиции номенклатуры. Т.к. виртуальная таблица остатки не хранит нулевых остатков, то и результат запроса может быть пустой и выборка не обходится. Попробуйте сделать условие на пустоту результата, а вообще запрос  в цикле - не самое производительное решение.

gaara2046

Цитата: Artem6237 от 06 сен 2015, 13:35
Возможно у вас нет остатков по нужной позиции номенклатуры. Т.к. виртуальная таблица остатки не хранит нулевых остатков, то и результат запроса может быть пустой и выборка не обходится.
Значит надо в запросе еще и виртуальную таблицу создавать?У меня не было создана она

Artem6237

Как вариант, попробуйте получить всю номенклатуру по табличной части и левым соединением присоединить остатки. NULL привести к нулю.  И далее уже в обходе выборки делать условие на достаточность товара.

gaara2046

Цитата: Artem6237 от 06 сен 2015, 13:46
Как вариант, попробуйте получить всю номенклатуру по табличной части и левым соединением присоединить остатки. NULL привести к нулю.  И далее уже в обходе выборки делать условие на достаточность товара.
А я прошу прощения,а можно как то либо на примере,либо я вам вышлю свою базу и там покажите?Я в 1С ниже любителя))

Artem6237

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

Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();

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

gaara2046

Спасибо буду пробовать))
Добавлено: 06 сен 2015, 20:30


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

Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();

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

А можно на моем примере показать?Если не сложно,а то я дуб в 1С

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск