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

Контроль остатков 1с

Автор Андрей Бутенко, 30 авг 2022, 11:37

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

Андрей Бутенко

Здравствуйте. Подскажите пожалуйста как сделать контроль остатков по складам в моем коде (чтобы номенклатура не списывалась в минус) в запросе2.

Процедура ОбработкаПроведения(Отказ, Режим)

Движения.ОстаткиТоваров.Записывать = Истина;
// Создаем новый менеджерВременныхТаблиц
МенеджерВТ = Новый МенеджерВременныхТаблиц;

Запрос = Новый Запрос;

Запрос.МенеджерВременныхТаблиц = МенеджерВТ;

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


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

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

Движения.ОстаткиТоваров.Записать();
РезультатЗапроса = Запрос2.Выполнить();

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

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если ВыборкаДетальныеЗаписи.Количество = 0 Тогда
СтоимостьМатериала = 0;
Иначе
СтоимостьМатериала = ВыборкаДетальныеЗаписи.Стоимость/
ВыборкаДетальныеЗаписи.Количество;
КонецЕсли;

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

КонецЦикла;
КонецПроцедуры

LexaK

Андрей Бутенко,
в запросе Количество остатка задайте имя
                    |    ЕСТЬNULL(ОстаткиТоваровОстатки.СтоимостьОстаток, 0) КАК Стоимость,
                    |    ЕСТЬNULL(ОстаткиТоваровОстатки.КоличествоОстаток, 0) как Остаток //добавьте название поля Остатка

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

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


и да, в этом коде могут быть ошибки, исправьте
если помогло нажмите: Спасибо!

Теги:

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

Рейтинг@Mail.ru

Поиск