УнифицированнаяФорма Т-12 и Т-13




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

34 Comments

  1. AlexaKot

    Не считает ночные/сверхурочные/выходные часы 🙁 (в табеле-12)

    Reply
  2. denium

    «Не считает ночные/сверхурочные/выходные часы (в табеле-12) »

    Планирую исправить чуть позже …

    Reply
  3. BigB

    Мне тоже нужны ночные/сверхурочные/выходные часы в Т-12.

    С нетерпением буду ждать обновления отчета.

    Reply
  4. denium

    Залил новую версию, пришлось обнулить счетчик скачиваний со 100 до 0 😀

    Reply
  5. BigB

    В новой версии бухи говорят, что ночные считаются, а сверхурочные нет. Сам не проверял.

    Reply
  6. denium

    А ты проверь по табелю, сверхурочное должно отображаться у тебя в табеле что Т13 что Т12 буквой «С», я сам тестировал все состояния.

    Reply
  7. denium

    Вот фрагмент кода

    Иначе

    ОбластьДанныхСтрока.Параметры.мНочных =мДанныеОбОтработанномВремени.Получить(Справочники.КлассификаторИспользованияРабочегоВремени.РаботаНочныеЧасы);

    ОбластьДанныхСтрока.Параметры.мСверхурочных=мДанныеОбОтработанномВремени.Получить(Справочники.КлассификаторИспользованияРабочегоВремени.Сверхурочные);

    Если мДанныеОбОтработанномВремени.Получить(Справочники.КлассификаторИспользованияРабочегоВремени.ВыходныеДни) <> Неопределено Тогда

    мВыходныеДни = мДанныеОбОтработанномВремени.Получить(Справочники.КлассификаторИспользованияРабочегоВремени.ВыходныеДни);

    Иначе

    мВыходныеДни =0;

    КонецЕсли;

    Если мДанныеОбОтработанномВремени.Получить(Справочники.КлассификаторИспользованияРабочегоВремени.ДополнительныеВыходныеДниОплачиваемые) <> Неопределено Тогда

    мДополнительныеВыходныеДниОплачиваемые = мДанныеОбОтработанномВремени.Получить(Справочники.КлассификаторИспользованияРабочегоВремени.ДополнительныеВыходныеДниОплачиваемые);

    Иначе

    мДополнительныеВыходныеДниОплачиваемые =0;

    КонецЕсли;

    ОбластьДанныхСтрока.Параметры.мВыходных = мВыходныеДни + мДополнительныеВыходныеДниОплачиваемые;

    ОбластьДанныхСтрока.Параметры.мПраздничных =мДанныеОбОтработанномВремени.Получить(Справочники.КлассификаторИспользованияРабочегоВремени.Праздники);

    КонецЕсли;

    Показать

    Как видишь тут определены все состояния из справочника КлассификаторИспользованияРабочегоВремени

    Reply
  8. denium

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

    Работа в выходные дни будет отображена как РВ, и ляжет в колонку Выходных дней.

    Reply
  9. denium

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

    Исправлю в ближайшее время. 🙁

    Reply
  10. denium

    ИСПРАВИЛ,

    Залил новый отчет …

    Reply
  11. a_vovan

    Отчет не скачивается — скачивается файл «копия» без расширения.

    Добавление .epf не помогает.

    Reply
  12. a_vovan

    Помогло добавление к имени файла .erf

    Reply
  13. gidrostroi

    Скажите, пожалуйста:

    у нас 8.2 Зарплата 2.5.31.4

    при попытке загрузки отчета ругается:

    «{Справочник.ВнешниеОбработки.Форма.ФормаЭлемента(170)}: Ошибка при вызове метода контекста (Создать): Ошибка подключения внешних метаданных: Ошибка загрузки документа.

    Внешний отчет не может быть прочитан текущей версией программы.»

    есть ли какой-то способ решить проблему?

    очень нужен хороший Т-13

    заранее спасибо!

    Reply
  14. denium

    Откройте сначала мой отчет в конфигураторе, он предложит конвертировать его из весрии 1с 8.1 в версию 1с 8.2

    После этого можно работать с ним в редакции 1с 8.2

    Reply
  15. gidrostroi

    (14)Спасибо Вам огромное! Бухгалтерия счастлива!

    Reply
  16. gidrostroi

    (14)Рано мы радовались.

    При формировании отчета вылетала ошибка

    {ВнешнийОтчет.УнифицированнаяФормаТ13.МодульОбъекта(1781)}: Метод объекта не обнаружен (ФамилияИнициалыОтветсвенногоЛица)
    ОбластьДанныхПодвал.Параметры.ФИООтветственного = УправлениеОтчетами.ФамилияИнициалыОтветсвенногоЛица(ВыборкаПоРаботнику.ФизЛицоОтветственного, ВыборкаПоРаботнику.ФамилияОтветственного, ВыборкаПоРаботнику.ИмяОтветственного, ВыборкаПоРаботнику.ОтчествоОтветственного);
    

    После того как в модуле объекта закомментировала 6 строк со словами «ФамилияИнициалыОтветсвенногоЛица» (предварительно попробовав исправить ОтветСВенного на ОтветСТВенного — безрезультатно) — все заработало, но конечно же не проставляется Ответственное лицо (в то время как с Руководителем и Кадровиком все ок). Бухгалтерия была счастлива пока это не заметила 🙂

    Возможно ли что-то с этим сделать?

    Будем Вам очень благодарны, потому что в остальном все просто идеально (проблема с формированием табелей при гибком графике сотрудника решена на ура!)

    Reply
  17. denium

    Данный отчет тестировался на Релизах 1с 8.1 редакция 2.5.26 и выше, в данный моменет успешно работает на

    2.5.34.

    Честно говоря после перехода я оставил старый модуль, скорее всего нужно заменить фрагмент на который ругаеться система

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

    меняем на

    ОбластьДанныхПодвал.Параметры.ФИООтветственного = УправлениеОтчетамиЗК.ФамилияИнициалыОтветсвенногоЛица(ВыборкаПоРаботнику.ФизЛицоОтветственного,ВыборкаПоРаботнику.ФамилияОтветственного, ВыборкаПоРаботнику.ИмяОтветственного, ВыборкаПоРаботнику.ОтчествоОтветственного);

    Дело в том что несколько релизов назад 1с стала перемещать функции из УправлениеОтчетами в УправлениеОтчетамиЗК.

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

    Перезалил новый отчет заменил все вызовы из модуля УправлениеОтчетами на УправлениеОтчетамиЗК.

    Reply
  18. gidrostroi

    Спасибо большое! Вы волшебник! Все работает точно как надо. спасибо

    Reply
  19. megabyte

    неправильно считает в столбце «неявки по причинам» в форме т-13. т.е. в табеле стоит От — 12 штук! в итог идет 10, типо 2 дня выходных. что не верно!

    Reply
  20. Hiren110

    Добрый день, объясните особо умной..как я скачала файл мои дальнейшие действия..как его установить? спасибо.

    Reply
  21. denium

    Я так понимаю вы далеки от программирования 😀

    В таком случае, если у вас платформа 1с 8.1 откройте этот отчет как внешний через файл открыть.

    Если 1с 8.2 Откройте сначала мой отчет в конфигураторе, он предложит конвертировать его из весрии 1с 8.1 в версию 1с 8.2.

    После конвертации тоже самое что для 1с 8.1.

    Если вы программист, до можете заменить в конфигураторе отчет формы Т-13 на мой.

    Reply
  22. jesus007

    В ЗУП 2.5.33.4 не учитывает перенос праздника с 1 на второе мая почему-то. Перенос праздников вообще предусмотрен?

    Reply
  23. GrigLena20

    Есть ошибка.

    Например, если человек в отпуске с 30.04.11 по 15.05.11

    В форме Т-13 должно же вывести что 1го и 9го мая «В» выходной, остальное отпуск, а у вас выводит только отпуск.

    В стандартной же форме выводятся слишком много выходных 1,2,7,8,9го мая, тоже неправильно.

    Reply
  24. Diversus

    (0) Да… Поддерживаю (23) не хватает такой штуки.

    Хотя отчет хороший

    Reply
  25. wereson

    У меня вопрос, ваш отчет поддерживает режи вывода сотрудников по заполняемым должностям в отдельных строках? ( если сотрудник в предеелах расчетного периода менял должность и график)

    Reply
  26. I_r_a

    очень хороший отчет, только не работает отбор по документу «Табель ….», когда добавляю в параметрах отбора НОмер по документу

    Reply
  27. denium

    (25) wereson,

    Реализовано в новой версии.

    Reply
  28. v.kov945

    1c 8.1 конфигурация Зарплата и Управление Персоналом (базовая), редакция 2.5 (2.5.13.5)

    После запуска внешнего файла выдает ошибки:

    {ВнешнийОтчет.УнифицированнаяФормаТ13(119,10)}: Переменная не определена (ПроцедурыУправленияПерсоналомПереопределяемый)

    Если Не <<?>>ПроцедурыУправленияПерсоналомПереопределяемый.РегламентированныйКалендарьЗаполнен(НачалоПериода, КонецПериода, Истина) Тогда

    {ВнешнийОтчет.УнифицированнаяФормаТ13(1641,57)}: Переменная не определена (УправлениеОтчетамиЗК)

    ОбластьДанныхПодвал.Параметры.ФИООтветственного = <<?>>УправлениеОтчетамиЗК.ФамилияИнициалыОтветсвенногоЛица(ВыборкаПоРаботнику.ФизЛицоОтветственного, ВыборкаПоРаботнику.ФамилияОтветственного, ВыборкаПоРаботнику.ИмяОтветственного, ВыборкаПоРаботнику.ОтчествоОтветственного);

    {ВнешнийОтчет.УнифицированнаяФормаТ13(1642,57)}: Переменная не определена (УправлениеОтчетамиЗК)

    ОбластьДанныхПодвал.Параметры.ФИОРуководителя = <<?>>УправлениеОтчетамиЗК.ФамилияИнициалыОтветсвенногоЛица(ВыборкаПоРаботнику.ФизЛицоРуководителя, ВыборкаПоРаботнику.ФамилияРуководителя, ВыборкаПоРаботнику.ИмяРуководителя, ВыборкаПоРаботнику.ОтчествоРуководителя);

    {ВнешнийОтчет.УнифицированнаяФормаТ13(1643,57)}: Переменная не определена (УправлениеОтчетамиЗК)

    ОбластьДанныхПодвал.Параметры.ФИОКадровика = <<?>>УправлениеОтчетамиЗК.ФамилияИнициалыОтветсвенногоЛица(ВыборкаПоРаботнику.ФизЛицоКадровика, ВыборкаПоРаботнику.ФамилияКадровика, ВыборкаПоРаботнику.ИмяКадровика, ВыборкаПоРаботнику.ОтчествоКадровика);

    {ВнешнийОтчет.УнифицированнаяФормаТ13(2018,59)}: Переменная не определена (УправлениеОтчетамиЗК)

    ОбластьДанныхПодвал.Параметры.ФИООтветственного = <<?>>УправлениеОтчетамиЗК.ФамилияИнициалыОтветсвенногоЛица(ВыборкаПоРаботнику.ФизЛицоОтветственного, ВыборкаПоРаботнику.ФамилияОтветственного, ВыборкаПоРаботнику.ИмяОтветственного, ВыборкаПоРаботнику.ОтчествоОтветственного);

    {ВнешнийОтчет.УнифицированнаяФормаТ13(2019,59)}: Переменная не определена (УправлениеОтчетамиЗК)

    Что нужно сделать для исправления?

    Reply
  29. kitt

    спасибки 🙂

    Reply
  30. Пуд

    Здравствуйте!

    Не объясните принцип работы вашей формы?Как я понял по выложенному коду

    Иначе
    ОбластьДанныхСтрока.Параметры.мНочных  =мДанныеОбОтработанномВремени.Получить(Справочники.КлассификаторИспользованияРабочегоВремени.РаботаНочныеЧасы);
    ОбластьДанныхСтрока.Параметры.мСверхурочных=мДанныеОбОтработанномВремени.Получить(Справочники.КлассификаторИспользованияРабочегоВремени.Сверхурочные);
    Если мДанныеОбОтработанномВремени.Получить(Справочники.КлассификаторИспользованияРабочегоВремени.ВыходныеДни) <> Неопределено Тогда
    мВыходныеДни = мДанныеОбОтработанномВремени.Получить(Справочники.КлассификаторИспользованияРабочегоВремени.ВыходныеДни);
    Иначе
    мВыходныеДни =0;
    КонецЕсли;
    Если мДанныеОбОтработанномВремени.Получить(Справочники.КлассификаторИспользованияРабочегоВремени.ДополнительныеВыходныеДниОплачиваемые) <> Неопределено Тогда
    мДополнительныеВыходныеДниОплачиваемые = мДанныеОбОтработанномВремени.Получить(Справочники.КлассификаторИспользованияРабочегоВремени.ДополнительныеВыходныеДниОплачиваемые);
    Иначе
    мДополнительныеВыходныеДниОплачиваемые =0;
    КонецЕсли;
    ОбластьДанныхСтрока.Параметры.мВыходных = мВыходныеДни + мДополнительныеВыходныеДниОплачиваемые;
    ОбластьДанныхСтрока.Параметры.мПраздничных =мДанныеОбОтработанномВремени.Получить(Справочники.КлассификаторИспользованияРабочегоВремени.Праздники);
    КонецЕсли;

    Показать

    — показалось, что анализируется данные Т-13?То есть не в запросе получаются все суммы выходных и т.п.?

    Reply
  31. Пуд

    Ну то есть данные получаются не одним запросом, а при обработке данных. Почему выбран такой способ? Просто хочется узнать,не сочтите за нахальство 🙂

    Reply
  32. Эсти

    Отчет формируется на основании каких данных? табеля или документов начислений?

    Reply
  33. AlexandraSerg

    Скачала новую версию. Формирую Табель Т-12, выводит неправильно, точнее совсем не считает ночные, сверхурочные и праздники с выходными. Заводим в программу табель учета рабочего времени, в котором указываем как работал сотрудник. Почему Табель не выводит данные?

    Reply
  34. AlexandraSerg

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

    Спасибо за отчет!

    Reply

Leave a Comment

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