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




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

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