Групповая обработка регистров сведений (изменение сразу нескольких полей, копирование с изменением любых полей) на основе обработки от Gmix




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

29 Comments

  1. Поручик

    (0) Так для 8.1 или 8.2. Если для оботх

    Reply
  2. Поручик

    (0) Так для 8.1 или только 8.2? Если для обоих, добавь второй файл

    Reply
  3. Puk2

    Добавил для 8.2

    Reply
  4. Dem1urg

    Под 8.2 при отключенном режиме совместимости не работает.

    Не надо было её на построителе отчета делать.

    Reply
  5. tiwolf

    обработка очень полезная, но для своих целей пришлось доработать ее и универсализировать.

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

    покурив немного, решил добавить обработку Регистров накопления, Бухгалтерии, Расчета.

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

    прилагаю свой вариант на суд общественности:

    Reply
  6. Puk2

    (5) tiwolf, спасибо, скачал, но пока не пробовал, т.к. обычно для изменения регистров накопления и прочих приходится писать обработки с не прямолинейным алгоритмом

    Reply
  7. ludai

    (5) tiwolf, скачала Вашу обработку. Идея хороша, но вот отбор по регистратору слишком жесткий(((

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

    Reply
  8. tiwolf

    спасибо ludai за ответ.

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

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

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

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

    собственно выкладываю исправленную версию на 8.1 и версию для 8.2, так как с недавних пор перешли на новую платформу, чего и вам желаем.

    Reply
  9. tiwolf

    добавлю, что изменение подчиненных регистратору регистров предполагается производить ИСКЛЮЧИТЕЛЬНО в режиме отбора по регистратору с видом сравнения «РАВНО»… хотя при желании можно достучаться до поля ввода вида сравнения и поменять «РАВНО» на что — нибудь другое, но на это обработка не рассчитывалась и этот момент не настраивался… так что если у кого-то возникнет желание доработать и этот момент, то флаг вам в руки, я не против 🙂

    Reply
  10. 1C82

    Скачал с http://gmixdev.ru последнюю версию в УТ10.3 прекрасно работает.

    (8) tiwolf, А почему отдельно не опубликовать? Тоже смотрел , не плохое продолжение данной разработки!

    Reply
  11. tiwolf

    (10) отдельно публиковать не вижу необходимости. скорее это допиливание чужой разработки. хотя и очень объёмное

    Reply
  12. Lenka_Boo

    В самописной конфиге 8.2 сругалось на «ЦветаСтиля.ТекстВторостепеннойНадписи». Таковой отсутствует.

    (Если это будет полезно для допиливания универсальности.)

    Reply
  13. fktrc171

    (11) tiwolf, если нетрудно , подскажите, как можно отобрать записи в регистре расчета , в которых сотрудник не соответствует физ лицу (так перенеслось из 77 , что в записи сотрудник Иванов , а физ лицо Петров)и если это возможно вашей обработкой, то еще и исправить : взять физ лицо , указанное в сотруднике.

    Reply
  14. wowkai

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

    Reply
  15. Allen5

    Плюсанул. Вещь нужная. Почему-то не могу изменить Период в периодическом зависимом регистре сведений. Его вообще можно изменить этой обработкой? Если да, то как? Спасибо!

    Reply
  16. zato1c

    Отлично все гениальное просто!

    Reply
  17. bzmax

    Ставлю минус.

    Идея использовать для фильтрации построитель не верна!

    Построитель не выбирает для фильтрации ресурсы и реквизиты регистра, а только измерения.

    А кто сказал что отфильтровывать записи нужно только по измерениям?

    Reply
  18. Alex1Cnic
    А кто сказал что отфильтровывать записи нужно только по измерениям?

    Энто точно, присоединюсь к сказанному! а так конечной плюс!

    Reply
  19. ГердаКай

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

    Reply
  20. natarezn

    спасибо за обработку!

    Reply
  21. lesenoklenok

    Спасибо, обработка облегчила жизнь

    Reply
  22. Puk2

    (19) ГердаКай, не полностью понятно что вы собираетесь менять в адресе, но чисто гипотетически (телепатически) предположу, что не подойдёт. Скорее всего необходимо добавить функцию выполнения произвольного кода для обработки ПРЕДСТАВЛЕНИЯ адреса.

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

    Reply
  23. m_aster

    Спасибо, скачал для 8.1

    Reply
  24. b-dm

    Хорошая обработка, у меня заработала — я про ту что на 8.2 🙂

    Reply
  25. b-dm

    так что автору респект и уважуха..

    Reply
  26. andt

    Пытаюсь изменить записи регистра сведений.

    Отбор установлен по периоду.

    «Показать результат отбора» — показывает правильно.

    По «Выполнить» — ошибка:

    {Форма.Форма.Форма(323)}: Поле объекта не обнаружено (Пометка_Период)

    Если СтрокаТаблицы[«Пометка_» + Эл_отбора.ПутьКДанным] = Истина Тогда//Эл_отбора.ПутьКДанным=КолонкаРегистра Тогда

    Значения в регистре не меняются.

    Попробовал удаление с тем-же отбором — удаляет нормально.

    Использую последнюю версию обработки.для 8.2

    Reply
  27. Puk2

    (26) Все кто нашел мою обработку, советую воспользоваться реализацией автора gmix

    Когда-то у меня была срочная потребность в большом количестве изменений регистров сведений, на тот момент нашел чуть ли не единственную обработку от Gmix, но она умела изменять только один реквизит, что меня не устраивало. Я её немного модифицировал и выложил с согласия автора, т.к. аналогов тогда практически не встретил. Автор в итоге доработал свою обработку примерно с этим же функционалом, но в более «красивом» исполнении.

    Работает только на обычных формах!

    Reply
  28. b-dm

    Действительно, значения в регистре не меняются…

    Reply
  29. quadrodecor

    Для УФ на 8.3 не работает?

    Reply

Leave a Comment

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