Единая нумерация кадровых документов для ЗУП 3.1




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

41 Comments

  1. karaw

    Мог бы не извращаться это реализовывать через расширение, это у тебя простая обработка документов. И что за «К сожалению, из-за ограничений типовой конфигурации ЗУП 3.1, автоматическая нумерация производится только из форм документов; при создании документов обработками они будут нумероваться стандартно, это можно исправить потом массовой перенумерацией.»? Моё расширение http://infostart.ru/public/566545/ как раз и позволяет присваивать новый номер при записи нового документа. В этом и есть суть расширений конфигураций.

    Reply
  2. japopov

    Отличия моего расширения — в его гибкости. Читай описалово. Тем более, что ты не то что не скачивал его и не опробовал. Ты даже описание почитать поленился. Это не «просто обработка документов», это именно механизм для толковой нумерации кадровых документов так, как захочет кадровик, а не так, как ленивые методологи от 1С хотят (да, проблема известная, и ответ от них был один: «закон не запрещает, поэтому мы сказали — будет так»).

    И твоё, и моё расширение делают одну задачу — единую нумерацию. Оба выполняют эту задачу через… форму документа. Это неправильно, конечно, но из-за ограничений режима совместимости в ЗУП по-другому никак не сделать.

    Хочешь пример? Не вопрос: ну-ка, подключи своё расширение и создай документ массовой обработкой! Ну как, что там с номером? А почему не сработало, уже понял? У тебя нумерация в форме документа делается, так что до неё дело и не доходит. Правильнее было бы через модуль объекта, но платформа 1С не позволяет.

    Теперь, что предложил ты? Расширение, которое худо-бедно решает проблему, но не всегда, да и не настраивается никак. Что предложил я? Тоже расширение, тоже решает проблему не всегда, но зато настраивается гибко, и имеет механизм для исправления ошибок в нумерации там, где расширение могло не отработать. Простейший вопрос: подключили твоё расширение — и что, старые документы все перенумеровывать вручную?! А моё расширение это делает! Сравни сырой полуфабрикат и готовое блюдо и пойми разницу.

    Равиль, я понимаю твою личную обиду, но на обиженных воду возят. 🙂 Я тебе сказал спасибо за идею, но реализация — целиком моя, так что обиды оставь при себе.

    Reply
  3. GeterX

    Вероятно хорошая реализация, но не хватает возможности включения и других документов (отпуск, командировка, назначение плановых начислений)

    Reply
  4. japopov

    Александр, напишите, чего добавить (виды документов), будет… Просто отпуска, командировки и т.д. — у Вас ПРАВДА встают в единую нумерацию?!

    Reply
  5. GeterX

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

    Требуются включить следующие документы:

    — КадровыйПереводСписком

    — Командировка

    — КомандировкаСотрудников

    — МатериальнаяПомощь

    — НазначениеПлановогоНачисления

    — НазначениеПодработки

    — ОтпускаСотрудников

    — ОтпускБезСохраненияОплаты

    — ОтменаСовмещения

    — ПрекращениеПлановогоНачисления

    — ПрекращениеПодработки

    — Премия

    — ПриемНаРаботуСписком

    — РазовоеНачисление

    — Совмещение

    Единственно, что для некоторых документов может быть как единая кадровая нумерация, так и отдельно расчетная (типовая нумерация). У нас это было реализовано, так, при записи документа выходил запрос с выбором вида нумерации (кадровая, либо расчетная).

    Хотя разработчики 1С отговаривают от этого.

    Reply
  6. japopov

    Ну, кадровые списком уже (вы не смотрели моё расширение) 🙂

    Что до остальных… Вот не знаю. У меня кадровики нумеруют единым списком по организации, но только кадровые. да ещё добавляют суффикс «-ОК» к документам. Итого, за вычетом префиксов и суффиксов остаётся всего 3 знака на номер! Если, как Вы предлагаете, КАЖДЫЙ документ отпуска за свой счёт впихивать в общий список… Навскидку, для небольшой организации (человек в 100), за год сколько человек могут заболеть с перехлёстом на отпуск? Или поболеть с переходом на другой месяц? А это — каждый раз новый приказ… Пул номеров переполнится за год-два!

    И почему в Вашем списке есть отпуск без оплаты, но нет, скажем, больничного листа?

    Я не против доделать то, что имеет смысл, но Ваша просьба приводит к логическому противоречию. А поскольку я за свою практику не разу не видел сквозную нумерацию ВСЕГО по зарплате (а Вы этого требуете), пока делать не буду.

    Если у Вас есть мысли/обоснования по этой теме, поделитесь, будет смысл — сделаю и скажу спасибо за развитие! 🙂

    Reply
  7. i_pich

    У меня вот такая ошибка:

    Платформа: 1С:Предприятие 8.3 (8.3.10.2466)

    Конфигурация: Зарплата и управление персоналом, редакция 3.1 (3.1.3.101)

    Режим: Файловый (без сжатия)

    Приложение: Тонкий клиент

    Ошибки:

    ———————————————————————————

    18.07.2017 16:10:21

    пяа_ЕдинаяНумерацияКадровыхДокументов_ЗУП_3_1: Критичная: Значение контролируемого свойства РежимСовместимости у объекта не совпадает со значением в расширяемой конфигурации

    Reply
  8. Shefer

    Можно ли создавать несколько своих нумераторов? У нас кадровики хотят объединять Прием и ПриемСписком, КадровыйПеревод и КадровыйПереводСписком, увольнение аналогично, то есть 3 журнала нужно, ваше расширение так может?

    Reply
  9. japopov

    (8) нет, только в один список объединить. Остальные остаются с механизмом нумерации, предусмотренным 1С.

    Reply
  10. user617021_spamtmp

    Какой из файлов самый свежий?

    https://yadi.sk/i/S14IgnQC3RMDQy

    Reply
  11. grig_nv

    будет ли работать на 3.1.4 ?

    Reply
  12. ardn

    В этой доработке есть недостаток:

    Последний номер ищется запросом по МАКСИМУМ(…Номер) — результат этой функции совсем не последний номер.

    У вас не бывает дробных номеров?

    Думается, правильнее было бы преобразовывать все номера в числа (как это в запросе сделать, еще Ильдарович писал) и затем уже находить максимум.

    Reply
  13. japopov

    (12)

    Тогда работать будет ОЧЕНЬ задумчиво, не надо усложнять без нужды. Да и номера получаются слишком короткими, какие ещё дроби?!

    Reply
  14. kotenok_nv

    Добрый день!

    ЗУП 3.1.2.445 обработка запускается, но когда нажимаешь Заполнить документы, ничего не выводится.

    Reply
  15. japopov

    (14)

    Зарплата и управление персоналом, редакция 3.1 (3.1.3.274)

    Всё корректно работает

    Reply
  16. gfoods

    Подскажите,пожалуйста, купил вашу обработку, подключил и запустил её, а пользователи не могут получать настройки без доп установки им права «Администрирование данных» роли «Администрирование», что можно с этим сделать?

    Зарплата и управление персоналом, редакция 3.1 (3.1.4.171) ; 1С:Предприятие 8.3 (8.3.10.2639)

    Reply
  17. japopov

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

    Если Вас это не устраивает, Вы можете доработать расширение самостоятельно до нужного именно Вам результата, это нетрудно.

    Reply
  18. gfoods

    Настройки используются тем пользователем который сохраняет документ вот код из расширения

    Процедура УстановитьНомерКадровогоДокумента(ДокументОбъект,ИзменятьТекущийНомер = Ложь,ПереопределенныйПрефикс = «»,МаксНомЧисло = «») Экспорт

    Если НЕ(ПустаяСтрока(ДокументОбъект.Номер)) И НЕ(ИзменятьТекущийНомер) Тогда //не надо ничего делать!

    Возврат;

    КонецЕсли;

    Настройки = ПолучитьНастройкиНумерацииКадровыхДокументов();

    Reply
  19. dr.Slipknot

    Добрый день. В ЗУП 3.1.6.6 будет работать, если да, то какой файл скачивать?

    Reply
  20. Zonder

    (19)

    Добрый день. В ЗУП 3.1.6.6 будет работать, если да, то какой файл скачивать?

    Добрый день. Скажите, подошёл какой-либо файл для 3.1.6.6 ?

    Reply
  21. japopov

    (20) с ЗУП 3.1.6.6 последняя версия работает нормально. Более позднюю ЗУП (пока) не проверял, но не вижу причин, почему не должна работать.

    Reply
  22. hanio

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

    Reply
  23. japopov

    (22) почему не хочу делать с отпусками — уже написал в (6). Это очень плохо и обязательно вылезет боком через год-другой.

    почему не будет универсальности — написано в (2). К сожалению, ничего не могу поделать — всё только описывать через форму документа. Возможности расширений очень ограничены.

    Reply
  24. user978221

    ДД

    Вчера скачал обработку, подключил как написано выше «вызвать меню «Все функции», выбрать «Стандартные» — «Управление расширениями конфигурации». Нажать кнопку «Добавить» и выбрать соответствующий файл.

    Но в меню «Настройка» нет «Настройка нумерации кадровых документов». Так же не нашет в настройке действий и навигаций, подскажите, что делать?

    Reply
  25. japopov

    (24)

    1) Раздел Администрирование / Печатные формы, отчеты и обработки. Находите Расширения. Проверяете наличие «Единая нумерация кадровых документов для ЗУП 3.1». Если что не так — разбираетесь.

    2) Раздел Настройка, находите Сервис / Настройка нумерации кадровых документов.

    Reply
  26. leeyura

    Добрый день. При установке расширения и перезапуска 1с выскакивает ошибка Платформа: 1С:Предприятие 8.3 (8.3.12.1529)

    Конфигурация: Зарплата и управление персоналом, редакция 3.1 (3.1.7.87) (http://v8.1c.ru/hrm/)

    Copyright © ООО «1C-Софт», 2007-2018. Все права защищены

    (http://www.1c.ru)

    Режим: Файловый (без сжатия)

    Приложение: Толстый клиент

    Локализация: Информационная база: русский (Россия), Сеанс: русский

    Вариант интерфейса: Такси

    Ошибки:

    ———————————————————————————

    19.09.2018 16:30:34

    пяа_ЕдинаяНумерацияКадровыхДокументов_ЗУП_3_1: Критичная: Значение контролируемого свойства CompatibilityMode у объекта не совпадает со значением в расширяемой конфигурации

    Reply
  27. leeyura

    ДОбрый день. После загрузки расширения и перезапуска ошибка 19.09.2018 16:53:33

    пяа_ЕдинаяНумерацияКадровыхДокументов_ЗУП_3_1: Критичная: Значение контролируемого свойства CompatibilityMode у объекта не совпадает со значением в расширяемой конфигурации Платформа: 1С:Предприятие 8.3 (8.3.12.1529)

    Конфигурация: Зарплата и управление персоналом, редакция 3.1 (3.1.7.87)

    Reply
  28. japopov

    (26)

    Перепроверил в 1С: ЗУП 3.1.7.128. Всё работает. Вы, возможно, не ту версию скачали?

    В принципе, всё просто. В Конфигураторе поправьте в расширении параметр РежимСовместимости, установите такой же, как и в Вашей конфигурации.

    Reply
  29. RPV

    День добрый! На релизе Зарплата и управление персоналом, редакция 3.1 (3.1.8.112) перестала работать

    Reply
  30. user1093555

    На платформе 1С:Предприятие 8.3 (8.3.13.1513) с правами администратора все замечательно работает, а с правами Старшего кадровика вылетает ошибка — Нарушение прав доступа.

    Reply
  31. nikdn

    (28) Какую версию качать для 3.1.7 ?

    Reply
  32. 11111111111

    Давно скачивал все работало, сейчас перестала работать. Платформа 8.3.13.1616, версия 3.1.8.216

    Reply
  33. vinodelll

    Добрый день!

    Платформа 8.3.13.1690, версия 3.1.8.216

    ошибка: «Критичная: Значение контролируемого свойства РежимСовместимости не совпадает со значением расширяемой конфигурации»

    Reply
  34. vinodelll

    На платформе 1С:Предприятие 8.3 (8.3.13.1690) с правами администратора все замечательно работает, а с правами Старшего кадровика вылетает ошибка — Нарушение прав доступа.

    Как сделать чтоб расширение работало и с другими правами (не только Админскими)???

    Reply
  35. Marina-M84

    Добрый день. На erp будет работать?

    Reply
  36. Олег1С

    А как поменять режим совместимости с Версия 8.3.8 на 8.3.12 ? Недоступно для редактирования.

    Reply
  37. Олег1С

    нашел как, извините

    Reply
  38. dr_dom

    (37) После смены режима совместимости запустилось на 3.1.8?

    Reply
  39. Олег1С

    Да, все заработало!

    Reply
  40. Zexes

    Добрый день! Подскажите, на текущих релизах (3.1.10.111) работает? Актуально?

    Reply
  41. Akava

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

    Получается сквозная нумерация по выбранным документам.

    Reply

Leave a Comment

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