Установка цен по поступлению УТ 10.3 с анализом цен




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

55 Comments

  1. Dimasik2007

    (0) Если Вам эти обработки нужны, и Вы решили скачать, то Вы либо поставите плюс или напишите, что Вам не понравилось и если это не исправят поставите минус.

    Руководство к действию?

    Reply
  2. Поручик

    (0) ты бы хоть за орфографией последил.

    Reply
  3. tchsn

    (1) Нет. Плюсы ставит тот кто хочет, а кто не хочет я их заставить не могу, а тем кто все-таки поставил плюс или поставит — Всем большое спасибо за плюсы которые поставили и которые ещё поставят

    (2) Спасибо у меня что-то клавиатура борохлит, а при наборе описания там текст очень мелкий, ещё раз спасибо за указание ошибок, вроде бы всё исправил

    Reply
  4. Dimasik2007

    (3) Внизу, статьи в «Оценке сообщества» уже есть текст про «Не забываем ставить плюсы, если вам понравилась публикация, и минусы — если не понравилась. Плюс добавляет публикацию в Мое избранное.»

    ИМХО, про плюсики-минусики писать уже излишне 🙂

    Reply
  5. tchsn

    (4) А что благодарить за плюсы уже нельзя? Я так пнимаю можно, что я и сделал в (3)

    Reply
  6. WiseSnake

    (5) Благодарить можно.

    А вот из сабжа фразу «Если Вам эти обработки нужны, и Вы решили скачать, то Вы либо поставите плюс или напишите, что Вам не понравилось и если это не исправят поставите минус.» следует убрать, так как администрация не поощряет выклянчивание плюсов!

    Reply
  7. tchsn

    (6) Если честно выклянчивание плюсов как то не прокатывает. Но раз у Вас такие правила то подчиняюсь

    Reply
  8. WiseSnake

    (7) Спасибо за сознательность. Тем более сразу перед оценкой сообщества за Вас уже давно все написали! (это пишется для каждого сабжа, это на будущее) 😉

    Reply
  9. ivpavlovsky

    Вот похожая идея http://infostart.ru/projects/3858/?p=1#comm6 Если соединить Вашу обработку с этой будет совсем хорошо…

    Reply
  10. tchsn

    (9) Так попробуйте написать конкретно, что бы вы хотели добавить и возможно мечта сбудется

    Reply
  11. tchsn

    (11) Спасибо. Реклама своего продукта дело полезное, но не я решил чего-то добавлять в обработку, а меня просят так что мне твоя обработка ни к чему, а что попросят попробую сделать лишь бы времени и сил хватило

    Reply
  12. csmail

    (12) Нужная вещь молодец!! Нашел косяк: если устанавливаешь цены для новой номенклатуры он не может подтянуть валюту… смотрю на код и немогу понять он устанавливает только розничную цену???

    Reply
  13. tchsn

    (13) В докумет «Установка цен номенклатуры» он ставит только цену продажи (или розничную кто как назовет), цена покупки специально не вставляется, чтобы каасиры её не знали, но она должна сохраняться в регистре «Цены номенклатуры контрагентов»

    —«Нашел косяк: если устанавливаешь цены для новой номенклатуры он не может подтянуть валюту… «— не понял как это не может подтянуть валюту

    Reply
  14. srsvet

    Вопрос: а можно сделать возможность изменения цены в графе новая «розничная цена»? Ну типа по тому что на некоторые товары цену ставим не просто в% накручиваем, а ручками типа у конкурентов 28 а мы ставим 27, и пофиг на проценты… ну а если еще когда я поставлю 27 обработка покажет сколь ето процентов наценено, то вообще шоколад

    Reply
  15. tchsn

    (15) А вообще-то она так и работает, и сохраняет только те цены, где стоит новая розничная цена

    Reply
  16. srsvet

    (16) ну я пробую ручкам цену забить старую розничную редактирует, а новую почему то нет

    Reply
  17. tchsn

    (17) Странно. Сейчас у меня технические проблемы, жестак с базами полетел, как только востановлю, сразу же посмотрю и дам ответ, хотя у меня в организации они по-другому цены и не заносят

    Reply
  18. yarilio

    Проект полезный, идея правильная. Ставлю плюс и буду разбираться в функционале.

    Reply
  19. tchsn

    (19) Спасибо за плюс. А функционал по моему не плохо описан , чего не поймешь пиши так или в личку

    Reply
  20. tchsn

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

    Reply
  21. srsvet

    (21) странно у меня немного другого вида эта обработка,чем у вас на скринах: у меня процент продажи, старые и новые цены все в одну строку, а у вас в (как в «установке цен номенклатуры»), нет кнопок печать накладной, печать ценообразования… я поместил её в [сервис/внещние печатные формы и обработки/внешние обработки], открываю оттуда же, мош я её не туда куда надо поместил?

    Reply
  22. tchsn

    (22) Попробуй просто открыть через файл —> открыть… и выбери файл с обработкой. Расположение колонок можно настроить с помощбю: На табличной части нажимаем правую кнопку мыши, в появившемся меню выбираем «Настройка списка», там справой стороны названия колонок, а справой стороны как распологать выделенную колонку: в новой колонке, на следующей строке и в той же колонке. Поэксперементируй. Да еще обработка писалась под разрешение экрана 1024х768, если у Вас меньше поэтому может быть кнопки и не влезают, тогда должна появиться справа полоса прокрутки

    Reply
  23. srsvet

    (23) розничная конечная цена так и не редактируется, мош проблема в редакции УТ 10.3.6.8 у меня… кнопок печать накладной, печать ценообразования нет, разрешение 1280*1024

    Reply
  24. tchsn

    (24) Но вообще-то когда -то она писалась под УТ 10.3.3.3, так что в этом проблемы быть не должно, могу только одним помочь, если пришлешь конфу на мыло Tchsn@bk.ru посмотрю в чем дело, и кроме тебя эту проблему больше никто не поднял

    Reply
  25. Поручик

    >> купном магазине

    >> На основнии

    >> руковдством

    >>> у меня борохлит, вроде бы всё исправил

    ….

    Блин, народ, porco madonno dios, это конечно моя придирка, но честно, заманало. На некоторые посты противно смотреть, как бомжа, жрущего из помойки.

    ПРОВЕРЯЙТЕ ОРФОГРАФИЮ! ХОТЯ БЫ В MS WORD! ПОДУМАЙТЕ О ДРУГИХ ПОЛЬЗОВАТЕЛЯХ! О ПОИСКЕ, В КОНЦЕ КОНЦОВ!

    Reply
  26. tchsn

    (26) Спасибо ещё раз. Исправил. Если за это Вам надо плюс, то скажете сколько поставлю, а клавиатура действительно борохлит и шрифт там действительно мелкий. В комментарии (3) я написал что вроде бы все исправил, это не означает что всё, а только то что нашел. А вообще я пишу либо с утра , когда глаза еле открыты или же после работы, когда они уже плохо смотрят.

    Тогда ещё один вопрос, а разве поиск ищет не по названию темы?

    Reply
  27. demiris

    Было бы неплохо запускать обработку из документа «Поступление товаров и услуг» и ввести новое поле Торговая наценка установленная предыдущими документами «Установка цен номенклатуры» для сравнения с текущими наценками.

    Reply
  28. tchsn

    (28) Можно подумать про документ «Поступление товаров и услуг», но когда будет время, я так понимаю либо через печатную форму либо через обработку табличной части. Хотя я считаю этот вариант удобней так как можно обрабатывать документы пачками после их ввода в базу.

    Насчет новой колонки яне очень понимаю зачем она, ведь есть на сколько процентов +/- цена поступления, и какой процент наценки получился после изменения цены поступления, отсюда проанализировав можно сделать вывод изменять цену продажи или нет.

    Я постараюсь рассмотреть Ваше предложение в будущем , сейчас нет времени, если после моего ответа оно Вам все таки будет нужно.

    Reply
  29. demiris

    Поясняю мысль по поводу Нового поля. Допустим после очередного поступления товара закупочная цена увеличилась. С помощью Вашей обработки анализируем ситуацию. Вапрос: Как узнать какая наценка должна быть у этого товара (наценка согласованная с начальством. В методологии 1С это наценка установленная на этот товар последним документом Установка цен номенклатуры) и соответственно нужно ли пересчитывать цену реализации) ? При оформлении больших накладных это большая проблема.

    Reply
  30. tchsn

    (30) Хорошо попробую с этим вопросом Вам помочь Только чуть позже сейчас нет времени приношу свои Извинения. Как только внесу изменения отпишусь

    Reply
  31. igbes

    У меня та же проблема, описанная выше. Конфигурация 10.3.6.8. Если товар новый, в первой строке, к примеру, то при проведении появляется сообщение:

    «Проведение документа: Установка цен номенклатуры 00000000104 от 09.10.2009 19:23:01

    В строке номер «1» табличной части для типа цен «Розничная» не заполнена Валюта.»

    Кроме того, для нового товара было бы неплохо, чтобы процент наценки брался установленный по умолчанию в спр. «Типы цен номенклатуры». Собственно, и валюта там же есть.

    Исправьте, пожалуйста!

    Reply
  32. csmail

    Вы господа придираетесь! Обработка отлично работает!!! Спасибо разработчику!

    Reply
  33. post279

    Спасибо, пригодилось

    Reply
  34. post279

    Добавил установку нескольких типов цен, и заполнение цены по заданным правилам, все супер, автору респект!

    Reply
  35. Гость

    подскажите плиз а можно сделать возможность изменения цены в графе новая «розничная цена»? Ну типа по тому что на некоторые товары цену ставим не просто в% накручиваем, а ручками типа у конкурентов 28 а мы ставим 27, и пофиг на проценты… ну а если еще когда я поставлю 27 обработка покажет сколь ето процентов наценено, то вообще шоколад

    Reply
  36. Гость

    Добавил установку нескольких типов цен, и заполнение цены по заданным правилам, все супер, автору респект!

    Reply
  37. volodya_gold
    Добавил установку нескольких типов цен, и заполнение цены по заданным правилам, все супер, автору респект!

    Сделал тоже самое + в обработке есть ошибка — для новых позиций не устанавлявается цена из-за ошибки кода валюты.

    А так супер!

    Reply
  38. volodya_gold
    подскажите плиз а можно сделать возможность изменения цены в графе новая «розничная цена»? Ну типа по тому что на некоторые товары цену ставим не просто в% накручиваем, а ручками типа у конкурентов 28 а мы ставим 27, и пофиг на проценты… ну а если еще когда я поставлю 27 обработка покажет сколь ето процентов наценено, то вообще шоколад

    Конечно можно! Если честно, думал что так и было)) Давно уже переделал. Еще можно с разрядностью чисел поковыряться, но тогда нужно будет и в регистрах менять.

    Reply
  39. Lizaveta1105

    спасибо, очень удачная обаботка

    Reply
  40. Harry_Joplin
    Добавил установку нескольких типов цен, и заполнение цены по заданным правилам

    Можно обработку с данными исправлениями в студию, т.к. тоже выдает ошибку при наличии НОВОГО товара?

    Reply
  41. Alies_Ka

    Описание очень заинтересовало!

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

    На основании заполнения табличной части формируются… заполненная табличная часть

    Вопрос! А может ли данная обработка заполнять не документ «Установки цен», а табличную часть документа «Поступление товаров и услуг»?

    Если она этого делать не может, то возможно подскажите где найти такую?

    Reply
  42. validat

    Полезная вещь! Кто поправил, выложите вариаты для испытаний, пожалуйста.

    Помогите советом, как добавить контроль штрихкода при поступлении?

    Reply
  43. EvaEva

    Подскажите, работает ли Анализ цен на платформе 8.2?

    Reply
  44. zas2004

    Как исправить эту ошибку с незаполненной валютой?

    Reply
  45. zas2004

    (41) Harry_Joplin, +1 выложите плиз исправленный, дополненный вариант!!!

    Reply
  46. zas2004

    все разобрался с валютой сам, в модуле стояла валюта по коду 810 (руб), а в конфигурации код 643, поменял в модуле все заработало, автору большой респектище! а так плюсанул 🙂

    Reply
  47. EvaEva

    Запустили обработку в УТ 10.3.. Работает некорректно. а именно:

    Не выделяет зеленым цветом строки, цена на товар в которых снизилась. и не выгружает данные в документ..

    Может кто знает, как исправить?

    Reply
  48. xor4eg

    У меня почему-то не подтягиваются действующие цены на товар, невозможно сравнить ничего.

    В обработке поправил код валюты (с 810 на 643)), теперь вылазит другая ошибка:

    {ВнешняяОбработка.ВО_АЛ_УстановкаЦен.МодульОбъекта(255)}: Ошибка при вызове метода контекста (Записать)

    Докум.Записать(РежимЗаписиДокумента.Проведение);

    по причине:

    Запись не верна! Значение поля «Тип цен» не может быть пустым!: ЦеныНоменклатуры: 17.01.2015, , [!]» Уши Эльфа с дождиком «А П, (Регистр сведений: Цены номенклатуры; Номер строки: 1)

    Reply
  49. leks633

    «Управление торговлей», редакция 10.3 (10.3.18.3). Обработка не запускается! Подскажите поддерживает ли она эту версию или другая проблема?

    Reply
  50. TombAlex

    Вобще не открывается, пишет «Внешняя обработка не может быть прочитана текущей версией программы»

    Reply
  51. user635149_ddg

    добрый день

    скачал обработку, на моей УТ 10.3.37.4 не запускается, пишет ошибка загрузки, типа в текущей конфигурации программы не может быть запущена

    хелп! очень хотел эту обработку, и так опечалился

    Reply
  52. NE_ZNAIY

    Сергей, ваша обработка сейчас работоспособна?

    Reply
  53. tchsn

    (53) Вряд ли, давно ее не проверял и не дорабатывал, да вроде бы 10.3 уже и никто не использует все ушли на 11 версию.

    Reply
  54. NE_ZNAIY

    А я вот никак не могу собраться перейти на 11-ую. Такой идиотизм! Эта 11-ая.

    Reply
  55. ЕленаЧерепнева

    Добрый день, попробовали вашу чудесную обработку. Получили такую ошибку:

    {ВнешняяОбработка.ВО_АЛ_УстановкаЦен.МодульОбъекта(236)}: Ошибка при вызове метода контекста (Записать)

    Докум.Записать(РежимЗаписиДокумента.Проведение);

    по причине:

    Запись не верна! Значение поля «Тип цен» не может быть пустым!: ЦеныНоменклатуры: 01.10.2018, , Товар 3, (Регистр сведений: Цены номенклатуры; Номер строки: 1)

    Если вы живы и здоровы (а вы наша предпоследняя надежда), исправьте, если можно.

    Reply

Leave a Comment

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