Конвертация файла 2-НДФЛ 2009 года в 2010




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

71 Comments

  1. sergey-201

    у меня {ВнешняяОбработка.Конвертер2НДФЛ}: Переменная не определена (СправкиПоНДФЛ)

    Управление производственным предприятием, редакция 1.2 (1.2.35.1)

    Reply ↓
  2. СергейКа

    (1) Исправил, перезалил обработку.

    Reply ↓
  3. e.kogan

    Спасибо, говорят, работает 🙂

    Эх, на три часа бы раньше — не пришлось бы вчера шаманить между 3мя версиями «Налогоплательщика»…

    Reply ↓
  4. СергейКа

    (3) Гм. Так вчера сделал и выложил 🙂

    Reply ↓
  5. UV2

    также работает с выгрузкой из ЗиК, правда пришлось чуток изменить типовую «ПодготовкаСведенийДляИМНС»… вовремя ЗиК не сделают — есть запасной вариант!

    Reply ↓
  6. СергейКа

    (5) Ну, подготавливалась с таким умыслом, что бы корректно обрабатывала выгрузку откуда угодно.

    Теоретически хоть выгруженный файл из старых налогоплательщиков.

    Кстати, при конвертации заменяет так же старые коды имущественных вычетов на новые, а не просто меняет формат.

    Возможно, что некоторые файлы обработать не сможет, но тут уж… Делалась на конкретных примерах выгрузок.

    Reply ↓
  7. folga1979

    эта обработка 8-ки? А для 7-ки есть?

    Reply ↓
  8. СергейКа

    (7) Увы. На текущий момент с 7.7 не работаю. Только в случае заказа …

    Reply ↓
  9. Shtyr

    Скажите, а должны переноситься коды и суммы вычетов, которые перечисляются в таблице доходов справки 2-НДФЛ, а не в конце в разделе 4?

    У меня в исходном файле указано так:

    <ДохВыч>
    <НомМес>11</НомМес>
    <КодДоход>1530</КодДоход>
    <СумДоход>28513.23</СумДоход>
    <КодВычет>201</КодВычет>
    <СумВычет>30285.13</СумВычет>
    </ДохВыч>
    

    А получается вот так:

    <ДохВыч>
    <СвСумДох Месяц=»11″ КодДоход=»1530″ СумДоход=»28513.23″ />
    </ДохВыч>
    

    т.е. сведения о 201-м вычете теряются, а в разделе социальных и имущественных мы его отражать не должны.

    Пытался смотреть структуру форматов в макетах — там вроде бы все правильно описано…

    Reply ↓
  10. chmv

    а для 7-ки

    Reply ↓
  11. СергейКа

    (9) Если не трудно, возможно файл исходного примера в личку ?

    Просто на практике мне такие вычеты не попадались. Возможно некорректно обработалось.

    (10) Увы…

    Reply ↓
  12. Shtyr

    (10) На самом деле какая разница, под какую платформу обработка? Я свой файл выгружал из 1С 7.7, запускал эту обработку в 8.1 и там конвертировал в новый формат файла, который и планируем отправлять в налоговую после проверки…

    Reply ↓
  13. СергейКа

    (12) Ну, некоторые просто даже не хотят заморачиваться с 8-кой. Им легче с 3-мя налогоплательщиками извратиться 😀

    Reply ↓
  14. KaNadi

    Большое Вам человеческое СПАСИБО!!!! Отчет принят 😀

    Reply ↓
  15. ollj

    А как эта программа работает. Скачиваешь и что дальше. Я выгрузила файл в формате 2009г из 1С8 и что с ним делать.У меня программа не открывается.

    Reply ↓
  16. СергейКа

    (15) Открываете через «Файл — Открыть» в любой конфигурации на платформе 8.1

    Указываете какой файл конвертировать.

    Указываете в какой каталог будет помещен указанный файл.

    Выполняете.

    Всё, проверяете результат.

    Reply ↓
  17. Ish_2

    (16) Не понял. А ЗУП 2.5.31.4 не позволяет выводить данные в нужном формате ?

    Reply ↓
  18. СергейКа

    (17)

    Позволяет. 🙂

    Однако:

    1) не все ведут учет в ЗУП, а данная обработка не привязана к конфигурации.

    2) даже если в ЗУП, то не все еще обновлены на текущую версию. Некоторые еще на очень старых сидят.

    3) в релизе 31.4 официально признанная ошибка обработки вычетов к доходам с кодами 1530. Собственно, последнее обновление этой обработки к этим вычетам тоже относится.

    Reply ↓
  19. Ish_2

    (18) Ок . Спасибо.

    Reply ↓
  20. Nata61

    У нас теряется ссылка на 503-вычет(Аналогично 203 у пользователя Shtyr).Как выйти из этой ситуации?

    Reply ↓
  21. СергейКа

    (20) Можете пример файла в личку?

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

    Reply ↓
  22. Арчибальд

    (7)(10) Это ко мне.

    Reply ↓
  23. rajja@rambler.ru

    Добрый день,

    Большое спасибо за конвертер.

    Reply ↓
  24. 300763@mail.ru

    Огромная человеческая благодарность разработчику! Дай бог Вам всего самого лучшего!

    Reply ↓
  25. СергейКа

    (24) Спасибо конечно. Приятно что пригодилось, для этого и выкладывалось.

    Только мне непонятно что действительно еще актуально? 🙂

    Делалось именно потому что другими средствами не было возможности сделать на тот момент. Сейчас же есть несколько различных вариантов…

    Reply ↓
  26. 300763@mail.ru

    Актуально. В 1С 8.1 ещё нет обновления, чтоб сдать отчетность, а ждать не охота, охота сдать и забыть до след. года….:)

    Reply ↓
  27. Николай

    Что-то обработка кушает <АдрИНО> (Адрес проживания за пределами РФ). Не кто не проверял?

    Reply ↓
  28. СергейКа

    (27) Не должна. Проверялась на своих файлах (такие тоже есть) — было всё нормально. Если адрес пропал, то значит структура исходного файла чем-то отличается.

    Reply ↓
  29. Surprising

    Арчибальд,

    Пожалуйста, конвертацию для 7-ки… уже сдавать пора, не хочется тянуть до последнего.

    Reply ↓
  30. Диадох

    Ваша обработка ещё актуальна 🙂

    Есть сторонняя программа, которая умеет выгружать лишь в формате 2009 года, и к тому же без разбивки на ОКАТО и КПП.

    Дак вот, если в одном файле разные ОКАТО и КПП, то после конвертации Вашей обработкой они во всех справках становятся одинаковыми. По-моему берет из первой справки и везде такие коды и ставит.

    Т.к. код закрыт, обращаюсь к разработчику, можно поправить ?

    Налогоплательщик-2010 может загрузить файлы старого формата, разбив по ОКАТО и КПП. Но файл у нас огромный и налогоплательщик часа 2 его обрабатывает, а потом не меньше выгружает. К тому же хотелось бы иметь один файл на выходе, только в новом формате. А на ОКАТО и КПП разобем другим способом.

    Reply ↓
  31. СергейКа

    (30) Вы можете приложить пример такого файла?

    Могу сделать и разбивку сразу на несколько файлов…

    Кстати, будь даже код открыт, изменить достаточно сложно. Код усложняется минимум на 30% 🙂

    Reply ↓
  32. Диадох

    (31) Ну если код усложняется на 30%, то не буду напрягать. Тем более что в таком Вашем варианте тоже есть свои плюсы.

    После Вашей обработки можно сделать проверку в налогоплательщике одного файла, это удобнее и быстрее, чем 100 штук проверять 🙂

    А если в файле будут разные коды, то проверка в налогоплательщике не пройдет.

    Спасибо!

    Reply ↓
  33. СергейКа

    (32) 😀

    Ну почему же, если очень надо, то сделаю 🙂

    Если в личку файл примера сегодня — завтра утром будет переделанная обработка, с разбивкой по кодам и файлам.

    Увы, просто под рукой файлов похожих сейчас нет.

    Reply ↓
  34. Диадох

    (33) Если Вам не трудно, то сделайте.

    К сожалению, пример не могу выслать, конфиденциально 🙂

    Но суть примера лишь в том, что в справках разные ОКАТО и КПП.

    Т.е. в любом своем файле поставьте в какой-нибудь справке ОКАТО и/или КПП от «фонаря», вот и всё.

    После обработки эти коды должны сохраниться.

    Сейчас же они все становятся одинаковыми, по-моему по кодам первой справки.

    Т.е. ОКАТО и КПП нужно переносить в новый формат точно также, как и ФИО например, а не приравнивать к одному значению.

    А разбивку на разные файлы можно и не делать, ведь суть обработки в конвертации в новый формат. И если в старом коды переплетаются, то пусть и в новом так будет.

    Reply ↓
  35. СергейКа

    (34) Поскольку файл не предоставили, тогда и тестировать Вам 🙂

    «От фонаря» не получится, поскольку коды формируются по определенному алгоритму.

    Новый вариант пока прикрепляю к этому сообщению.

    Reply ↓
  36. Surprising

    Люди! Ну неужели нет для 7-ки? Помогите, пжлста, уже очень хочется!

    Reply ↓
  37. света1969

    а на 8.2 не работает? горююююююююююююююююю

    Reply ↓
  38. СергейКа

    (37) Работает. Сначала откройте её в конфигураторе, сконвертируйте и дальше заускайте как обычно.

    Reply ↓
  39. boks

    А у нас не приняли, из протокола:

    Путь к реквизиту: СвНА /СвНАФЛ / @Имя

    Значение элемента:

    Текст ошибки: Недопустимое значение элемента

    И в сконвертированном файле: <ФИО Фамилия=»» Имя=»» />

    Reply ↓
  40. СергейКа

    (39) А вы уверены что в исходном файле всё нормально?

    Скорее всего этих данных там и не было…

    Reply ↓
  41. boks

    В исходном файле есть, но выглядит иначе:

    <ФИОФЛ>

    <Фамилия>Иванов</Фамилия>

    <Имя>Иван</Имя>

    <Отчество>Иванович</Отчество>

    </ФИОФЛ>

    Я ссылка на исходный файл в личке.

    Reply ↓
  42. СергейКа

    Ошибка исправлена. + добавлен новый функционал.

    Reply ↓
  43. boks

    Файл в налоговой приняли, спасибо за оперативную помощь ! 🙂

    Reply ↓
  44. evgenyivanov

    Конвертер2НДФЛ.epf

    Реестр, файл хорошо, а как сами справки 2-НДФЛ распечатать? Если есть бесплатная программу, чтобы файл распечатывала, пожалуйста, дайте ссылочку

    Reply ↓
  45. СергейКа

    (44)

    А в чем проблема?

    Старые периоды в типовой нормально работают. Для новой формы тут же бесплатная поя обработка выложена (типовая с ошибками пока)… Или что-то другое в виду имелось?

    Reply ↓
  46. Karlos

    А нельзя ли галочку в форму добавить, чтобы в

    <СГДНалПер СумДохОбщ=»89982.59″ НалБаза=»63982.59″ НалИсчисл=»8318″ НалУдерж=»8318″ НалПеречисл=»0″ НалУдержЛиш=»0″ НалНеУдерж=»0″/>

    БЫЛО

    НалУдерж=»8318″ НалПеречисл=»8318″

    совпадали по суммам, т.е. что удержано, то и перечислено

    Reply ↓
  47. Karlos

    Сорри, Только заметил, что это не актуально и надо заполнять с 2011 года

    Reply ↓
  48. narh

    Исчезает АдрИНО… Приложил исходный файл и файл-результат

    Reply ↓
  49. СергейКа

    (48) Разобрался, исправлено.

    Reply ↓
  50. :Lana:
    СергейКа пишет:

    (37) Работает. Сначала откройте её в конфигураторе, сконвертируйте и дальше заускайте как обычно.

    А как обычно?

    Объясните для «особо одаренных»?

    В Конфигураторе открываем папку через файл-открыть, а дальше? Действия?

    Reply ↓
  51. СергейКа

    (50) Добавил этапы конвертации в версию 8.2 пошагово, в описание.

    Reply ↓
  52. :Lana:

    Все сделала как написали…

    Дошла до пункта 5., открываю, а меня спрашивает программа с помощью чего открыть… если нажимаю, то что предлагается , то открывается обычная 1с… что не так у меня происходит?

    Reply ↓
  53. :Lana:

    Все, спасибо, уже не надо… 😀

    В 1С вышло обновление, уже скачала, все работает!

    Reply ↓
  54. Диадох

    Сергей, добрый день!

    Обнаружил ошибку в обработке:

    не всегда переносятся имущественные вычеты.

    А именно, если нет стандартных вычетов, а только имущественные, то они не переносятся.

    Если стандартные есть, то все нормально.

    Т.е. если есть блок <СтандВыч>, а после него идет блок <ИмущВыч>, то всё переносится.

    Если же блока <СтандВыч> нет, то и <ИмущВыч> пропускается.

    Может ошибка не совсем в этом, но я такую закономерность уловил.

    Посмотрите пожалуйста, очень надо.

    Прилагаю файл, в котором не переносится имущ. вычет.

    Спасибо!

    Reply ↓
  55. СергейКа

    (54) Не встречал такого в практике, исправил.

    Reply ↓
  56. Диадох

    (55) Спасибо, проверю.

    У меня тоже изначально такого не попадалось.

    Я же Вашу обработку своей обработкой проверял :), всё правильно переносило.

    А тут новый файл подкинули огромный, и вылезли расхождения по 5-ти справкам 🙂

    Reply ↓
  57. Диадох

    (55) Проверил, все нормально.

    Больше ошибок не обнаружено, спасибо!

    У меня вопрос: я скачал обработку и проверил её до того, как в описании к обновлению появился пункт 2:

    «2. Мелкие косметические исправления модуля.»

    Я так понимаю на правильность работы не влияет ?

    Reply ↓
  58. СергейКа

    (57) Необязательно.

    Там просто кое-в чем поправил модуль для подготовки к возможным изменениям в дальнейшем (пока не решил делать ли их) и обкатка паранойи 😀

    Кстати, to all:

    Если закачивали обработку между 17 часами вчера и сейчас — перекачайте, выкладывал не ту версию. Поправил 😳

    Reply ↓
  59. Диадох

    Сергей, приветствую!

    Ещё нашел ошибку в обработке, опять по имущественным вычетам.

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

    Но может и в другом причина: в моих файлах несколько таких примеров с 2-мя имущ.вычетами, сначала идет код 311, потом 312.

    Т.е. либо 312 не переносится, либо от кода не зависит, а переносится просто один первый вычет.

    Посмотрите пожалуйста.

    Файл прилагаю.

    Reply ↓
  60. СергейКа

    (59) Да ставится только первый.

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

    Кроме того, в соответствии с Приказом ФНС РФ от 17.11.2010 N ММВ-7-3/611@ «Об утверждении формы сведений о доходах физических лиц и рекомендаций по ее заполнению, формата сведений о доходах физических лиц в электронном виде, справочников» , в разделе 4, указано о подаче сведений об имущественном вычете в единственном числе.

    Так что, делать этот момент не вижу смысла. Либо у вас не правильные данные, либо какая-то специфика, с которой я не знаком.

    Разве только что для вас отдельно…

    Reply ↓
  61. Диадох

    (60) Спасибо за разъяснения.

    Почему-то мне дали такой файл 2009 года, буду разбираться.

    Reply ↓
  62. 90Vlad

    Спасибо, что поделились. Удобно.

    Reply ↓
  63. Гобсек

    Благодаря этой утилите я сэкономил как минимум один рабочий день.

    Reply ↓
  64. Sephiroth

    СергейКа,

    Спасибо за обработку, но у меня с ней есть проблемы.

    при конвертации с галкой разделять по ОКАТО — формируется 4 файла в новом формате. 2 из них проверку не проходят с формулировкой Ошибка в элементе верхнего уровня документа. В обоих этих файлах НЕрезиденты РФ, соответственно вижу проблему в этом, но пока не понимаю — проблема в исходном файле или в обработке. В общем, подскажите куда копать.

    Reply ↓
  65. СергейКа

    (64) Если не боитесь, пришлите в личку проблемный файл. Можно через любой обменник.

    Reply ↓
  66. Smeyana

    Отличный конвертор! Спасибо автору 🙂

    Reply ↓
  67. Sephiroth

    (65)всё, разобрались, нашли ошибки. Всё как обычно — косяк бухгалтера, а я на этот файл трачу времени больше, чем она. Пойду завтра, придушу. Ещё раз спасибо за обработку.

    Reply ↓
  68. tvaleshina

    Спасибо!

    Reply ↓
  69. crn

    хорошая прога

    Reply ↓
  70. m818rt

    Спасибо за обработку!

    Reply ↓
  71. antowka

    Спасибо за обработку! Помогла

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *