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




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

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