Обработка ЗиК 2009 + Приказ ФНС от 30.12.2008 ММ-3-3/694




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2024-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='\

31 Comments

  1. Ёпрст

    Ну и…? и чего нового в ней ?

    Reply
  2. Gorr

    1. Добавил описание;)

    2. обновил обработку в ней действие вычета 313 установил с 01.01.2008 (в первоначальном варианте было с 2009) хотя думаю это не принципиально.

    Reply
  3. OdinokC

    НДФЛ считается неправильно.

    Жду новую версию Вашей обработки.

    Очень нужна.

    Reply
  4. Gorr

    дело тут не в обработке. новые коды вычетов не прописаны в коде. для корректного расчета НДФЛ исчисленного необходимо в глобальном модуле в процедуре глСобратьДанныеДляНДФЛ заменить строку

    «ИначеЕсли ((КодВычета=101) или (КодВычета=102) или (КодВычета=106) или (КодВычета=107)) и (ДостиглиПределаДоходов=0) Тогда»

    на строку

    «ИначеЕсли ((КодВычета=101) или (КодВычета=102) или (КодВычета=106) или (КодВычета=107) или (КодВычета=108) или (КодВычета=109) или (КодВычета=110) или (КодВычета=112) или (КодВычета=111) или (КодВычета=113)) и (ДостиглиПределаДоходов=0) Тогда»

    при этом печатная форма 2ндфл за 2009 формируется нормально, а вот печатной формы 1ндфл за 2009 год с новыми кодами вычетов еще нет, придется подождать с этим до нового релиза конфигурации….

    Reply
  5. Timesoft

    (4) И правильно, что не прописаны… Приказ ФНС от 30.12.2008 ММ-3-3/694 уже вступил в силу ? Когда ?

    Reply
  6. Looking

    Зарегистрировано 19.01.2009 (рег. № 13101) и вступило в силу спустя 10 дней после дня официального опубликования.

    Reply
  7. Looking

    Правда дату официального опубликования не нашёл, кто в курсе опубликовали уже или нет?

    Reply
  8. LanaMax

    А как быть с этими изменениями:

    Доходы в виде материальной выгоды (ст. 212 НК РФ)

    Установлено, что при получении физическим лицом доходов в виде материальной выгоды от экономии на процентах по займам и кредитам, выраженным в рублях, налоговая база по НДФЛ определяется как превышение суммы процентов, исчисленной исходя из 2/3 ставки рефинансирования Центрального банка РФ, действующей на дату получения дохода, над суммой процентов, рассчитанной по условиям договора (подп. 1 п. 2).

    Reply
  9. vvf1973
  10. Gorr

    Ввиду того, что автором оригинала проекта Antia была обнаружена ошибка в релизе 284, обработка обновлена.

    Данная ошибка может сказаться, при обновлении на 286 релиз если обработка была запущена на релизе ранее 284 да и то при условии, что в 286 релизе ошибку не устранят.

    Более подробно см комментарий 58 автора оригинала проекта.

    Reply
  11. Gorr

    (8) эти изменения к предмету данной дороботки не относятся. требуется изменение конфигурации. об этом по-моему уже не раз говорилось. но если же есть желание внести изменения самомтоятельно, в этом нет ничего сложного:)

    Reply
  12. pma

    Опубликовали 04/02/2009

    http://www.rg.ru/2009/02/04/spravochniki-dok.html

    Reply
  13. Allex

    Строку:

    // УстановитьВидВычета(«103″,»400 руб. на налогоплательщика, пп.3 п.1 ст.218 НК», 400 ,40000,’01.01.2009′);

    не надо было комментировать — там предел изменился.

    И сообщения типа: «Возможно необходимо установить вид вычета …»

    Там по ходу д.б. [108 или 111] и [109 или 113], а не [110 или 111] и [112 или 113].

    В процедуре «ПриВыбореТипаЛьготы» неплохо бы еще добавить:

    ИначеЕсли ( КодВычета=»313″) Тогда

    Форма.ИспользоватьСлой(«Основной,ИмущественныеВычеты»,2);

    ОписаниеИмущественногоВычета=»Сумма, израсходованная на новое строительство либо приобретение на территории Российской Федерации «;

    ОписаниеИмущественногоВычета=ОписаниеИмущественногоВычета+»ж­илого дома, квартиры или доли (долей) в них (кроме сумм, направленных на погашение процентов «;

    ОписаниеИмущественногоВычета=ОписаниеИмущественногоВычета+»п­о целевым займам (кредитам) и фактически израсходованных на новое строительство или приобретение «;

    ОписаниеИмущественногоВычета=ОписаниеИмущественногоВычета+»н­а територии Российской Федерации жилого дома, квартиры или доли (долей) в них), в размере фактически произведенных «;

    ОписаниеИмущественногоВычета=ОписаниеИмущественногоВычета+»и­ документально подтвержденных расходов в пределах 2 000 000 руб., пп.2 п.1 ст.220 Налогового кодекса Российской Федерации.»;

    А в процедуре ПриОткрытии:

    Если РабочаяДата()>=’01.01.2008′ Тогда

    //эти вычеты действуют с 01.01.2008

    Льготы.НайтиПоКоду(«313»);

    СписокВычетов.ДобавитьЗначение(Льготы.ТекущийЭлемент(),Льготы.Код + » (» + Льготы.Наименование + «)»);

    КонецЕсли;

    Ну и контроль для 313 вычета в Процедуре ПриЗаписи и Процедуре ПриВводеСуммы, если есть желание…

    Reply
  14. LanaMax

    103 «400 руб. на налогоплательщика, пп.3 п.1 ст.218 НК» — 400 (до 40000)

    а в обработке до 20000 — почему?

    Reply
  15. Allex

    (14) Я же написал — разкомментируйте в обработке строку:

    // УстановитьВидВычета(«103″,»400 руб. на налогоплательщика, пп.3 п.1 ст.218 НК», 400 ,40000,’01.01.2009′);

    Reply
  16. Gorr

    (13) благодарю. изменения по коду 103 внесены в обработку. а вот в отношении соответствия старых кодов новым хотелось бы услышать аргументы!

    Итак мои аргументы: вычеты 108 и 111 абсолютно разные поскольку в первом случае вычет получют оба члена семьи, а во втором только один, да и суммы вычетов отличаются. тоже относится и к паре 109 113. таким образом пары из кодов 108 и 111 не получается равно как и пары из 109 113. в паре [110 111] вычет получает только один родитель и сумма вычетов одинакова, в паре [112 113] тоже что и в [110 111]+инвалидность. что и позволяет их сгруппировать именно таким образом.

    вот смотрите: имеем вычет 101 предоставлялся «на каждого» родителя здорового ребенка. в новых кодах группа «на каждого» включает 108 и 109. поскольку код 109 предоставляется на инвалида, то остается код 108. итак нашли однозначное соответствие

    101-108

    далее 102 предоставлялся «единственному» родителю здорового ребенка. в новых кодах группа «единственных» включает 110,111,112 и 113 коды. из которых 112 и 113 предоставляются на инвалида, таким образом остаются возможные коды [110 111]. итак нашли соответствие

    102-[110 111]

    далее 106 предоставлялся «на каждого» по инвалидности. в новых кодах группа «на каждого» включает 108 и 109 из которых только код 109 предоставляется по инвалидности. итак нашли однозначное соответствие

    106-109

    ну и последний код 107 предоставлялся «единственному» родителю по инвалидности. в новых кодах группа «единственных» включает 110,111,112 и 113 к котоым по инвалидности относятся только 112 и 113. итак нашли последнее соответствие

    107-[112 113], что собстно и было реализовано.

    Reply
  17. Allex

    111 это вычет не единственному родителю, а вычет одному из родителей при условии что второй вычетами на ребенка не пользуется. Раньше это был 101 вычет. Поэтому можно даже по умолчанию менять 101 на 111. А 108 это вычет на здорового ребенка в том случае, если второй родитель тоже у себя на работе написал заявление на вычет (раньше вычет мог получать только один родитель). Вот исходя из того, что второй родитель скорее всего воспользуется этой новой возможностью и напишет

    заявление на вычет (если, конечно, он работающий), потому что з/п одного родителя может и превысить 280000, и тогда получать вычеты двум родителям выгоднее, чем одному, я согласен, что надо по умолчанию менять 101 на 108.

    То же самое с парой [109,113].

    Reply
  18. Allex

    (17) А вообще то лучше даже переключатель добавить, вернее два, которые будут определять куда по умолчанию переносить 101 и 106 вычет.

    Reply
  19. Gorr

    (17) не надо ничего усложнять и мудрить!!! вычеты на детей банально делятся всего на две группы «каждому» и «одному» из возможной пары. понятия «единственному» или «одному при отказе второго» равны и относятся к группе «одному».

    101, 106, 108, 109 относятся к группе «каждому», а 102, 107, 110, 111, 112, 113 относятся к группе «одному».

    Reply
  20. slige

    «Зарплата и Кадры» Как изменить размер вычетов по НДФЛ и пределы доходов?

    *******************Официальный ответ 1С*************************

    Размеры вычетов по НДФЛ, а также величины пределов доходов для исчисления вычетов пользователь может изменить в справочнике «Виды вычетов» (меню «Справочники» — «Классификаторы» — «Виды вычетов»). Изменяемые значения являются периодическими. Поэтому прежде следует указать дату изменения значения периодических реквизитов — 01 января 2009 года. А затем в графах «Сумма вычета» и «Предел доходов для исчисления вычетов» установить размеры вычетов и соответствующих им пределов доходов, действующих с начала текущего года.

    По окончании ввода данных пользователь имеет возможность проверки произведенных действий в экранной форме «Значения периодических реквизитов». Форма открывается нажатием кнопки «История

    Reply
  21. Allex

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

    Reply
  22. nickVZ

    Чего вы спорите, горячие парни? Коды — всего лишь «сведения». Заменяйте не особенно мудрствовая. Лишь бы «суммовой» смысл подошел. Далее — дело самих расчетчиц применить конкретный код. Это последнее замечание относится к «размноживщимся» кодам. Для «101», например, жесткое соответствие со «108».

    «313» код вообще надо из обработки выкинуть: коды этой группы назначаются строго на один год, и строго по справке из ИФНС. Потому никакой «автоматической» отсебятины 😉

    Reply
  23. BIGMAG

    Gorr я долёк от з/пл. Объясни мне пожалуйста с этого места.

    Цитирую: «Для установки сотрудникам новых вычетов вручную, необходимо внести изменения в модуль формы справочника ВычетыСотрудниковПоНДФЛ:»

    сомнение «установка вычетов вручную», я правильно понял, если я выполню твои изменения в конфигурации, то мне что то ещё придется делать вручную?

    Тогда подскажи что именно?

    Или напиши мне на io2t@ya.ru по подробнее об установке всех этих изменений в з/пл.

    И ещё вопрос. У нас на предприятии есть мат.выгода тогда мне нужно выполнить следующие изменения:

    Цитирую:

    [

    (20) Anita, а что ты на счет этого скажешь (ЗиК 285)?

    ВидРасчета.МатВыгодаПоСсудам.Модуль Расчета(30):

    Если ДатаНачала >= ‘01.01.2008’ Тогда

    СтавкаЦБ=Константа.СтавкаРефинансирования.Получить(КонМесяца(ДатаОкончания))*3/400;

    Иначе

    СтавкаЦБ=Константа.СтавкаРефинансирования.Получить(Макс(Документ.ДатаДок,’01.01.2001′))*3/400;

    КонецЕсли;

    Имхо, я бы здесь тоже исправил на:

    Если ДатаНачала >= ‘01.01.2009’ Тогда

    СтавкаЦБ=Константа.СтавкаРефинансирования.Получить(КонМесяца(ДатаОкончания))*2/300;

    ИначеЕсли ДатаНачала >= ‘01.01.2008’ Тогда

    СтавкаЦБ=Константа.СтавкаРефинансирования.Получить(КонМесяца(ДатаОкончания))*3/400;

    Иначе

    СтавкаЦБ=Константа.СтавкаРефинансирования.Получить(Макс(Документ.ДатаДок,’01.01.2001′))*3/400;

    КонецЕсли;

    ]

    Ух что тоя запутался подскажи….

    Reply
  24. Gorr

    1. Вручную это значит дать возможность расчетчику устанавливать вычеты сотрудникам по мере необходимости в процессе своей нормальной работы. Обработка предназначена для тех сотрудников на которых вычеты уже были установлены до начала этого года. дело в том, что в справочнике ВычетыСотрудниковПоНДФЛ (подчинен справочнику сотрудников ) коды вычетов жестко прописаны и не отображаются все коды которые есть в справочнике ВидыВычетов. поэтому если этого не сделать, расчетчик не сможет установить новые вычеты вновь принятым работникам в этом году.

    2. Думаю, все правильно понял.

    Скоро должен выйти новый релиз (20.02.09) и если нет нужны можно просто подождать.

    другое дело будет ли в нем предусмотрена процедура для закрытия старых вычетов.

    Reply
  25. Uragan

    Как и куда установить данный файл?

    Reply
  26. idw

    Откуда информация, что 20 числа выйдет обновление ЗиК?

    Reply
  27. Nata80

    Всем доброе время суток!

    У меня возникла такая проблема. Человеку была начислена материальная помощь на рождение ребенка. А в справке 2-НДФЛ она не отражается. Что делать?

    Reply
  28. TKENA13071962

    Спасибо!

    Reply
  29. orsh

    После обновления полетели коды вычетов по детям.

    Пришлось тупо написать вот это. 🙂

    Процедура Сформировать()

    Спр=СоздатьОбъект(«Справочник.Сотрудники»);

    Спр1=СоздатьОбъект(«Справочник.ВычетыСотрудниковПоНДФЛ»);

    Спр2=СоздатьОбъект(«Справочник.ВидыВычетов»);

    Спр2.НайтиПокоду(«108101»);

    Сообщить(Спр2.Наименование);

    Спр.ВыбратьЭлементы();

    Пока Спр.ПолучитьЭлемент()=1 Цикл

    Спр1.ИспользоватьВладельца(спр);

    Спр1.ВыбратьЭлементы();

    Пока Спр1.ПолучитьЭлемент()=1 Цикл

    Если Строка(Спр1.ВидВычета)=»108″ Тогда

    Спр1.ВидВычета=спр2.ТекущийЭлемент();

    Спр1.Записать();

    Сообщить(спр);

    КонецЕсли;

    КонецЦикла;

    КонецЦикла;

    КонецПроцедуры

    Reply
  30. Gorr

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

    Reply

Leave a Comment

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