Конфигурация "ТСЖ". УСН




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

15 Comments

  1. ctpek03a

    Документ не проводится.

    Пишет: «ВНИМАНИЕ! Проведение документа невозможно!

    не указан счет учета затрат.

    заполните справочник и повторите проведение документа.»

    хотя я все заполнила.

    Reply
  2. dmitish

    Обратите внимание, что нужно дозаполнить в «Справочники»-«Прочие»-«Тарифы квартплаты» счет учета для той из услуг, которая фигурирует в вашем документе: обычно 76.7 86.1 или 96.2

    А точнее 96.2 — для резерва на капремонт

    86.1 — для целевых сборов

    76.7 -остальных комунальных платежей.

    Reply
  3. ctpek03a

    Еще вопрос:

    В справочнике «Список контрагентов» — «Сведения о контрагенте» есть вкладка «Показания счетчиков».

    Как эти данные влияют при начислении квартплаты?

    Reply
  4. dmitish
    Еще вопрос:

    В справочнике «Список контрагентов» — «Сведения о контрагенте» есть вкладка «Показания счетчиков».

    Как эти данные влияют при начислении квартплаты?

    Это периодические реквизиты, которые используются для фиксирования показаний за каждый месяц.

    Они заполняются автоматически из документа «квартплата».

    Для первого месяца показания текущего периода вносятся в документ вручную, так же вручную вносится разница между показаниями текущего и прошлого месяцев, для последующих месяцев вносятся только данные текущего м-ца, разницу система посчитает сама.

    Reply
  5. ctpek03a

    Помогите, что-то не могу разобраться.

    Например, рассчитываю эл.энергию со следующими данными:

    показания счетчика на 31.05 — конечные 17, начальные 10, итого за месяц 7;

    показания счетчика на 30.06 — конечные 22, начальные 17, итого за месяц 5;

    показания счетчика на 31.07 — конечные 33, начальные 22, итого за месяц 11;

    В «Сведениях о контрагенте» в «Показаниях счетчиков» в «счетчик №1» ставлю 10 (начальные на 31.05)

    Заполняю документ «квартплата» на 31.05:

    услуги: эл.энергия, по счетчику 17, общее 7, тариф 3,08, начислено 21,56

    Как заполнить на 30.05, чтобы разница посчиталась сама?

    Reply
  6. dmitish
    Помогите, что-то не могу разобраться.

    Например, рассчитываю эл.энергию со следующими данными:

    показания счетчика на 31.05 — конечные 17, начальные 10, итого за месяц 7;

    показания счетчика на 30.06 — конечные 22, начальные 17, итого за месяц 5;

    показания счетчика на 31.07 — конечные 33, начальные 22, итого за месяц 11;

    В «Сведениях о контрагенте» в «Показаниях счетчиков» в «счетчик №1» ставлю 10 (начальные на 31.05)

    Заполняю документ «квартплата» на 31.05:

    услуги: эл.энергия, по счетчику 17, общее 7, тариф 3,08, начислено 21,56

    Как заполнить на 30.05, чтобы разница посчиталась сама?

    В справочнике заполните на 30.04 значением 10

    Далее в документе от 31.05 повторите ввод значения (17) и система должна сделать пересчет.

    Reply
  7. ctpek03a

    Если значением 10 заполнить через «Справочник» — «Контрагенты», то данные сохраняются на текущую дату, а не на 30.04.

    А если заполнить значением 10 через документ «квартплата» на 31.04, и в документе на 31.05 в колонке «по счетчику» поставить 17, автоматически ничего не считает.

    Reply
  8. dmitish

    Для установки значения на конкретную дату есть специальная кнопка возле надписи «Значение периодических реквизитов установлены на ДД/ММ/ГГГГ». Установите с помощью этой кнопки на 30/04 и внесите значение.

    Для контроля воспользуйтесь кнопкой «История»

    Reply
  9. ctpek03a

    На 30.04 установила.

    Делаю документ «квартплата» на 31.05:

    в колонку услуги: эл.энергия, в колонку по счетчику: 17, в в колонке тариф: автоматически поставилось 3,08,

    в колонке «общее» и в колонке «начислено» автоматически не посчиталось не посчиталось.

    Reply
  10. dmitish

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

    Между справочником «ТарифыКвартплаты» и Значениями «Показания счетчиков» в справочнике контрагентов есть связь и она жесткая.

    Так услуга с кодом

    «3» привязана «Счетчик_Хол»

    «7» Счетчик_Горячей воды

    «11» Счетчик_Электроинергии

    «16» Счетчик_Гор2

    «17» Счетчик_Хол2

    «18» Счетчик_Элект2

    «28» Счетчик_Гор3

    «29» Счетчик_Хол3

    «30» Счетчик_Элект3

    «44» Счетчик_Элект4.

    Только по этим элементам справочника будет вестись учет показаний счетчиков. Попробуйте…

    Reply
  11. ctpek03a

    Спасибо. Все отлично считает.

    Reply
  12. dmitish

    Для удобства в следующем, устанавливаете новые расценки расценки, в ТарифыКвартплаты, а далее путем копирования старых документов создаете новые.

    Расценки в документах обновляются, а так как набор для каждой квартиры индивидуален и из месяца в месяц меняется редко, то процесс упрощается.

    Для анализа есть отчет и плюс ОСВ с аналитикой, которые покрывают потребности почти на 100%

    Reply
  13. ctpek03a

    Еще вопрос:

    В «Сведениях о контрагенте» во вкладке «Показаниях счетчиков» есть «Площадь» и «Количество прописанных».

    А как эти данные участвуют в расчете квартплаты?

    Reply
  14. dmitish

    Нет. Эта информация только отражается в отчете

    Reply
  15. ctpek03a

    Спасибо, все поняла.

    Reply

Leave a Comment

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