Распределение входящих услуг по произвольному проценту/коэффициенту




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

29 Comments

  1. gutentag

    ИМХО для небольшого предприятия — это удобная вещь! (+)

    Reply
  2. gutentag

    ИМХО для предприятий, с несколькими видами деятельности (в т.ч. НДС-18% и Без НДС), надо распределять затраты по видам деятельности, а если нельзя конкретно распределить, то распределять пропоционально выручке. И это удобнее делать в проводках.

    Reply
  3. lion11

    (2) Согласен, и вариантов может быть куча: можно при помощи данной обработки распределить по видам деятельности и по подразделениям, а статью затрат выбрать — распределяемые, и потом программа сама разделит по НДС/без НДС/ЕНВД.

    Reply
  4. Сафик

    именно такая обработка нужна для 7.7. Может подскажете, где можно взять? )

    Reply
  5. lion11

    (4) Если очень надо, могу нарисовать и для 7.7. Только так красиво не получится, в доке Услуги сторонних организаций нет возможности даже внешнюю форму прикрутить, по-этому либо отдельная внешняя обработка либо изменение конфигурации…

    Reply
  6. lion11

    Обновил обработку. Могла возникнуть ситуация, когда нераспределенные копейки в результате округления падали не на строку с максимальной суммой. В случае с большими суммами и небольшим количеством строк такое вообще не случается. Но когда наоборот, то вполне может быть ситуация, подробно рассмотренная в http://infostart.ru/projects/2780/. Планирую в будущем, если будет надо, поправить алгоритм, как там описано.

    Reply
  7. lion11

    Добавил обработку для Бухгалтерии 7.7.

    (4) Смотрите…

    Reply
  8. gutentag

    (7) Ура !

    Reply
  9. MariP

    идея хорошая, нужно попробовать…

    Reply
  10. jsofthome1

    хорошая идея

    Reply
  11. Юля_1

    для УПП 1.1 работает? Скачала, обработка вроде открылась, но выбрать документ ссылку не получается, список документов не открывается

    Reply
  12. lion11

    (11) Вообще-то для УПП не рассматривалось. В УПП в этом документе другие поля в услугах. Но в-общем работает, проверил на релизе 1.2.19.1 (какой был). Какие поля есть, заполняет, другие нет. Переделать не сложно, модуль не большой. Тут главное идея…

    А обработку прямо открывать не нужно, нужно ее подключить в меню Сервис — Доп.отчеты и обработки — Обработки заполнения таб.частей — Добавить — выбрать этот файл, сохранить. Потом в заполненном документе Поступление на закладке услуги нажать Заполнить и выбрать Распределение поступления.

    Reply
  13. Юля_1

    В УПП 1.1 такого нет ( в меню Сервис — Доп.отчеты и обработки — Обработки заполнения таб.частей) :((, это только в 1.2….

    Борюсь за распределение ОПЗ между подразделениями, так как в УПП 1.1 этого нет, думала, может хоть Вашей обработкой облегчить жизнь, но и тут облом:(

    Reply
  14. lion11

    (13) Можно попробовать обновить конфигурацию, или вставить модуль обработки в документ и к кнопке привязать…

    Reply
  15. Юля_1

    (14) Обновление конфигурации до 1.2 — наболевший вопрос: очень много доработок и за обновление выставляют огромный счет (почти как новое внедрение). Поэтому пока работаем на 1.1. Будем пробовать вставить модуль в документ…

    Reply
  16. lion11

    (13)+ Немного доделал обработку: теперь можно пользоваться через Файл — открыть. Посмотрите.

    Reply
  17. Юля_1

    Попробовала

    пишет ошибку

    {Форма.Форма(25,28)}: Переменная не определена (РаботаСДиалогами)

    мКнопкиЗаполненияТЧ = <<?>>РаботаСДиалогами.СформироватьПодменюЗаполненияТЧ(ДокументСсылка, СоответствиеТЧ, Новый Действие(«НажатиеНаДополнительнуюКнопкуЗаполненияТЧ»));

    Reply
  18. lion11

    (14) Понятно, версия слишком отличается. К сожалению такого старого релиза УПП у меня нет, проверить не могу.:(( На 1.2 работает… Придется Вам самим встраивать в конфигурацию

    Reply
  19. lion11

    (17) Хотя нет, я там лишнего написал в 18, попробуйте сейчас, обновил обработку.

    Reply
  20. Юля_1

    Открыла, спросил способ отражения расходов, заполнила, выдал :

    {ВнешняяОбработка.РаспределениеПоступления(55)}: Ошибка при вызове метода контекста (Свернуть): Неверное имя колонки

    ТаблицаУслуг.Свернуть(«СпособОтраженияРасходов,Номенклатура,Содержание,СтавкаНДС,СчетУчетаНДС,ОтражениеВУСН,Цена»,

    по причине:

    Неверное имя колонки

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

    Для семерки все же можно было бы не извращаться с материалами, а использовать «ПрочиеОбъекыУчета». Но +

    Reply
  22. lion11

    (21) Весь смысл не в справочнике материалов, а в подчиненном справочнике «Назначения использования» — там заносится база распределения. А в «ПрочиеОбъекыУчета» — без серьезного конфигурирования я не понимаю, как туда базу воткнуть…

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

    (22)Там три уровня. Вместо владельца берем родителя, а процент загоняем в наименование.

    Reply
  24. lion11

    (20) Видно сильно структура поменялась. Два варианта решения задачи: Вы мне можете скинуть имена всех реквизитов, что используются в ТЧ услуги в этом доке у Вас (смотреть в конфигураторе), или взять и ручками поправить этот модуль — там в трех местах всего…

    Reply
  25. lion11

    (23) А счет затрат и 3 уровня аналитики по БУ и НУ?

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

    (25)Да не спорю я, так универсальней. Мое замечание касалось примера из описания. Счет и два субконто — в самом документе, по третьему субконто (Подразделения) делим обработкой.

    Reply
  27. Юля_1

    Заказ

    Количество

    Номенклатура

    НоменклатурнаяГруппа

    ОбъектСтроительства

    Подразделение

    ПодразделениеОрганизации

    Продукция

    Проект

    СерияПродукции

    Содержание

    СтавкаНДС

    СтатьяЗатрат

    Субконто1

    Субконто2

    Субконто3

    Сумма

    СуммаНДС

    СчетЗатрат

    СчетУчетаНДС

    НДСВключенВСтоимость

    ХарактеристикаПродукции

    ВидДеятельностиНДС

    ВидНалоговойДеятельности

    Амортизируется

    Цена

    ТС

    РасходБП

    ПутевойЛист

    Reply
  28. lion11

    (27) Юлия, напишите какой-нибудь адрес эл.почты, туда скину…

    Reply
  29. Юля_1

    (28) написала в личку

    Reply

Leave a Comment

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