Казахстан: Как я помогал сдать 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,6k
    • 5
    Поделиться публикацией
    Ой, у вас баннер убежал!

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

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

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

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

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

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

        Самое читаемое