Мастер перенумерации справочников и документов (Обычная форма 8.2)




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

61 Comments

  1. Душелов

    По-моему нет ничего лучше универсальной обработки с ИТС.

    Reply
  2. Sharloc

    Чем лучше обработки УниверсальныеПодборИОбработкаОбъектов.epf с диска ИТС?

    Reply
  3. Ish_2

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

    Тут есть какая-то непонятная мне тайна.

    Чем тема так всех манит ? Что в ней «сермяжного» ?

    Reply
  4. Yashazz

    Равно как и гляделки констант пишут. Да, тайна сия велика есть.

    Reply
  5. alexeyw
    Ish_2 пишет:

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

    Тут есть какая-то непонятная мне тайна.

    Чем тема так всех манит ? Что в ней «сермяжного» ?

    Ну не зря же даже рубрика есть такая в каталоге. Это практически как HelloWorld 😀

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

    Sharloc пишет:

    Чем лучше обработки УниверсальныеПодборИОбработкаОбъектов.epf с диска ИТС?

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

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

    Reply
  6. Valerich
    Только не у всех есть ИТС

    вот это лучше не афишировать…. иначе вопрос — а где 1С взяли? Потому как кто купил, у того минимум 1 диск есть (в коробочке лежит) + бесплатная подписка еще на 6.

    Reply
  7. alexeyw

    Valerich,

    ну ведь бывает же, обновляются с 6 бухгалтерии на 8.2 через франчей и все имеющиеся у пользователя ИТСы уже неактуальны =)

    Reply
  8. Rustig

    (1) Что Вы скажете по поводу http://infostart.ru/public/78695/ ?

    Reply
  9. Inetguru

    А можно ли в качестве префикса перенумерации добавить что-то вроде произвольного алгоритма перебора. (например для отобранных элементов справочника производить перенумерацию с добавлением счета с точкой и например-номера склада или нескольких первых символов его наименования

    Reply
  10. gutentag

    В обработке нет выбора организации, поэтому использовать не могу, увы :-/

    Reply
  11. alexeyw
    gutentag пишет:

    В обработке нет выбора организации, поэтому использовать не могу, увы :-/

    Добавил отборы.

    Reply
  12. Abadonna
    Десятки людей, не сговорившись, упорно пишут перенумераторы

    А чего удивительного? Всего найдется пара десятков долб пользователей, которые наплюсуют. Вот и близко заветный рейтинг 30.

    Reply
  13. gutentag

    (11) Спасибо!

    (12) Я для 8.2 еще не встречал боле-менее удобного нумератора 😎

    Reply
  14. gutentag

    (11) Попытался начать перенумерацию с произвольного места(т.к. прошлые периоды закрываю)

    В запросе ввел:

    Организация = «наименование оргагнизации»

    Дата > 01.06.2011

    Номер >= А000023 (чтобы пернумероваллись все документы от 23 и боле )

    Наверное стоило бы ввести «с какого номера начинать» и «ограничиватель длины номера»

    ——————

    ОШИБКА:

    {Форма.Форма.Форма(179)}: Ошибка при вызове метода контекста (Записать)

    ВыбранныйЭлемент.Записать();

    по причине:

    по причине:

    Значение поля «Номер» не уникально

    ———-

    На самом деле, номера просто стоят не попорядку

    Reply
  15. alexeyw
    gutentag пишет:

    по причине:

    Значение поля «Номер» не уникально

    ———-

    На самом деле, номера просто стоят не попорядку

    В данном случае поможет предварительная нумерация с другим временным префиксом, а потом уже с нужным

    Reply
  16. gutentag
    В данном случае поможет предварительная нумерация с другим временным префиксом, а потом уже с нужным

    Имхо это ошибка :-/



    А может обработка начать перенумерацию с заданного номера?

    Reply
  17. alexeyw
    gutentag пишет:

    Имхо это ошибка :-/

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

    gutentag пишет:

    А может обработка начать перенумерацию с заданного номера?

    уже может

    Reply
  18. Octopus

    Автор, исправьте появление неразрывного проблема в номерах от 1000. Иначе появляются номера вида А000 001, А000 002 и т.д.

    Reply
  19. alexeyw
    Octopus пишет:

    Автор, исправьте появление неразрывного проблема в номерах от 1000. Иначе появляются номера вида А000 001, А000 002 и т.д.

    Исправлено

    Reply
  20. Octopus

    Еще в качестве пожелания хотелось, чтобы при выборе вида документа/справочника список позиционировался на выбранном элементы. Когда идет ренумерация нескольких видов, неудобно каждый раз сверху мотать до нужного объекта. Или как вариант, реализовать множественный выбор видов. Во всем остальном все работает отлично, очень пригодилось, спасибо!

    Reply
  21. sevipa

    Воспользовался, просто, быстро удобно… что еще нужно

    Reply
  22. still_

    Очень классная штука

    Reply
  23. MarkSofaMark

    Здорово получилось

    Reply
  24. alaudit

    скчала а мне под 8,1 надо было- не заиграло ))

    Reply
  25. Adoms

    захлебнулась на первом же дубле 🙁

    Reply
  26. nick_e

    Сразу сказала, что код не уникальный, а так все ок. Сделал новый префикс, переименовал с ним, а переименовал с тем префиксом, на котором говорил что код не уникален и все ок!:)

    Reply
  27. bes-kkm

    В управлении торговлей 8.1 не работает.НЕ может быть прочитана текущей версией.

    Reply
  28. ismagulov

    Хорошая обработка, мне понравилось! Главное код открыт! )))

    Reply
  29. logoped

    Спасибо,

    испоьзовал как заготовку, работы меньше

    код открыт и это хорошо.

    Reply
  30. Terking

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

    Reply
  31. alexeyw

    (31) Terking, это что за наезды на идеальность и эргономику? 😀

    Жду предложений по этому направлению

    Reply
  32. alaudit

    Не знаю чем вызван негатив а ля «Чем лучше обработки УниверсальныеПодборИОбработкаОбъектов.epf» «чем лучше обработки с диска ИТС»… Яндекс нашел эту обраотку а не ИТСную с сайта http://its.1c.ru Скачал, заюзал- проблему решил за 10 минут, ошибок не выявил. Автору- спасибо.

    Reply
  33. Ninelle

    Эта обработка легче для обычных пользователей, чем с диска ИТС. Иногда очень нужно, чтобы пользователь не приставал каждый раз с вопросами по перенумерации. А для этого нужна простая в использовании обработка.

    Reply
  34. Zuzya_2

    попробую, надеюсь поможет…:)

    Reply
  35. Alex®

    Спасибо. Очень удобно 🙂

    Reply
  36. Lostris

    Может тема и избитая, но с этой обработкой действительно удобнее,чем искать на диске ИТС, а еще у меня на рабочем компе нет дисковода 🙁

    Reply
  37. Shade
    gutentag пишет:

    (11) Попытался начать перенумерацию с произвольного места(т.к. прошлые периоды закрываю)

    В запросе ввел:

    Организация = «наименование оргагнизации»

    Дата > 01.06.2011

    Номер >= А000023 (чтобы пернумероваллись все документы от 23 и боле )

    Наверное стоило бы ввести «с какого номера начинать» и «ограничиватель длины номера»

    ——————

    ОШИБКА:

    {Форма.Форма.Форма(179)}: Ошибка при вызове метода контекста (Записать)

    ВыбранныйЭлемент.Записать();

    по причине:

    по причине:

    Значение поля «Номер» не уникально

    ———-

    На самом деле, номера просто стоят не попорядку

    Показать

    Скажите, пожалуйста, а эта ошибка на 8.2 или на 8.1 получается?

    Вообще обработка запустится на 8.й А то я по сайту хожу, везде 8.2, а 8.1 нет отдельно

    Заранее спасибо

    Reply
  38. natnat5

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

    Основной целью было создать простой инструмент.\r

    полностью согласна

    Reply
  39. olgadogi

    обработка понравилась, только не удобно что нет выбора организаций

    Reply
  40. alexeyw

    (40) olgadogi, так отбор же есть по всем реквизитам

    Reply
  41. MBG 2

    Обработка очень пригодилась в конце квартала для перенумерации документов поступления товаров и услуг. Спасибо! На диске ИТС искала что-то подобное- не нашла. У меня ИТС технологическая поставка. Если подскажете где на нем искать- буду благодарна.

    Reply
  42. veb063

    А у меня обработка почему-то не работает… неправильно нумерует ПКО — не в хронологическом порядке. 1,2,3,51,6,4…. в чем проблема — не могу понять… и с префиксами пробовала, а потом без префиксов — ничего не помогает! перенумеровывает, но криво! ПОМОГИТЕ!!!

    Reply
  43. vovkakursk

    а МНЕ ВОТ ОЧЕНЬ ПОНРАВИЛАСЬ И ПРИГОДИЛАСЬ! СПАСИБО

    Reply
  44. vovkakursk

    спасибо

    Reply
  45. davydoff

    И у меня почему то обработка не правильно работает…

    Reply
  46. alexeyw

    (46) davydoff, можно поподробнее, что не так? исправим…

    Reply
  47. SanyaGrek

    Хорошая вещь.

    Жаль, что уже не нужна.

    Не так давно писал что-то подобное.

    Reply
  48. Misanets

    Ладно, плюсик оставлю, но есть ошибка: При перенумерации есть проверка которая складывает длину префикса и объектов для нумерации и проверяет достаточно ли длинны кода, так вот количество объектов считается без установленных отборов, в моем случае не смог перенумеровать так как всего объектов оказалось больше 1000, а тех которые мне нужно было перенумеровать всего 100+префикс.

    Так что, юзаем типовую с ИТС.

    ИМХО, результат обработки (код до и после) лучше выводить в табличный документ для последующего анализа, кому это необходимо, и лично я в подобных обработках делаю добавляю возможность «тестового выполнения» то есть выполнение всего кода кроме заветной строки Объект.Записать(), это даст возможность посмотреть «А так ли все будет хорошо как задумалось?».

    Reply
  49. Misanets

    (42) MBG 2, универсальные обработки на ИТС лежат в папке UNIREPS82 (для 8.1 соответственно UNIREPS81)

    Reply
  50. Гость

    Ладно, плюсик оставлю, но есть ошибка: При перенумерации есть проверка которая складывает длину префикса и объектов для нумерации и проверяет достаточно ли длинны кода, так вот количество объектов считается без установленных отборов, в моем случае не смог перенумеровать так как всего объектов оказалось больше 1000, а тех которые мне нужно было перенумеровать всего 100+префикс.

    Так что, юзаем типовую с ИТС.

    ИМХО, результат обработки (код до и после) лучше выводить в табличный документ для последующего анализа, кому это необходимо, и лично я в подобных обработках делаю добавляю возможность «тестового выполнения» то есть выполнение всего кода кроме заветной строки Объект.Записать(), это даст возможность посмотреть «А так ли все будет хорошо как задумалось

    Reply
  51. dtitov

    Очередной велосипед. За труды плюсую.

    Reply
  52. GCRaistlin

    Полезная штука, спасибо. Но вот «код неуникален» — это задалбывает. Как правило, обработка в итоге запускается трижды — первый раз обламываемся с неуникальным кодом, второй раз — вспомогательный, с большим стартовым номером, третий раз — окончательный. Это слегка чересчур. Хотя бы предупреждение надо добавить, что может неуникальность получится.

    Reply
  53. Kes

    ндя полуручная обраьботка получилась…. отбор вместо дато-периодов тоже как то печалит.. а так все ничего спасибо!

    Reply
  54. yokko

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

    Reply
  55. angelika74

    «код неуникален» — это задалбывает-не то слово.

    Спасибо за обработку, Но смотрите, что перенумеровываете…..

    Reply
  56. julia242977

    Поставьте, пожалуйста, упорядочивание по дате, тогда все вообще хорошо. Спавибо. Обработка вроде неплохая, пока срабатывает.

    Reply
  57. higs

    Обработку тоже забрал для работы именно бухам, чтобы было меньше вопросов. А три раза нажать перенумерацию не так и сложно, по телефону можно решить. В отличие от объяснений, как работать с ИТС-ной обработкой.

    Reply
  58. olezhe

    Годится для бухгалтеров. Зачёт.

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

    Поставил плюс.

    Reply
  59. lelusha

    Хорошая обработка, но хорошо бы иметь возможность сразу переименовывать все объекты. Хотя наверное так можно очень сильно накосячить, переименовывая все подрят

    Reply
  60. XOCTEP

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

    Reply
  61. white_ven

    Иногда такая нужна…

    Reply

Leave a Comment

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