Остатки отпусков сотрудников организации. С деньгами!!!




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

44 Comments

  1. СуперСтар

    Попробовал,пока есть только вопросы:

    1. Что за загадочная колонка «Дополнительный оплачиваемый», какие дни в ней показывает отчет?

    2. Прошлые годы, остатки тех отпусков, кроме текущего, отчет не учитывает? Как настроить, чтоб считал с начала учета?

    3. Дополнительные неоплачиваемые отпуска > 14 дней не учитывает?

    4. Где в типовой конфигурации можно увидеть типовой механизм расчета остатков отпусков, о котором упоминается?

    Наверное я не умею его готовить ;))

    Reply
  2. Armando

    (1)

    1. Загляни в справочник «Виды ежегодных отпусков»

    2. Считает с момента последнего заполнения справочника «Остатки отпусков организаций»

    3. Неоплачиваемые отпуска > 14 дней и отпуск по уходу за ребёнком (вопреки закону) учитываются как стаж дающий право на отпуск… Я для себя сам исправлял.

    4. В конфигураторе)))

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

    (2)

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

    3. Ответ не понят. По законодательству неоплачиваемые отпуска (за свой счет) > 14 дней в год уменьшают (или сдвигают) рабочий период для исчисления отпуска. Отчет это учитывает, или гуляй хоть сколько за свой счет — ничего не уменьшится?

    Reply
  4. nightsun

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

    Reply
  5. sv1233

    Обновили конфигурацию в октябре и отчет перестал работать, что делать? Подскажите, пожалуйста.

    Reply
  6. Armando

    Ждать, когда я обновлю конфигурацию и переделаю отчет 😐

    Reply
  7. sv1233

    Заранее, спасибо, будем ждать.

    Reply
  8. Lectat

    Почему обработка скачивается, как просто файл?

    Reply
  9. filis

    Выдает ошибку (ТК 2.5.20.3):

    {ОбщийМодуль.ПроцедурыУправленияПерсоналом(2011)}: Ошибка при вызове метода контекста (Выполнить): {(6, 2)}: Тип не может быть выбран в запросе

    <<?>>&Таблица КАК ТаблицаПериодов

    Запрос.Выполнить();

    по причине:

    {(6, 2)}: Тип не может быть выбран в запросе

    <<?>>&Таблица КАК ТаблицаПериодов

    Что делать?

    Reply
  10. Alex Y

    (9) Необходимо в модуле объекта добавить в функцию ПолучитьТаблицуОстатковОтпусков

    следующий код:

    ТаблицаСотрудников.Колонки.Добавить(«Сумма», Новый ОписаниеТипов(«Число»));
    //10-02-09 добавлен тип для Периода
    ТаблицаСотрудников.Колонки.Добавить(«Период», Новый ОписаниеТипов(«Дата»));
    

    Ошибка возникала именно из-за неопределенного типа колонки

    Reply
  11. Alex Y

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

    Мною добавлена проверка заполненности параметра. Если он пуст, то сумма не рассчитывается.

    Функция Проверка()
    //ИЗМЕНЕНО 10-02-09
    СсылкаДокумента = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(«ДокументОтпуск»)).Значение;
    РасчитыватьСумму = ЗначениеЗаполнено(СсылкаДокумента);
    //СсылкаДокумента = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(«ДокументОтпуск»)).Значение;
    //Если Не ЗначениеЗаполнено(СсылкаДокумента) Тогда
    // Сообщить(«Не выбран документ»);
    // РезультатПроверки = Ложь;
    //КонецЕсли;
    
    Функция РассчитатьСуммуОтпуска(СтрокаТаблицыОстатков)
    //ДОБАВЛЕНО 10-02-09
    Если НЕ РасчитыватьСумму Тогда
    Возврат Неопределено;
    КонецЕсли;
    
    
    Функция ПолучитьТаблицуОстатковОтпусков()
    …
    //ИЗМЕНЕНО 10-02-09
    Если РасчитыватьСумму Тогда
    СтрокаТаблицы.Сумма = ?(СтрокаТаблицы.Количество = 0, 0, РассчитатьСуммуОтпуска(СтрокаТаблицы));
    СтрокаТаблицы.Сумма = СтрокаТаблицы.Сумма * СтрокаТаблицы.Множитель;
    КонецЕсли;
    //конец ИЗМЕНЕНО 10-02-09
    
    

    Показать

    Кстати, без сумм отчет формируется за считанные секунды 🙂

    Ещё не очень удобно, когда в отчет попадают давно уволенные сотрудники.

    Но и с этим можно справиться:

    В «ОсновнаяСхемаКомпоновкиДанных» у поля «Состояние» снимите галки в ограничениях. Теперь реквизит «ДанныеОРаботнике.Состояние (Текущее состояние)» доступен для отбора. Ставим «Не равно Уволен» и видим чистенький отчет по работающим сотрудникам.

    Ну а красиво это оформить в настройках вы сможете и сами. Или дождитесь официального релиза от разработчика.

    Reply
  12. fedor40

    8.2.10 после конвертации в Параметре можно выбрать только Параметры. Документ. Конкретный документ не дает.

    Reply
  13. Lui55

    К сожалению эта обработка перестала работать в версии Зарплата и Управление Персоналом, редакция 2.5 (2.5.19.3) 😥 😥 😥

    Выдает ошибку:

    {ОбщийМодуль.ПроцедурыУправленияПерсоналом(2167)}: Ошибка при вызове метода контекста (Выполнить): {(6, 2)}: Тип не может быть выбран в запросе

    <<?>>&Таблица КАК ТаблицаПериодов

    Запрос.Выполнить();

    по причине:

    {(6, 2)}: Тип не может быть выбран в запросе

    <<?>>&Таблица КАК ТаблицаПериодов

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

    Reply
  14. nnh

    Функция ПолучитьТаблицуОстатковОтпусков()



    ТаблицаСотрудников.Колонки.Добавить(«Период»);

    Заменить на:

    ТаблицаСотрудников.Колонки.Добавить(«Период», Новый ОписаниеТипов(«Дата»));

    Reply
  15. nnh

    Также

    Функция РассчитатьСуммуОтпуска(СтрокаТаблицыОстатков)

    ПроведениеРасчетов.РассчитатьЗаписиРегистраРасчета(«ДополнительныеНачисленияРаботниковОрганизаций», НаборДополнительныеНачисления, , НаборРасчетСреднего, СтрокаТаблицыОстатков.Организация, СтрокаТаблицыОстатков.ОбособленноеПодразделение);

    Заменить на ПроведениеРасчетовПереопределяемый.РассчитатьЗаписиРегистраРасчета(«ДополнительныеНачисленияРаботниковОрганизаций», НаборДополнительныеНачисления, , НаборРасчетСреднего, СтрокаТаблицыОстатков.Организация, СтрокаТаблицыОстатков.ОбособленноеПодразделение);

    Reply
  16. kell

    Спасибо Armando и Alex Y. Всё хорошо, только при расчете остатка отпуска учитывается и тот период когда сотрудник был в декретном отпуске…

    Reply
  17. Serg1970

    Залит файл erf,а не ert,перезалейте нормальный,пожалуйста…

    Reply
  18. RinaMS

    В последних релизах выдаёт ошибку:

    Общий модуль. Типовые отчеты: Модуль

    Метод объекта не обнаружен (ПолучитьПараметрыИсполненияОтчета)

    ПараметрыИсполненияОтчета = ОтчетОбъект.ПолучитьПараметрыИсполненияОтчета();

    В предыдущих релизах в общем модуле была Попытка/Исключение/КонецПопытки, а теперь её убрали и отчёт ругается 🙁

    Reply
  19. RinaMS

    Решение нашлось 🙂

    В модуле объекта нужно добавить

    Функция ПолучитьПараметрыИсполненияОтчета() Экспорт

    СтруктураНастроек = Новый Структура();

    Возврат СтруктураНастроек;

    КонецФункции

    Reply
  20. dka80

    ОГРОМНОЕ СПАСИБО!

    Reply
  21. smartu

    а как можно увеличить скорость?

    Reply
  22. mabuta_serg

    Что может означать ошибка (открываю платформой 8.2 конфмгурация УТП Украина релиз 1,2,2,3):

    Помилка в схемі компонування даних

    через:

    Помилка отримання інформації набору даних

    через:

    Помилка у запиті набору даних

    через:

    {(4, 30)}: Поле не знайдено «РаботникиОрганизации.ПериодЗавершения»

    КОГДА РаботникиОрганизации.<<?>>ПериодЗавершения < &Период

    Reply
  23. sh_max

    (21) Сильно тормозит расчет сумм. Для увеличения скорости воспользуйтесь советом Alex Y (11) (ну естественно сумм вы не получите :))

    (22) Это значит что в конфигурации УТП для Украины в регистре сведений «РаботникиОрганизации» нет поля «ПериодЗавершения» (возможно оно по другому называется). Для этой конфигурации отчет нужно переделывать.

    Автору плюс конечно. Публикация старая, но скачивают неплохо и до сих пор её. Было-бы совсем замечательно если бы подправили ошибочки которые здесь написаны в комментариях(тем более решения тоже описаны). А то получается как в том анекдоте: «доработать напильником».

    Reply
  24. YakshinAnd

    Спасибо большое за отчет.Формирует суммы конечно медленно, но если надо, то деваться некуда(((Хотелось бы корректировки от самого автора,т.к. скачивают и будут скачивать еще много людей.А без программиста допилить нормально нельзя(

    Reply
  25. vmv

    Полезный отчет! Спасибо)))

    Reply
  26. hrust444

    Вы пишете: Это значит что в конфигурации УТП для Украины в регистре сведений «РаботникиОрганизации» нет поля «ПериодЗавершения» (возможно оно по другому называется). Для этой конфигурации отчет нужно переделывать.

    Автору плюс конечно. Публикация старая, но скачивают неплохо и до сих пор её. Было-бы совсем замечательно если бы подправили ошибочки которые здесь написаны в комментариях(тем более решения тоже описаны). А то получается как в том анекдоте: «доработать напильником». Замечательно

    Reply
  27. candy_sk

    Подскажите в конфигурации 1С:Зарплата и Управление Персоналом 8.2 работает?

    Reply
  28. fiyona

    Очень пригодился отчетик! Спасибо!

    Reply
  29. нинас

    Подойдет ли отчет для Комплексной автоматизации?

    Reply
  30. Misanets

    Оооо, это как раз то что доктор прописал, плюхаем 🙂

    Reply
  31. Bomba1911

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

    Reply
  32. spamyda

    Не знаю с какой версии релиза это началось, но пробовал уже на 2.5.45.3. При формировании выдаёт ошибку:

    {ВнешнийОтчет.ОстаткиОтпусковСотрудниковОрганизации.МодульОбъекта(192)}: Метод объекта не обнаружен (РассчитатьЗаписиРегистраРасчета)

    ПроведениеРасчетов.РассчитатьЗаписиРегистраРасчета(«ДополнительныеНачисленияРаботниковОрганизаций», НаборДополнительныеНачисления, , НаборРасчетСреднего, СтрокаТаблицыОстатков.Организация, СтрокаТаблицыОстатков.ОбособленноеПодразделение);

    У кого происходит тоже самое, нужно подправить в модуле объекта в функции РассчитатьСуммуОтпуска(СтрокаТаблицыОстатков):

    ПроведениеРасчетовПереопределяемый.РассчитатьЗаписиРегистраРасчета(«ДополнительныеНачисленияРаботниковОрганизаций», НаборДополнительныеНачисления, , НаборРасчетСреднего, СтрокаТаблицыОстатков.Организация, СтрокаТаблицыОстатков.ОбособленноеПодразделение);

    А в остальном, если подправить ещё и уже вышенаписанное, то работает и на 8.2 после конвертации. Пока ещё не опробовал на своих замороченных организациях, но — спасибо автору!

    Reply
  33. oleg_ss

    Спасибо! Будем пользовать, осталось допилить под свои нужды и можно временно вопрос по резервам закрыть.

    А то в 1С это все пока очень сыро.

    Reply
  34. ptica-voron

    Спасибо!

    Я не умею читать инструкции заранее…

    Сконвертировал отчет под 8.2, исправил все ошибки, добился, чтобы отчет работал в УПП 1.3.22.1, и только потом увидел, что добрые люди в комментариях уже нашли и описали все ошибки 🙂

    Если кому-то нужно сразу рабочий отчет, могу выслать на почту. Или автору могу прислать его же отчет, чтобы перезалить в публикацию

    Reply
  35. ptica-voron

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

    Опять же, могу поделиться с желающими, только автор не торопится отвечать… Товарищи форумчане, подскажите, можно ли сделать новую публикацию, со ссылкой на эту и ее автора? В ней было бы здорово разместить последнюю рабочую версию отчета, плюс механизм начисления резерва. Если в дальнейшем разработаю механизм списания резерва при начислении отпусков, его тоже размещу.

    Reply
  36. Silver1975

    Огромное спасибо за Ваш труд! Бухгалтерия в восторге!

    На конфигурации: Зарплата и Управление Персоналом, редакция 2.5 (2.5.49.2) — после внесенных изменений (описанных выше) работает без проблем!

    Reply
  37. vechiy

    Как исправить следующую ошибку?

    {ВнешнийОтчет.ОстаткиОтпусковСотрудниковОрганизации.МодульОбъекта(180)}: Метод объекта не обнаружен (ПодготовитьДанныеПоРегламентированнымОтпускам)

    ВыборкаПоОстаткам = ПроцедурыУправленияПерсоналом.ПодготовитьДанныеПоРегламентированнымОтпускам(ТаблицаСотрудников,,Ложь,);

    метод удалили в новом релизе, а другой не добавили?)

    Reply
  38. ptica-voron

    И я тоже столкнулся с тем, что метод удалили. Ищу, что теперь можно сделать. Может кто подскажет?

    Reply
  39. pandora_x

    (42) ptica-voron, возьми с прошлых релизов, могу выслать, но не факт, что в новом релизе отчет будет работать корректно

    Reply
  40. vechiy

    Ну и кто как теперь остатки получает?) Нужно метом новый подставить, я так понимаю) Кто разбирался уже?

    Reply
  41. ptica-voron

    (44)Я на выходных буду разбираться…

    Reply
  42. masik85

    Отчет очень интересный, сейчас метод добавлю и посмотрю что получится

    если заменить на

    ВыборкаПоОстаткам = ПроцедурыУправленияПерсоналомДополнительный.ПодготовитьДанныеПоУправленческимОтпускам(ТаблицаСотрудников);

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

    изменить на:

    ПроведениеРасчетовПереопределяемый.РассчитатьЗаписиРегистраРасчета(«ДополнительныеНачисленияРаботниковОрганизаций», НаборДополнительныеНачисления, , НаборРасчетСреднего, СтрокаТаблицыОстатков.Организация, СтрокаТаблицыОстатков.ОбособленноеПодразделение);

    Reply
  43. m1cro

    Релиз 2.5.62.1 . — работает правильно!

    спасибо masik85. Необходимые изменения!

    Reply
  44. b-dm

    В ЗУП Корп не заработал. Это отчет для ЗУПа подходит? а то он может для УПП ?

    Reply

Leave a Comment

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