Конфигурация для абонентского отдела водоканала (7.70.606)




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

37 Comments

  1. alexk-is

    В формате этого портала данный материал я бы рассматривал как демонстрацию некоторых возможностей 1С:Предприятия 7.7.

    Reply
  2. LenaTorpeda

    Не поняла шутки.Что смотреть? закачка 7.70.507 закончилась ошибкой,а в 7.70.012

    одни шапки. Такое мы богато бачили. Лучше бы сало показали…:)

    Reply
  3. LenaTorpeda

    Не понятно за что плюсы ставят DSshark и support если даже не смотрели.

    Reply
  4. alexk-is

    (2) (3) По поводу 7.70.012. Документы Перерасчет, Исправление, ОказаниеУслуг и ПоступлениеДенежныхСредствПКО появились только в версии 7.70.201. В демонстрационную сборку на базе версии 7.70.012 они добавлены опционально. Т.е. без модулей проведения. Это же и в отношении других добавленных в эту версию объектов из старших версий.

    В версии 7.70.507 все есть и все работает. Нет только некоторых текстов модулей.

    Reply
  5. alexk-is

    (2) По поводу закачки. Проверил. Все качается. Дистрибутивы устанавливаются. Библиотеки регистрируются.

    Reply
  6. LenaTorpeda

    И вообще вы с работниками водоканалов общались? У нас они работают на старой

    досовской версии.И им «ничего не надо,нас и так всё устраивает».Сколько интересно стоит Ваша программа?

    Reply
  7. LenaTorpeda

    Посмотрела — 9500 рублей.Довольно не плохо. И вопрос : Коммерческая версия открыта

    или там ничего не изменить?

    Reply
  8. alexk-is

    (8)

    Полностью открыта.

    http://www.1c.ru/rus/partners/solutions/solution.jsp?SolutionID=11639

    Внедрение Респ Удмуртская, г Глазов, Январь 2004

    МУП “Водопроводно-канализационное хозяйство города Глазова” МО “Город Глазов”

    АВТОР: 1С:Франчайзи Дельта Ай-Ти, Ижевск

    Расчеты с частным сектором

    Конфигурация построена на основе оригинальной конфигурации ООО «Информ Сервис» (г.Лысьва), использующей компоненту 1С:Зарплата и Кадры 7.7, и предназначена для ведения расчетов с частным сектором по услугам водоснабжения.

    Reply
  9. LenaTorpeda

    Прежде чем предлагать кому-то ,нужно знать с чем имеешь дело.

    Один предприниматель купил конфигурацию за 21 000 рублей.В итоге — это был мыльный пузырь. Было жалко на него смотреть.Эта конфа у меня есть и скажу я вам она вообще ничего не стоит. Можете зайти посмотреть к деятелям ,которые ее двигают.(дурят — другого слова не подобрать).

    http://estetik-consulting.ru/openbiz/openbiz6/

    Reply
  10. alexk-is

    (10) «География пользователей» это холодные продажи. Т.е. пользователи сами на нас выходят. Узнают друг у друга или еще как-то…

    Чтобы это был не «мыльный пузырь» — смотри материал. Именно поэтому документация и две конфигурации:

    7.70.012 — с текстами чтобы понять общие принципы.

    7.70.507 — полнофункциональная версия. Сомневаешься — проверяй. Не понятно — спроси…

    Хотя здесь материал был опубликован с несколько иной целью… (см. пост 1)

    Reply
  11. LenaTorpeda

    Неа. Подождем…

    Reply
  12. f13

    каковы размеры клиентских баз? есть ли проблемы с производительностью?

    Именно из-за производительности делал подобные вещи на MySQL и PostgreSQL.

    Reply
  13. alexk-is

    (13) Встречный вопрос. А какие показатели вы считаете приемлимыми, ну, например, для базы данных на 10000 абонентов?

    Reply
  14. f13

    (14) ну .. для 1с это уже немалый размер. У меня например базы 25 000 — 30000 полностью пересчитываются за 1-1.5 мин, в базе всегда актуальные данные (как правило включен авторасчет). Базы никогда не резались — т.е. в системе данные за весь период эксплуатации системы.

    По моим скромным ощущениям 🙂 при увеличении числа пользователей в десятки раз база на Postgres покажет почти линейное увеличение времени расчета.

    Действительно интересно — есть ли проблемы с производительностью, что пришлось сделать для решения проблемы.

    Reply
  15. alexk-is

    (15) К сожалению у меня нет таких больших баз. Поэтому тренируюсь на базе в которой 11600 активных абонентов. Размер базы за 4 года ~ 350 Mb.

    На моем компьютере в монопольном режиме полный расчет по 11600 абонентам за 1 месяц занимает 28 секунд (10 секунд отмена проведения, 18 секунд проведение). При этом удаляется, а потом формируется 25000 записей в журнал расчетов. Программа использует около 30 Mb оперативной памяти.

    Reply
  16. alexk-is

    +16 «всегда актуальные данные» — не совсем понятен тезис.

    Разумеется при работе по сети и в многопользовательском режиме показатели производительности будут хуже.

    Reply
  17. alexk-is

    +16 Немного покривил душой. 28 секунд это лучший показатель. т.е. по свежим индексам. Стабильный показатель — 32 секунды.

    Со сменой всех тарифов в середине месяца при 60000 записей полный расчет — 51 секунда (21 секунда отмена проведени

    Reply
  18. f13

    Структура базы / состав данных — продиктованы жизнью.

    В своих проектах дела все очень похоже. На 1с скорее всего конфигурация так и выглядела.

    Молодцы 🙂

    Еще один вопрос — льготники.

    Откуда берется/как вводится в систему информация о льготниках?

    Сталкивался с тем, что файлы, формируемые собесом, не всегда актуальны и могут содержать ошибки в ФИО и адресах. Пришлось сделать инструмент для сравнения и сопоставления тек. состояния базы и файла собеса.

    Reply
  19. alexk-is

    (19) Льготники — ручками. собес ничего не дает — только требует отчетности в «своем» формате. Сделана выгрузка в 2х «своих» форматах…

    Есть обработка для загрузки справочников с диска ИТС. Можно воспользоваться ей. После загрузки есть обработка в конфигурации, которая проверяет справочники и дозаполняет, исправляет или выводит предупреждения…

    Reply
  20. f13

    Я обратил внимание на обработки.

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

    У меня базы города и районов вытягивают на 8 и более тысяч льготников. Раньше «расчет льгот» + «отчет для собеса» требовал: «программиста» + неделю работы.

    После внедрения время обработки сократилось до нескольких часов.

    Могу поделиться «концептуальными» наработками.

    Reply
  21. alexk-is

    (21) Всегда за. А какой у вас регион?

    Reply
  22. f13

    (22) Программы используются в Ростовской области, но я думаю сути это не меняет. Набор данных собеса (Уник. номер, ФИО, Адрес, количество человек, количество льготников, проценты начислений) — одни и те же.

    Reply
  23. seermak

    (23) не надо! Я работаю плотно с собесами, сибсидиями,монитизациями — данных они требуют гораздо больше и разноообразнее. 🙂

    Reply
  24. alexk-is

    В продолжение http://www.infostart.ru/blogs/939/ пост (64, 66, 67)

    Мне не хотелось бы сравнивать эти две конфигурации. Мне кажется, что они имеют разную направленность. Но раз Арчибальд привел этот пример http://www.kamin.kaluga.ru/products/rent/, то замечу, что приведенная в качестве примера эталонная конфигурация предусматривает создание регламентных документов по расчету домов. 1 дом — 1 документ. 10000 домов — 10000 документов в месяц. Средний «вес» 1 начисления в эталонной конфигурации около 3500 байт. Средний вес 1 начисления в конфигурации Абонентский отдел водоканала около 350 байт.

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

    Что будет, если база 100000 абонентов и у каждого в среднем 3 начисления + оплата. База данных за месяц будет увеличиваться на 1,3 Гб (за год на 15,6 Гб).

    …или не так?

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

    (25)

    Задержался с ответом – связь вырубилась.

    Итак: я привел пример решения похожей задачи на движке Бухучет. Для водоканала архитектура решения (структура данных, порядок ввода) не очень подходящая, конечно, ибо не учтена многочисленность объектов (аб. точек) и единственность начисления. О трех в среднем начислениях я речь не веду, поскольку расчеты ведутся не по людям, а по точкам отбора. Люди и поменяться могут, а кран остается.

    Касательно объема базы. В самом деле, в бухучете объем данных по одному движению больше, чем в журнале расчетов. Но примерно вдвое, а отнюдь не в 10 раз. Зато данные и более информативны (движение + итоги, а не только движение), и извлекаться могут независимо, поскольку не лежат в одной куче (журнале расчетов), а распределены по их природе (по «счетам»).

    Что осталось? Оптимизировать обработку справочника аб. точек и заставить начисление за месяц формировать не один документ-монстр, а дюжину операций.

    На 10000 аб. точек в месяц будет порядка 30000 проводок (вместе с платежами, льготами и субсидиями). Это порядка 100 Мб в год прибавления к объему БД. И никаких проблем со сверткой базы.

    Reply
  26. alexk-is

    (26) В 10 раз получилось случайно. Я скачал демку и тупо померил результат до и после проведения документов начисления, и поделил на количество строк начислений. Конечно все зависит от структуры данных абонентской базы. Если льготников много (а на каждого делается по 3 дополнительных проводки по каждому начислению), то размер базы значительно увеличится. Если говорить об «информативности данных», то учет раздельно ведут по водоснабжению, водоотведению, поливу, на скот в разрезе размера скота (крупный, средний, птица) и еще автомобиль (на помыв) и разовые работы. Раздельно по счетчикам и по норме. Раздельно горячую и холодную. Раздельно льготируемые начисления и без льгот. Раздельно по тарифным ставкам. Так что формула 1 абонент — 1 начисление не соответствует реальности. 3 начисления я взял из демонстрационного примера чтобы быстрее клонировать документы и набрать объем эталонной базы. В реальных базах может быть в среднем и более 10 начислений. Я видел базу где только по скоту было 26 начислений у одного абонента и тарифы разные.

    А дюжину операций будет формировать обработка? Чем такое решение лучше регламентного документа? Несколько тысяч проводок в одной операции. Насколько удобно будет искать в таком объеме проводки по конкретному абоненту. И что будет с ручными изменениями при повторном регламентном расчете?

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

    (27)Т.о. мы имеем разные типы абонентскик точек = различные счета начисления (Дебет). Различные варианты льгот, субсидий и платежей = различные счета кредита проводок. Плательщик (абонент) — это атрибут справочника абонентских точек. Возможно, второе субконто в проводках по абонентским точкам.

    Начисление (регламентный расчет) проводится однократно. Все изменения — документом «Корректировка», формирующим проводки по требуемым отклонениям.

    Вся информация в перечисленных разрезах получается стандартными бух. отчетами типа «анализ субконто» или «ОСВ», поскольку данные автоматически хорошо структурированы.

    Reply
  28. alexk-is

    (28) «Начисление (регламентный расчет)» — это обработка?

    Что делать в случае, если через неделю работы обнаружили, что новые тарифы установили не по всем начислениям?

    Как получить отчет в разрезе тарифных ставок?

    3.15, 3.62, …

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

    (29) Нормативное требование в сфере коммунальных услуг — периодическое (ежемесячное) выставление счетов потребителям. А когда через неделю выяснится, что выставлены неправильные счета — это не повод для повторного выставления оных. Делается коррекция начислений.

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

    Reply
  30. alexk-is

    (30) Счета выставляются за прошлый месяц, а платежи собираются за прошлые месяца и за текущий. Т.е. расчет выполняется в начале месяца — предварительный и в конце месяца — окончательный. Окончательный это после поступления от почты и банков данных по показаниям счетчиков.

    По периодическим реквизитам справочника нельзя сделать отбор или сортировку. Если реквизит будет не периодический, то отчет за прошлый период будет неверный. Нужно добавить субконто?

    Reply
  31. alexk-is

    (30) Теперь у меня есть версия под компоненту «бухгалтерский учет». Над ней набо еще поработать, но регламентные начисления уже работают. Однако сомневаюсь что найдутся энтузиасты купить данный продукт, но попорядку…

    — проводил только регламентные документы по начислениям, т.к. остальные документы еще неготовы, то их не сравнивал

    — потерял немного аналитики в проводках и типовыми бухгалтерскими отчетами этого не вернуть — придется разрабатывать что-то специально

    — 4 файла для работы с журналом расчетов (ЖР) заменили 20 файлов для работы с бухгаллтерскими итогами (БИ) + 6 справочников для восстановления аналитики

    — объем 4 файлов ЖР — 300 Мб, объем 20 файлов БИ — 2 Гб (основной объем 2 файла — проводки и итоги)

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

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

    (32)Могу посмотреть и чего-нить посоветовать. Один ум хорошо, а два сапога — пара.

    Reply
  33. alexk-is

    (33) Однажды я уже пытался это побороть, но в то время техника была слабая, а на большое количество экспериментов небыло времени.

    Я использовал план счетов из приведенной в качестве примера конфигурации. Добавил аналитику по тарифам и нормам. Получилось 5 субконто.

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

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

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

    (34)Сваял иллюстрацию к некоторым идеям по минимизации итогов и количества субконто. Куда послать?

    Reply
  35. alexk-is

    Версия 7.70.521.

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

    Исправлена в 7.70.522

    Reply
  36. Ish_2

    Даже смотреть не стал . На 8 — ке когда будет ?

    Reply

Leave a Comment

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