Доработка ERP 2 для отражения акциза при реализации подакцизных товаров (табачной продукции)
Опираясь на опыт реализации учета акцизов в УПП, решили реализовывать как можно меньшим изменением кода конфигурации.
При продаже подакцизных товаров рассчитывать и накапливать суммы акцизов, отражая их печатных формах СЧЕТ-ФАКТУРА и ТОРГ-12(особая форма). В дальнейшем собирать эти сведения для заполнения Налоговой декларации по акцизам на табачные изделия.
План решения:
В документе РеализацияТоваровУслуг добавить колонку «Акциз» в таблице "Товары", проработать ее заполнение. Сформировать проводку по акцизу. Изменить печатные формы.
1. Создание и вывод столбца "Акциз" в закладке «Товары» на форме документа.
Снимаем с поддержки только корень документа «РеализацияТоваровУслуг»
Добавляем реквизит «Акциз» в табличную часть «Товары». На форму его будем выводить программным способом, благо 1С позаботилась и добавила специальный общий модуль для шаловливых ручек, вроде наших.
Снимаем с поддержки общий модуль «МодификацияКонфигурацииПереопределяемый». В нем в процедуру «ПриСозданииНаСервере» добавляем код вызова нашей процедуры для модернизации формы документа:
Создаем общий модуль «ИТ_РаботаСДиалогами» с флагами «Сервер», «ВызовСервера». Добавляем в него процедуру:
2. Расчет и заполнение поля «Акциз» при работе на форме документа с табличной частью «Товары».
Согласно правилам расчета акцизов на табачные изделия, сумма акциза в каждой строке зависит от вида товара и его количества. В прошлой раз, при внедрении учета акцизов в 1С УПП, мы ввели регистр сведений для сохранения суммы акциза на единицу номенклатуры. Как показал практика, это было хоть и гибкое, но ошибочное решение. В этот раз пойдем другим путем, сумма акциза будет вычисляется «с нуля» каждый раз по законодательно определенным правилам уже на общее количество товара в строке.
Приступаем к форме документа «РеализацияТоваровУслуг». Нужно выявить события, которые вызываются при изменении в табличной части «Товары», а вернее ее реквизитов: «Номенклатура», «Характеристика», «Количество упаковок», «Единица упаковки». Разбор полетов показал, что 1С нам приготовила всего два переопределяемых обработчика событий, это «НоменклатураПриИзмененииПереопределяемый» и «ХарактеристикаПриИзмененииПереопределяемый». К сожалению я не нашел никаких переопределяемых процедур для перехвата события при изменений упаковки или количества упаковок (если я неправ, поправите меня в комментариях). Значит придется снимать с поддержки форму документа и вставлять вызов функции пересчета акциза в каждое из четырех событий формы:
Теперь пропишем функции, которую мы вызываем из формы документа, для расчета акциза. Для этого в глобальном модуле создаем «ИТ_АкцизКлиент». В свойствах модуля ставим флаг «Клиент (управляемое приложение)». Создаем процедуру:
Дополнительные функции «ПолучитьТвердуюСтавкуДляСигарет», «ПолучитьАдвалорнуюСтавкуДляСигарет», «ПолучитьМинимальнуюСтавкуДляСигарет», «СведенияОПодакцизнойНоменклатуре» и «ВытащитьМРЦИзХарактеристикиНоменклатуры» описывать в этой статье не буду. По их названию и так понятно что они делают.
3. Формирование дополнительной проводки Дт 90.04 Кт 68.03 в документе РеализацияТоваровУслуг на сумму акциза.
Все проводки в ЕРП2 формируются при помощи запроса.
Любой документ в ЕРП, генерирующий проводки, в модуле менеджера содержит экспортную функцию «ТекстОтраженияВРеглУчете()» . Эта функция всегда возвращает текст запроса, который при выполнении должен вернуть таблицу проводок.
Формат запроса можно подглядеть вот здесь: РеглУчетВыборкиСерверПовтИсп .ТекстИнициализации()
Более того, формируя запрос для проводок, можно обращаться к разным данным во временных таблицах. Они формируются в РеглУчетВыборкиСерверПовтИсп.ЗапросДанных(). Если быть честным, то именно эта процедура вызывается при проведении документа, а уже она собирает все необходимые данные для отражения проводок в виде запроса. (Советую посмотреть ее содержимое).
Возвращаемся к нашей функции «ТекстОтраженияВРеглУчете()» в менеджере документа «РеализацияТоваровУслуг». Добавляем строку:
В общий модуль «ИТ_АкцизСервер» добавляем функцию формирования текста запроса для нашей проводки.
Все, проводка готова.
4. Дорабатываем печатную форму С/Ф.
Такие печатные формы как Счет-Фактура или Торг-12 вынесены в отдельную обработку «ПечатьОбщихФорм». Для ее доработки снимаем ее корень с поддержки.
Находим в модуле менеджера процедуру «ЗаполнитьТабличныйДокументСчетФактура()». Там ищем часть кода, где заполняется параметр печатной формы «акциз» примерно такой:
и меняем участок кода на:
И тут есть небольшая проблема. В качестве передаваемой переменной «СтрокаТовары» передается не строка из табличной части «Товары», а строка результата запроса с выборкой из табличной части «ВидыЗапасов».
Сначала я хотел вклиниться в этот запрос, формирующий список строк, но этот запрос использовался во многих местах и количество вмешательств в конфигурацию было слишком велико. Решил эту проблему путем преобразования строки «ВидыЗапасов» в строку «Товары» в своей процедуре. Уверен, что так делать не правильно, но нашу задачу это решило. Итак, добавляем в наш общий модуль «ИТ_АкцизСервер» функцию:
Аналогичным способом меняет ТОРГ-12., правда в унифицированной форме акциза нет, пришлось дорисовывать в отдельный макет.