Предотвращение ошибок в материальном учете Бухгалтерии 7.7
Два небольших участка кода для предотвращения ошибок бухгалтеров в учете материальных запасов.
Для конфигурации 1С 7.7 Бухгалтерский учет 4.5 релиз 510 (будет работать и на других релизах)
- Описание
- Подробнее
Описание
В документах стандартной конфигурации имеются две возможности запутаться с учетом материалов: (работу с операциями в ручную нерассматриваем :))
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
..
Представленный код не вностит изменений в базу данных.
В первом случае блокировка безусловная + контроль указания места хранения и собственно материала.
Во втором случае разъясняется возможная ситуация и предлагается выбор проводить документ или нет.
После введения этих изменений, бухгалтера перестали спрашивать — «почему у меня здесь красным» и «почему несписывает ведь он есть на складе».
Имем взаимную экономию нервов и времени.