1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программировании. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление

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

Тема в разделе "Базы данных и администрирование", создана пользователем Greml1N, 2 ноя 2010.

  1. Greml1N

    Greml1N Гость

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

    tanat Well-Known Member

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

    unknown181538 НеГуру

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

    Darlock Well-Known Member

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

    Greml1N Гость

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

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

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

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

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

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

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

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

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

    КонецЕсли;

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

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

    puh14 Well-Known Member

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

    Darlock Well-Known Member

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

    Дайнеко Well-Known Member

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

    evgenyatam Well-Known Member

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

    User1C Гость

    Репутация:
    0
    Вот тебе рабочий код с проверкой на остаток и т.д.

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

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