Выгрузка в "Возмещение НДС: Налогоплательщик""




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

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

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

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

38 Comments

  1. dgolovanov

    Поставил плюс из-за солидарности — сам это рисовал квартал назад и радовался знакомству с их идиотским внутренним стандартом.

    Тут есть платная обработка на ИС, там суть другая — она, как я понял, сразу выгружает напрямую в СУБД программы, т.е. не надо мучиться с внутренним форматом файла. Возможно, так было бы проще сделать.

    Reply
  2. Alexez

    (1) dgolovanov, Спасибо, да формат крайне интересный. Потратил нормально времени, что бы разобраться.

    Reply
  3. sego75

    Спасибо попробовал все работает . Полезная вещь, хорошо облегчает работу .

    Reply
  4. Alexez

    (3) sego75, И вам спасибо что оставили комментарий.

    Reply
  5. kgp

    Маленькое замечание: {Форма.Форма.Форма(193)}: Поле объекта не обнаружено (БазоваяЕдиницаИзмерения)

    Reply
  6. Alexez

    (5) kgp, Спасибо, в ближайшее время поправлю

    Reply
  7. pepe_n

    (6) Так и не удалось поправить: Поле объекта не обнаружено (БазоваяЕдиницаИзмерения)?

    Из-за этого не работает :((

    Reply
  8. makcyta.89

    Подскажите пожалуйста что значит в этой обработке поступление это я понимаю информация по поставщикам и как ее добовлять нет кнопки

    Reply
  9. ivan3434

    не работает выдает ошибку: Поле объекта не обнаружено (БазоваяЕдиницаИзмерения)?

    Из-за этого не работает :((

    Reply
  10. Alexez

    (9) ivan3434, на выходных будет новый релиз с исправленными ошибками, скиньте мне в личку почту отправлю вам.

    Reply
  11. Alexez

    Релиз обновил

    Reply
  12. makcyta.89

    Я не могу понять почему он не потдягивает поступление мне может кто нибудь обьяснить

    Reply
  13. miksla

    Здравствуйте.

    При загрузке с контролем формата выдает такие ошибки.

    Ошибка 12. Встречено неконвертируемое значение в строке с единицами измерения. Строка 36

    Ошибка 9. Встречено неконвертируемое значение суммы. Строка 132

    Подскажите, пожалуйста, что не так?

    Reply
  14. Alexez

    (13) miksla, Можете скинуть файл который у вас получился. Я попробую его загрузить в налогоплатильщик

    Reply
  15. period

    Ашипка в запросе: Процедура ОбновитьДанныеПоКонтрактам()

    РеализацияТоваровУслугТовары.ЕдиницаИзмерения КАК ЕдиницаИзмерения,

    заменить на

    РеализацияТоваровУслугТовары.Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,

    Reply
  16. Alexez

    (15) period, спасибо поменяю

    Reply
  17. period

    Я пробежался посмотрел — мне свою переделывать надо из 2.0 в 3.0… Я вот думаю, что проще — свою 2.0 переписать под управляемое или от твоей оттолкнуться.

    Просто тогда уж до ума надо доводить — реализации брать не по датам реализаций, потому как могут быть подтвержденные остатки с прошлых периодов и неподтвержденные отгрузки с прошлых.

    То бишь, что-то вроде

    «ВЫБРАТЬ
    | ПодтверждениеНулевойСтавкиНДС.Состав.(
    |  ДокументОтгрузки.Ссылка
    | ) КАК Состав,
    | ПодтверждениеНулевойСтавкиНДС.Дата,
    | ПодтверждениеНулевойСтавкиНДС.Номер,
    | ПодтверждениеНулевойСтавкиНДС.Проведен,
    |ИЗ
    | Документ.ПодтверждениеНулевойСтавкиНДС КАК ПодтверждениеНулевойСтавкиНДС
    |ГДЕ
    | ПодтверждениеНулевойСтавкиНДС.Дата МЕЖДУ &НачалоПериода И &КонецПериода
    | И ПодтверждениеНулевойСтавкиНДС.Проведен = ИСТИНА»

    Показать

    Собирать подтвержденные отгрузки, а дальше по ним.

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

    Думать, короче, надо.

    Здорово алгоритм работы с экспортом поменялся 2.0 -> 3.0

    Поправлено:

    Думаю, для поступлений тоже нефиг голову ломать, надо брать НДСПредъявленныйРеализация0, от него уходить к поступлению, и уже там выбирать номенклатуру.

    Reply
  18. Alexez

    (17) period, обработку делал под нужны своего предприятия. То есть подойдет только для торговли.

    Reply
  19. period

    Я уже допилил, выгрузил, вроде налоговая взяла.

    Переделать много пришлось, у меня часть реквизитов (номера и даты отметок для Беларуси, номера ГТД для Таджикистана и пр.) была в доп реквизитах, работа с ними изменилась при переходе с 2.0 на 3.0.

    Сделал распределение по суммам для блока ПризнВДЭксп/НалБазаВД (там где 01 экспорт 06 беларусь) по ДоговорКонтрагента.Владелец.СтранаРегистрации.Код

    Переделал твою выгрузку поступлений, оттолкнулся от РегистрНакопления.НДСПредъявленныйРеализация0 все-таки…

    Допилить надо еще нормальную выгрузку номенклатуры сырья для красоты. У нас почему-то не требуют, я поэтому там кривовато накрутил.

    Доделаю, если интересно, покажу что получилось.

    Reply
  20. buKIN

    DEL

    Reply
  21. ivan3434

    Мне выгрузка нужна готовая рабочая а не полуфабрикат.

    Reply
  22. period

    (21) ivan3434, тут как всегда два варианта 🙂 Вот тут готовая есть всего за 8000 тыр: http://infostart.ru/public/143607/

    или полуфабрикат и напильником 🙂 У меня в адрес автора только благодарность, он все равно сэкономил мне часа три рабочего времени точно. Уж не меньше.

    P.S. автор указанной выше коммерческой в описании пишет, что убил более 20 часов. И если там реально работающее универсальное решение (не проверял), то я ему верю.

    Reply
  23. kivi-84

    Добрый день! У нас несколько организаций экспортеров. Тестировали Вашу обработку на одной из баз, где у нас прошла только одна реализация на экспорт в Беларусь. При попытке загрузки файла в Налогоплательщик пошли ошибки. Сначала заругался на строку 61 СтранаИнПарт. Там был полный адрес покупателя из Беларуси. А нужно указать только код (в нашем случае 112). Вручную в файле исправил. Далее пошла ошибка по строке 135 АдресПост. Там должен быть адрес нашего российского поставщика (который указан на строку выше НаимПост), но в файле оказался адрес белорусского покупателя. Причем похоже у налоговой какие-то строгие требования к формату адреса. Скажите, пожалуйста, можете ли Вы исправить обработку?

    Reply
  24. dgolovanov

    (23) kivi-84, насчет адреса — Адрес поставщика должен соответствовать определенной маске. Проверка в программе примитивная — наличие шести запятых.

    Reply
  25. Anna_bmw

    Оплаты не заполняются, поступления тоже, а также выгружаются все реализации, как подтвержденные, так и нет.. В общем иду к программистам на доработку )

    Reply
  26. syneco

    Как вернуть мани за эту обработку? Поступления не заполняются в БП 8.3 самая последняя версия. Также при загрузке в «Возмещение НДС:Налогоплательщик» возникает ошибка 19: встречен код страны, отсутствующий в справочнике ОКСМ. И загрузка прекращается. Для меня прога оказалась бесполезной.

    Reply
  27. user598199_serega240710

    Спасибо большое, за обработку. Все работает.

    Reply
  28. user598199_serega240710

    В чем может быть причина, при заполнении ТЗ Поступления, в предприятии, сразу очищается, а если отследить через конфигуратор, то видно, что там есть данное значение?

    Reply
  29. leobrn

    подскажите, что должно быть в СлужИнф пишет, что неправильная сумма

    Проверка формата файла…

    Ошибка 99. Неверная контрольная сумма! Строка 9.

    Возможно, файл был несанкционированно изменен.

    Окончание контроля: 12.01.2017 17:44:08.225

    Проверка формата завершена. Обнаружено ошибок: 1.

    Reply
  30. prosto_wolf

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

    Reply
  31. user735380

    (29) Владимир. При импорте файла в налогоплательщик — обратите внимание на кодировку. DOS/Windows

    И на режим разгрузки Контрольная сумма/Контроль формата.

    Reply
  32. ElenaMikulina

    Ребят, а никто не знает, случайно, «Паспорт сделки» как Код реквизита называется в налогоплательщике???

    Reply
  33. ElenaMikulina

    (26) У всех контрагентов страна должна быть выбрана из классификатора, а не которая вручную добавлена.

    Reply
  34. user735380

    (32) В соответствии с документом

    «Структура файлов на электронных носителях информации (ЭНИ), представляемых налогоплательщиками в ИФНС России

    (МИ ФНС России по КН ) и подготовленных программой

    «Возмещение НДС: Налогоплательщик»

    (версия формата 3.06)»

    Реквизит паспорт сделки

    Раздел 8 $8

    Реквизит — НомерПСд

    (Номер ПСд, открытого к контракту Н С(25) НомерПСд: <текст>)

    Reply
  35. ElenaMikulina

    (34)

    НомерПСд

    Спасибо!!!

    Reply
  36. user632992_volod-bk

    Добрый вечер. Подскажите, пожалуйста, можно ли с помощью обработки заполнить раздел 8 «Сведения о поставщиках»?

    Reply
  37. ASMIR.ru

    Добрый день! Работает ли обработка для текущей конфигурации: Бухгалтерия 3.0 (3.0.67.43)?

    Reply
  38. alina0587

    http://ick.su/info/news/sertifikat_sovmestimo_sistema_programm_1s_predp­riyatie_poluchili_produkty_vygruzka_dannykh_v_vozmeshch/

    Reply

Leave a Comment

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