gifts2017

Предотвращение ошибок в материальном учете Бухгалтерии 7.7

Опубликовал mastakw (mastakw) в раздел Программирование - Практика программирования

Два небольших участка кода для предотвращения ошибок бухгалтеров в учете материальных запасов.
Для конфигурации 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

..

Представленный код не вностит изменений в базу данных.

В первом случае блокировка безусловная + контроль указания места хранения и собственно материала.

Во втором случае разъясняется возможная ситуация и предлагается выбор проводить документ или нет.

 

После введения этих изменений, бухгалтера перестали спрашивать - "почему у меня здесь красным" и "почему несписывает ведь он есть на складе".

Имем взаимную экономию нервов и времени.

См. также

Подписаться Добавить вознаграждение
Комментарии
1. mastakw (mastakw) 16.01.10 17:28
Как раскрасить код в стиле 1С ??
неразобрался :(
karabas1980; +1 Ответить
2. igor Nemo (karabas1980) 16.01.10 19:31
Реализовал подобное, но тут более красивее. Спасибо
3. lesna (lesna) 17.01.10 00:40
"Предотвращение ошибок в матеральном учете "
улыбнуло ;)
4. mastakw (mastakw) 17.01.10 11:15
(3)
:) Поправил, спасибо за внимательность.
5. Jers (Jers) 17.01.10 11:44

Если Вопрос(ТекстМ+"Продолжать ?", 4) = 7 Тогда
глНеПроводить(Контекст, ТекстМ);
Возврат;
КонецЕсли;


Нельзя такие вопросы вставлять в модуль проведения документа. Юзер на вопрос не ответил, а пошел обедать. И приплыли, работа всех других юзеров встала.

За идею - плюсик.
6. mastakw (mastakw) 17.01.10 12:29
(5)
Jers прав - Спасибо.
Посему надо добавить таймаут сек на 10-15.
исходный: Вопрос(ТекстМ+"Продолжать ?", 4) = 7
замена: Вопрос(ТекстМ+"Продолжать ?", 4, 10) <> 6

основной текст изменен.
7. mastakw (mastakw) 17.01.10 14:51
8. Борис Балясников (bb1962) 20.01.10 09:32
Не всегда можно, да и не всегда нужно вносить изменения в типовую.
Есть другой способ борьбы с подобными проблемами:
http://www.profiufa.ru/express/decrypt7.shtml
http://www.infostart.ru/public/20684/
9. mastakw (mastakw) 20.01.10 12:47
(8)
Можно обвесить конфу кучей внешних обработок ...
Но у них есть главный минус - результат будет лишь при ее выполнении, что сделать вовремя всегда забывают.
А при операциях закрытии месяца эти ошибки и так видны.
И придется Исправлять.

Уж лучше чтобы их небыло изначально.