Казахстан: Как я помогал сдать 100 форму налоговой отчетности. Начало 200 форма

    Приветствую социум! Давным-давно (пару дней назад числа 25 марта), в далекой-далекой галактике (в Алматы, Казахстан)…

    Моя знакомая, бухгалтер, позвонила мне со словами:

    " — Привет Ринат! Ты же увлекаешься программированием! Я тут устроилась на новую работу, в ТОО-шку. За прошлый год тут сменилось несколько бухгалтеров по налогам. А мне нужно сдать годовой отчет. Я продление уже запросила, и у меня есть месяц чтобы разобраться в цифрах. Я то конечно разберусь, за недельку, но не факт что все будет правильно. Помоги. Нужно немного автоматизировать проверку уже сданных деклараций."

    Я не долго думая решил помочь, девушка то не плохая, а иногда и полезная, в прикладном смысле.

    И вот тут меня ждала засада…
    Ремарка к статье: Всего будет 3 статьи, 200 форма, 300 форма и учет счет фактур.

    trouble:

    Системы автоматизации бухгалтерского учёта такие как 1С: Предприятие, показывают ситуацию в целом никак не связывая ее со сданными налоговыми декларациями. Они могут создать файл для импорта в действующие онлайн сервисы, но проверить правильно ли сдана отчетность не могут.

    problem solution:

    Пришлось изучить азы бух учета.

    У нас в Казахстане с 2009 года налоговые декларации можно сдать в онлайн режиме. Есть два варианта:

    1. Кабинет налогоплательщика
    2. Система Обработки Налоговой Отчётности (далее по тексту СОНО)

    Для ТОО имеются несколько режимов налогообложения:

    • Общеустановленный порядок налогообложения;
    • На основе упрощенной декларации;
    • Специальный налоговый режим для юридических лиц.

    Мне был нужен Общеустановленный порядок налогообложения.

    При этом режиме сдаются три основных вида деклараций, в большинстве своем, также как и в моем случае:

    100.00 Декларация по корпоративному подоходному налогу
    200.00 Декларация по индивидуальному подоходному налогу и социальному налогу, по гражданам Республики Казахстан
    300.00 Декларация по налогу на добавленную стоимость

    100 форма сдается раз в год.
    200 и 300 формы сдаются раз в квартал.

    Мне нужно было дать сводную по 200 и 300 формам.

    Первым делом я начал искать API для доступа к онлайн сервисам. К сожалению в обслуживающей портал компании ни какого API никогда не существовало. Замкнутая система. Можно запросить публичные данные о налогоплательщике, но декларации к сожалению не получится.

    Так как я не ищу легких путей, решил хватит открытого поиска.

    Зашел в «Кабинет налогоплательщика» и выгрузил все 200 формы для начала работы.

    Как выглядит 'Кабинет налогоплательщика'



    В итоге получил 5 деклараций за 2016 год. 4 очередных и 1 дополнительную. Декларации выгрузились в xml формате.

    Как это выглядит



    Основной элемент в этом xml это fno.

    <fno code="200.00" version="26" id="83970683" documentId="304374645967031219" formatVersion="1">

    Тут нужно выделить два свойства:

    var version =  "26";
    var formatVersion = "1";
    

    Остальные свойства мне не нужны, так как от них внутренняя структура не меняется. После проверки всех xml 200 формы, я обнаружил что в них имеются два значения version, это «25» и «26». А formatVersion только одно значение, «1».

    Далее уточнив у знакомой(далее заказчик), какую именно информацию ей нужно из 200 форм я приступил к написанию кода. Кстати, заказчик изменил начальное тех задание, и вместо одной ТОО-шки попросил написать код для учета нескольких ТОО-шек.

    Понятия РНН, ИИН и прочие бухгалтерские сокращения
    Регистрационный номер налогоплательщика (РНН)
    Индивидуальный Идентификационный Номер (ИИН)
    бизнес-идентификационный номер(БИН) полный аналог ИИН для бизнеса.
    Индивидуальный подоходный налог (ИПН)
    Обязательные пенсионные взносы(ОПВ)
    Обязательные профессиональные пенсионные взносы(ОППВ)
    Социальный налог(СН)
    Социальные отчисления(СО)

    Я решил сделать фильтрацию по ИИН/БИН и РНН. Они заложены внутри xml:

    <field name="iin">Здесь ИИН или БИН лица сдавшего декларацию</field>

    Тех задание по полям по которым требуется сводная:

    ИИН
    РНН
    Квартал
    Год сдачи (да, да Заказчик решил если все получится и по прошедшим периодам пройтись чтобы все привести в порядок)
    Дата сдачи отчетности.
    ИПН(сумма по декларации)
    ОПВ(сумма по декларации)
    ОППВ(сумма по декларации)
    СН(сумма по декларации)
    СО(сумма по декларации)
    Вид декларации.

    Для начала создаю элементы:

    <input type="file" id="file" onchange="seeXML();">
    

    Изучив структуру подачи требуемых для сводной данных по версиям 26 и 25, понял что именно в подаче этих данных разницы нет.
    Данные name поля
    ИИН iin
    РНН rnn
    Квартал period_quarter
    Год сдачи period_year
    Дата сдачи отчетности. submit_date
    ИПН(сумма по декларации) field_200_00_001_4
    ОПВ(сумма по декларации) field_200_00_002_4 + 
    field_200_00_004_4
    ОППВ(сумма по декларации) field_200_00_003_4
    СО(сумма по декларации) field_200_00_005_4 +
    field_200_00_006_4 + 
    field_200_00_007_4
    Вид декларации. field_200_00_008_4 +
    field_200_00_009_4

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

    var frame = document.createElement("IFRAME");
    function getValue(a,b,fnoVersion = "25",fnoFormatVersion = "1") {
        try {
            switch(true) {
                case((fnoVersion == "25")&&(fnoFormatVersion == "1")):
                    return frame.contentWindow.document.querySelector("form[name='form_200_0" + a + "'] field[name='" + b + "']").innerHTML.split("<")[0];;
                    break;
            }
            return "";
        } catch (ex) {
            return "";
        }
    }
    
    
    function seeXML() {
        var fno = {};
        if (document.querySelector("#file").files.length < 1)
            return;
    	var fReader = new FileReader();
    	fReader.addEventListener("load", function(){
            frame.contentWindow.document.documentElement.innerHTML = fReader.result;
            fno["iin"] = getValue(0,"iin");
            fno["rnn"] = getValue(0,"rnn");
            fno["period_quarter"] = getValue(0,"period_quarter");
            fno["period_year"] = getValue(0,"period_year");
            fno["submit_date"] = getValue(0,"submit_date");           
            fno["ipn"] = (getValue(0,"field_200_00_001_4") - 1) + 1;                         
            fno["opv"] = (getValue(0,"field_200_00_002_4") - 1) + (getValue(0,"field_200_00_004_4") - 1) + 2;                          
            fno["oppv"] = (getValue(0,"field_200_00_003_4") - 1) + 1;                       
            fno["sn"] = (getValue(0,"field_200_00_005_4")) - 1 + (getValue(0,"field_200_00_006_4") - 1) + (getValue(0,"field_200_00_007_4") - 1) + 3;                         
            fno["so"] = (getValue(0,"field_200_00_008_4") - 1) + (getValue(0,"field_200_00_009_4") - 1) + 2;                     
            switch(true) {                                    
                case (getValue(0,"dt_main") == "true"):
                    fno["dt"] = "dt_main/первоначальная";
                    break;
                case (getValue(0,"dt_regular") == "true"):
                    fno["dt"] = "dt_regular/очередная";
                    break;
                case (getValue(0,"dt_additional") == "true"):
                    fno["dt"] = "dt_additional/дополнительная";
                    break;
                case (getValue(0,"dt_notice") == "true"):
                    fno["dt"] = "dt_notice/дополнительная по уведомлению";
                    break;
                case (getValue(0,"dt_final") == "true"):
                    fno["dt"] = "dt_final/ликвидационная";
                    break; 
            }
            console.log(fno);
    	}, false);
    	fReader.readAsText(document.querySelector("#file").files[0]);
    }
    

    Далее с этим объектом можно делать все что угодно. Кому как нравиться а я сделал маленькую систему учета сданных деклараций по 200 форме.

    В итоге что у меня получилось, я не дизайнер, по визуализации не ко мне.




    p.s. Заказчик начал писаться от радости при виде хотя бы такого учета сданных форм.
    p.p.s. А вот с формой 300 я очень сильно намучился.

    2 статья здесь
    • +13
    • 5,1k
    • 5
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 5
    • –1
      к черту код, код мы все тут умеем рассказывать и показывать,
      напишите лучше что у вас с девушкой вышло в итоге — вот что действительно интересно! :)
      • 0
        так он же намекнул
        Заказчик начал писаться от радости
        • +1
          Это-то понятно. А в прикладном смысле?
      • +1
        Хм… Не знаю как конфигурации 1С адаптированные для Казакстана (последний раз сталкивался с ними очень давно), но Российские вполне могут проверять отчетность (её разделы) по контрольным соотношениям и пересчитывать при ручном изменении данных. А список отчетов (и их состояний) прекрасно хранится в системе.
        • +1
          Спасибо за комментарий Andre_Sk.

          Здесь о чем речь идет. Сдается вначале одна декларация. бухгалтер пересчитывает через некоторое время контрольные цифры меняются и у него получается, что нужно сдавать дополнительную декларацию для корректировок цифр.

          В 1С можно сохранить определенный отчет, но когда по предыдущим периодам фактическая ситуация меняется, привезли документы через полгода например, а принимающая сторона их давно подписала, но сами документы попали в компанию намного позже. Вот тогда и наступает ситуация как у моей знакомой. Не известно что сдано, правильно ли сдано и как отразится годовой отчет если предыдущие отчеты требуют корректировок.Казахстанская 1С не может сгенерировать дополнительную отчетность получив информацию с онлайн портала.

          Да и то что я сделал тоже не может.

          Мой код просто объединяет все декларации и из них генерирует сводные отчеты. В 1С храниться информация по текущему состоянию компании из всей имеющейся информации на данный момент времени.В моей системе по текущему состоянию сданной отчетности.

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.