Приходный ордер М-4 для авансового отчета




Принцип обмена данными из 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='\

36 Comments

  1. gvr1978

    Круто!!!

    Очень было нужно, бухгалтер в восторге!

    Reply
  2. maxmaster

    Вещь, очень полезная, а вот для бух. 8 бы такую штуку…

    Reply
  3. Solomonoff

    Сейчас некогда, после майских праздников 😉

    Reply
  4. Хряк

    Если Докум.ПолучитьСтроку() = 1 Тогда

    Таб . ВывестиСекцию(«Шапка»);

    КонецЕсли;

    и

    Докум.ВыбратьСтроки();

    Если Докум.ПолучитьСтроку() = 1 ТОгда

    Таб . ВывестиСекцию(«Подвал»);

    КонецЕсли;

    замени на

    Если Докум.ПолучитьСтроку() = 1 Тогда

    Сообщить(Тра-та-та)

    Возврат

    КонецЕсли;

    переменные в модуле присваивай, а не тяни Докум.Субконто1.ЕдиницаИзмерения.Наименование и т.п. в таблицу

    Reply
  5. Solomonoff

    Пасиб за критику, буду исправляться….

    » Если Докум.ПолучитьСтроку() = 1 Тогда

    Сообщить(Тра-та-та)

    Возврат

    КонецЕсли;» не совсем понял…

    Reply
  6. limbo

    По строке 1 указан не материал, в форму М-4 выведен не будет

    Что-то не складывается

    Reply
  7. Хряк

    5: чего уж непонятного.

    Вместо тра-та-та так и пиши тупому пользователю, что, мол, нет у него в таблице ни одной строки и отчета ему не видать как своих ушей.

    А то пялюсь на пустую страницу…

    Reply
  8. ОльгаM

    solomonoff, после майских будет для 8,0 или для 8,1? ))

    Reply
  9. бубух

    красиво, полезно.

    Reply
  10. MohnatiyLobster

    Очень хочется иметь сабж для 1С8 🙂

    может есть гдето такое?

    Reply
  11. ОльгаM

    MohnatiyLobster. есть для 1С8.0, на клерке выложен.

    Reply
  12. sashulyT

    +1. Понадобилось, но самому было лень делать

    Reply
  13. monolit2

    Подскажите плиз, где можно найти эту штучку для 1С 8.1?

    Reply
  14. Asmir

    Подскажите плиз, где можно найти эту штучку для 1С 8.1:

    http://infostart.ru/projects/2610/

    Reply
  15. phox

    Спасибо! Как раз понадобилось =)

    Reply
  16. stalker72

    а в 1С Предприятие 7.7 комплексная, как засунуть эту штуку )

    Reply
  17. ivanovnm
  18. ivanovnm
  19. АллаБух

    а для 8.1 для «поступления из переработки» закладки «возвращенные материалы» нету М-4 ??

    Reply
  20. yjdbxjr

    Спасибочки

    Reply
  21. lena0510

    Спасибо огромное!!! Очень пригодилась форма М-4 для авансового отчета и Авизо для бухгалтерской справки. Работает отлично и легко подключить!

    Reply
  22. gva

    Отчет полезный

    единственное замечание при количество=0 выдает ошибку

    следует предусмотреть это

    в ячейке Цена поставить

    Формат(?(Докум.Количество<>0,(Докум.Сумма-Докум.НДС)/Докум.Количество,0), «Ч15.2-«)

    или в форме прописать условие

    Reply
  23. dds

    Спасибо, печ. форма реально выручила (вроде и самому ее сделать пара пустяков, но времени нет вообще)… 🙂

    Reply
  24. senta720

    Добрый день, скачала форму вставила в 1с. В печатных формах появилась строка «Авансовый отчет» — но никак не открывается??? Помогоите, очень надо

    Reply
  25. kouch

    Спасибо. Помогло.

    Reply
  26. lana_nco

    Учитывая, что работаю бухгалтером в одном лице, значительно сократилось время на документооборот. Раньше-то все ручками-ручками. А теперь все летает! Спасибо!

    Reply
  27. mega

    Все здорово. М-4 давно хотел сам писать, а здесь готовый оказался. Автору +

    Reply
  28. kouch

    Хорошая штуковина!+5

    Reply
  29. Solomonoff

    (28) kouch, спасибо. Рад что пригодилось.

    Reply
  30. yu229

    Спасибо. Получила удовольствие.

    Авансовых отчетов до 150 в квартал — раньше вешалась.

    Reply
  31. olgadogi

    тему пора закрывать

    Reply
  32. Apelsinka

    Спасибо автору , хоть все переходят потихоньку на восьмерку, но до сих пор требуются настройки для 7.7

    Reply
  33. ulas

    Полезная обработка. Без нее никак — вручную очень долго. Спасибо

    Reply
  34. Ламия

    Очень рада, что наткнулась на такую чудную вещь, спасибо.

    Reply
  35. T-Ira

    спасибо! жаль, что на товары не печатает,а только на материалы на 10 сч .

    Reply
  36. Soikalv

    Можно использовать во всех конфигурациях (УСН, Комплексная) Если в модуле переписать константы (Тип Наименование.Предприятие) — могут различаться.

    Reply

Leave a Comment

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