Подошло время делиться опытом и наработками, связанными в автотматизацией налогового учета. Для меня основной проблемой стала настройка НУ для нестандартных конфигураций, да и для стандартных в некоторых случаях тоже. После долгих мытарств и рисования бесконечных отчетотв по регистрам было мной и коллегами решено отмахнуться от предложенных и рекомендованных регистров и сделать регистры по принципу "строка декларации - регистр". Что получилось?
Получилась небольшая конфига, накладываемая на любую, с тремя справочниками, одним документом, одним забалансовым счетом и одним отчетом.
Справочники:
Регисты учета
Виды движений
Объекты учета
Документы:
Движения по НУ
Счет:
НАЛ Забалансовый, Количественный, Валютный
Субконто1 Регисты учета
Субконто2 Виды движений
Субконто3 Объекты учета
Отчет:
Регистры учета
Собственно дальше дело техники, в справочнике виды движений настраиваются фильтры для "выдирания" информации из документов и операций. Документом формируются движения и проводки по "НАЛ", ну и собственно потом по БИ формируется отчетность.
Хотелось бы отметить, что возможно рекурсивное формирование документа по НУ - хорошая возможность если не хватает возможностей фильтра.
Примерный код фильтра:
Реги=СоздатьОбъект("Справочник.РегистрУчета");
Об=СоздатьОбъект("Справочник.ОбъектыНалоговогоУчета");
Движ=СоздатьОбъект("Справочник.ВидыДоходовИРасходовНалоговогоУчета");
УдалитьСтроки();
Движ.ВыбратьЭлементы();
Пока Движ.ПолучитьЭлемент()<>0 Цикл
Если Движ.Регистр=Рег Тогда
Док=СоздатьОбъект(Движ.Документ);
Док.ВыбратьДокументы(НачМесяца(ДатаДок),КонМесяца(ДатаДок));
Пока Док.ПолучитьДокумент()<>0 Цикл
Если Док.Проведен()<>0 Тогда
Если Док.КоличествоСтрок()<>0 Тогда
Док.ВыбратьСтроки();
Пока Док.ПолучитьСтроку()<>0 Цикл
Если СокрЛП(Движ.Фильтр)<>"" Тогда
Если Движ.Равно=1 Тогда
Если (Строка(Док.ПолучитьАтрибут(СокрЛП(Движ.Фильтр)))=СокрЛП(Движ.ЗначениеФильтра)) Тогда
ОкФ=1;
Иначе
ОкФ=0;
КонецЕсли;
Иначе
Если (Строка(Док.ПолучитьАтрибут(СокрЛП(Движ.Фильтр)))<>СокрЛП(Движ.ЗначениеФильтра)) Тогда
ОкФ=1;
Иначе
ОкФ=0;
КонецЕсли;
КонецЕсли;
Иначе
ОкФ=1;
КонецЕсли;
Если Окф=1 Тогда
НоваяСтрока();
ДатаДвиж=Док.ДатаДок;
Если Об.НайтиПонаименованию(СокрЛП(Док.Вид()+" № "+Док.НомерДок+" от "+Док.ДатаДок+" "+Док.ПолучитьАтрибут(СокрЛП(Движ.Объект))))<>1 Тогда
Об.Новый();
Об.Наименование=СокрЛП(Док.Вид()+" № "+Док.НомерДок+" от "+Док.ДатаДок+" "+Док.ПолучитьАтрибут(СокрЛП(Движ.Объект)));
Об.Записать();
КонецЕсли;
Объект=Об.ТекущийЭлемент();
Сумма=Док.ПолучитьАтрибут(СокрЛП(Движ.Реквизит));
Если СокрЛП(Движ.Количество)<>"" Тогда
Количество=Док.ПолучитьАтрибут(СокрЛП(Движ.Количество));
КонецЕсли;
Вид=Движ.ТекущийЭлемент();
КонецЕсли;
КонецЦикла;
Иначе
Если СокрЛП(Движ.Фильтр)<>"" Тогда
Если Движ.Равно=1 Тогда
Если (Строка(Док.ПолучитьАтрибут(СокрЛП(Движ.Фильтр)))=СокрЛП(Движ.ЗначениеФильтра)) Тогда
ОкФ=1;
Иначе
ОкФ=0;
КонецЕсли;
Иначе
Если (Строка(Док.ПолучитьАтрибут(СокрЛП(Движ.Фильтр)))<>СокрЛП(Движ.ЗначениеФильтра)) Тогда
ОкФ=1;
Иначе
ОкФ=0;
КонецЕсли;
КонецЕсли;
Иначе
ОкФ=1;
КонецЕсли;
Если Окф=1 Тогда
НоваяСтрока();
ДатаДвиж=Док.ДатаДок;
Если Об.НайтиПонаименованию(СокрЛП(Док.Вид()+" № "+Док.НомерДок+" от "+Док.ДатаДок+" "+Док.ПолучитьАтрибут(СокрЛП(Движ.Объект))))<>1 Тогда
Об.Новый();
Об.Наименование=СокрЛП(СокрЛП(Док.Вид()+" № "+Док.НомерДок+" от "+Док.ДатаДок+" "+Док.ПолучитьАтрибут(СокрЛП(Движ.Объект))));
Об.Записать();
КонецЕсли;
Объект=Об.ТекущийЭлемент();
Сумма=Док.ПолучитьАтрибут(СокрЛП(Движ.Реквизит));
Если СокрЛП(Движ.Количество)<>"" Тогда
Количество=Док.ПолучитьАтрибут(СокрЛП(Движ.Количество));
КонецЕсли;
Вид=Движ.ТекущийЭлемент();
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
На приложенных скриншотах:
по адресу: http://www.justaferist.narod.ru/screenshots.gif
1. Вид справочника "Виды движений" т.е. фильтры
2. Документ "Налоговый учет"
3. Собственно сам отчет.
P.S. Настроено и работает в 14 организация, включая крупные предприятия.
