пятница, 25 августа 2017 г.

1С Оперативный учет - Новый метод контроля остатков



Задача демонстрирующая новый метод списания в документе расходная накладная и алгоритм контроля отрицательных остатков.

При использовании данной методики контроля отрицательных остатков алгоритм можно разделить на 2 шага :
1. Формирование и запись движений
2. Получение и проверка остатков из регистра после записи движений. При появлении  отрицательных остатков документ не проводится.

Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа - «Расходная накладная». Помимо продажи товара, могут оказываться дополнительные услуги, например по доставке. И услуги и товары указываются в одной табличной части.При нехватке товара необходимо выдавать соответствующее предупреждение с указанием количества нехватки и не позволять проводить документ

Задача 1.01

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


// *********** Вариант 2

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

Комментариев нет:

Отправить комментарий

Печать чека ККМ из драйвера ККМ

Суть проблемы: Пробиваем чек из 1С: Бухгалтерии. Чек пробит не  правильно. Теперь нужно сделать чек коррекции. Но в программе это сделать н...