Да, еще одна ТТН (1-Т) с сохранением




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

23 Comments

  1. Ish_2

    Зачем DBF ?

    Воникает куча проблем при раздельном доступе и др.

    Уже не первый раз встречаю решения с хранением данных во внешнем файле.

    Зачем ?

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

    Reply
  2. fenka4reg4rum

    Сохранять и выбирать водителей — хорошо. а вот если бы сохранить всю ТТН — было бы просто замечательно

    Reply
  3. Alexparquet

    Добрый день!

    После установки Вашей обработки я в Реализации товаров и услуг выбираю ТТН (с сохранением), а вместо печатной формы вылезает окошко — Метод объекта не обнаружен — (Ответственные лица Организации)

    Подробно:

    {Форма.Форма.Форма(306)}: Метод объекта не обнаружен — (Ответственные лица Организации)

    Руководители = РегламентированнаяОтчетность.ОтветственныеЛицаОрганизации(Шапка.Руководители, Шапка.ДатаДокумента,)

    Идея с сохранением мне очень понравилась)

    Подскажите как решить эту «проблемку»…

    Reply
  4. lazy

    (3) Уточните версию вашей конфигурации УТ, если смогу найти такую же — сделаю альтернативную версию отчета для вашей версии.

    (2) Разверните пожалуйста свою идею — что именно Вы предлагаете сохранять, и как себе представляете пользу и реализацию данной идеи.

    (1) Согласен, отдельная конфигурация решает ряд проблем, позволяет хранить ряд вспомогательных таблиц, решить проблему совместного доступа. Но создание целой конфигурации для того, чтобы держать в ней всего один регистр считаю нецелесообразным. А в филиалах у нас работает один — три менеджера выписывающих документы, т.е. вероятность, что они столкнутся с проблемой блокировки крайне низка даже при интенсивном выписывании документов.

    Reply
  5. Ish_2

    (4) «создание целой конфигурации» — громко звучит. Создайте один справочник в пустой конфигурации и посмотрите на её размер.

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

    1. технологичнее

    2. надежнее

    3. адаптивнее (легко перестраиваемое решение)

    4. обеспечивается раздельный доступ к базе.

    Вы всё еще по-прежнему работатете с DBF ?

    Reply
  6. Alexparquet

    У меня стоит 1С: Управление производственным предприятием 8.2.

    Стандартная форма 1-Т печатается, а через вашу обработку вылезает окошко с предупреждением (см. ниже).

    Ранее установленные обработки по отображению комплектующих в реализациии и т.д. из 1С:УТ 8.0 успешно работают.

    Заранее, пребольшое спасибо)

    Reply
  7. fenka4reg4rum

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

    Reply
  8. babylon_5

    (7) Решение — создать в конфигурации ТТН документом. И вводить его на основании.

    Я такое на 7ке когда-то делал. Да и вот буквально позавчера повторял.

    Разница двух вариантов была в том, что в старом у организации были свои автомобили и их заносили в справочник (ну, и водители свои сотрудники). А в новом транспорт сторонний и автомобиль, номер его и прицепа, и водитель — строки. Вводят (пока) ручками.

    Reply
  9. fenka4reg4rum

    (8) Во-первых — не хочется ломать замок (с обновлениями проблема), во-вторых (4), если же Вы сделали сохранение справочника водителей, то, может быть, и сохранять весть документ?

    (8) А пока — это надолго?

    Интересно, почему 1С-цы не подумали о том, что ТТН — это такой же документ, как и все остальные (почему только печатная форма?)?

    Reply
  10. babylon_5

    (9) Пока — это до того, как клиент захочет чтобы программа это запоминала и чтобы потом просто выбирать из списка.

    Reply
  11. lazy

    (7) понял желание. Возможно реализую, если будет свободное время.

    (6) 8.2 это версия платформы. Мне нужно знать версию конфигурации. Посмотрите на приложенный рисунок, а затем по примеру изображенному на нем укажите номер планеты в Тентуре версию своей конфигурации.

    (5) ну, учитывая пожелания в (7) возможно переделаю с использованием отдельной конфигурации

    Reply
  12. Alexparquet

    (11) 1С:Предприятие 8.2 (8.2.9.356)

    Управление производственным предприятием, редакция 1.2 (1.2.25.1)

    Copyright (С) ЗАО «1C», 2004-2009. Все права защищены

    Reply
  13. Haim3000

    Очень хочется, чтобы работало 🙂

    1С:Предприятие 8.2 (8.2.13.202)

    Комплексная автоматизация, редакция 1.1 (1.1.4.1)

    {Форма.Форма.Форма(306)}: Метод объекта не обнаружен (ОтветственныеЛицаОрганизации)
    Руководители = РегламентированнаяОтчетность.ОтветственныеЛицаОрганизации(Шапка.Руководители, Шапка.ДатаДокумента,);
    Reply
  14. Gawws

    Спасибо. Пригодилось. Пришлось, правда немного приспособить для БП8 2.0. Заметно облегчит внесение данных в ТТН.

    Видел на подобие обработку по заполнению путевых листов. Там выбор водителей и автомобилей осуществлялись из списка в txt файлах, куда же и сохранялись.

    Попробую так же реализовать в ТТН, а потом на выбор пользователям. Что будет удобней, то и приживется.

    Reply
  15. stema23

    Спасибо, хорошо бы еще перевозчика и заказчика из списка контрагентов выбирать.

    Reply
  16. Deniz200

    спасибо, нужная вещь

    Reply
  17. Deniz200

    А как отдельный документ со своим журналом никто делать не пробывал? Было бы неплохо хранить все документы

    Reply
  18. lazy

    Deniz200 Обратите внимание, что данная форма ТТН более не актуальна и валяется тут из исторически-архивных соображений. Актуальным на данный момент является http://infostart.ru/public/90559/ Либо, если у Вас есть возможность заплатить, то http://infostart.ru/public/90908/

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

    Reply
  19. VragHorosh

    Насчет хранения в виде документов — есть нюанс связанный с тем, что модификация типовой конфигурации при обновлениях вытекает в затруднения, т.к. мальчики и девочки приходящие из франчайзи обновлять кофнигурацию, как правило не знают, что делать с добавленными структурами. Поэтому, легче всего идти именно по пути отсутствия изменений в конфе, хотя это и связанно с некоторыми затратами на возведение подпорок для внешнего хранения информации. (с)

    Нех пускать левых к конфе, есть программер пусть занимается, чаще всего обновляльщики с франей делеко не професионалы ………

    Reply
  20. w22u

    Спасибо за печатную форму, буду тестировать.

    Reply
  21. volga1

    Плюс.

    Сохранил стандартную (новой редакции обработку ТТН)как внешнюю в предприятии 8,2 и вставил необходимые ваши (процедуры, функции и 1 форму) в неё, немного скорректировал стандарт и внешней печ. формой подцепил.

    Итог — работает на последней редакции ТТН.

    Reply
  22. бендер

    Спасибо!Пригодилось.ТТН-ку украинскую прилепил.

    Reply
  23. Orlenok

    Спасибо помогло, но если бы можно было проворачивать такой фокус с адресами отгрузки и поставки, вобще шоколодно было бы!!!Может добавите!;)

    Reply

Leave a Comment

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