Регистр накопления, запрет списания в минус

17.05.24

Задачи пользователя - Адаптация типовых решений

Около двух месяцев назад потребовалось сделать запрет продажи в минус, но не нашёл ни одной полезной статьи, поэтому решил поделиться своим решением.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Регистр накопления, запрет списания в минус:
.zip 207,26Kb ver:1С:Предприятие 8.3 (8.3.24.1368)
0 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Для начала необходимо создать Регистр Накопления, для того чтобы фиксировать количество нашего товара.

Дальше создаём документы "Приход" и "Расход".

В документе "Приход" всё просто, делаем пару реквизитов, в моём случае это "Товар" и "Количество", дальше нам необходимо сделать движения.

Открываем движения и выбираем тип движения регистра - Приход, далее жмём "Заполнить выражения", дальше жмём "ок" и у нас появляется следующий код.

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

Дальше переходим в документ "Расход" и проделываем те же манипуляции, только уже выбираем тип Расход.

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

Ниже нужно прописать две строчки кода, которые фиксируют количество товара на момент создания документа.

Движения.ОстаткиНоменклатуры.Записать();
Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;

Далее необходимо сделать запрос, в котором в качестве таблицы мы выбираем наш регистр с типом остатки, а в полях выбираем оба наших реквизита, в условиях надо выбрать количество меньше 0.

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

После создания запроса надо присвоить значения

Товары = ЭтотОбъект.СписокТоваров.ВыгрузитьКолонку("Товар");
Запрос.УстановитьПараметр("Товар", Товары);
РезультатЗапроса = Запрос.Выполнить();

Ну и наконец надо сделать условие с циклом

Если не РезультатЗапроса.Пустой() Тогда
	Выборка = РезультатЗапроса.Выбрать();
	ТекстШаблон = ("Не хватает товара ""%1"" в количестве %2");
	Пока Выборка.Следующий() Цикл
		СтрокаВывода = СтрШаблон(ТекстШаблон, Выборка.Товар, -Выборка.КоличествоОстаток);
		Сообщить(СтрокаВывода);
	КонецЦикла;
	Отказ = Истина;	
КонецЕсли;

В архиве выгрузка приложения с описанным кодом.

Тестирование проводилось в 1С:Предприятие 8.3  версия (8.3.24.1368).

Вступайте в нашу телеграмм-группу Инфостарт