Перенумератор (Справочники, Документы+Нумераторы)




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

    Может и баян, но писалось под себя

    использую давно в самых разнообразных случаях 😉

    Reply
  2. dummy

    первая из стопиццоттыщ перенумераторов, которая позволяет отбирать документы по префиксу номера… ну или я просто не натыкался на такие.

    Reply
  3. CheBurator

    (2) а что, универсальная обработка подбора объектов — этого не позволяет? — не далее как в четверг перенумеровывал справочник, выбирая элементы принадлежащие ЦБ — по вхождению в номер префикса «ЦБ» — и заметьте! без программирования… — учите матчасть!

    Reply
  4. grigr

    (3) она слишком универсальная и не всегда подходит 😉

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

    Боян же братия…

    Мне понравилось:

    1. Методичность автора в процессе разработки (набор комментариев)

    2. Четкий дизайн.

    Reply
  6. grigr

    (5) тогда уж скорей «+»

    ———————

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

    ———————

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

    Reply
  7. rasswet

    тоже понравился код и дизайн. молодец)

    Reply
  8. yulya_vlady

    Хорошая обработка! Быстро и без проблем решила мою проблему. Надо было перенумеровать документы разных видов с одним нумератором в ЗиК.

    Спасибо! Очень вовремя!

    Reply
  9. aexeel

    Если уж речь зашла об универсальности, то я бы сделал следующие доработки:

    1. интерфейс — 3 закладки: подбор, данные, настройки;

    2. данные должны выбираться запросом: на DBF разницы, конечно, нет, а вот на SQL (особенно на больших объемах) — существенная;

    3. заключить изменения данных в транзакцию (одну или несколько, по настройкам);

    4. в попытке/исключении учесть разделенный режим работы (ошибку записи из-за блокировок т.е.), либо проверку на монопольный режим при запуске;

    5. не изменять номер/код, если он совпадает со вновь присвоенным;

    6. расширить отбор документов общими реквизитами (например, выбирать по одной фирме).

    Очень хотелось бы увидеть режим эмуляции и отчет на выходе, что на что изменилось.

    Восторгов по поводу кода не разделяю. Структурированность не сильная. + Мое мнение — обработчики событий (формулы элементов диалога) должны быть отделены от базового функционала.

    Reply
  10. KereberoS

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

    Reply
  11. grigr

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

    ————————-

    (7)(8) и вам спасибо

    ————————-

    (9)(10) вам тоже спасибо, но вы по моему просите совсем другую программу…

    это простой перенумератор, делать его супер универсальным ради самой универсальности действительно не вижу большого смысла!

    у меня была идея — разместить весь функционал на одной рабочей площадке.

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

    (9.2) sql баз у меня к сожалению нет, соответственно переписывать не буду, к тому же перенумеровка не такая уж и частая процедура, и не такая уж и долгая разок можно и подождать

    (9.3,5) вы правы транзакцию нужно сделать, а так же проверять на существование уже существующего кода/номера

    (9.4) вы действительно запустите мою обработку на рабочей базе в раздельно режиме, не сделав копии??? вот это Доверие — Спасибо 😉 (я бы сам не запустил)

    (9.6) чем отбор по префиксу не устраивает?

    (9.7) режим эмуляции делать не буду (делайте копию базы), а отчет на выходе вполне хорошая идея

    (9.8.) «обработчики событий (формулы элементов диалога) должны быть отделены от базового функционала» — поясните пожалуйста, зачем?

    (10) «не видя требуемых для перенумерации данных» — там есть окно где представлены все обрабатываемые данные, попользуйтесь и увидите

    «Грамотно написанные обработчики событий делают прогу более универсальной и более стабильной» — вы же не скачивали, как вы оценили грамотность?

    😉

    Reply
  12. aexeel

    (11) >>sql баз у меня к сожалению нет, соответственно переписывать не буду

    Тогда слово «универсальный» из описания я бы исключил)

    >>вы действительно запустите мою обработку на рабочей базе в раздельно режиме, не сделав копии

    Опять же «универсальность»… далеко не у всех есть возможность выгнать бухгалтеров на сколько-то часов из базы

    >>…должны быть отделены от базового функционала» — поясните пожалуйста, зачем?

    Про контекстонезависимость слышал? Я стараюсь придерживаться данных принципов. В v8, кстати, в т.ч. под это дело выделен модуль обработки.

    Reply
  13. Yackov

    Вот тебе 30й плюс..молодца!)))

    Reply
  14. grigr

    (13) спасибо. да уж, за неделю больше 30 «+» одной обработкой — очень не плохо

    (12.11) не исключу, т.к. она в sql работать будет 😉 как и во всех остальных

    впрочем вы можете доработать под свои нужды

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

    (12.13) аааа понял. только тут ведь Один модуль. так и быть отсортирую функции обработчика от интерфейсных.

    Reply
  15. grigr

    Друзья. эта обработка — маленькая удобная тележка.

    грузить ее функционалом самосвала с грузоподъемностью тележки я не хочу.

    так что, что-то я добавлю, что-то нет… Всем Спасибо

    Reply
  16. zemochka

    молодец. очень вовремя она мне подруку попала))

    Reply
  17. grigr

    доработано в v 1.6 (от 10/09/09) — по Вашим просьбам

    отсортированы функции модуля, ко всем интерфейсным элементам добавлено описание, работа в транзакции

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

    Reply
  18. grigr

    скриншоты попозже обновлю (не так там много изменений)

    Reply
  19. CheBurator

    ндя… 90% процентов — делается с помощью штатной универсальной обработки. Из востребованного в универсальной обработке, по-моему, только работы с нумератором нет…

    Reply
  20. grigr

    (19) ну да — каждому свое… только почему-то ею не многие пользуются (или не хотят пользоваться) 😉

    Reply
  21. CheBurator

    Правильно, потому что при нормальной работе — всякую перенумерацию — прог только должен делать… у меня на старой работе и сейчас — такие задачи по оперативным документам — возникали ну настолько редко… что я даже ПЕРЕНУМЕРАТОРЫ НЕ ПИСАЛ!!!!

    Reply
  22. artbear

    (21) Ага, я так ни разу перенумератор за свою жизнь не написал, все время чужими пользуюсь, правда, очень и очень редко, в основном, у новых клиентов 🙂

    Reply
  23. grigr

    (21,22) я на продажу делал 😉

    а вот теперь со всем делюсь

    Reply
  24. CheBurator

    (221) аналогично, коллека! 😉

    Reply
  25. JohnyDeath

    (21), (22) не уж-то на вашей работе расходнички задним числом не делают? 😉

    Reply
  26. CheBurator

    (25) неа.. не делают.. 😉 а вот наклдную перетащить вперед на 10 дней — это могут.. потому что блин типа Ипшник не может товар покупать в рассрочку при оплате налом… 😉

    Reply
  27. Марита Х

    + спасибо

    Reply
  28. lefthander

    + Спасибо. То что нужно. 🙂

    Reply
  29. host_kms

    ЗафиксироватьТранзакцию();

    {D:DOWNLOADSPERENUMEROVKA.ERT(633)}: Ошибка при выполнении процедуры ЗафиксироватьТранзакцию.

    Пытаюсь перенумеровать справочник «Номенклатура», 12000 элементов, длина кода 8, текстовый.

    Где-то собака зарылась!

    Reply
  30. grigr

    (29) с транзакциями там фигово (это скорее всего на будущее), нужно алгоритм избавить от конструкции «Попытка Исключение», тогда долнжо будет нормально работать.

    не включай транзакции и будет тебе счастье, но медленно …

    Reply
  31. eslava

    У меня пишет ошибка открытия файла и подвешивает 7.7. У меня Vista может в этом дело!?

    Reply
  32. grigr

    (31) может и Висте… на лицо баг самой 1С

    а другие-то обработки открываются?

    Reply
  33. eslava

    🙁

    Другие открываются нормально. Была с одной обработкой проблема, но решилась путём запуска её дллов от администратора.

    Reply
  34. grigr

    Если честно понятия не имею в чем дело ;( нет там ни каких ДЛЛ.

    попробуй загрузить заново, попробуй в конфигураторе открыть…

    Reply
  35. pannamara

    Благодарствую))) разработчику

    Reply
  36. EugeneR1c

    Благодарю за обработку.

    Reply
  37. xDee

    ЗафиксироватьТранзакцию();

    {D:NIXPERENUMEROVKA.ERT(633)}: Ошибка при выполнении процедуры ЗафиксироватьТранзакцию.

    Пытаюсь перенумеровать справочник «Номенклатура», 8000 элементов, длина кода 8, текстовый.

    Точно такая же ошибка.

    Reply
  38. grigr

    (37) алгоритм не совершенный (есть косяки, а выискивать смысла большого не вижу). лечится просто:

    1. неиспользуйте транзакции, т.к. внутри есть конструкция Попытка/Исключение — именно она валит транзакцию

    2. отключите на время перенумеровки в конфигураторе контроль уникальности в справочнике, тогда все будет ОК

    Reply
  39. xDee

    2. отключите на время перенумеровки в конфигураторе контроль уникальности в справочнике, тогда все будет ОК

    Именно так и поступил, и все пошло, еще раз СПАСИБО!

    Reply
  40. alexsiswx

    Буду пробовать. Но с нетерпением буду смотреть и анализировать код.

    Reply
  41. TrinitronOTV
    soroka пишет:

    Благодарю за обработку.

    я тоже присоединяюсь, огромное спасибо

    Reply
  42. pepe_n

    Очень удобно, спасибо 😉

    Reply
  43. smtan-2011@mail.ru

    очень здоровская обработка спасибо!

    Reply
  44. sergb1979

    Доработал ее добавив возможность перенумерации всей базы.

    Очень удобно перед объедидением нескольких баз

    Reply
  45. Ariko-sv

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

    Reply
  46. ogeniv

    Отличная обработка, спасибо!

    Reply
  47. MoonAriman

    Спасибо! Но очень медленно… Особенно обязательное заполнение списка к перенумерации. У меня 20000 номенклатуры, она просто умрет от таких визуальных приблуд.

    Reply
  48. grigr

    (47) MoonAriman, отключить визуализацию можете и сами 😉

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

    Reply
  49. eslava

    При включенной галке макс. длинна номера обработка проверяет код в справочнике если он больше указанного значения, то из кода удаляются лишние нули?

    Reply
  50. orehova123

    плюсую! сохранение префиксов документов — как раз то, что нужно (оххх, когда же народ уйдет с 7.7? 🙂 )

    Reply
  51. grigr

    (50) eslava,

    да все верно. ее можно использовать для укорачивания номеров или добивания нулями до нужной длинны (правда могут возникнуть дубли в номерах: 00100 и 0100 — станут одинаковыми)

    (51) orehova123,

    когда уйдет? у меня есть учетные конфы на ТИС, зачем с них уходить-то? есть и на УТ под 8.0 — все работает.

    Reply
  52. AlexO

    Обработка весьма неплохая.

    Немного разобрался и доработал.

    Первое — пункт «Заменить у существующих префиксов на…» следует читать как «Заменить выбранную подстроку

    в префиксах документов на введенную в поле «Строка префиксов документов».»

    Разбил на транзакции по 100 элементов.

    Флаг «Добить нулями» в исходной реализации не имеет смысла — если его отключить, то никакой перенумерации не будет вовсе.

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

    Reply
  53. AlexO

    (38)

    2. отключите на время перенумеровки в конфигураторе контроль уникальности в справочнике, тогда все будет ОК

    Думаю, чтобы как раз этого не делать/сократить выборку с невыполнимой транзакцией — поможет запуск отдельных транзакций на каждые 100 элементов.

    Reply
  54. AlexO

    (44) sergb1979,

    Доработал ее добавив возможность перенумерации всей базы.

    Что значит — перенумерация всей базы? А сейчас — не по всей нумерует?

    Reply
  55. AlexO

    (52)

    (правда могут возникнуть дубли в номерах: 00100 и 0100 — станут одинаковыми)

    Не станут, в обработке есть механизм обработки дублей, который работает так:

    если какие-то номера в процессе перенумерации оказались неуникальными — то

    — попытка вернуть обрабатываемым объектам их первоначальные «неуникальные» номера;

    — если это не удается — присваивается вспомогательный номер вида «максимально возможный (99999) — позиция элемента в текущем списке».

    Т.е. в любом случае но выходе получим разные номера 🙂

    Reply
  56. sergb1979

    (55) AlexO, Сейчас только по выбранному типу Справочника

    Reply
  57. AlexO

    (57) sergb1979,

    А зачем перенумеровывать ВСЕ справочники одновременно?!

    Reply
  58. grigr

    (56) AlexO, бывают всякие ситуации — алгоритм не совершенен и он дает иногда на один номер 2 элемента

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

    а добить нулями иногда нужно именно без перенумервки

    Reply
  59. AlexO

    (59)

    а добить нулями иногда нужно именно без перенумервки

    Отбора ВНУТРИ номеров все равно нет — велика вероятность, что попадет на существующий номер.

    Кстати, видимо ошибка «Ошибка при выполнении процедуры ЗафиксироватьТранзакцию.» обычно из-за попытки создать уже существующий номер.

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

    Лучше так:

    — перенумеровать с неким уникальным префиксов (например, «F»)

    — перенумеровать уже окончательно — все номера будут заранеее уникальны.

    Reply
  60. AlexO

    (3) CheBurator,

    а что, универсальная обработка подбора объектов — этого не позволяет?

    И как типовой перенумеровать номера 15, 0015 и 00015?

    Reply
  61. CheBurator

    (61) вопрос непонятен.

    приведите исходное множество документов с исходными номерами и итоговый желаемый результат — я попытаюсь сказать — можно перенумеровать или нет.

    а так — конечно можно

    вместо трех документов 15,0015,000015 будут документы 15,16,17 с нужными префиксами…

    ???

    Reply

Leave a Comment

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