Перенумерация элементов справочника




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

64 Comments

  1. cs25

    Не Даная … Но всё равно плюсик ! Главное — девушке приятно. 🙂

    Reply
  2. Abadonna

    >»плюсаните» рейтинг

    Обнажись махом — плюсану :))))))))))

    Reply
  3. vasilykushnir

    (2) Она уже обнаженная Махом….

    Reply
  4. Skorobogatko1

    Ну очень творческий подход к программированию :))))

    Прикольно!!!

    Reply
  5. coder1cv8

    Маха, почему опять без картинок? Как посмотреть «оригинальный дизайн» не скачивая?…

    Reply
  6. vasilykushnir

    (6) Правильно — у женщины всегда должна быть загадка.

    Reply
  7. CheBurator

    Е-мае!

    А на 7-ке я остался без сюрприза….

    Reply
  8. vasilykushnir

    (8) Аналогично… Затр сделал девушке приятно…

    Reply
  9. vasilykushnir

    затр = зато

    Reply
  10. Abadonna

    (10) Ой, чую, под «»затр» вовсе не «зато» подразумевалось 😉 А то я Кушнира не знаю 😛

    Reply
  11. Abadonna

    Ну а что? Если бы еще свою фотку на форму кинула, можно было бы и два плюсика поставить 😉

    Reply
  12. vasilykushnir

    (11) Чисто на автомате оговорился…

    Reply
  13. Abadonna

    Во! И я про автомат 😉

    Reply
  14. vasilykushnir

    (12) Да еще в виде, соответствующем нику… (я аж замурлыкал…)

    Reply
  15. vip

    Развеселились, старые пердуны :)))

    Reply
  16. Abadonna

    Гойя в 1С — круто 😉

    Reply
  17. Abadonna

    (16) можно подумать он — пердун молодой ;)))))))))))

    Reply
  18. isn

    не работает. при тестовой перенумерации справочника. когда в списке 1 элемент и он номером отличным от 000001. обработка стирает номер и не присваевает другой

    Reply
  19. vasilykushnir

    (19) Да что ты — работает/неработает…. Видишь — здесь совсем другие проблемы решаются: всем вдруг захотелось обнажить Маху.

    Шутка конечно.(без обид).

    А если серъезно — разве код закрыт? религия не позволяет его подшаманить? Или жди, когда Маха подправит.

    Reply
  20. Father

    Маха, простите пожалуйста, минусанул случайно…. ээээххх….

    Reply
  21. Abadonna

    (23) Переплюсуй :))

    Reply
  22. Father

    Афигеть, не знал, что можно переголосовать =)

    Позор мне…..

    Reply
  23. poppy

    > Уникальность кода гарантирована, если в справочнике нет элементов,

    > код которых содержит какие-либо символы (не буквы и не цифры 🙂 ).

    Уникальность не гарантирована, даже если в коде используются только цифры… 🙁

    Reply
  24. poppy

    (27)

    > Позвольте вам не поверить. Уникальность кода

    > гарантирована, если используются только цифры.

    Ну-ну… Возьми любой справочник с двумя элементами. У одного элемента код «0». У другого — «00000000» (количество нулей = длине кода). Чем не цифры?

    > По другому в силу используемого алгоритма быть не может…

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

    Reply
  25. Abadonna

    (27) Мария, с кем угодно можешь спорить, только не с poppy 😉 Она всегда права

    Reply
  26. O-Planet

    Жесть какая-то… Даж Чебурашка очарованию поддался и молчит. Все знают его особый интерес к разным перенумерациям…

    Но, по делу… Алгоритм не понравился. Посколько разработка сравнительно простая, то должна просто блистать оптимальностью. То, что Счетчик1 не используется — это чтобы врагов запутать? И ни что не мешает обойтись без запроса…

    Оформление — тоже не понравилось. Все должно быть в тему. Если интересен пример идиально-оригинального оформления обработки, то воть: http://infostart.ru/projects/454/ 😉

    poppy, все решается просто:

    Код
    Пока Истина Цикл
      Попытка
        ЭлементСправочника.Код = ... ;
        Прервать;
      Исключение
        Счетчик=Счетчик+1;
      КонецПопытка
    КонецЦикла;
    

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

    Кстати, дополнение очень правильное. У меня у клиентов часто бывают товары с кодом по 6, 7 и 8 символов.

    ПС Так вот простые обработки тут выкладывать! 😉

    Reply
  27. O-Planet

    … а вот еще пример «оформления». Почти Гойя 😉

    http://webfile.ru/2014539

    ПС по определенным причинам, выложить ЭТО сюда не могу…

    Reply
  28. poppy

    (30)

    > poppy, все решается просто:

    Спасибо, Планет, я в курсе. Только ты неправильно код написал. Внутри попытки должна быть запись элемента, но не только присваивание кода.

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

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

    На сайте полно перенумераторов, но ни один из них толком не работает. 🙁

    Reply
  29. O-Planet

    (32)

    поскольку писалось в 6 утра, то можно сказать, что оно — правильно.

    Reply
  30. hogik

    А в каких случаях требуется “перенумерация” элементов справочника?

    Reply
  31. O-Planet

    (37) Когда мат уже не помогает…

    (36) >> счетчик1 используется

    не нашел 🙁 6 утра…

    Reply
  32. hogik

    (38)

    Не про мат, а про “перенумерацию”.

    Долго пытался вспомнить в своем 35 летнем пребывании около АСУпа такой случай – не вспомнил. Склероз… :-(((

    Reply
  33. poppy

    (30)

    > То, что Счетчик1 не используется — это чтобы врагов запутать?

    Похоже, что запутала… 😉

    Вероятно, Маха не подозревает о существовании цикла "ДЛЯ".

    Код
          Строка = "";
          Для Cчетчик1 = 1 По Справочник.Метаданные().ДлинаКода Цикл
             Cтрока = Cтрока + "0";
          КонецЦикла;
    

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

    Reply
  34. poppy

    (41)

    Точно!

    Еще можно так написать:

    Код
          Строка = "";
          Счетчик1 = 1;
       ~М1:
          Cтрока = Cтрока + "0";
          Cчетчик1 = Cчетчик1 + 1;
          Если Cчетчик1 <= Справочник.Метаданные().ДлинаКода Тогда
             Перейти ~М1;
          КонецЕсли;
    

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

    Но, я бы написала:

    Cтрока = "00…всего тридцать восемь нулей…00";

    Так букавак и строк меньше.

    Reply
  35. O-Planet

    Poppy, любишь погорячее? Тогда уж так:

    Код
    Функция СтрокаКод(Сч,Справочник)
      Возврат ?(СтрДлина(Строка(Сч))<Справочник.Метаданные().ДлинаКода,СтрокаКод("0"+Сч,Справочник),Сч);
    КонецФункции
    

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

    Reply
  36. O-Planet

    Нет, девушки, вы мне объясните, нупу, популярно, для поднятия уровня общего развития: зачем вообще это делать в любой интерпретации?

    Код
    Строка = "";
    счетчик1 = 1;
    Пока счетчик1 <= Справочник.Метаданные().ДлинаКода-1 цикл
      строка = строка + "0";
      счетчик1 = счетчик1 + 1;
    КонецЦикла;
    

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

    Что мешает просто вот так написать:

    ЭлементСправочника.Код = Прав(("0000000000000000000000000000000000" + Строка(Формат(счетчик, "ЧГ = 0; ЧН = ‘0’"))), (Справочник.Метаданные().ДлинаКода));

    Reply
  37. O-Planet

    А! О!!! Об этом уже писалось в (42)…

    Reply
  38. poppy

    (46)

    Не, 100 — не окажется, максимум — 50. Поэтому в (42) и (44) должно быть по пятьдесят нулей в строке.

    (43)

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

    Reply
  39. poppy

    (36)

    > Однако такая ситуация возникает только если в кодах двух или более

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

    > возникают достаточно редко (сказала бы даже — очень редко, вероятность их

    > возникновения, очевидно, близка к нулю…).

    > Ну, будем считать, что уникальность кода гарантирована на 99,99%

    У блондинки спрашивают:

    — какова вероятность встретить живого динозавра на улице?

    — 50%

    — почему?

    — я его либо встречу, либо не встречу…

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

    > Уникальность кода гарантирована.

    Во втором издании уникальность гарантирована скорее платформой. Просто обработка перестала вываливаться в ошибку.

    Однако, последовательность нумерации не гарантирована даже на множестве чисел, хотя такое ограничение изъято из описания…?

    > Код естественно не запаролен (в силу своей чрезвычайной простоты)

    Во втором издании код стал не такой простой и однозначный, лучшеб он был запоролен…

    Reply
  40. O-Planet

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

    Reply
  41. poppy

    (50)

    > Потому и изъято, что во втором издании последовательность

    > и уникальность гарантирована.

    Я не смогла обнаружить ни один справочник в типовой демо-бухгалтерии 1.6, c которым смогла бы справиться обработка.

    Это так и должно быть?

    > А что до юмора о блондинках — так мир все равно вертится вокруг них.

    Я бы сказала — вокруг нас с тобой.

    Reply
  42. O-Planet

    >> А что до юмора о блондинках — так мир все равно вертится вокруг них.

    >> Я бы сказала — вокруг нас с тобой.

    Возможно, в данный момент вы просто сидите с ноутбуками на каруселе…

    Как можно стоить отношения с блондинкой? Она — впечатлительна, ранима, боится кошек и мышей, считает, что умеет хорошо готовить, и может просто взять и потолстеть ради прикола, а через месяц снова стать прежней. Похоже, это блондинок особо забавляет. Блондинка может просто взять и отключиться, задумавшись о чем-то своем, и тогда к ней не пробьешься и пушками. Она может прохохотать весь вечер в компании, а потом признаться, что ей там было скучно. Но по большому счету, она не умеет скрывать чувства. Если в ней и есть рациональное зерно, то оно спрятано очень глубоко. Я встречал, пожалуй, лишь одну или двух блондинок, которые заставляли меня ими восхищаться. Остальные — симпотичные, оригинальные, неповторимые, милые, но лучше, чтобы это было где-то далеко… Короче, все боятся блондинок! 🙂

    Reply
  43. Вадимко

    Ипать…

    Reply
  44. Punisher

    Млин файл не открылся. Надо… надо переходить на 8.1 🙂

    Reply
  45. ЛохНесс

    Ого!

    Щас так модно? Выкладывать неработающие разработки? Песец! 🙁

    Интересно, за что голосовали восемьдесят лузеров? За то, чтобы Маха публично обнажилась? Или за то что она позировала известному художнику?

    Reply
  46. poppy

    (53)

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

    Иногда сидим с ноутбуками, иногда — в карусели.

    Все в мире относительно. Смотря какую систему координат взять за основу.

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

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

    Таже фигня. Я встречала лишь трех-четырех грамотных бухгалтеров. Остальные (бухгалтеры) — ну полные блондинки. 😉

    Reply
  47. maljaev

    Я в шоке… Теперь понимаю почему Abadonna положил свой … на все это дело.

    Reply
  48. sashocq

    Алгоритм — пипец! Жаль, не хватает рейтинга минусануть

    Reply
  49. master_yoda

    я бы тоже минусанул за такое исполнение

    Reply
  50. bvv003

    Красиво!!!!!!!!!

    Reply
  51. Phantomo

    Код потряс. Кто-то выше писал, что лучше он бы был запоролен и я с ним полностью согласен. К тому же не учтена возможность ведения префиксации справочников. При таком подходе вся нумерация слетит, а если она достаточно сложная (у меня префикс строится из кода узла РИБ и префикса организации), то можно попрощаться с хоть

    какой-либо информативностью.

    Reply
  52. Mayak

    Что б перенумеровать справочник, пришлось раз 10-15 запустить обработку. Т.е. обработка не доработана.

    Reply
  53. WKBAPKA

    кошмар… 183 плюса… правду женщины говорят, что над мужиком, при виде голой женщины, контроль имеет явно не та голова!

    Reply
  54. Поручик

    Иппическая сила, отсыпте травки, кто плюсовал..

    Reply
  55. dgeday

    Что-то обработочка не подошла, 😀 но за оригинальность +

    Reply
  56. flaks

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

    Reply
  57. SkorikA

    Пригодилось, спасибо!

    Reply
  58. forurchik

    ОТличная мне очень понравилось. большое спасибо

    Reply
  59. Epic_Fail

    Большое спасибо! В своё время очень даже помогло ))))

    Reply
  60. Bomba1911

    ОТличная мне очень понравилось. большое спасибо

    Reply
  61. tanya1605

    мне так хочется иметь такую обработку, но нет пока возможности скачать с сайта, пожалуйста, пришлите на почту tanya160577@mail.ru/ спасибо!!!

    Reply
  62. akozhuhova

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

    Reply
  63. dddimmm

    стоит 1С 8.2

    «Управление торговлей», редакция 10.3 (10.3.26.1)

    в базе только справочники перенесенные из 7.7

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

    Reply
  64. TIGER1991

    В УТ 10.3.32.1 не работает

    Reply

Leave a Comment

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