Создание регистра накопления «Остатки номенклатуры»
В регистре накопления «ОстаткиНоменклатуры» (Вид регистра: Остатки), на вкладке «Данные» создали Измерения «Номенклатура» (Тип: СправочникСсылка.Номенклатура) и Ресурсы «Количество» (Тип: Число, Длина: 13, Точность: 3, Неотрицательное).
На вкладке регистраторы выбрали «ПриходнаяНакладная» «РасходнаяНакладная».
В документе «ПриходнаяНакладная» создали движение в модуле объекта:
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|ПриходнаяНакладнаяТовары.Товар КАК Номенклатура,
|СУММА(ПриходнаяНакладнаяТовары.Количество)КАК Количество,
|СУММА(ПриходнаяНакладнаяТовары.Сумма) КАК Сумма
|ИЗ
|Документ.ПриходнаяНакладная.Товары КАК ПриходнаяНакладнаяТовары
|ГДЕ
| ПриходнаяНакладнаяТовары.Ссылка =&Ссылка
|
|СГРУППИРОВАТЬ ПО
|ПриходнаяНакладнаяТовары.Товар";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Движение = Движения.ОстаткиНоменклатуры.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Номенклатура =
ВыборкаДетальныеЗаписи.Номенклатура;
Движение.Количество =
ВыборкаДетальныеЗаписи.Количество;
КонецЦикла;
КонецПроцедуры
В модуле документа «РасходнаяНакладная» создали новую процедуру (Ввели «проц» и нажали ctrl+q), назвали «Продажи», в скобки вписали «Отказ». Перенесли весь код из Процедура ОбработкаПроведения(Отказ, Режим) в Продажи(Отказ). Создали новую процедуру НоваяМетодикаКонтроляОтрицательныхОстатков(Отказ). Написали туда код:
Процедура НоваяМетодикаКонтроляОтрицательныхОстатков(Отказ)
Движения.ОстаткиНоменклатуры.Записывать = Истина;
//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц=Новый МенеджерВременныхТаблиц;
Запрос.Текст =
"ВЫБРАТЬ
| РасходнаяНакладнаяТовары.Товар КАК Номенклатура,
| СУММА(РасходнаяНакладнаяТовары.Количество) КАК Количество
|ПОМЕСТИТЬ ВТНоменклатура
|ИЗ
| Документ.РасходнаяНакладная.Товары КАК РасходнаяНакладнаяТовары
|ГДЕ
| РасходнаяНакладнаяТовары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РасходнаяНакладнаяТовары.Товар
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТНоменклатура.Номенклатура КАК Номенклатура,
| ВТНоменклатура.Количество КАК Количество
|ИЗ
| ВТНоменклатура КАК ВТНоменклатура";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Движение = Движения.ОстаткиНоменклатуры.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
Движение.Количество = ВыборкаДетальныеЗаписи.Количество;
КонецЦикла;
Движения.Записать();
Запрос.Текст =
"ВЫБРАТЬ
| ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК КоличествоОстаток,
| ОстаткиНоменклатурыОстатки.Номенклатура.Представление КАК НоменклатураПредставление
|ИЗ
| РегистрНакопления.ОстаткиНоменклатуры.Остатки(
| &МоментВремени,
| Номенклатура В
| (ВЫБРАТЬ
| ВТНоменклатура.Номенклатура КАК Номенклатура
| ИЗ
| ВТНоменклатура КАК ВТНоменклатура)) КАК ОстаткиНоменклатурыОстатки
|ГДЕ
| ОстаткиНоменклатурыОстатки.КоличествоОстаток < 0";
Запрос.УстановитьПараметр("МоментВремени", Новый Граница(МоментВремени(),ВидГраницы.Включая));
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
Отказ=Истина;
ВыборкаДетальныеЗаписи=РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщение = СтрШаблон("Ошибка! Недостаточно товара: '%1', в количестве: %2 шт.",ВыборкаДетальныеЗаписи.НоменклатураПредставление,-ВыборкаДетальныеЗаписи.КоличествоОстаток);
Сообщить(Сообщение);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
В процедуру ОбработкаПроведения(Отказ, Режим) пишем код:
Процедура ОбработкаПроведения(Отказ, Режим)
Продажи(Отказ);
НоваяМетодикаКонтроляОтрицательныхОстатков(Отказ);
КонецПроцедуры
Запускаем «1С:Предприятие», проводим сначала Приходные накладные, потом, предварительно сменив дату так, чтобы она была свежее чем в Приходных накладных, проводим Расходные накладные. Если в расходной накладной указано больше товара, чем в приходной в дату проведения расходной, то проведение не случиться и появиться ошибка.
Рисунок 3 – Вывод сообщения о не проведении Расходной накладной на «1С:Предприятие».
Рисунок 4 – Вывод сообщения об нехватке товаров вместо проведения на «1С:Предприятие».
Нажимаем на «Сервис и настройки», «Функции для технического специалиста», «Регистры накопления», «Остатки номенклатруы»
Рисунок 5 – Расположение кнопки «Сервис и настройки» на «1С:Предприятие».
Рисунок 6 – Состав регистра накопления «Остатки номенклатуры» на «1С:Предприятие».
