Удобные фильтры в журнале документов 1С 8.1




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

13 Comments

  1. anton.fly7

    +++ за оформление 🙂 супер!

    Reply
  2. s_a_r_u_m_a_n

    однозначный + за оформление 😀

    Reply
  3. Jahongir

    Я прошу прошение, только учусь. Не подскажите как этим пользоваться? Где его открыт в конфигураторе или в режиме предприятие.

    Reply
  4. finder

    Тут описан ход установки для ручного прикручивания к любому списку

    Инструкция

    Reply
  5. slimper

    (0) Количество хорошо, а итоговая сумма?

    Reply
  6. finder

    Новый релиз Finder81_v2.cf:

    — добавил расчет суммы;

    — ускорил расчет количества;

    Запрос для ускорения расчета взял здесь

    http://infostart.ru/public/70227/

    Reply
  7. Serj1C

    Видяха — супер!

    Reply
  8. Bux2

    Плюс.

    Добавьте фильтр по виду документа — ещё удобнее будет.

    Жаль, что 1С не стремится улучшать пользовательские функции.

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

    Аплодисменты за оформление.

    Reply
  9. tormozit

    Не смотря на красивое оформление, предложенное решение очень непрактично, т.к. обновлять таким образом доработанные формы будет довольно тяжело. Попробуй сделать встраивание своих элементов управления динамически. Тогда практичность вырастет в разы.

    Reply
  10. Log_in

    аха, мне тоже понравилась и идея и оформление. остается учесть пожелание tormozit.

    спасибо.

    Reply
  11. cool.yju

    (0) Попробуй с помощью http://www.infostart.ru/public/22147/ сделать динамическую форму как подсказал (11)

    Reply
  12. finder

    Спасибо за совет!

    Полностью согласен на счет практичности. Было бы круто, если бы можно было запустить инсталляшку и все формы одним махом оснащаются фильтрами. Кто знает способ, подскажите…

    Сейчас делаю форму динамической, все получается. Элементы управления появляются и работают. Одно не могу понять, как программно освободить место сверху и снизу… ДокументСписок постоянно разъезжается на весь экран (почему-то не отрабатывает изменение свойства Верх)

    Reply
  13. finder

    Если в новом году Вы открыли журнал и увидели ошибку, необходимо подправить процедуру УстановкаТекущегоМесяцаГода()

    Исправление процедуры УстановкаТекущегоМесяцаГода()

    Процедура УстановкаТекущегоМесяцаГода()

    ТекущийГод = Год(ДатаПоследнего());

    НомерТекущегоМесяца = Месяц(ДатаПоследнего());

    ЭлементыФормы.Год.Значение = Лев(ТекущийГод,1)+Прав(ТекущийГод,3);

    Если НомерТекущегоМесяца = 1 Тогда

    ЭлементыФормы.Месяц.Значение = «Январь»;

    ИначеЕсли НомерТекущегоМесяца = 2 Тогда

    ЭлементыФормы.Месяц.Значение = «Февраль»;

    ИначеЕсли НомерТекущегоМесяца = 3 Тогда

    ЭлементыФормы.Месяц.Значение = «Март»;

    ИначеЕсли НомерТекущегоМесяца = 4 Тогда

    ЭлементыФормы.Месяц.Значение = «Апрель»;

    ИначеЕсли НомерТекущегоМесяца = 5 Тогда

    ЭлементыФормы.Месяц.Значение = «Май»;

    ИначеЕсли НомерТекущегоМесяца = 6 Тогда

    ЭлементыФормы.Месяц.Значение = «Июнь»;

    ИначеЕсли НомерТекущегоМесяца = 7 Тогда

    ЭлементыФормы.Месяц.Значение = «Июль»;

    ИначеЕсли НомерТекущегоМесяца = 8 Тогда

    ЭлементыФормы.Месяц.Значение = «Август»;

    ИначеЕсли НомерТекущегоМесяца = 9 Тогда

    ЭлементыФормы.Месяц.Значение = «Сентябрь»;

    ИначеЕсли НомерТекущегоМесяца = 10 Тогда

    ЭлементыФормы.Месяц.Значение = «Октябрь»;

    ИначеЕсли НомерТекущегоМесяца = 11 Тогда

    ЭлементыФормы.Месяц.Значение = «Ноябрь»;

    ИначеЕсли НомерТекущегоМесяца = 12 Тогда

    ЭлементыФормы.Месяц.Значение = «Декабрь»;

    КонецЕсли;

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

    Reply

Leave a Comment

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