Каталог решений - Запрет проведения документов в неоперативном режиме УТ 10.3

Запрет проведения документов в неоперативном режиме УТ 10.3

Запрет проведения документов в неоперативном режиме УТ 10.3

В наличии

Предлагаю Вам небольшое решение для запрета проведения документов РТУ в неоперативном / оперативном режимах УТ 10.3.

Категория:

Описание

Предлагаю свое решение по избитой теме, когда УТ 10.3 разрешает проводить документы РТУ в неоперативном режиме, в результате чего на складе образуются отрицательные остатки.

Сразу оговорюсь, что задача писалась под мой частный случай для документа РТУ. Данное решение требует несущественной доработки конфигурации.

У меня получилась проверка из двух действий.

Предлагаю на обсуждение:

Первым делом, я открываю модуль документа «Реализация товаров и услуг» и пишу в нем вот такую функцию (потом, по желанию, ее можно вынести в отдельный общий модуль):

 

Функция ПоискОстатковПоСкладу(Номенклатура, ДатаДокумента, СкладДокумента)

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

КонецФункции

 

Далее, в том же модуле РТУ ищем процедуру «ОбработкаПроведения» и в самом конце ее перед «КонецПроцедуры» добавляем вот такой элементарный код (условие):

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

 

Еще раз, данное решение работает, писалось мной под определенную задачу. Буду рад, если оно поможет кому. Также хочу услышать ваши мысли по доработке, возможным косяках, альтернативных решениях.

Всем спасибо!

has been added to your cart:
Оформление заказа