Универсальный реестр документов




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

61 Comments

  1. Abadonna

    В хозяйстве сгодится

    +1

    Reply
  2. Abadonna

    Гы!

    «Вы не можете голосовать. Необходим рейтинг больше RATING_TO_RATE_PLUS»

    Это мне оно так написало.

    Reply
  3. vasilykushnir

    Караул!!! А куда смотрит суппорт? Что за дела? Рейтингов лишают средь бела дня…

    Reply
  4. CheBurator

    Ну вы, блин, любители изобретать лисапеды.. Возьми штатную универсальную обработку «Универсальный журнал документов» и хоть обостройся всяких рееестров=журналов и прочее… сделанные свои журналы — сохраняются в виде настроек…

    Reply
  5. vasilykushnir

    «Универсальный журнал документов» -это что за зверь и где лежит. Если опять на диске ИТС, повторюсь — диска в глаза не видел и с типовыми ситуация аналогичная.

    Reply
  6. Abadonna

    >Ну вы, блин, любители изобретать лисапеды..

    А тут пришел Чебурашка и все опошлил 😉

    Ну что, что велосипед, но САМ же изобрел

    Reply
  7. vasilykushnir

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

    Reply
  8. das

    В 2006 году был комент: «Foxy, если не хочешь навеки остатся начинающим программистом — мой тебе дружеский совет: пиши сам. Чужие используй только как источник идей и методов «хитрого» программирования.

    Пиши на мыло — скину образец для 7-ки. Но предупреждаю — писалась под себя: унификация и рядом не лежала. Подробности по мылу или ася — не хочется засорять чужие разработки не нужными комметами.» ….

    Хотелось бы посмотреть на данную обработку — подойдет для нас или нет. Если не трудно — сбросить на мыло: sveta.argument@mail.ru

    Reply
  9. das

    +1

    Reply
  10. das

    Ура! я могу голосовать! Спасибо всем!

    Reply
  11. vasilykushnir

    Так это ты была Foxy? Вспомнила… Надо же… Я начинаю медленно краснеть.

    Reply
  12. das

    Нет это была не я. Но это, может быть, к сожелению. От чего краснеешь, VasilyKushnir?! Сегодня просматривала сайт и натолкнулась на данный коментарий (в связи с обработкой Пакетная Печать документов), ну и решила написать — может быть откликнешься…

    Reply
  13. Abadonna

    Кушнир, научи, как на своих разработках девочек клеить 😉

    ЭТО ШУТКА!!!!!!!!!!!!!!!!!!!!!!!!!!!

    Reply
  14. Ворона

    Угу…ему скажи…,да еще и список девочек с огромным рейтингом!!!

    Reply
  15. Abadonna

    >список девочек с огромным рейтингом

    ……………………………………………………..

    надеюсь, догадались, что я хотел сказать у кого должен быть огромный, у кого — наоборот

    Reply
  16. v.l.

    хотел поругать, типа в ТиС есть такой, но маленькие прибамбасы!!! Я растаял. Идею мне понравилась. +1

    Reply
  17. poppy

    Очень много замечаний и предложений.

    Выкладывать?

    Reply
  18. Abadonna

    (18) Можешь не сомневаться, от тебя он с удовольствием все замечания примет

    (на этот раз не шучу)

    Reply
  19. vasilykushnir

    (13) Конечно — откликнусь. Только я пока отложил в сторону пакетную печать — другие идеи отвлекают (а текучка просто за горло берет).

    (14) Это кого учить? Тебя?! Да где я учился, ты уже преподавал… (тоже шутка, а может и нет…)

    (15) Огромный рейтиг ерунда, для для девочек главное — глубокие знания…

    (18) Конечно выкладывай! Для того и выложил — можно оказывается и на своих программах учится благодаря вашим замечаниям. Была кстати задумка написать печать справочников, но когда увидел здесь УПС — понял, что тема закрыта. Правда осталась идейка написать приблуду работы со справочниками — чтобы все было в одном стакане: и печать, и корекция вплоть до периодики, а также копирование(в другую группу)/удаление — в общем все мыслимое и немыслимое, что можно проделать над справочником. Нечто типа обработки Влада Цылева, только с добавленным функционалом (скажу по секрету — рабочий вариант уже есть, но без разрешения Влада, сама понимаешь, выкладывать не этично).

    Ну вот, в описании к благодарностям надо бы добавить пункт

    4. Всем обратившим внимания на эту приблуду и особено высказавшим деловые замечания и предложения.

    Reply
  20. dobraleks

    Спасиба за отчетик.

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

    Reply
  21. vasilykushnir

    (21) Думал об этом, но пока:

    http://infostart.ru/forum/read.php?25,4076,page=9,ref=440

    там как раз о сохранении на 9 странице.

    Расковыряю сделаю.

    Reply
  22. poppy

    Главное замечение.

    В (4) все сказано. Очередной велик.

    «диска в глаза не видел и с типовыми ситуация аналогичная.»

    Зря. Много полезного пропустил мимо.

    Вот если-б взять обработку UniJourn.ert и доработать. Там есть куда стремиться.

    Reply
  23. poppy

    Допустим, нет обработки UniJourn.ert или она не доступна.

    Как говорится, встречают по одежке… Смотрим на форму обработки и что видим? Элементы формы «уходят» за верхнюю границу формы. Нижняя граница — «напирает» на кнопки, правая — на таблицу.

    Reply
  24. poppy

    В коде явно не хватает следующего:

    Код
       Таб.Опции(0, 0, 6, 3, "РеестрДокументов", "РеестрДокументов");
       Таб.ТолькоПросмотр(1);  
       Таб.Показать("Реестр документов")
    

    Показать полностью

    Reply
  25. poppy

    Обычно, число выравнивают вправо, остальное — влево.

    В обработке все = вправо. Что не есть гуд.

    Reply
  26. poppy
    Код
          Сообщить ("Вы явно не дружите с Датой (или с головой?)");
    

    Показать полностью

    ИМХО это грубо.

    За основу проверки дат можно взять функцию глПроверкаДаты(ДатаНачала,ДатаКонца) из типовой ТиС.

    Reply
  27. poppy
    Код
          Сообщить ("Запрос не выполнен - кури инструкцию.");
    

    Показать полностью

    Кто виноват, что не выполнился запрос? Пользователь или разработчик?

    Где инструкция?

    Reply
  28. poppy

    В процедурe тбРеквизитыСформировать() не плохо бы добавить следующие строки кода:

    Код
          тбРеквизиты.Наименование   =  Метаданные.ОбщийРеквизитДокумента(Ин).Синоним;
    ...
          тбРеквизиты.Наименование   =  Метаданные.Документ(ДокВид).РеквизитШапки(Ин).Синоним;
    ...
             тбИтоги.Наименование   =  Метаданные.Документ(ДокВид).РеквизитТабличнойЧасти(Ин).Синоним;
    
    

    Показать полностью

    Reply
  29. poppy

    С фильтрами какая-то беда.

    1. Если выбрал условие и значение, то отказаться уже нельзя.

    2. Условие «в» не работает. Сообщает:

    Если Запрос.Выполнить(ТекстЗапроса()) = 0 Тогда

    {E:MY DOWNLOADSINFOSTART.RUPROJECTS1147РЕЕСТРУНИВЕРСАЛЬНЫЙ.ERT(438)}: Условие(ТекДок.Контрагент.Наименованиев»МАГАЗИНЫ» <<?>> );

    Запрос[5] : Неправильное использование операции сравнения

    Запрос не выполнен — кури инструкцию.

    3. Почему нельзя устанавливать условие для общих реквизитов?

    4. Условие для перечислений не работает, выдает ошибки.

    5. Условие для документов не работает, выдает ошибки.

    6. Условие для счетов работает не правильно.

    6. Нельзя выбрать фильтр для реквизитов неопределенного типа.

    7. ИМХО список условий с избытком. Если условие можно накладывать только на справочники, зачем их сравнивать на больше/меньше?

    8.

    Reply
  30. poppy

    (30) п.1

    Не заметила кнопку «Удалить условие», извини.

    Соседняя кнопка «Удалить все условия» не работает.

    Reply
  31. poppy

    Вместо строк:

    Код
          Для Ин = 1 По Объект.КоличествоСтрок() Цикл
             Объект.УстановитьЗначение(Ин, Колонка, Режим);
          КонецЦикла;
    

    Показать полностью

    можно написать:

    Код
          Объект.Заполнить(Режим,,,Колонка);
    

    Показать полностью

    Reply
  32. poppy

    Вместо кода:

    Код
       Если Тип <> "Число" Тогда
          Тип   = Тип + "." + Вид;
       КонецЕсли;
    

    Показать полностью

    можно написать:

    Код
       Тип   = Тип + ?(Вид = "", "", "." + Вид);
    

    Показать полностью

    Вместо:

    Код
          Если (Лев(Тип, 5) = "Число") Или (Лев(Тип, 6) = "Строка") Или (Лев(Тип, 4) = "Дата") Тогда
    

    Показать полностью

    можно:

    Код
          Если Найти(Тип, ".") = 0 Тогда
    

    Показать полностью

    Reply
  33. Abadonna

    Всё! Кладу то только экзешные файлы. А то poppy как раскритикует…. 😉

    Reply
  34. Abadonna

    Но свою долю критики всё же внесу.

    17 (!!!) функций/процедур со словом «Далее». И не лень тебе эти строки писать!?

    Reply
  35. Abadonna

    (35) Отмазку, что привычка осталась с Си, не принимаю, я же не перетаскиваю привычки Дельфи на 1С 😉

    Reply
  36. Abadonna

    И вдогонку:

    Процедура ПритбИтоги () Далее

    Процедура ПритбРеквизиты() Далее

    На фига столько табов? И ведь все равно не отровнял.

    А я эстет 😉

    Reply
  37. Abadonna

    Кушнир! Из-за твоих «далее» пришлось лишний час провозиться в новом плагине, чтобы при выборе процедуры прыгало на «нормальную», без «далее». С тебя 10 литров пива

    Reply
  38. poppy

    (34)

    Я ж не со зла. Скорее, для пользы дела. Надеюсь, Василий не обидится. 😉

    (35, 36, 37)

    Тоже хотела написать про Далее, но руки не дошли. С одной стороны, предварительное объявление процедур, как говорят горнопляжники, «на скорость не влияет». С другой — код читать немного сложнее.

    (38)

    И мне пива… 😉

    Reply
  39. Abadonna

    (39) >как говорят горнопляжники, «на скорость не влияет»

    Чушь собачья! Даже если это и правда (очень сомневаюсь), то выигрыш будет в доли секунды.

    Зашибись экономия: отчет будет работать не 59.1 секунды, а 59.0

    Reply
  40. Abadonna

    (40) беру слова обратно, не заметил «не» перед влияет.

    Предварительное определение лично я делаю очччччччень редко, если лень перетащить процедуру

    выше вызывающей. Т.е. времени на выделение блока уйдет больше, чем на перелистывание вначало и вставки

    строки со словом «далее»

    Reply
  41. vasilykushnir
    Reply
  42. Abadonna

    (42) (37)(39) Ребята, ну в крови оно уже сидит…

    Сделай переливание крови!

    И ваще — неиб@т

    Reply
  43. vasilykushnir

    (43) Срочно не обещаю, но подумаю…

    Reply
  44. poppy

    (42,30)

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

    Если твой алгоритм не поддерживает условие «в», так и убери его из списка доступных.

    Другое дело, сейчас отбор работает по наименованию. В этом случае, условие «в» нереализуемо. Есть и другие недостатки такого способа.

    Reply
  45. poppy

    (42,29)

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

    Я предлагаю заполнять колонку «Наименование» синонимами. Пользователь может их изменить или оставить как есть.

    ИМХО это повысит юзабилити отчета.

    Reply
  46. vasilykushnir

    (45) Пожалуй временно уберу, но на будущее все-таки множественный фильтр хочу добавить.

    (46) Принято — обязательно доработаю.

    А кстати UniJourn.ert в меня не кинешь?

    А заодно «глПроверкаДаты(ДатаНачала,ДатаКонца) из типовой ТиС. » — интересно посмотреть на типовые. Может действительно стучусь ап стенку, а дверь рядом, да еще и открыта…

    Reply
  47. vasilykushnir

    А вообще сооздается впечатление, что прохожу публичную порку…

    Теперь я представляю, каково ребятам в этой шкуре. Но все равно здорово!. Иногда даже маленького намека достаточно, чтобы заметить свой ляп или недосмотр — после (31) сразу добавил комметарий к кнопкам удаления условий.

    Reply
  48. vasilykushnir

    Маненько причесал (спасибо Поппи — много очень замечаний по делу) — остальное чуток погодя.

    (25) фиксация верхних строк тоже позжее (не всегда их будет 6 — см. Колонка «ВСтроке»). Пожалуй добавлю счетчик дополнительных строк шапки.

    Reply
  49. Abadonna

    (47)>А заодно «глПроверкаДаты(ДатаНачала,ДатаКонца) из типовой ТиС. »

    Валий Батькович! Я тоже не юзаю стандартные, но в наличии-то они у меня есть.

    Кинуть тебе Конфу что ли?

    Reply
  50. vasilykushnir

    (50) Получил — СПАСИБО.

    Reply
  51. CheBurator

    Может тебе сккинуть месячный набо дисков ИТС каких-нить стареньких — много интересного назыришь….

    Reply
  52. Abadonna

    Дошли руки попробовать поюзать, так что держись Василий 😉

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

    2. Картинки мерзкие 😉

    3. А почему фильтр не предусмотрен по Общим реквизитам документа?

    4. |ОбрабатыватьДокументы Проведенные; А если мне и не проведенные нужны?

    5. Слабо было сделать запрос не по одному виду документов, а по нескольким? 😉

    Reply
  53. Шёпот теней

    В отличие от всехВышевысказавшихся товарищей позвольте выразить вам своё «5» мнение о вашей/ваших работе/ах… АХ… есть чему поучиться… и дизай… «ну такой интересный»…!

    Удачи…

    Reply
  54. astonvilla

    Замечания:

    1. В печатной форме замени отображение вида документа на представление вида. Намного симпатичнее будет.

    2. В скачанном только что отчете вся форма съехавшая, даже название.

    3. В выборе даты форма явно лишняя, оставь стандарную — ВвестиПериод.

    Хотя все замечания как бы из разряда придирок 🙂

    А так чего ж, неплохо :))

    Reply
  55. vasilykushnir

    Ребятыыыы… Дайте выйти из запоя — все доделаю.

    Reply
  56. Abadonna

    (56)>Дайте выйти из запоя

    Со следующего понедельника бухать не прекратишь — некому будет доделывать 😉

    Демон обещает :)))))))))))))))

    Reply
  57. vlad_klg

    +1

    Reply
  58. nmf

    идея хороша, вот если бы еще и табличня часть документа разворачивалось

    Reply
  59. vasilykushnir

    (59) В самое ближайшее время постараюсь учесть все замечания.

    Reply
  60. Pic_nic

    ❗ Здорово ❗

    Reply
  61. Ctrl P

    плин, ну че так трудно выложить скрин с «выходной формой»…

    Reply

Leave a Comment

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