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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *