В документах стандартной конфигурации имеются две возможности запутаться с учетом материалов: (работу с операциями в ручную нерассматриваем :))
1. В авансовом отчете оприходовать материал на на иной субсчет нежели указанныый в свойствах материала. На остатках материал висеть будет а списание по средством документа ТребованиеНакладная проходить небудет.
2. Произвести списание/передачу материала два раза, обычно задним числом.
Представленный здесь код позволяет блокировать/предупредить эти ошибки.
1. Для предупреждения первой ошибки необходимо в модуль формы документа АвансовыйОтчет вставить процедуру:
//Начало изменений
Процедура ПриОкончанииРедактированияСтроки()
Если (КоррСчет.ПринадлежитГруппе(СчетПоКоду("10")) = 1)и
(КоррСчет.ПринадлежитГруппе(СчетПоКоду("10.11")) = 0)и
(КоррСчет <> СчетПоКоду("10.7")) Тогда
Если Субконто1.Выбран() = 0 Тогда
Сообщить("Не выбран материал");
СтатусВозврата(0);
Возврат;
КонецЕсли;
Если Субконто2.Выбран() = 0 Тогда
Сообщить("Не выбрано место хранения");
СтатусВозврата(0);
Возврат;
КонецЕсли;
Если Субконто1.СубСчет10 <> КоррСчет Тогда
Предупреждение("Указано поступление на счет: "+Строка(КоррСчет)+разделительстрок+
"Однако выбранный материал учитывается на счете: "+Строка(Субконто1.СубСчет10)+разделительстрок+
"Исправьте !");
СтатусВозврата(0);
Возврат;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
//Конец изменений
Вставить процедуру можно в любое место, как ориентир смотри картинку "Вставка в модуль формы Авансового отчета"
2. Для предупреждения второй ошибки необходимо в модуль проведения документа ТребованиеНакладная вставить два блока. При исходном тексте это строка 44 и строка 138 соответственно:
строка44:
//44я строка
//Начало изменений 1
ПсД = СоздатьОбъект("Документ");
ПсД.ОбратныйПорядок(1);
ПсД.ВыбратьДокументы();
Пока (ПсД.ПолучитьДокумент() = 1)и(ПсД.Проведен() = 0) Цикл
КонецЦикла;
ДатаНачалаД = ДатаДок;
ДатаКонцаД = ПсД.ДатаДок;
Если ДатаНачалаД > ДатаКонцаД Тогда
ДатаКонцаД = ДатаНачалаД;
КонецЕсли;
Если ДатаКонцаД < ТекущаяДата() Тогда
ДатаКонцаД = ТекущаяДата();
КонецЕсли;
Если ДатаКонцаД > КонецРассчитанногоПериодаБИ() Тогда
ДатаКонцаД = КонецРассчитанногоПериодаБИ();
КонецЕсли;
БИм = СоздатьОбъект("БухгалтерскиеИтоги");
БИм.ИспользоватьСубконто(ВидыСубконто.Материалы, СписокМатериалов, 2);
БИм.ИспользоватьСубконто(ВидыСубконто.МестаХранения);
БИм.ВключатьСубсчета(-1);
БИм.ВыполнитьЗапрос(ДатаНачалаД,ДатаКонцаД, "10",,,,"Операция","СК");
//Конец изменений 1
строка 138:
//138я строка, с первой вставкой 165я строка
//Начало изменений 2
Если ТаблицаОстатков.Материал.Вид() = "Материалы" Тогда
Если БИм.ПолучитьСчет(, ТаблицаОстатков.СчетУчета) = 1 Тогда
Если БИм.ПолучитьСубконто(1,, ТаблицаОстатков.Материал) = 1 Тогда
ОстатокТекущий = КоличествоНаСкладе;
СписаниеТекущее = ТаблицаОстатков.КоличествоОтпущено;
ПоступилоПосле = 0;
СписаноПосле = 0;
Если БИм.ПолучитьСубконто(ВидыСубконто.МестаХранения,, МестоХранения) = 1 Тогда
БИм.ВыбратьПериоды();
ДЧас = 0; ДМин = 0; ДСек = 0;
ПолучитьВремя(ДЧас,ДМин,ДСек);
ДокВремя = ДЧас*3600 + ДМин*60 + ДСек;
Пока БИм.ПолучитьПериод() = 1 Цикл
ПЧас = 0; ПМин = 0; ПСек = 0;
БИм.Операция.ПолучитьВремя(ПЧас,ПМин,ПСек);
ПериодВремя = ПЧас*3600 + ПМин*60 + ПСек;
Если ДатаДок = БИм.Операция.ДатаОперации Тогда
Если ДокВремя <= ПериодВремя Тогда
ПоступилоПосле = ПоступилоПосле + БИм.ДО("К");
СписаноПосле = СписаноПосле + БИм.КО("К");
КонецЕсли;
Иначе
ПоступилоПосле = ПоступилоПосле + БИм.ДО("К");
СписаноПосле = СписаноПосле + БИм.КО("К");
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если (ОстатокТекущий + ПоступилоПосле)<(СписаниеТекущее + СписаноПосле) Тогда
БИм.ВыбратьПериоды();
ФлагМ = 1;
ДокМ = "";
Пока (БИм.ПолучитьПериод() = 1)и(ФлагМ = 1) Цикл
ПЧас = 0; ПМин = 0; ПСек = 0;
БИм.Операция.ПолучитьВремя(ПЧас,ПМин,ПСек);
ПериодВремя = ПЧас*3600 + ПМин*60 + ПСек;
Если ДатаДок = БИм.Операция.ДатаОперации Тогда
Если ДокВремя <= ПериодВремя Тогда
Если (БИм.СНД("К") + БИм.ДО("К")) < (БИм.КО("К") + СписаниеТекущее) Тогда
ДатаКонцаД = БИм.Операция.Документ.ДатаДок;
ДокМ = Строка(БИм.Операция.Документ);
ФлагМ = 0;
КонецЕсли;
КонецЕсли;
Иначе
Если (БИм.СНД("К") + БИм.ДО("К")) < (БИм.КО("К") + СписаниеТекущее) Тогда
ДатаКонцаД = БИм.Операция.Документ.ДатаДок;
ДокМ = Строка(БИм.Операция.Документ);
ФлагМ = 0;
КонецЕсли;
КонецЕсли;
КонецЦикла;
ТекстМ = "Для материала "+Строка(ТаблицаОстатков.Материал)+" по дату "+Строка(ДатаНачалаД)+" время "+Строка(ДЧас)+":"+Строка(ДМин)+":"+Строка(ДСек)+разделительстрок+
" на складе "+Строка(МестоХранения)+" имеется отстаток "+Строка(ОстатокТекущий)+" "+ТаблицаОстатков.Материал.ЕдиницаИзмерения+разделительстрок+
"Позже имеется поступление "+Строка(ПоступилоПосле)+" "+ТаблицаОстатков.Материал.ЕдиницаИзмерения+разделительстрок+
"И списание (перемещение) "+Строка(СписаноПосле)+" "+ТаблицаОстатков.Материал.ЕдиницаИзмерения+разделительстрок+
"По документу списывается (перемещается) всего "+Строка(СписаниеТекущее)+" "+ТаблицаОстатков.Материал.ЕдиницаИзмерения+разделительстрок+
""+разделительстрок+
Строка(ОстатокТекущий)+" - "+Строка(СписаниеТекущее)+" + "+Строка(ПоступилоПосле)+" - "+Строка(СписаноПосле)+" = "+
Строка((ОстатокТекущий + ПоступилоПосле) - (СписаниеТекущее + СписаноПосле))+разделительстрок+
"На дату "+Строка(ДатаКонцаД)+" будут отрицательные остатки !";
Если ФлагМ = 0 Тогда
ТекстМ = ТекстМ + разделительстрок + "После документа: "+ДокМ;
КонецЕсли;
Если Вопрос(ТекстМ+"Продолжать ?", 4, 10) <> 6 Тогда
глНеПроводить(Контекст, ТекстМ);
Возврат;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
//Конец изменений 2
..
Представленный код не вностит изменений в базу данных.
В первом случае блокировка безусловная + контроль указания места хранения и собственно материала.
Во втором случае разъясняется возможная ситуация и предлагается выбор проводить документ или нет.
После введения этих изменений, бухгалтера перестали спрашивать - "почему у меня здесь красным" и "почему несписывает ведь он есть на складе".
Имем взаимную экономию нервов и времени.