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