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




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

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 не будет опубликован. Обязательные поля помечены *