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

Списание с регистра накопления части товаров на основании другого документа

Автор Sasha1C, 06 июн 2023, 16:05

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

Sasha1C

Уважаемые разработчики, передо мной встала дилемма. В регистр накопления вводится заказ, с помощью документа "Счет". А второй документ "ПродажаТоваров", который вводится на основании документа "Счет", должен списать необходимое количество товара, но возникает проблема, что документу "ПродажаТоваров" не важно количество, главное чтобы небыло перебора(По моему заданному условию). При проведении "ПродажаТоваров" запись в регистре просто списывает все остатки, хотя я надеялся что будет просто: количество в "Счет" - Количество в "ПродажаТоваров" = Осталось.

Может будут предложения как реализовать данный функционал. Заранее спасибо!!
 

НаборЗаписейРезерва = РегистрыНакопления.РезервыНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписейРезерва.Отбор.Регистратор.Установить(Счет);


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

Шапка = Запрос.Выполнить().Выбрать();
Шапка.Следующий();



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

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

Запрос.УстановитьПараметр("Основание", Счет); 
//
.................условия и выборка
//

// здесь мы делаем выборку из запросов

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

Afinogen


Sasha1C

Afinogen, Измерения: Номенклатура, основание, Склад
Ресурс: Резерв

Максим75

так это же резервирование товара.
логично, что при проведении расхода с резерва снимается по документу-основанию (тот что поставил на счет) количество проданного товара.
т.е. если продаем все что в счете, то и снимает все и на резерве ничего не остается.

и да, первый запрос не совсем понятен, выгребает все существующие документы Счет, может условие надо какое задать, чтобы конкретный один документ выбрать?

Sasha1C

Максим75, Но в документе "Счет" количество товара превышает то, которое мы хотим списать, но списывается все, хотя должно остаться. Почему это может быть

Afinogen

вот эта часть  запроса
 

               |ВЫБРАТЬ
               | ...
               | ЕСТЬNULL(ТаблицаДокумента.Количество, 0) КАК Количество,
               | ЕСТЬNULL(РезервыНоменклатурыОстатки.РезервОстаток, 0) КАК Резерв
               |...;



выбирает имеющийся остаток и я так понимаю именно резерОстаток списывает

вам надо условие ставить


               |ВЫБРАТЬ
               | ...
               | ВЫБОР КОГДА ЕСТЬNULL(ТаблицаДокумента.Количество, 0) >ЕСТЬNULL(РезервыНоменклатурыОстатки.РезервОстаток, 0)  ТОГДА
               | ЕСТЬNULL(РезервыНоменклатурыОстатки.РезервОстаток, 0) 
                   |ИНАЧЕ
                   | ЕСТЬNULL(РезервыНоменклатурыОстатки.Количество, 0) 
                   | КОНЕЦ  КАК РезервСписание
               |...;



что то  типа такого



Sasha1C

Afinogen,
Условие списания уже есть, только не в запросе

   
            ТребуетсяСписать = ВыборкаОбщая.Количество;
            Выборка = ВыборкаОбщая.Выбрать();
         ;
            Пока Выборка.Следующий() Цикл
                Если Выборка.Количество >= Выборка.Резерв Тогда
                    КоличествоСписания = Выборка.Резерв;
                    ТребуетсяСписать = ТребуетсяСписать - КоличествоСписания;
                Иначе
                    КоличествоСписания = ТребуетсяСписать;
                    ТребуетсяСписать = 0;
                КонецЕсли;
               

Afinogen

чет я не понял вашей конструкции

вам же нужно списать с резерва но не более имеющегося количества так?


Теги:

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

Рейтинг@Mail.ru

Поиск