Расчет жилищных и коммунальных услуг для РЭУ




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

51 Comments

  1. seermak

    Вот наваял 🙂

    Reply
  2. nddru

    Интересно. Посмотрим чего у нее внутре )

    Reply
  3. batys

    Хотел посмотреть, но не запускается в режиме Предприятия (8.2.9.356)

    Reply
  4. seermak

    я же написал в файле «прочти» — создаете нового пользователя, даете ему права аминистратора, и закрыватете конфигуратор. Открываете конфигуратор под новым пользователем и работаете дальше под новым пользователем

    Reply
  5. Asus_198

    А если есть по два счетчика хол. и гор. воды?

    Reply
  6. Арчибальд

    (5) Что-то с набором услуг напряженка… Счетчиков электроэнергии и газа тоже бывает по нескольку штук… 🙁

    И мне крайне не нравится все перЕодическое… 👿

    Reply
  7. Арчибальд

    Интерфейс вражественный… Несмотря на инструктаж 😐

    Не представляю, как операторов учить такому…

    Reply
  8. seermak

    (5) В перечислении Виды счетчиков внесите сколько угодно

    (6) набор услуг базовый — дополните своими сколько угодно. Счетчики не могут быть не переодические, как и тарифы (больше ничего периодического нет)

    (7) интерфейс администратора и неприкрашен — все что есть чтобы не искать в меню операции. Под пользователя можно сделать любой — не проблема.

    Reply
  9. seermak

    Интересно 43 скачало, 4 отметили — а остальные «про запас» качают что-ли ❓

    Reply
  10. Altair777

    (9) Чуть было не изменил баланс: хотел минус поставить, не скачивая…. 😉

    Не фик список друзей скрывать. Хорошо хоть, что у тебя аватарка запоминающаяся 🙂

    Reply
  11. Serj1C

    ммм, я бы плюс поставил, да вот пишет «Для голосования необходмо авторизоваться». Глюк, я же сообщение это авторизованный написал…

    Reply
  12. Serj1C

    (11) оп, получилось 🙂

    Reply
  13. seermak

    я просто прочитал что фирма 1С за разработку данной темы отдала кому-то тендер на ~1 200 тыс руб = это был «мой ответ Чемберлену» — месяц работы и никаких денег. «Нам солнца не надо -нам партия светит, нам денег не надо — работу давай!»

    Reply
  14. Арчибальд

    В конце концов,

    «Каждая самописная работающая конфа имеет право на плюс» (с) Арчибальд

    Reply
  15. rasswet

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

    Reply
  16. shootnik

    Разбежался было ставить плюс, но при запуске (под 1С:Предприятие 8.2.9.356) выдается ошибочка:

    «{ОбщийМодуль.МодульТехнический.Модуль(25)}: Значение не является значением объектного типа (Имя)».

    А модули-то закрытые — так вот ничего и не посмотрел, а посему и оценить к сожалению не могу.

    Reply
  17. vigorv

    Еще не скачал, но в любом случае МОЛОДЧИНА!Сам отработал 7 лет в расчетном центре, знаю эту кухню изнутри — геморрой, но надо….Чуть попозжа поюзаю…

    Reply
  18. seermak

    (16) Пользователя заведите, назовите его Иванов Иван Иванович, дайте права админитсратора и……. будет Вам щастье 🙂

    Reply
  19. slige

    (14) Поддерживаю слова предыдущего оратора 😉 .

    Reply
  20. shootnik

    (18) спасибо помогло, но почему конфе не нравилось что администратора зовут Gosha?

    Reply
  21. seermak

    (20) Откройте справочник Сотрудники — там ответ. 🙂

    Reply
  22. Advan

    модули закрыты 🙁

    Reply
  23. batys

    Плюс, конечно. Работа большая сделана. Жаль не на управл. формах. А почему регистры сведений …УслугиЛицСчета не периодические? Сам буду скоро творить для расчетов, поэтому интересуюсь.

    Reply
  24. seermak

    (23) а смысл ? Есть даты начала и окончания — больше ничего не нужно. Кончилась или не началась не считаем 🙂 Зачем базу «дуть»

    Reply
  25. Арчибальд

    (24) Она и так нехилая 😀

    Reply
  26. seermak

    (25)Сжатая, заполненная база с 2 месяцами расчета = 4124 кб

    Reply
  27. seermak

    (26)+ НЕ сжатая

    Reply
  28. PeRom

    Учёт льгот есть? ИМХО по работе в ЖКХ самое замороченное было эти льготы.

    Есть конфа на 77 по расчёту тепла на отопление, используется для расчета планового и потреблённого тепла юрлицами(дом с частниками считали за один объект). Писал, когда там работал. А сейчас не знаю как с правами быть. Считаю, что права принадлежат конторе, но если есть потребность могу выложить.

    Reply
  29. seermak

    (28) да льготные категории учитываются. Заморочки по льготникам потому что нет четкого определения по некоторым категориям — пользуются еще и ведомственными документами и постановлениями

    Reply
  30. PeRom

    (29) Определей-то хватает, даже через-чур. Пример: у одной категории льгота распространяется на долю, но не более определённого значения, у другой — на соц.норму, у третьей — на весь объём… одна только на бытовую воду, другая на поливную… А самое прикольное их сочетание в непрогнозируемых вариантах 🙂

    Reply
  31. seermak

    (30)Все «сочетания» для наших льготников прописаны — справочник Льготные категории 🙂

    Reply
  32. PeRom

    (31) Отлично. Заслуженно ставлю «+». Направлю своих, пусть потестят.

    Reply
  33. seermak

    (32) буду только рад. Все вопросы и пожелания — seermak@mail.ru (Только пусть внимательнее читают помошь)

    Reply
  34. Мухин

    КЛАССНАЯ КОНФА!!! ПЛЮС

    Reply
  35. uzerdv

    Конфигурация для 1С: Предприятие 8.1; 1С: Предприятие 8.2, в 8.1. не могу загрузить, почему?

    Reply
  36. seermak

    (35) под 8.1 не работает — исправил в заголовке

    Reply
  37. uzerdv

    Не могли бы связаться со мной по асе 316615837

    Reply
  38. seermak

    28_10_2008 — выложил демонстрационную базу с рабочим местом паспортиста, переведенным в управляемое приложение. Вот…

    Reply
  39. XELEN

    уже прошло 24 часа почему я не могу сачать файл

    Reply
  40. OneHundred

    Уважаемый автор! Что-то я никак не могу открыть Вашу конфигурацию ни с какой учетной записью… В файл-серверном варианте все работает, а на клиент-сервеном не хочет :cry:… Уже даже сделал выгрузку данных из рабочей базы, но пользователя, который также присутствует в справочнике сотрудников, так и не пускает. Ошибок нет, просто идет окно загрузки, которое закрывается сразу после надписи «Расчет платежей»…

    1С:Предприятие 8.2 (8.2.12.78)

    Расчет жилищных и коммунальных платежей для домоуправления (000.000.000.001)

    Reply
  41. seermak

    (40) это демо-версия, рассчитана для файл-серверного варианта, для клиент-серверного надо немного поработать ручками 🙂

    Reply
  42. OneHundred

    Переустановил, вроде пошло. Спасибо, будем изучать!

    Reply
  43. Alexsisit

    Отличная разработка, только вот почему-то модули все запаролены? Вроде бесплатно раздаешь, а править низя ((. Дай паролик в личку 😉

    Reply
  44. seermak

    (43) потому, что это демо. 1.поищите — здесь есть решения для снятия паролей 2.мне интересно было бы поработать напрямую с покупателем/пользователем

    Reply
  45. alexmilut@mail.ru

    мдя сам из крыма тут вопрос нужна конфа для автоматизации ЖКХ помоему наверное ток под заказ (((

    Reply
  46. grey_yes

    Доброго вам времени суток!

    Решил покопаться в Вашей конфе «Расчет жилищных и коммунальных платежей»

    их хелпа….

    Справочник Улиц — предназначен для хранения наименований улиц, используемых в программе. Можно заполнить справочник автоматически. Для этого необходимо:

    Открыть обработку «Редактирование адресов»;

    Выбрать свой регион;

    Выбрать свой город;

    Выбрать свою улицу — откроется форма списка улиц;

    Правая клавиша мыши на поле списка — пункт меню «Заполнить справочник улиц » и справочник улиц будет автоматически заполнен улицами выбранного города.

    Заполнение НЕ РАБОТАЕТ! Выдает ошибку

    {РегистрСведений.АдресныйКлассификатор.Форма.ФормаВыбора.Форма(204)}: Ошибка при вызове метода контекста (Записать)

    НовыйЭлемент.Записать();

    по причине:

    Значение поля «Код» не уникально

    Судя по всему не срабатывает отбор по городу….

    Пробовал на Вологодской области, г. Вологда. …хотя думаю не важно…

    Хотел подправить…. но увы ….:-((((((

    Reply
  47. seermak

    (47) Ничего не могу сказать — конфигурация менялась многокартно — такой ошибки нет — через адресный классификатор выбираете свой регион, улицы подгружаются автоматически И потом, кто же пытается записать новый элемент через форму выбора этого элемента…. Еще = можно убрать в конфигураторе проверку кода на уникальность

    Reply
  48. grey_yes

    (48) шутить изволите?

    «Еще = можно убрать в конфигураторе проверку кода на уникальность» — а пароль на конфе?

    попробую скачать еще раз конфу….

    попробую другой регион…

    Reply
  49. grey_yes

    …. уже попробовал….

    взял в этот раз Санкт-Петербург .. ну чтобы меньше выбор полей в обработке…

    ТО ЖЕ САМОЕ….

    подумал что какая то проблема с кодом справочника улиц (тип число) и попробовал маленький городок Котлас Арх-я обл…

    то же самое…

    а дело в том что со времени написания конфы (2009 кажись) изменился классификатор … ИМХО

    «НовыйЭлемент.Код = СтрокаНабора.КодУлицыВКоде;//число Код »

    не прокатывает… в отборе «КодУлицыВКоде» как минимум 21 цифра «1» и т.д.

    так что для «современного» классификатора…..

    Reply
  50. seermak

    (49) см. пост 44

    Reply
  51. grey_yes

    как начать изменять — разобрался…

    а причина КМК написал ранее

    Reply

Leave a Comment

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