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

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 не будет опубликован. Обязательные поля помечены *