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




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

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