Перенумератор документов для платформы v77 (перенумерует по любому количеству видов документов и нумераторов)




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

23 Comments

  1. prolancer

    (gutentag) исправил то, что Вы просили. Спасибо за коммент.

    Reply
  2. whtblck

    блин, где же ты был 2 недели назад 🙁

    не пришлось бы самому ваять.

    тем не менее, +

    Reply
  3. prolancer

    (2) эт не я, эт мой клиент захотел позже…

    за плюс, thnx… всем

    Reply
  4. MS_Tos

    а я только собирался делать ))

    Спасибо!!!

    Обработка в основном предназначена для востановления учета или для его коректировки!!

    Reply
  5. SatanClaws

    Нумераторы воспринимает?

    Reply
  6. prolancer

    (4) Обработка выполняет т.н. «сквозную» нумерацию по выбранным: периоду; виду и статусу (проведенные, не проведенные, удаленные, не удаленные) документов. При этом для проведенных документов перепроведение не выполняется, т.к. происходит изменение номера документа и его запись.

    (4),(5) Обработка выполняется только по одному (выбранному) виду документов. Нумератор (если он установлен у выбранного вида документа) используется только для поиска существующего документа с номером совпадающим с устанавливаемым. Если такой документ будет найден, то сначала у него произойдет замена номера на временный и его запись, затем запишется наш целевой документ, затем у найденного документа номер будет заменен на старый номер целевого документа и он будет записан в ИБ.

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

    Еще будут вопросы задавайте.

    За оперативность ответа, извиняйте, работа.

    Reply
  7. prolancer

    (5) ред. 2 теперь работает и с нумераторами.

    Reply
  8. Shaman100M

    А как решал проблему ИДНумератора = ИДДокумента ?

    Reply
  9. prolancer

    (8) Имеется ввиду проверка коллизии?

    Поиск документов коллизии выполняется не по идентификатору нумератора, а последовательно по всем видам документов входящих в нумератор. Для этого у целевого вида документа проверяется установлен-ли нумератор, если да, то составляется список видов входящих в такой нумератор, а затем последовательно создается объект для каждого конкретного вида документа попавшего в список и по этому объекту делается выборка документов.

    Почему делается выборка, а не поиск? Много лет тому назад когда использовал УРИБ, заметил, что после обмена данными в ИБ могут появиться документы и справочники с одинаковыми номерами и кодами, пришедшими из разных ИБ.

    Но так работает только в ред.2. В первом варианте обработки коллизия убирается только у первого найденного документа (см. мой ответ в 6 комменте).

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

    Reply
  10. SatanClaws

    (7) просто сам недавно делал нечто подобное.

    О нумераторах задумался не сразу…

    ЗЫ что-то в пятницу-ночер 9й ответ вкурить не могу — расскажу к чему пришел я: обходом по метаданым выбираются виды документов, принадлежащих выбранному нумератору.

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

    список сортируется по позиции документа (вторым параметром метода Сортировать()) и далее делается перенумерация.

    Кстати…

    С префиксами, так полагаю, никак не заморачивались?

    Reply
  11. prolancer

    (10) префикс указывается в поле ‘Начать с №’, в случае если среди выбранных видов документов нет ни одного «числового» номера. Префикс определяется следующим образом: анализируется последовательно символ заданного номера, если этот символ не число и не пробел, считается что это конец префикса, например если указать ’76/ 00 67 ‘, то в качестве префикса будет испорльзоваться ’76/’. Повторюсь, если нет «числовых» номеров.

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

    Обработка без пароля и открыта, можно посмотреть код. Кстати, там есть прокомментированная процедура УстановитьНовыйНомер() в которой реализован алгоритм автонумерации номера с проверкой коллизии. Необходимость в этой функции у меня появилась в связи с тем, что в 1С иногда «сбивается» автонумерация документов и перестает работать штатный метод УстановитьНовыйНомер(), так вот данная процедура делает то-же, что и штатный метод, только более надежно.

    Reply
  12. Bell

    Хорошо.

    Reply
  13. IsiKosta

    Сортировку в списке можно сделать, искать вид документа легче будет.

    Reply
  14. IsiKosta

    Не добавляет лидирующие нули к номеру …

    Reply
  15. gull71

    Из всех попадавшихся единственная справилась с с/ф на авансы в ПУБ-е через снятие с проведения:-) (Префикс ессно был «ав»)

    Reply
  16. mtn0a

    Немного не понял смысл этих многочисленных «перенумераторов». Как можно изменить номер всех документов(перенумеровать все документы за период), когда каждому из них соответствует печатная версия, которая хранится в бухгалтерии. Получается ситуация, когда у клиента документ с одним номером, а в организации с другим. Врятле бухгалтер допустит такую операцию. Коллеги, как этот вопрос решен у Вас?

    Reply
  17. prolancer

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

    Reply
  18. Stoly

    😉 перенумератор отличная вещь . при не оперативном учете товара. меня бухи слезно просили поставить

    Reply
  19. Nad1812

    Полезная вещь. Бухгалтерша очень просила.

    Reply
  20. elekona

    Эта обработка спасла три часа моего времени — огромнейшее спасибо!!!!

    Reply
  21. SkorikA

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

    Reply
  22. Urbant

    Спасибо. Очень помогло.

    Reply
  23. nina88

    Добрый день!

    подскажите после того как я скачала перенумератор на панели 1с должен появиться значок? сис.админа у нас нет. услышала от знакомой про Перенумератор, решила полазить и найти. Найти нашла))) а дальше ступор)

    Reply

Leave a Comment

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