Целые расчетные листки (без разрывов)




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

32 Comments

  1. legioner

    Спасибо! Полезная штука

    Reply
  2. Natalia

    Можно сделать проще, совсем без изменения кода

    Для всех строк, кроме подвальных для расчетного листка (Подвал2_1СКомп и 2Подвал2_1СКомп) ставим признак «положение на странице — вместе с последующим» — в результате разрывы в расчетных появляются только там, «где им разрешили появляться».

    Добавила плюсик — за найденную и решенную проблему ))

    Reply
  3. TachYanochka

    А у меня не получилось печатает по старому 🙁

    Reply
  4. HITDEVIL

    Если Таблица1.КоличествоСтраниц() > 1 Тогда

    {H:РАСЧЕТНЫЕ.ERT(3102)}: Поле агрегатного объекта не обнаружено (КоличествоСтраниц)

    И как можно сделать так чтоб в расчетке показывались не выходы, (которые сам добавил через конфигуратор)?

    Reply
  5. Арчибальд

    (4) Платформа какая?

    Reply
  6. HITDEVIL

    7.70.025, 293 релиз

    Reply
  7. HITDEVIL

    7.70.027 все работает. СПС.

    Только как сделать так чтоб не выходы показывались в расчетке?

    Помогите кто сможет в данной ситуации…

    Reply
  8. Одинец

    по поводу метода «КоличествоСтраниц()» в расчетных листках — видимо старый релиз платформы 1С, можно рекомендовать обновиться до 27 релиза… 😉

    Reply
  9. mastakw

    (3) Нужно подробнее. Опишите что делали.

    Reply
  10. karaw

    Молодчик! Плюсую за идею

    Reply
  11. kery

    Процедура пишет ошибку.

    Если Таблица1.КоличествоСтраниц() > 1 Тогда

    {D:ЗИК_КОПИЯEXTFORMSРАСЧЕТНЫЕ ЛИСТЫ 3.ERT(3102)}: Поле агрегатного объекта не обнаружено (КоличествоСтраниц)

    Надо с релизом 27 работать? В этом дело?

    Reply
  12. Natalia

    (11) Сделайте «положение на странице» (см (2) ) и не мучайтесь с релизами )))

    Reply
  13. mastakw

    (11) Именно, нужен 27 релиз.

    Что может удерживать от перехода на него ?

    Reply
  14. akrazan

    Мелочь, а приятно. 🙂 Плюс!

    Reply
  15. Svetlana_E

    Конечно «+»! Поставила бы и еще один ,если бы можно было, за то, что доступен «для всех» 🙂

    Reply
  16. bubliko_o

    Понадобилось, а здесь уже все готово. Спасибо!

    Reply
  17. El_Duke

    Запускается и работает без ошибок, но все равно не разбивает по листам …

    Reply
  18. mastakw

    (18)

    Проверьте Файл->Параметры страницы переключатель по ширине страницы !

    Reply
  19. Anachronizm

    (2)

    В моём случае получилось только при исключении вторых строк в секциях Подвал(стр.15) и 2Подвал(стр.42), а не Подвал2_1СКомп и 2Подвал2_1СКомп, как у Natalia. (а за наводку + 🙂 )

    Reply
  20. sin_elena

    Отчет несомненно нужный!но в моем случае с ним происходят непонятки.Через какое-то время стало печататься по 2 расчетных листа на странице.Т.е. поллиста остается пустым.Вернуться к правильному количеству листов удалось только архивированием основной конфигурации и раскрытием ее в другом каталоге.Параметры страницы одинаковые,база и сам отчет неизменные-почему тогда так происходит?

    Reply
  21. mastakw

    (21)

    Сам отчет изменений в базу данных невносит, а значит ничего ненарушает. Возможно у вас изменялись параметры принтера(менялся принтер). Помогает чистка реестра HKEY_CURRENT_USERSoftware1C1Cv77.7ИМЯ ВАШЕЙ БАЗЫ

    ! С чисткой реестра осторожнее — придерживайтесь правила: неуверен — неделай.

    Reply
  22. sin_elena

    Изумительно!Все получилось,хотя принтер уже 100 лет не менялся.Почистила реестр и все пошло как часы!Спасибо огромное!

    Reply
  23. gia2011

    Актуально. Однозначно плюс

    Reply
  24. istyak

    (2) Natalia, а как ставить положение страницы вместе с последующим?

    Reply
  25. mastakw

    (25)

    Выделить строку, далее Верхнее меню — Таблица — Положение на странице …

    Reply
  26. istyak

    (26) спасибо большое!=)

    Reply
  27. mj2008

    спасибо большое!=)

    Reply
  28. mastakw

    (27) (28) Для благодарности есть волшебный [+] 😉

    Reply
  29. нОлька

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

    Reply
  30. mastakw

    (30) «не надо ничего менять в конфигурации» пожалуйста просвятите — КАК ?

    Reply
  31. нОлька

    сервис-настройка пользователя- многостраничные отчеты- в «названии отчета» выбрать Расчетные листки, а в «Строк на странице» подобрать число. для нашего предприятия подошло 36. может в этом варианте больше тратиться бумаги при печати, но зато проще обновлять))

    Reply
  32. mastakw

    (32) Спасибо, забыл совсем про эту дополнительную обработку.

    Вот только «больше бумаги» — сильно расстраивает бухгалтеров.

    В данной обработке алгоритм просчета листов простой до смешного — обновить совсем несоставит труда.

    Reply

Leave a Comment

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