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




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

45 Comments

  1. CheBurator

    Чем лучше штатной обработки, размещаемой на дисках ИТС?

    Reply
  2. snarkelun

    Во-первых можно выбрать какой вид документа или справочника перенумеровывать

    (выбирается в форме, а не передается параметром).

    Во-вторых для документов выбирается период за который перенумеровывать.

    В-третьих выполняется в десятки раз быстрее.

    В-четвертых можно указать количество разрядов номера (шаблон для текстовых номеров).

    Reply
  3. easy_dee

    спасибо, за обработку….)))

    Reply
  4. CheBurator

    (2)

    1. ну и что? преимущество сомнительное…

    2. а если мешающий номер будет лежать вне заданного периода — что будет в случае «нарушения уникальности»?

    3. это надо проверить..

    4. это да, может пригодится… но тоже сомнительно…

    Reply
  5. CheBurator

    ТипНомера = СокрЛП(Метаданные.Справочник(ВидСправочника).ТипНомера);

    {C:ПЕРЕНУМЕРАЦИЯДОКУМЕНТОВИСПРАВОЧНИКОВПЕРЕНУМЕРАЦИЯСПРАВОЧНИ­КОВ000000.ERT(37)}: Поле агрегатного объекта не обнаружено (ТипНомера)

    Reply
  6. Esperance

    Ответ Сhe Burashke: в модуле вместо указанной строчки написала ТипНомера= «Текстовый»; и все работает, автору спасибо большое!

    Reply
  7. CheBurator

    смотрим сюда. на всякий случай…

    http://www.infostart.ru/articles/242/

    Reply
  8. poppy

    (6)

    Esperance, на справочнике с числовым кодом и выбраным префиксом проверяла?

    У O-Planet’а в похожей ситуации аналогичная обработка вообще подвисает.

    Reply
  9. Abadonna

    >ТипНомера = СокрЛП(Метаданные.Справочник(ВидСправочника).ТипНомера);

    Вредный ты, Чебур 😉 Описка у автора, полагаю…

    Надо

    ТипНомера = СокрЛП(Метаданные.Справочник(ВидСправочника).ТипКода);

    >в модуле вместо указанной строчки написала ТипНомера= «Текстовый»; и все работает, автору спасибо большое!

    Да уж… А в следующий раз ТипНомера= «Числовой» писать будешь?

    Reply
  10. Abadonna
    Код
    Процедура ПриСменеВидаСправочника()
       //............................
           ТипНомера = СокрЛП(Метаданные.Справочник(ВидСправочника).ТипКода);
       Если  ТипНомера="Числовой" Тогда
          Форма.ПрефиксШаблона.Доступность(0);
          ПрефиксШаблона="";
       КонецЕсли;
           //...............................
    КонецПроцедуры   
    

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

    Вот так надо, во избежание…

    Reply
  11. Abadonna

    (10) Сам чуток лопухнулся.. 🙂

    Код
    Если  ТипНомера="Числовой" Тогда
          Форма.ПрефиксШаблона.Доступность(0);
          ПрефиксШаблона="";    
       Иначе
          Форма.ПрефиксШаблона.Доступность(1);
    КонецЕсли;
    

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

    И на фига мне последовательность справочников, как они в конфе идут? Неудобно!

    Надо добавить: ВидыСпр.Сортировать();

    Reply
  12. CheBurator

    я не вредный, я — дотошный.. это значит до тошноты вредный…

    Reply
  13. snarkelun

    Исправлены ошибки, учтены пожелания.

    Особые благодарности Abadonna +1, Сhe Burashka (я тоже ДоТошный).

    Reply
  14. snarkelun

    (4)

    Если мешающий номер будет лежать вне заданного периода: две возможности 1) расширить период, 2) номер будет пропущен

    Reply
  15. poppy

    Хороший алгоритм перенумерации. Однако, при определенных исходных данных можно получит ошибку:

    ДокуменДляПеренумерации.Записать();

    {С:ПЕРЕНУМЕРАЦИЯДОКУМЕНТОВ.ERT(234)}: Номер не уникальный!

    Например. В выбранном периоде имеется 7 документов. Исходные номера — с префиксами. Задаем префикс = «1», длина шаблона = 1.

    Reply
  16. poppy

    (12)

    > я не вредный, я — дотошный.. это значит до тошноты вредный…

    — это что за клоун?

    — местный, говорит мудила-страшный…

    — страшный? ты сказал страшный? меня зовут страшила-мудрый, однако! живу в подводном посёлке, в оленеводческом совхозе…

    (с) Гоблин (Буря в стакане)

    Извини, навеяло… 😉

    Reply
  17. snarkelun

    Добавлена проверка на правильность шаблона.

    Плюс некоторые внешние усовершенствования.

    Reply
  18. Shaman100M

    Есть пара вопросов.

    Вид документа, имеющий ссылку на общий нумератор нескольких видов, похоже, не сможет перенумероваться?

    Функция ПроверкаВЗаблокированныхДокументах() поиск номера осуществлен перебором списка. Имхо, лучше обрезать пробелы в значениях в списке сразу и использовать НайтиЗначение(). Еще метода, — на порядок быстрее будет искать в строке, сделав предварительно ВСтрокуСРазделителями().

    Reply
  19. magus

    На поле ввода ПрефиксШаблона логичнее повесить процеудру ПроверкаПравильностиШаблона(), но не ПриВводеДлинаШаблона()

    Кнопки Закрыть() не хватает.

    Reply
  20. magus

    Еще предложение. Вместо кода

    Код
       Синоним = СокрЛП(Метаданные.Документ(Индекс).Синоним);
       Идентиф = СокрЛП(Метаданные.Документ(Индекс).Идентификатор);
       Если Синоним="" Тогда
          Синоним = Идентиф;
       КонецЕсли;   
    

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

    Можно написать:

    Код
       Синоним = СокрЛП(Метаданные.Документ(Индекс).Представление());
       Идентиф = СокрЛП(Метаданные.Документ(Индекс).Идентификатор);
    

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

    Reply
  21. magus

    По какому признаку были выбраны недопустимые симовлы?

    Проверка шаблона нужна только для предупреждения пользователя или для его ограничения?

    Если перед шаблоном поставить пробелы, то проверка незаметит запрещенные символы. Например шаблон «~» проверку не пройдет, но » ~» пройдет успешно.

    Reply
  22. poppy

    (17)

    > Добавлена проверка на правильность шаблона.

    Бяка. Стало хуже. ИМХО неоправданные ограничения для получения сомнительного результата.

    Reply
  23. anton905

    Спасибо! помогло — времени нет и эта обработка очень кстати!!

    Reply
  24. shard

    а в чем отличие по функционалу от стандартного комплекса обработок UChoice?

    Reply
  25. rabanik

    Спасибо ОГРОМНОЕ очень помогла!!!!!

    Reply
  26. karbofos

    Пришлась оченьно к стати. Самому было лениво писать. А юэеры такого понаписали за то время пока я в отпуске был.

    В общем Спасибо.

    Reply
  27. GSoft

    спасибо за лелеяние моей лени )))))

    Reply
  28. cheri

    Спасибо огромное!!! Прекратились мои мучения по перенумерации вручную.

    Reply
  29. Мартовский_котя

    надо добавить фирму…. в перенумерцию по документам у многих на разные фирмы разные префиксы и разные номера а он зараза их под одну греьенку

    Reply
  30. NaidaM

    Очень удобная обработка…

    афтару +1

    Reply
  31. IsiKosta

    Отсортируйте список видов, добавьте описание. Плюсую.

    Reply
  32. vilkomaudit

    Извините, а я могу такую обработку по перенумерации рко и пко получить, очень нужно… 🙂

    Reply
  33. po.l.i

    почему-то при перенумерации в документе количество символов в номере 7

    у себя я поправил так:

    // Для КолвоЗнаков = 1 По ДлинаШаблона-СтрДлина(СокрЛП(ПрефиксШаблона))-СтрДлина(Строка(МаксНомер)) Цикл

    Для КолвоЗнаков = 1 По ДлинаШаблона-СтрДлина(Строка(МаксНомер)) Цикл

    Reply
  34. Сашулик

    В свете Украинских изменений в налоговом законодательстве-хорошая обработка плюсую однозначно!

    Reply
  35. Tristania

    Спасибо большое!

    Reply
  36. NewYork

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

    Reply
  37. Markin

    Спасибо большое!

    Reply
  38. revril

    спасибо))очень пригодилась))

    Reply
  39. TrinitronOTV
    dgamelya пишет:

    спасибо))очень пригодилась))

    я тоже присоединяюсь….

    Reply
  40. tgnike

    То что надо!!

    Reply
  41. mkobzancev

    Респект автору

    Reply
  42. m-xolding

    Спасибо автору! Очень удобно, если документы вводятся не по порядку по датам, можно в любой момент, в пределах отчета, перенумеровать. За исключением уже выписанных документов для клиентов.

    Reply
  43. MoonAriman

    Что-то я не понимаю… Максимальная длина кода справочника — 8, а он дает с учетом префикса сделать максимум 7. Разряд теряет, что меня совсем не устраивает. Но за скорость работы — плюс.

    Reply
  44. e812vk

    спасибо!

    Reply
  45. фюра

    Огромное СПАСИБО!!!

    Reply

Leave a Comment

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