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

Запрет на проведения при отрицательном и нулевом остатке

Автор vadim10121995, 21 янв 2021, 19:19

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

vadim10121995

Добрый вечер, подскажите как мне поставить контроль в документ продажа товара. Там нужно что бы при минусовом или нулевом остатке во время проведения выходило сообщение и документ не проводился. Но проблема в том что он проводится в этих случаях и ни какого сообщения не выходит.

Процедура ОбработкаПроведения(Отказ, Режим)
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

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

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

Движения.Записать();

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

Запрос.УстановитьПараметр("Граница", Новый Граница(МоментВремени(),ВидГраницы.Включая));
Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("Ссылка", Ссылка);

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

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

    Если ВыборкаДетальныеЗаписи.Количество() < 0 Тогда     

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




Что не так в этой процедуре ?

antoneus

ВыборкаДетальныеЗаписи.Количество() (то есть количество выбранных в запросе записей) никогда не будет меньше нуля. То есть, в цикл программа даже не заходит.

vadim10121995

Цитата: antoneus от 21 янв 2021, 20:12
ВыборкаДетальныеЗаписи.Количество() (то есть количество выбранных в запросе записей) никогда не будет меньше нуля. То есть, в цикл программа даже не заходит.
Как мне тогда поменять код ? Я просто новичок и не совсем понимаю. Если знаете можете пожалуйста подсказать.

antoneus

Ну, например, так:

........
        |ГДЕ
        |    ТоварыНаСкладахОстатки.КоличествоОстаток <= 0";

..........

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


Но лучше, конечно, не доводить до отрицательных остатков на складе.

vadim10121995

Цитата: antoneus от 22 янв 2021, 13:48
Ну, например, так:

........
        |ГДЕ
        |    ТоварыНаСкладахОстатки.КоличествоОстаток <= 0";

..........

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


Но лучше, конечно, не доводить до отрицательных остатков на складе.
Всё равно проводится. Уже не знаю как записать.

antoneus


vadim10121995

Цитата: antoneus от 22 янв 2021, 15:17
Код-то как сейчас выглядит?

Процедура ОбработкаПроведения(Отказ, Режим)
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

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

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

Движения.Записать();

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

Запрос.УстановитьПараметр("Граница", Новый Граница(МоментВремени(),ВидГраницы.Включая));
Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("Ссылка", Ссылка);

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

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

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

КонецЕсли;
КонецПроцедуры




antoneus

Ладно, а если так?

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

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

    //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

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

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

    Движения.Записать();
           

КонецПроцедуры

vadim10121995

Цитата: antoneus от 22 янв 2021, 16:05
Ладно, а если так?

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

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

    //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

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

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

    Движения.Записать();
           

КонецПроцедуры



Выходит следующая ошибка когда провожу
{Документ.ПродажаТовара.МодульОбъекта(37)}: Ошибка при вызове метода контекста (Выполнить)
    Выборка = Запрос.Выполнить().Выбрать();
по причине:
{(2, 12)}: Неправильный псевдоним ".Товар"
&Товары<<?>>.Товар КАК Товар,

по причине:
{(2, 12)}: Неправильный псевдоним ".Товар"
&Товары<<?>>.Товар КАК Товар,

Когда жму по ошибке указывает на
Выборка = Запрос.Выполнить().Выбрать();

antoneus

А, да, виноват

Запрос.Текст =
"ВЫБРАТЬ
|    Товары.Товар КАК Товар,
|    Товары.Количество КАК Количество
|ПОМЕСТИТЬ
|    ДокументТЧ
|ИЗ
|    &Товары КАК Товары

Теги:

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

Рейтинг@Mail.ru

Поиск