17 июля 2015 г.

Контролируем заполнение данных налогового учёта в документах "Операция" и "Корректировка записей регистров"

Есть в 1С:УПП два распрекрасных документа – "Операция (бухгалтерский и налоговый учет)" и "Корректировка записей регистров". Они много чего позволяют делать, в том числе ошибаться. У меня пока нет рецепта, как контролировать всё, что делают пользователи, и избегать ошибок. Решение одной из задач сейчас продемонстрирую.


Итак, условие задачи таково. Документ "Операция", как известно, позволяет вводить бухгалтерские проводки непосредственно в регистры бухгалтерии вручную. В документе имеются закладки "Бухгалтерский учет" и "Налоговый учет". На закладке "Бухгалтерский учет" вводятся проводки в регистр бухгалтерии "Хозрасчетный", а на закладке "Налоговый учет" – соответственно в регистр бухгалтерии "Налоговый". Чтобы избавить пользователя от рутины, на закладке "Бухгалтерский учет" имеется кнопка "Заполнить". При её нажатии на закладке "Налоговый учет" автоматически появляются соответствующие проводки налогового учёта. При этом все имеющиеся данные на закладке налогового учёта удаляются, то есть происходит перезаполнение. Всё хорошо, но, как известно, errare humanum est, то есть человеку свойственно ошибаться. Забывают нажимать кнопочку, забывают.

Далее будет показано, как можно напомнить забывчивым, что кроме учёта бухгалтерского существует ещё и налоговый. Кстати, всё вышесказанное относится и к документу "Корректировка записей регистров". Он позволяет вручную записывать движения в любых регистрах, в том числе в регистрах бухгалтерии. Понятное дело, не хочется корёжить типовые документы. Воспользуемся возможностями подписок на события.

Давайте создадим новый объект "Подписка на событие" и присвоим ему имя ПриЗаписиОперацииБух. В принципе, любое имя можете присвоить. В качестве источника определим типы ДокументОбъект.ОперацияБух, ДокументОбъект.КорректировкаЗаписейРегистров. Назначим событие ПриЗаписи, выбрав его из списка. И в качестве обработчика определим процедуру в общем модуле. У меня она называется ПриЗаписиОперацииБух и выглядит следующим образом.

Процедура ПриЗаписиОперацииБух(Источник, Отказ) Экспорт
   #Если НаКлиенте Тогда
   Если Не Источник.ПометкаУдаления Тогда
      ПроводкиБУ = Источник.Движения.Хозрасчетный;
      ПроводкиНУ = Источник.Движения.Налоговый;
  
      Предупредить = Ложь;
      Если ПроводкиБУ.Количество() > 0 Тогда
         НЗНалоговый = РегистрыБухгалтерии.Налоговый.СоздатьНаборЗаписей();
  
         НалоговыйУчет.ЗаполнитьДанныеНалоговогоУчетаПоБухгалтерскомуУчету(НЗНалоговый, ПроводкиБУ, Источник.Дата);   
         НалоговыйУчет.СвернутьНаборЗаписейРегистраБухгалтерии(НЗНалоговый);
   
         Если НЗНалоговый.Количество() <> ПроводкиНУ.Количество() Тогда
            Предупредить = Истина;
         Иначе
            Для каждого ПроводкаНУ Из ПроводкиНУ Цикл
               ЗНалоговый = НЗНалоговый[ПроводкиНУ.Индекс(ПроводкаНУ)];
               Предупредить = 
               ПроводкаНУ.Активность <> ЗНалоговый.Активность Или
               ПроводкаНУ.Организация <> ЗНалоговый.Организация Или
               ПроводкаНУ.ВидУчетаДт <> ЗНалоговый.ВидУчетаДт Или
               ПроводкаНУ.ВидУчетаКт <> ЗНалоговый.ВидУчетаКт Или
               ПроводкаНУ.СчетДт <> ЗНалоговый.СчетДт Или
               ПроводкаНУ.СчетКт <> ЗНалоговый.СчетКт Или
               ?(ПроводкаНУ.КоличествоДт = Null, 0, ПроводкаНУ.КоличествоДт) <> ЗНалоговый.КоличествоДт Или
               ?(ПроводкаНУ.КоличествоКт = Null, 0, ПроводкаНУ.КоличествоКт) <> ЗНалоговый.КоличествоКт Или
               ПроводкаНУ.Сумма <> ЗНалоговый.Сумма;
      
               Для каждого ЭлементСубконтоДт Из ПроводкаНУ.СубконтоДт Цикл
                  ЗНалоговыйСубконтоДтЗначение = ЗНалоговый.СубконтоДт[ЭлементСубконтоДт.Ключ];
                  Если ЗначениеЗаполнено(ЭлементСубконтоДт.Значение) Или ЗначениеЗаполнено(ЗНалоговыйСубконтоДтЗначение) Тогда
                     Предупредить = Предупредить Или ЭлементСубконтоДт.Значение <> ЗНалоговыйСубконтоДтЗначение;
                  КонецЕсли;
               КонецЦикла;
               Для каждого ЭлементСубконтоКт Из ПроводкаНУ.СубконтоКт Цикл
                  ЗНалоговыйСубконтоКтЗначение = ЗНалоговый.СубконтоКт[ЭлементСубконтоКт.Ключ];
                  Если ЗначениеЗаполнено(ЭлементСубконтоКт.Значение) Или ЗначениеЗаполнено(ЗНалоговыйСубконтоКтЗначение) Тогда
                     Предупредить = Предупредить Или ЭлементСубконтоКт.Значение <> ЗНалоговыйСубконтоКтЗначение;
                  КонецЕсли;
               КонецЦикла;
     
               Если Предупредить Тогда
                  Прервать;
               КонецЕсли;
            КонецЦикла;
         КонецЕсли;
      КонецЕсли;

      Если Предупредить Тогда
         Сообщить("Проводки НУ в документе " + Источник + ", возможно, некорректны!", СтатусСообщения.Информация);
      КонецЕсли;
   КонецЕсли;
   #КонецЕсли
КонецПроцедуры

Теперь немного поясню, как это работает. В теле процедуры есть вызов процедуры ЗаполнитьДанныеНалоговогоУчетаПоБухгалтерскомуУчету. Это процедура типовой конфигурации. Именно эта она заполняет данные на закладке "Налоговый учет", когда пользователь нажимает кнопку "Заполнить" в форме документа. Я использую ту же самую процедуру, подсовывая ей в качестве параметра временный набор записей регистра бухгалтерии "Налоговый". Затем полученные данные во временном наборе записей сравниваются с проводками налогового учёта из документа. Если находится несовпадение, процедура сигнализирует об этом пользователю, побуждая проверить, всё ли он сделал правильно. В данном примере проверка происходит, как видите, довольно примитивно. И сообщение выдаётся соответствующее. При желании процедуру можно усложнить, сделать более информативной.

Как программно создать и заполнить документ «Операция»
Как программно создать и заполнить документ «Корректировка записей регистров»

Комментировать в ВКонтакте

Комментировать в Facebook

Комментировать в Blogger

Комментариев нет:

Отправить комментарий