Замена аналитики «подразделение» в документе «Отражение зарплаты в бух.учете». Расширение конфигурации для Бухгалтерии 3.0




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

8 Comments

  1. u_n_k_n_o_w_n

    Добрый день!

    Поясните пожалуйста, а что мешает просто привести все в соответствие?

    Спасибо.

    Reply
  2. VsHome

    День добрый!

    По словам бухгалтерии, данное требование обусловлено сбором затрат по подразделениям в БУ в производстве..

    В ~ 90 % есть соответствие «кадрового» прикрепления сотрудников и распределения затрат по подразделениям… работаем «стандартно».

    Оставшиеся 10 % «отклонений» это сотрудники принятые в подразделение, отличное от подразделение отнесения затрат (выполняют работы для других подразделений временно/постоянно).

    Reply
  3. vkozak

    Идей интересная, но я пошел другим путем.

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

    Reply
  4. karpik666

    (2) если брать зуп 2.5, то там такая ситуация решалась просто: для каждого подразделения задавался свой способ отражения затрат. Если нужно относить на определенные статьи только определенных сотрудников. то можно задать способ отражения для определенного сотрудника. Если на определенную статью должно ложиться только какая-то выплата, например «Сдельный наряд», то задаем конкретно для нее способ. также в зуп 2.5 можно задавать и процентное соотношение как зп сотрудника распределяется по счетам и статьям. Не думаю, что в зуп 3 этого нет.

    Reply
  5. leosoft

    В ЗУП 30 (в отличие от ЗУП25) нет очень важного момента — нельзя задать в сбособе отражения затрат

    на какое подразделение относить затраты. В результате — нельзя в Бухгалтерию отправить проводки

    на Основное подразделение, если в ЗУП 30 много мелких подразделений, детализация которых

    не нужна в Бухгалтерии!

    Reply
  6. VsHome

    (4) karpik666,

    «Сдельный наряд» нашу ситуацию не решит… Данная «затычка» используется для «постоянных работников». LeoSoft прав, ЗУП 3.0 уступает 2.5 в этой части функционала

    Reply
  7. KoshkinSM

    В 2.5 делаем сейчас так:

    1. Добавили в подразделения организации ветку подразделений из БП (коды для подразделений ЗУП сделали для наглядности с префиксами ЗП, коды в этой дополнительной ветке как в БП).

    2. Добавили в ЗУП регистр сведений, в котором назначили соответствия подразделений ЗУП подразделениям БП.

    3. При переносе отражения из ЗУП в БП подменяем подразделения ЗУП на подразделения БП.

    Аналогично поступим после перехода на 3.0.

    Замену можно сделать и в самом документе отражения в ЗУП (сделав копию дока после заполнения). Так можно проверить всем ли подразделениям назначили соответствия.

    Reply
  8. VsHome

    (7) KoshkinSM,

    т.ж. нормальное решение

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

    Уточнение:

    Можно было-бы обойтись без изменения конфигурации, (все засунуть в «расширение») если бы справочник «способы отражения» в конфигурации поставщика был включен в подсистемы «доп.реквизитов» / «доп.свойств».

    Reply

Leave a Comment

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