История сотрудника (как в ЗиК`е) для ЗУП и УПП. Версия 1.04 от 19.02.2012




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

48 Comments

  1. gutentag

    Полезная вещь!

    Reply
  2. e.kogan

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

    Вопрос: на картинке-образце поля группируются, а в реальности — нет. Это баг или фича?

    Reply
  3. Armando

    (2) Группировка по периоду и документу.

    Reply
  4. e.kogan

    (3) Не поняла. Группировка строк меня не интересует. Я не вижу группировки полей в шапке, которая в образце наличествует.

    Reply
  5. Armando

    (4) Ясно. Если в обработку передать не пустой параметр «НужныеПоля», то колонки группироваться не будут.

    Reply
  6. Olga_bpz

    (5) Про группировки не очень понятно.

    Даже без группировок — классно!

    У нас УПП 1.2.22.3. Работает.

    Пока увидела один косяк:

    Работница была в отпуске по уходу за ребенком до 3 лет.

    Документом зарегистрировано, что она должна будет вернуться на работу в ноябре 2008 года на оклад 7000р. На самом деле она вышла на 2 года раньше (док. Изменение условий оплаты отпуска по уходу…)- это отразилось в Истории, на больший оклад, потом шли повышения оклада, отпуск, болезни — все в Истории правильно, и вдруг понижение оклада до 7000 в ноябре 2008г.

    Reply
  7. kit

    Удобно. Думаю, буху тоже понравтся.

    Reply
  8. Kuzkin_otets

    ВАХ!

    Reply
  9. Olga_bpz

    (5) Про группировки поняла, все получилось.

    Убрала склонение ФИО, т.к. у нас в наименовании сотрудника пишется: Иванов Иван Иванович (осн.) или (вн.совм.).

    Reply
  10. Armando

    (6) Это не баг. Именно так информация прошла по регистрам.

    (9) Есть такой косяк со склонением. Вчера заметил. Исправил.

    Reply
  11. Armando

    Поясняю про группировки колонок. На самом деле это не группировки, а логическое объединение колонок. Если задать параметр «НужныеПоля», то колонки будут выводиться в заданном порядке. В этом случае, ни о каком логическом объединении речи быть не может.

    Reply
  12. Olyunchik

    Большущий +!!!

    Reply
  13. Olga_bpz

    (10) Согласна, информация так прошла по регистрам. Но следующие записи вытесняют(отменяют её). Согласна, что сложновато это обработать, но хотя бы задокументировать надо.

    Кадровики и экономисты по труду счастливы. Спасибо большое.

    Reply
  14. АнатолийСтриж

    Почему-то скачивается 15-килобайтная пустышка Имя: История, расширения нет. Что-то не так?

    Reply
  15. Olga_bpz

    (14) Добавьте расширение .epf и подключайте как внешнюю печатную форму

    Reply
  16. Sonia

    Расчетчик попросила обязательно подключить. Большое спасибо. Плюс!

    Reply
  17. Armando

    Версия 1.02

    Испралена ошибка из (6) комментария:

    «Работница была в отпуске по уходу за ребенком до 3 лет.

    Документом зарегистрировано, что она должна будет вернуться на работу в ноябре 2008 года на оклад 7000р. На самом деле она вышла на 2 года раньше (док. Изменение условий оплаты отпуска по уходу…)- это отразилось в Истории, на больший оклад, потом шли повышения оклада, отпуск, болезни — все в Истории правильно, и вдруг понижение оклада до 7000 в ноябре 2008г.»

    Добавлена кнопка «Обновить»

    Reply
  18. Armando

    Версия 1.03

    В некоторых случаях неверно отражалось состояние работника. Например, когда досрочный возврат на работу из коммандировки отражался документом «Возврат на работу».

    Reply
  19. vladimirstg

    Добрый день!

    У меня не запускается в ЗУП 2.5 2.5.9.2.

    Тишина.

    Reply
  20. artbear

    УПП 1.2.17.3 не работает — там у спр. «Сотрудники организаций» вообще печ.формы не подключаются 🙂

    Reply
  21. Armando

    (19) Не могу проверить на 2.5.9.2 за неимением оного :(. Предлагаю обновиться.

    (20) В УПП сам не проверял, но у (6) все работет 🙂

    Reply
  22. Armando

    +(21) Только что проверил в УПП 1.2.21.1 — работает

    Reply
  23. Olga_bpz

    (20) В УПП 1.2.17.3 была зарегистрирована ошибка: у справочников не работала авторегистрация внешних печатных форм. Строчку со ссылкой на справочник Сотрудники нужно добавлять ручками и всё будет хорошо. В 1.2.21.3 авторегистрация работает.

    На версиях ниже 1.2.15 работать не будет, там совсем по-другому организован учет сотрудников и справочника сотрудники нет совсем.

    Reply
  24. artbear

    (23) В форме объект Спр.Сотрудники вообще не вижу ни одной кнопки «Печать» и т.д.

    Форму для этого спр. зарегистрировал. При этом в форме регистрации видно, что спр.Сотрудники есть 3 встроенные формы — Труд.договор и т.д.

    Как их получить, непонятно 🙂

    ЗЫ УПП 1.2.17.3 — скоро буду обновляться на последнюю УПП.

    Reply
  25. artbear

    (24) Упс, напечатал и увидел, что, оказывается, не для всех сотрудников печ.формы доступны 🙂

    Например, для штатных доступны, а я «тренировался» на уже уволенных.

    Строка «История сотрудника» в списке печ.форм при нажатии на «Печать» стала видно, но при ее нажатии все-таки ничего не происходит 🙁

    Reply
  26. artbear

    (25+) Выдается ошибка

    НаборЗаписейФИО = СсылкаНаОбъект.Физлицо.ПолучитьОбъект().мНаборЗаписейФИО;

    Строка 548

    Поле объекта не обнаружено (мНаборЗаписейФИО)

    Положил этот незначительный блок в Попытка-Исключение, обработка заработала.

    Ставлю +

    Reply
  27. aryan_spirit

    {ВнешняяОбработка.ИсторияСотрудника(601,24)}: Переменная не определена (УправлениеДопПравамиПользователей)

    ФормаИстории.Защита = <<?>>УправлениеДопПравамиПользователей.ЗащитаТаблиц();

    УПП для Украины 1.2.11.3

    Reply
  28. prickly

    Управление производственным предприятием, редакция 1.2 (1.2.21.1)

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

    Reply
  29. Alex_will

    вешь хорошая за это +, но если мозги имеются то допиливайте напильничком))

    Reply
  30. smooth

    На 2.5.18.2 не работает: 🙁

    Не удалось сформировать внешнюю печатную форму!

    Поле объекта не обнаружено (мНаборЗаписейФИО)

    Reply
  31. artbear

    (All) Для исправления (26) и (30) в строке 546 нужно вставить код

    // — Артур — исправил получение ФИО
    НаборЗаписейФИО = РегистрыСведений.ФИОФизЛиц.СоздатьНаборЗаписей();
    ОбщегоНазначения.ПолучитьСвязанныеДанныеФизлица(СсылкаНаОбъект.Физлицо, НаборЗаписейФИО);
    //НаборЗаписейФИО = СсылкаНаОбъект.Физлицо.ПолучитьОбъект().мНаборЗаписейФИО;
    // —завершение
    

    в комментариях тот код, который нужно заменить на вышеприведенный код.

    Наслаждайтесь 🙂

    Проверено на ЗУП 2.15.19.3

    Reply
  32. СуперСтар

    Релиз 2.5.23.4. Не работает. А жаль… 🙁

    Метод объекта не обнаружен (ПросклонятьФИО)

    Reply
  33. СуперСтар

    Впрочем, оригинальный аппендикс легко заменить на искусственный, и заработало. 😀 КомпоновщикНастроек.Настройки.ПараметрыВывода.Элементы.Найти(«Title»).Значение = «История: » + ФИОСотрудника;

    //Если УниверсальныеМеханизмы.ПросклонятьФИО(КомпонентаСклоненияФИО, ФИОСотрудника, 2, ,РезультатСклонения, СообщениеОбОшибке) Тогда

    // КомпоновщикНастроек.Настройки.ПараметрыВывода.Элементы.Найти(«Title»).Значение = «История » + РезультатСклонения;

    //Иначе

    // Сообщить(СообщениеОбОшибке);

    //КонецЕсли;

    Reply
  34. Shum23str

    А для одного физлица эта обработка работает?

    То есть в у меня в базе 4 организации. И в разные времена сотрудник работал по очереди во всех этих 4х организациях.

    Обработка покажет всю историю этого физлица?

    Или только для каждого сотрудника одной организации?

    Reply
  35. Boroda

    Ой, ну неконец-то! Так было удобно, когда появилась эта обработка, но потом, на новых релизах, стала давать сбои. Надеюсь, эта подстроена под новые конфигурации и свё будет ОК. Спасибо!

    Reply
  36. Armando

    Да да, дошли руки))

    Исправил ошибки. Сконвертил для 8.2. Тестировал на ЗУП ПРОФ 2.5.46.1.

    Reply
  37. Armando

    К сожалению у меня практически нет времени на публикации(((

    Поэтому крайне редко обновляю их.

    Протестируйте на УПП, пожалуйста, у кого есть возможность.

    Reply
  38. mamba

    Спасибо! На КА работает.

    Reply
  39. aqua22

    Полезная обработка, особенно на начальном этапе перехода с ЗиК на ЗУП.

    Reply
  40. horntankur

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

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

    Мы перешли на 8-ку буквально в сентябре прошлого года, а история тянется аж с 2002. Поэтому, как Вы понимаете, вся история зарегистрирована документами «Перенос данных», что делает колонку «Документ» в отчете ну оочень ненаглядной, мало того, Плановые начисления и перемещения регистрируются при переносе разными документами «Перенос данных», тем самым в отчете получается по 2-3 строки на одно движение.

    Я поменяла все поля «Регистратор» в запросах на поле «Первичный документ» — стало намного красивее и понятнее.

    Reply
  41. horntankur

    И еще: если сотруднику, например при приеме, назначено 2 начисления (оклад + перс.надбавка в одной организации, а другая с РК) — ловит только одно начисление. Пока не исправила

    Reply
  42. HelenKov

    Спасибо, замечательный отчет! Мне нужно было отследить историю изменения окладов.В ЗУП штатными средствами трудно увидеть такую информацию

    Reply
  43. dedicated

    Спасибо! Очень нужная обработка.

    Reply
  44. ula1c

    Действительно это первое, чего не хватало при освоении ЗУПа. Спасибо.

    Reply
  45. silver-747

    Все понравилось. Единственное когда входим в «Сгрупировать» выбрасывает из программы….

    Reply
  46. @lex

    Доброго дня. Поправьте, пожалуйста, ОбщегоНазначения… на ОбщегоНазначенияЗК 🙂

    Reply
  47. rr-irina

    У меня ЗИК БУ 8.2. выдаёт ошибку Не удалось сформировать внешнюю печатную форму!

    Метод объекта не обнаружен (ПолучитьЗначениеПеременной)

    Reply
  48. RodinMax

    У кого выдаёт ошибку

    «Не удалось сформировать внешнюю печатную форму!

    Метод объекта не обнаружен (ПолучитьЗначениеПеременной)»

    Нужно в Модуле объекта заменить все строки содержащие фразу «ОбщегоНазначения»

    на «ОбщегоНазначенияЗК», сохранить и переподключить печатную форму.

    (проверил на 8.2.17.169 / ЗУП 2.5.68.1)

    Reply

Leave a Comment

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