Расширенная зарплата для конфигурации "Бухгалтерский учет для Украины" 7.7




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

25 Comments

  1. kompas-dm

    (0) Приветствую. Сам имею такого зверя — для Бух и Бюджетников Украины.

    Но при каждом изменении регламентированных отчетов в фонды приходится писать…

    Reply
  2. Некто A. Petti

    В данном случае отчеты в фонды менять не надо.

    Все работает — проверено.

    Reply
  3. baa

    Большое спасибо. Как раз начал доделывать подобную вещь. А тут все красиво и лаконично. Еще бы под 277 релиз 😉 он нынче последний. Но я думаю это не проблема.

    Reply
  4. Некто A. Petti

    В 277 по зарплате кажется ничего не менялось

    Reply
  5. script

    ИН — АГРО Зарплата + Кадры для Украины

    Участок ЗП и Кадров программы полностью слизан с комплексной (те же документы , справочники, даже формы те же), но переделана под работу не через виды расчетов и группы расч. а через бух. счета.

    И отчетность обновляют. Но даже на SQL база вешается при штате от 100 чел.

    Но если на фирма 10-50 чел. — то это то что надо.

    Reply
  6. umtz

    Спасибо , все работает, я обновила и слила с 277 релизом. Но огорчает лишь: 1.при заполнении из табеля заполняется индексация, но прирасчете, она кудато, пропадает. Это, очевидно,гдето- автор протабанил, прошу Вас , подсказать где что подкоректировать, чтобы индексация коррекктно насчитывалась.

    2. еще есть фишка поначислению на гражд. правов. договора. там отличие есть от трудовых вот в чем: нарах. Фоп -пф 33,2, безр 2,2, выдрах пф-2% безраб-0% 1ПДФО 15% со всей суммы, не отнимая Пф-2. Понятно? Может реализуете и это, буду признательна.

    Reply
  7. Некто A. Petti

    2 umtz

    Это старая разработка, делалась для 205 релиза, и возможно где-то не совсем корректно работает с новым.

    На выходных постараюсь посмотреть по вашим замечаниям.

    Reply
  8. KereberoS

    По скриншотам — ну явно слизана с бюджетной для Украины. Не удивлюсь, если есть еще документ «Материальная помощь» и отчет «Расчетные листки» ))

    Reply
  9. Некто A. Petti

    (8) Удивишься — их там нет. Доработка написана в 2001 году, когда бюджетной еще не было 🙂

    Reply
  10. KereberoS

    (9) А, всё с точностью наоборот )) идеи всегда откуда-то черпаются. А я думаю, почему решение Теллур не выглядит столь самостоятельным?! 😀

    Reply
  11. Некто A. Petti

    1. Исправлена ошибка с индексацией.

    2. Добавлены изменения для релиза 2.77

    Reply
  12. Некто A. Petti

    (6) Расчеты по договорам ГПХ должны проходить по 631 счету и по субконто Контрагенты. В этом случае, увы, следует использовать другие документы или ручные операции.

    Расширение функционала данной доработки не планируется.

    Для тех кому необходимы навороты существует ЗиК.

    Reply
  13. umtz

    Спасибо. Но всвете событий: теперь договора ГПХ облагаються и безработицей, попадают в отчет в ПФ и В безрабоотицу, поэтому, не лргично их вести на 63.

    Reply
  14. umtz

    Но все равно, приятно, что отозвались 😀

    Reply
  15. umtz

    ПОПРОБОВАЛА , гдето в 277 ввели шахтера теперь ошибка :

    Подоходный = ОблагаемаяБаза*ноНДФЛШахт<<?>>.Ставка.Получить(КонецПериода);

    {Документ.НачислениеЗП.Форма.Модуль(761)}: Переменная не определена (ноНДФЛШахт)

    Reply
  16. Некто A. Petti

    (15) Исправлена ошибка с «шахтером».

    Reply
  17. umtz

    Если Сотрудник.Шахтер.Получить(КонМесяца(ДатаДок)) = 1 Тогда

    {Документ.НачислениеЗП.Форма.Модуль(760)}: Значение не представляет агрегатный объект (Получить)

    Reply
  18. Alisija

    Объясните, пожалуйста, как скопировать содержимое файла globmod.txt в Глобальный модуль. Зашла в Отладчик. Открыла Глобальный модуль, но вот вставить в него ничего не получается.

    P.S. Не судите строго. Я бухгалтер, а не программист. Но, по мере возможности, пытаюсь все обновления и улучшения 1с делать сама.

    Спасибо

    Reply
  19. Некто A. Petti

    (18) Заходите в Конфигуратор.

    Меню Конфигурация — Открыть конфигурацию

    Меню Действия — Глобальный модуль

    Копируете содержимое в конец модуля, перед основным телом модуля.

    Например перед этой конструкцией:

    // ===============================

    // Инициализация переменной правовой поддержки


    Если ЗагрузитьВнешнююКомпоненту(«1CRtInf.dll») = 1 Тогда

    глКомпонентаПравовойПоддержки = СоздатьОбъект(«AddIn.DBExtension»);

    КонецЕсли;

    Сохраняете конфигурацию (меню Файл — Сохранить)

    Reply
  20. Alisija

    Огромное спасибо, все получилось.

    Но возник такой вопрос. Вот выйдет новый релиз. Буду обновлять конфигурацию и что все улучшения коту под хвост? Или как?

    Reply
  21. Некто A. Petti

    (20) Хм, при объединении необходимо будет отключить те объекты которые вы изменили. Если при обновлении будут изменения в глобальном модуле, то тогда необходимо либо объединять либо заново вставить текст из globmod.txt 🙂

    Reply
  22. alpopo

    (20) бухгалтер «я сама», новый релиз уже вышел, предлагаю Вам переходить на 1с82 ale45978@ya.ru для Alisija

    Reply
  23. llarisav

    У меня выдает такую ошибку

    глСохранитьЗначение(Контекст,»Подразделение», Подразделение<<?>>);

    {Документ.НачислениеЗП.Форма.Модуль(347)}: Переменная не определена (Подразделение)

    Если (ПустоеЗначение(СчетПоДругимВыплатам) = 0) и (СчетПоДругимВыплатам <> Подразделение<<?>>) Тогда

    {Документ.НачислениеЗП.Форма.Модуль(1010)}: Переменная не определена (Подразделение)

    СписокСчетов.ДобавитьЗначение(Подразделение<<?>>);

    {Документ.НачислениеЗП.Форма.Модуль(1012)}: Переменная не определена (Подразделение)

    СписокСчетов = Подразделение<<?>>;

    {Документ.НачислениеЗП.Форма.Модуль(1015)}: Переменная не определена (Подразделение)

    Reply
  24. llarisav

    Помогите выдает ошибку

    глСохранитьЗначение(Контекст,»Подразделение», Подразделение<<?>>);

    {Документ.НачислениеЗП.Форма.Модуль(347)}: Переменная не определена (Подразделение)

    Если (ПустоеЗначение(СчетПоДругимВыплатам) = 0) и (СчетПоДругимВыплатам <> Подразделение<<?>>) Тогда

    {Документ.НачислениеЗП.Форма.Модуль(1010)}: Переменная не определена (Подразделение)

    СписокСчетов.ДобавитьЗначение(Подразделение<<?>>);

    {Документ.НачислениеЗП.Форма.Модуль(1012)}: Переменная не определена (Подразделение)

    СписокСчетов = Подразделение<<?>>;

    {Документ.НачислениеЗП.Форма.Модуль(1015)}: Переменная не определена (Подразделение)

    Reply
  25. Andrij-ko

    Спасибо за эту доработку, документы работают, з/п начисляется, но:

    — Начисление и удержание единого соц. взноса идет по старой аналитике (пенсионный вместо ЕСВ). Как это исправить?

    — Удалены некоторые объекты, это сильно критично?

    в справочнике Сотрудники удален объект Нерезидент,

    в документах:

    НачислениеЗП удалены объекты ЕдиныйВзнос, НДФЛ по др. выплатам,

    Выплата ЗП удален объект безФСС.

    Reply

Leave a Comment

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