Печать приказа на предоставление отпуска по беременности и родам, ЗУП(2.5.42.4)




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

    может номер строки табличной части лишний? и печатать для текущей выделенной строки по умолчанию стоит?

    Reply ↓
  2. kuz.mina
    и печатать для текущей выделенной строки по умолчанию стоит?

    я не ставила 😀 мне проще нашим кадрам объяснить, как пользоваться дополнительным полем в форме, чем отвечать на постоянные звонки: «Я тут нажала, а у меня не то появилось»

    Reply ↓
  3. e.kogan

    Хорошо бы по умолчанию сделать всё-таки печать всех строк, имеющих нужный вид неявки. Или регулировать доп.свойством.

    Кстати, как вам ЗУП на 8.2? Косяков много? Пользователи спокойно воспринимают?

    Reply ↓
  4. kuz.mina

    (4) позже попробую сделать, пока не до этого….

    косяки конечно есть, как же без них… пользователи до сих пор в шоке (зуп стоит уже 5 месяцев), особенное если учитывать, что до этого кадры работали в ворде, а зарплатники в БЭСТе. худо-бедно учимся, уже виднеется свет в конце тонеля

    Reply ↓
  5. Молодой 1Снег

    {ВнешняяОбработка.ОтпускаПоБеременностиИРодамТ6.МодульОбъекта(129)}: Ошибка при вызове метода контекста (ПолучитьОбласть): Область не найдена: Согласовано

    ОбластьМакетаСогласовано = Макет.ПолучитьОбласть(«Согласовано»); // с кем согласовано

    по причине:

    Область не найдена: Согласовано

    Reply ↓
  6. kuz.mina

    (6) Извиняюсь, мой косяк, блок Согласовано работал только для макетов нашей организации. Исправила, можно качать заново. Однако интересен тот факт, что обработку скачали уже 62 человека, а ошибка обнаружилась только сейчас =)

    Reply ↓
  7. Abadonna

    (7)

    Однако интересен тот факт, что обработку скачали уже 62 человека, а ошибка обнаружилась только сейчас =)

    Да ничего удивительного. Качают «абы було», на всякий случай.

    Reply ↓
  8. Abadonna

    +(8) Кстати, и ваши могли спокойно обойтись без оного, у вас же там не конвейер беременных? Ручки бы не отвалились в кадрах в Ворде нарисовать в кои-то веки

    Reply ↓
  9. Молодой 1Снег

    (7) Плюсую

    Reply ↓
  10. kuz.mina

    (8) Даже если «абы было», можно же запустить посмотреть. не понимаю я таких

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

    Reply ↓
  11. Abadonna

    (11) Слушай, а ведь бывают и НЕ кадровые приказы…

    Как же они, бедные, их печатают? 😀

    Reply ↓
  12. kuz.mina

    (12) наверно, таких еще небыло, ибо если бы им еще какую бумажку надо было, они бы уже давно ко мне прибежали. Забавно то, что они только с начала года начали работать в 1с, до этого ВСЕ приказы набивали в ворде

    Reply ↓
  13. KostyaBu

    Процедура ПолучитьТекстЗапросаПоОтветственнымЛицам() переехала из модуля ФормированиеПечатныхФорм в модуль ФормированиеПечатныхФормЗК, после редактирования все работает. Автору огромная благодарность!!! 😀

    Reply ↓
  14. Bruk

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

    Reply ↓
  15. tanilka

    а у меня на ЗуП 2.5.40.4 вылезла ошибка

    {ВнешняяОбработка.ОтпускаПоБеременностиИРодамТ6.МодульОбъекта(34)}: Метод объекта не обнаружен (ПолучитьТекстЗапросаПоОтветственнымЛицам)

    Запрос.Текст = ФормированиеПечатныхФорм.ПолучитьТекстЗапросаПоОтветственнымЛицам(

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

    Метод объекта не обнаружен (ПолучитьТекстЗапросаПоОтветственнымЛицам)

    Reply ↓
  16. tanilka

    Прошу прощения, прочитала комментарий (14), исправила — Все работает!!! Спасибо!

    Reply ↓
  17. anima-07

    {ВнешняяОбработка.ОтпускаПоБеременностиИРодамТ6.МодульОбъекта(34)}: Метод объекта не обнаружен (ПолучитьТекстЗапросаПоОтветственнымЛицам)

    Запрос.Текст = ФормированиеПечатныхФорм.ПолучитьТекстЗапросаПоОтветственнымЛицам(

    Пожалуйста, поясните подробно, как можно исправить косяк, не привлекая программиста!

    Reply ↓
  18. kuz.mina

    файл отредактирован в соответствии с релизом 2.5.42.4 ЗУП

    Reply ↓
  19. gutentag
    В виду того, что приказ о предоставлении отпуска по беременности и родам не предусмотрен действующим законодательством, но в нашей организации используется

    Вопрос теоретическо-филосовский: если законом не предусмотрен отпуск, то нет ли в этом нарушения закона(ов)?

    Reply ↓
  20. kuz.mina

    (20) нет, не нарушает. Организация имеет право издавать любые внутренние приказы не противоречащие законодательству

    Reply ↓
  21. 105raz

    Я уже третий год успешно сопротивлялась написанию подобного приказа. Из подобного же — приказ на смену фамилии. Но плюсик поставила, сейчас скачаю и попробую прикрутить с ЗиКБУ.

    Reply ↓
  22. gutentag

    (22) …ну, еще дождаться бы от Автора приказа «на разрешение получить единовременное пособие из ФСС» 🙂

    —

    Reply ↓
  23. kuz.mina

    (23) если попросят — и такой сделаю =) любой каприз за ваши деньги =)

    Reply ↓
  24. sdsmax

    Отпуск по беременности и родам обычно плавно переходит в отпуск по уходу за ребенком до полутора лет и мохно было бы расширить возможности данной формы. Сами пока в Ворде набираем.

    Reply ↓
  25. kuz.mina

    (25) Печатная форма отпуска по уходу за ребенком есть в документе Отпуск по уходу за ребенком. Зачем изобретать велосипед?

    Reply ↓
  26. winder

    Хорошо бы добавить авторегистрацию, а также отключение ответственного и списка согласований.

    Reply ↓
  27. Zas1402
    я не ставила smile:D мне проще нашим кадрам объяснить, как пользоваться дополнительным полем в форме, чем отвечать на постоянные звонки: «Я тут нажала, а у меня не то появилось»

    знакомая ситуация))

    Reply ↓
  28. sv-ikon

    А мы, вообще, не печатали такой приказ, пока ФСС не потребывала при подаче документов на возврат. И я уже месяц смотрю на бумажку образец, а руки не доходят сделать обработку, поэтому с радостью скачаю и поблагодарю автора.

    Reply ↓
  29. рибак

    счас скачну) посмотрим.. заранее плюс

    Reply ↓
  30. profych1

    Отлично, несколько раз уже разгорался спор по этому приказу. Нужен он или не нужен. Проблема в том, что в фонды требуют ксерокопии этих приказов. Вот и получается чехорда. Поэтоу лучше уж иметь печатную форму, да и 1С-никам давно бы пора ее внедрить в ЗиУП, а не упираться, что приказ не является основанием для отпуска по беременности и родам.

    Reply ↓
  31. tanilka

    (31) profych1, если 1с-ники начнут внедрять в конфигурацию все что просят фонды и налоговые, но не требуется по законодательству, то мы с Вами устанем обновляться… :-)))

    Reply ↓
  32. kuz.mina

    (32)а если не начнут, то мы устанем сами это дорабатывать

    Reply ↓
  33. tanilka

    (33) если за нас все будут делать 1с-ники, зачем же тогда вообще мы нужны?

    Reply ↓
  34. kuz.mina

    (34)например, чтобы исправлять их косяки =)))

    Reply ↓
  35. tanilka

    (35) Это точно… Об этом я как то подзабыла :-)))

    Reply ↓
  36. bahbah

    Хорошая печатная форма. Хотя вопрос с ее необходимости и спорный, автору большое спасибо за работу!!

    Reply ↓
  37. cmd_vasec

    Спасибо, хотел сам писать. А количество дней отпуска сохраняются?

    Reply ↓
  38. petrov_al

    Отлично у нас как раз начальник КАДРОВ потребовал печать данного приказа. Спасибо. Кстати долго ржал когда он заявил, дословно: «Внести в справочник отпусков Отпуск по беременности и родам для формирования приказа о предоставлении отпуска по беременности и родам». После этого захотелось действительного так и сделать и поставить галку предоставлять всем.

    Reply ↓
  39. kuz.mina

    (39) может ему еще нужно график отпусков по беременности и родам?))))))))))))))

    Reply ↓
  40. Nathaly

    Спасибо, как раз пригодилась

    Reply ↓
  41. sergiobargio1

    Спасибо, печатная форма очень полезная.

    Подскажите, пожалуйста, как поступить:

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

    Reply ↓
  42. kuz.mina

    Обработка крепится к документу НеявкиИБолезниОрганизации — кадровому документу.

    Reply ↓
  43. Bacemo

    В некоторых компаниях от нечего делать только и придумывают новые формы. Так что сойдет. От меня +.

    Reply ↓
  44. TrinitronOTV

    Большая благодарность автора за данную печатную форму, как раз понадобилась такая форма

    Reply ↓
  45. i_pich

    Спасибо, пригодилась!

    Reply ↓
  46. Infector

    Нашим понадобилась, в целом нормально

    Но на одну недоработку сразу могу указать: для подключения к документу «НеявкиИБолезниОрганизации» неплохо бы использовать макет «Параметры_Авторегистрации». Иногда все-таки и простые пользователи качают, а у них от действий по розыску и подключению нужного документа и ступор может быть.

    №2

    Дополняю:

    По умолчанию исполнителя стоит заполнять из данных поля «Ответственный». Там, конечно, не физ. лицо, а пользователь и не сотрудни, но если «пользователь» заполнен полностью и правильно, проблем с поиском нужного физ. лица или сотрудника нет.

    Reply ↓
  47. Semak

    ЗУП 2.5 (2.5.94.1)

    {ВнешняяОбработка.ОтпускаПоБеременностиИРодамТ6.МодульОбъекта(27)}: Метод объекта не обнаружен (ГоловнаяОрганизация)

    Запрос.УстановитьПараметр(«ГоловнаяОрганизация», ОбщегоНазначения.ГоловнаяОрганизация(СсылкаНаОбъект.Организация));

    там функция «ГоловнаяОрганизация» в модуле «ОбщегоНазначенияЗК»

    Reply ↓
  48. Infector

    То верно, но учтите, что публикация не первой свежести.

    Reply ↓

Leave a Comment

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