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

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

  1. Greml1N

    Greml1N Гость

    Всем привет. Тут столкнулся с популярной проблемой. Но чёткого решения не нашёл. В УТ при неоперативном проведении документов не учитывается контроль остатков. Т.е спокойной можно уйти в минус. Как решить эту проблему ?
     
  2. tanat

    tanat Well-Known Member

    Регистрация:
    2 мар 2007
    Сообщения:
    265
    Симпатии:
    0
    перепровести документы
     
  3. unknown181538

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    Не проводить неоперативно)
     
  4. Darlock

    Darlock Well-Known Member
    1C Team

    Регистрация:
    4 янв 2008
    Сообщения:
    558
    Симпатии:
    0
    проверить запрос получения остатков при проведении документа. Параметр должен быть "МоментВремени".
     
  5. Greml1N

    Greml1N Гость

    В итоге была написано функция имеющая вид: Работает если товар есть на складе(неважно хватает или нет,считает и выдаёт недостаток)

    Для каждого Движение из ДвиженияТоварыНаСкладах цикл
    ТекНоменклатура=Движение.Номенклатура;
    ТекСклад=Склад;

    ТекКол=Движение.Количество;

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

    Запрос.УстановитьПараметр("Номенклатура",ТекНоменклатура);
    Запрос.УстановитьПараметр("Склад",ТекСклад);
    Результат=Запрос.Выполнить();
    ВыборкаТоваров=Результат.Выбрать();
    Пока ВыборкаТоваров.Следующий() Цикл

    //Контроль нехватки
    Выборка=ВыборкаТоваров.Остаток;
    Нехватка=ВыборкаТоваров.Остаток-ТекКол;
    Если

    //Выборка=Неопределено
    нехватка<0

    Тогда
    ;
    Сообщить("Нехватает товара" +" "+ ТекНоменклатура +" "+ "Количеством" +" "+ Нехватка);

    возврат Истина ;
    иначе
    возврат Ложь;

    КонецЕсли;

    КонецЦикла;
    КонецЦикла;

    Проблемы теперь в том что не идёт проверка если товара нет на складе.Выборка=Неопределено не получается,даже не знаю почему. Подскажите как можно осуществить проверку товара которого нету на складе.
     
  6. puh14

    puh14 Well-Known Member
    1C Team

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

    Darlock Well-Known Member
    1C Team

    Регистрация:
    4 янв 2008
    Сообщения:
    558
    Симпатии:
    0
    А если еще и дублирующие строки есть в табличной части?
     
  8. Дайнеко

    Дайнеко Well-Known Member
    1C Team

    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    Классика, она такова:
    Код ( (Unknown Language)):
    ОстКоличества = 0;
    ВыборкаТоваров=Результат.Выбрать();
    Пока ВыборкаТоваров.Следующий() Цикл
    ОстКоличества = ВыборкаТоваров.Остаток;
    КонецЦикла


    // А здесь уже Контроль нехватки
    Если
    КонецЕсли;
    Надо инициализировать переменную до цикла
     
  9. evgenyatam

    evgenyatam Well-Known Member

    Регистрация:
    7 сен 2007
    Сообщения:
    175
    Симпатии:
    0
    что-то я в этом коде не вижу моента времени или хотя-бы даты. похоже что остаток будет на точку актуальности......
     
  10. User1C

    User1C Гость

    Вот тебе рабочий код с проверкой на остаток и т.д.

    Код (Text):
    ТаблЗн = Новый ТаблицаЗначений;
    ТаблЗн.Колонки.Добавить("ВидДвижения");
    ТаблЗн.Колонки.Добавить("Период");
    ТаблЗн.Колонки.Добавить("Номенклатура");
    ТаблЗн.Колонки.Добавить("Контрагент");
    ТаблЗн.Колонки.Добавить("Количество");

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

    ВыборкаИтогОбщий = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаИтогОбщий.Следующий()=1 Цикл

    Выборка = ВыборкаИтогОбщий.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока Выборка.Следующий()=1 Цикл

    Если Выборка.Количество>Выборка.Остаток Тогда
    Сообщить("Не хватает товара "    +
    Выборка.Номенклатура     +
    ",из необходимых "         +
    Выборка.Количество         +
    " за " + Выборка.Контрагент+
    " в остатках имеется только " +
    Выборка.Остаток);

    Отказ = Истина; 
    КонецЕсли;

    Стр = ТаблЗн.Добавить();
    ЗаполнитьЗначенияСвойств(Стр,Выборка,"Номенклатура,Контрагент,Количество");
    КонецЦикла;

    Если Отказ=Истина Тогда
    Продолжить;
    КонецЕсли;

    КонецЦикла;

    ТаблЗн.ЗаполнитьЗначения(Дата,"Период"); //Заполним Колонку период датой проведения
    ТаблЗн.ЗаполнитьЗначения(ВидДвиженияНакопления.Расход,"ВидДвижения"); 

    Движения.РегистрПриход.Загрузить(ТаблЗн);
     
Загрузка...

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