Расширение возможностей скидок в ТиС 9.2




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

40 Comments

  1. Сидоров

    А как работать с файлом 1cv7.7z

    Reply
  2. Бит

    файлы *.7z это архивы, сайт разработчика http://www.7-zip.org.

    Reply
  3. Бит

    Как то не густо замечаний и предложений.

    Reply
  4. ev-kov

    инструкция содержит такие дикие формулы, что в md заглядывать не хочется , автор такая инструкция с формулами вида мин(макс(мин(мин(мин(?(с2=0,с1,с2),?(с3=0,?(с2=0,с1,с2),с3)),?(с4=0,мин(?(с2=0,с1,с2),?(с3=0,?(с2=0,с1,с2),с3)),с4)),?(с5=0,мин(мин(?(с2=0,с1,с2),?(с3=0,?(с2=0,с1,с2),с3)),?(с4=0,мин(?(с2=0,с1,с2),?(с3=0,?(с2=0,с1,с2),с3)),с4)),с5)),?(с6=0,мин(мин(мин(?(с2=0,с1,с2),?(с3=0,?(с2=0,с1,с2),с3)),?(с4=0,мин(?(с2=0,с1,с2),?(с3=0,?(с2=0,с1,с2),с3)),с4)),?(с5=0,мин(мин(?(с2=0,с1,с2),?(с3=0,?(с2=0,с1,с2),с3)),?(с4=0,мин(?(с2=0,с1,с2),?(с3=0,?(с2=0,с1,с2),с3)),с4)),с5)),с6))

    отпугивает

    Reply
  5. Бит

    (4)уважаемый, ev-kov, этот пример был специасльно вставлен для демонстрации (что не стоит в «лоб» писать), там же приведёт аналогичный по взаимодействию скидок пример но сокращённый.

    мн(макс(мн(мн(мн(?(с2=0,с1,с2),с3),с4),с5),с6),с7)

    Reply
  6. ineoosaki

    Спасибо за исправление. Теперь скидки работают и по агрегатным группам. Сам отловить глюк не смог.

    Reply
  7. Бит

    (6)Если будут ещё замечания или проблемы лучше сразу мне отписывайте.

    Reply
  8. skonto

    В целом всё хорошо, но не хватает печатной формы накладной с указанием суммы скидки по клиенту и прайса с учетом скидок по клиенту.

    Reply
  9. int3

    (4) ужос какой

    (5) а в чем сакральный смысл вложенных Мин()? Ведь если синтакс-помощник нам не врет, функции Мин() и Макс() могут принимать и более 2 значений 😉

    Reply
  10. Бит

    (9)Уважаемый, int3, в чём «сакральный смысл» постов, когда не разобрался с идеей но уже осуждаю?

    (8)Добавлю

    Reply
  11. int3

    (10) зачем людей пугать дикими формулами, если можно проще записать тоже самое?

    Reply
  12. Бит

    (11) Вы внимательно читали (5) это раз, во вторых «мин(100,99,90,0)» что вернёт? это два, немного ограничений наклыдывает пункт «Реализована возможность задания общей схемы взаимодействия скидок без изменения кода в конфигураторе» и человеческая лень это три, в четрёртых человек который научился пользоваться СП как правило может пользоваться и конфигуратором…, в пятых просто не люблю постов «ниочём» типа (4,9), слова проде есть а смысла кроме облить чем нибудь вонючим нет 🙂

    Reply
  13. int3

    (12) «а смысла кроме облить чем нибудь вонючим нет»

    зависит от жизненной позиции, с негативной позицией — да, кроме как «облить вонючим» не видится

    а если не зацикливаться на этом — можно усмотреть и предложение развития — увеличение чиса параметров например или еще чего

    да и —

    мин(100,99,90,0)=мин(мин(мин(100,99),90),0)

    только короче

    Reply
  14. Бит

    (13)Уважаемый, int3, если вы не возражаете давайте прекратим дискусию,

    «мин(100,99,90,0)=мин(мин(мин(100,99),90),0)»

    в обоих случая вернёт 0 а по нормальному, что косается именно цен, должно вернуть 90, в общем если не хотите разбираться с данной «разработкой» если её правда так можно назвать, то и не надо.

    Reply
  15. ineoosaki

    skonto написал

    ——————————————

    >В целом всё хорошо, но не хватает печатной формы >накладной с указанием суммы скидки по клиенту и >прайса с учетом скидок по клиенту.

    Бит ответил

    ———————————

    > Добавлю

    Будем ждать.

    Reply
  16. Бит

    (15)Через недельку выложу

    Reply
  17. Бит

    (8,15) Обновил

    Reply
  18. Бит

    Исправил пару найденых ошибок в мд от 15.02.07

    Reply
  19. Бит

    Исправлена ошибка

    Reply
  20. Бит

    Добавлен флаг «Абсолютная» в скидки, для более гибкой настройки. Подробности во встроенном описании и в инструкции.

    Reply
  21. Бит

    Интересно ктонибудь кроме skonto и ineoosaki пробывал использовать эту наработку?

    Reply
  22. Бит

    думаю можно убрать признак «бэтта».

    Reply
  23. etibarr

    Для компаний быстро реагирующих на изменения вещь необходимая. Я только сейчас подумывал о том, что бы перейти на 1С. Можем ли мы более подробно поговорить на эту тему? Мой e-mail etibar.veliyev@gmail.com

    Благодарю заранее.

    Reply
  24. Бит

    (23)В иструкции есть мой e-mail

    Reply
  25. Alexandra

    Идея здоровская.

    Дурацкий вопрос:

    после пересчета скидок в ТЧ документа изменяются столбцы «Цена», «Сумма без

    скидки», «Сумма» и столбец «Скидка» обнуляется. Вроде ж «Цена» и «Сумма без скидки»

    должны оставаться без изменения, а пересчитываться столбцы «Скидка» и «Сумма»?

    Reply
  26. Бит

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

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

    Если вы хотите видеть именно в самом документе скидки, то придётся переписывать.

    Reply
  27. Alexandra

    Доброго времени, спасибо за быстрый ответ.

    Ага, надо переписывать. В принципе, наверное любая фирма рано или поздно

    «дорастает» до нетипового подхода к скидкам. Так что идея хороша.

    Попробую под свои нужды приспособить, думаю, получится 🙂

    Reply
  28. Бит

    (27)Удачи, если что пишите.

    Как дойдут руки выложу также возможность задание скидок в абсолютных единицах

    Reply
  29. ko1ek

    ДАров Мужики ТУт засада. Мне здать нужно выпускную работу, м.б. подскажете где можно нарыть какую либо информацию?*

    Курсавая работа на тему:

    «Автоматизированный учет скидок в системе «1С: Торговля и склад».»

    Reply
  30. skilster

    Отличная разработка! Не подскажете, какие именно объекты конфигурации были изменены? Хочу внедрить механизм в нетиповой ТиС.

    Reply
  31. Бит

    (30)Конфигурация изменена по минимуму, для сравнения выложен МД без изменений, если правильно помню то документы реализаций и заявка остальное в дополнительных объектах, но могу ошибаться, если будут проблемы пишите там что нибудь придумаем

    Reply
  32. skilster

    (31) спасибо за оперативный ответ! Разобрался со всем, кроме валют. Если документ продажи рублевый, а цены установлены в USD или EUR, то получаем такую картину: цена товара = $200, в реализации = 5949 руб, по нажатию на кнопку ПРОСТАВИТЬ СКИДКИ имеем 200 рублей минус % скидки. А должно быть 200 долларов за вычетом скидки. Как можно решить проблему?

    Reply
  33. Бит

    (32)Это или руками самому или подождать, до конца недели постараюсь поправить, у меня стояло на фирмах которые торгуют в одной валюте, поэтому такой проблемы не возникало

    Reply
  34. skilster

    (33) Допилил сам. Спасибо!

    Reply
  35. Vikik

    Отлично! Давно хотел расширить систему скидок. Проблема с валютами, как в предыдущем сообщении. Изменением конфигурации занимаюсь сам, а опыта мало. Думаю буду долго возится.

    Reply
  36. skilster

    (35), на самом деле, проблема учета валют решается добавлением пары строк в глобальный модуль. Достаточно передать валюту в процедуру глВернутьЦену, а затем обработать полученную переменную рез.

    Reply
  37. Vikik

    (36)Спасибо. Для меня пару строк в глобальный модуль это уже подвиг. Основное занятие непосредственно ТиС. Как только появится время, обязательно буду настраивать.

    Reply
  38. Бит

    (36)Ваше решение сточки зрения производительности более оптимально, но пока придерживаюсь подхода при создании, минимального изменения конфигурации, поэтому преобразование идёт в обработке

    (37)Обновил

    Reply
  39. Vikik

    (38)Спасибо! Всё работает. А есть ли возможность, чтобы скидки ставились автомотически, сразу при оформлении документа? Персональные скидки назначены не для всех контрагентов. Опасаюсь, что при интенсивной торговле можно упустить поставить скидки.

    Reply
  40. Бит

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

    Reply

Leave a Comment

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