Разное → Автоматизация отчетности для ПФУ

Для подготовки отчетов по персонифицированному учету до Пенсионного фонда Украины в электронном виде используется программный комплекс “АРМ Звіт Страхувальника” (АРМ-ЗС).

На том, насколько эта программа «далека до совершенства» думаю не стоит останавливаться.

Задача состоит в том, чтоб ввести ведомости об 1980-ти сотрудниках в систему Бест-Звіт АРМ «Звіт страхувальника», с минимальными затратами времени и усилий.

Система персоніфікованого обліку - це облік і зберігання в Пенсійному фонді України переданої йому інформації про трудовий стаж, заробіток і пенсійні внески працівників. Запровадження персоніфікованого обліку дає можливість вдосконалити умови призначення пенсії та порядок обчислення її розмірів. Персоніфікований облік є одним із способів точного обліку відомостей, необхідних для реалізації права на пенсію та здійснення диференціації її розміру залежно від трудового внеску особи.

Персоніфікований облік спрямований на удосконалення чинної солідарної системи та єпідґрунтям для запровадження накопичувальної системи.

На підставі відомостей, поданих страхувальниками і громадянами, які самостійно сплачують страхові внески, в централізованому банку даних Пенсійного фонду України, на кожну застраховану особу відкривається електронна персональна облікова картка.

В цій картці накопичуються дані про заробіток за весь період трудового життя, внески до Пенсійного фонду України, відомості про стаж з усіх місць роботи та інші відомості, необхідні для правильного призначення пенсії.

Облік відомостей здійснюється згідно з Законом України «Про загальнообов’язкове державне пенсійне страхування» від 09.07.03 р. №1058-ІУ.

Дані персоніфікованого обліку за період з 1 липня 2000 року використовують для призначення та перерахунку пенсії. Зібрана інформація безпосередньо впливає на розмірпенсій (у тому числі й тих осіб, які будуть оформляти її в майбутньому). Тому вкрай важливо, щоб зібрані дані були реальними (достовірними) і відповідали вимогам законодавства.

Итак, процедура ввода разделяется на несколько этапов:

1) ввод общих данных о всех работающих сотрудниках (ФИО, идентификационный номер, период работы)

clip_image004

2) формирование списка сотрудников которые работали в отчетном периоде

clip_image005

3) ввод формы ИНДАНИ для каждого сотрудника

clip_image006

Задача не из легких, если учесть что количество сотрудников достигает 2000. Но есть один нюанс: далеко не у всех сотрудников (скажем одной специальности) заработные платы отличаются — тогда какой смысл вводить для всех одни и те же данные?

Внутренних средств для автоматизации «шаблонного ввода» в программе нету.

Я, будучи человеком в здравом рассудке «валить» 1500 форм с одинаковыми данными (только фамилии меняются) не стал, и в общем начал искать способ автоматизировать этот процесс.

Ход мыслей:

1) Все данные хранятся (как это не странно) в базе данных Firebird — ZVIT.FDB

clip_image007

Но попытки её «расковырять» на предмет возможности автоматизации — результата не принесли. Мне так и не удалось разобраться во всех хитросплетениях 201 таблицы :))

clip_image008

Куда именно и в какой связке какие данные вбивать, мне так и не удалось выяснить… (там действительно тьма :)

INSERT INTO FJ0500102_TAB1 («Code», «CardCode», «RecNo», TAB1_A1, TAB1_A2, TAB1_A21, TAB1_A31, TAB1_A3, TAB1_A41, TAB1_A4, TAB1_A5, TAB1_A51, TAB1_A6, TAB1_A7, TAB1_A8, TAB1_A81, TAB1_OZNAKA, TAB1_NNPP) VALUES (34156, 58487, NULL, 14, ‘2428011068’, NULL, 126, 105.49, 18.62, 18.62, 1, ’01’, NULL, NULL, 0, ’00’, 0, NULL);

Элементарный поиск/сравнение «а где это мои циферки тут хранятся» тоже результата не дал. Не знаю как оно что там считает, но те суммы что в документе нигде и ни в одном файле в чистом виде не хранятся.

2) второй зацепкой были встроенные функции

clip_image009

Но опять же, упоминаний как их создавать, редактировать или что то в это роде я не нашел ни в документации, ни в Интернете. Сам код процедур храниться в зашитом виде в файлике FORMS.OVL, и делает лишь то, что по месяцам проставляет количество дней, где надо 30, а где 31 :)

clip_image010

3) третью, решающую зацепку я нашел в маленьком excel-файлике

clip_image011

Который разработчики по-видимому «тупо» забросили, как пример…

clip_image012

Немножко поковыряв его и нарисовались пути решения…

Подводя итог — вот VB код который автоматизирует процесс ввода данных персонификации формы ИНДАНИ для предопределенного количества записей. Код столь же не совершенен, как и мои знания VB :) Но если возникнет необходимость в воде данных о большом количестве сотрудников, то воспользовавшись им вы сэкономите драгоценное время.

Public App As ZApplication 'Объект ЗВИТ
Public Doc As ZDocument 'Объект Документ
Public rsMain As ZDataset 'Объект Данные Документа
Public DocWin As ZDocumentWindow  'Объект Окно Документа

Private Sub TestDataSets()
    'Каждый док. под номером, проходим все…

    For i = 1 To 1546 
            Doc = App.OpenDocumentByCode(i)

        If (Doc Is Nothing) Then GoTo Line1
        Doc.CloseOnRelease = False

        rsMain = Doc.DataSets("MAIN")

        Call rsMain.Edit()

        With rsMain
        'Проверки, чтоб не загадить ненужные записи

            If (.FldVal("KPU_INN") <> Null Or .FldVal("KPU_INN") <> "") 
            And .FldVal("KPU_FAM") <> "" 
            And .FldVal("KPU_IMJ") <> "" 
            And .FldVal("KPU_OTC") <> "" 
            And .FldVal("N15") = "30" 
            And .FldVal("N16") = "09" 
            And .FldVal("N18") = "01" And .FldVal("N19") = "10" Then

                rsMain.FldVal("N12") = "1"
                rsMain.FldVal("N13") = 41.83
                rsMain.FldVal("N14") = 0.63
                rsMain.FldVal("N21") = "00"
                rsMain.FldVal("N22") = "02"

                rsMain.FldVal("A9") = 61.6
                rsMain.FldVal("B9") = 61.6
                rsMain.FldVal("D9") = 0.31
                rsMain.FldVal("E9") = 1
                rsMain.FldVal("A10") = 64.4
                rsMain.FldVal("B10") = 64.4
                rsMain.FldVal("D10") = 0.32
                rsMain.FldVal("E10") = 1

                rsMain.FldVal("A13") = 126
                rsMain.FldVal("B13") = 126
                rsMain.FldVal("C13") = 0
                rsMain.FldVal("D13") = 0.63
                rsMain.FldVal("E13") = 2

            End If

        End With

        Call rsMain.Post()

        Doc.Refresh()

        Doc.Save()

        Call CommandButton_DisConnect_Click()
Line1:
    Next i

End Sub

Private Sub CommandButton5_Click()
    Call TestDataSets()
End Sub

Скрипт работает ужасно тормозно, частенько выскакивают левые окна, мол документ с таким номером не существует (документ мог пересоздаваться, удаляться и т.д. и соответсвенно нумерация могла сбиться). Но это все мелочи и дело техники – зато работает.

Мне помогло, надеюсь и Вам поможет если вы столкнётесь с аналогичной задачей.

PS. Лень во истину двигатель прогресса. Прикрепляю модифицированный excel-файлик и файлик с описанием кодов полей — скачать