Установка цен номенклатуры из документа "Поступление товаров и услуг" с отбором для УТ (код как обычно открыт)




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

33 Comments

  1. bestuzhev

    Да… Уже скачали 25 раз, а комментариев нет. Обидно.

    Reply
  2. bestuzhev

    Блин, уже 33. Если нечего сказать хоть плюсуйте 🙂

    Reply
  3. Поручик

    Блин, уже 51, нет 52.

    Сейчас поглядим, какой он Сухов (С)

    Reply
  4. Поручик

    Наверное, лучше сделать её обработкой для заполнения табличных частей. Чтоб под рукой была.

    Так уж и быть, ставлю зачёт.

    Кстати, уже 69.

    Reply
  5. barsa-05

    Штучка работает, только не моуг понять какой от нее толк???

    Reply
  6. ivpavlovsky

    Мне понравилось. Вот если бы еще добавил до очистки «Очистить все» , «Очистить не отмеченные» было бы еще лучше.

    Reply
  7. csmail

    Вещь прикольная но лучше доработать : добавить колонки остаток товар, приход, старая цена розницы, установа новой цены, процент наценки, закупка старая , новая!!!у меня такая наработка для 7.7 торговли, до 8 руки не доходят, но нужна!!!

    Reply
  8. bestuzhev

    (7) Спасибо, подумаю.

    Reply
  9. bestuzhev

    (5) Толк в том чтобы максимально быстро изменить цены на товар после его поступления, увидеть что подешевело а что подорожало и не записывать не изменившиеся цены

    Reply
  10. bestuzhev

    (6) Добавил.

    Reply
  11. Sam.

    Идея хороша. Но не учтены характеристики, единицы измерения, валюта (приход в одной, цена в другой).

    Reply
  12. vitaliyua

    Возможность добавлять не только из документа Поступления.. а и по ценам номенклатуры поставщика. Это даст полный список номенклатуры поставщика, для того, чтобы изменить цены у «братиков и сестричек».

    Reply
  13. d.snissarenko

    у меня в девелопе стоит, правда с раскурочками в типовой, с доп регистром сведений с наценками на группы товаров и конкретные товары.

    Функционал обработки

    — установка цен на конкретные товары (по остаткам на конкретном складе)

    — группы товаров (по остаткам на конкретном складе)

    — по заказу поставщику

    — по поступлению

    Возможность 2х валютного учета

    Динамическое построение таблицы цен, одним запросом, динамическое построение текста запроса. Количество типов цен не ограничено.

    Тек. состояние

    — требуется доработка кроссвалютного учета, а не просто бивалютного

    — ну и отвязка от регистра наценок (которого нет в типовой)

    http://infostart.ru/upload/iblock/ec6/tc.jpeg

    Reply
  14. d.snissarenko

    зы.. формирование документа ценообразование из обработки

    Reply
  15. tchsn

    Я с помощью твоей обработки доработал свою обработку, в которой хоть и одна валюта, но отслеживается как поменялась цена закупки в цене и в процентах, и как это сказалось на наценке. И цены у меня можно устанавливать как процент от закупки так и жестко.

    За твою помощь, если надо пришлю только не знаю куда?

    А так же я тебе плюсую!!!

    Reply
  16. manoff

    Не совсем понял смысл обработки. Документ установка Цен номенклатуры отлично позволяет загрузить из поступления и даже нескольких. Небольшая доработка позволяет видеть старые цены и сравнивать с новыми.

    Reply
  17. tchsn

    Доработка документа приведет к проблемам обновления

    Reply
  18. raiml

    (17) +1

    Reply
  19. tchsn

    (18) Спасибо

    Reply
  20. RuslanK

    Спасибо )

    Reply
  21. mrxxl

    Спасибо!

    Reply
  22. rutony

    плюсанул,

    у меня что то похожее но функционал убежал очень далеко, и из чего то подобного мутировало в реальный продукт для УТ)

    http://www.pichost.ru/show.php/111765_.JPG.html

    Reply
  23. bestuzhev

    (22) Интересно. Давай подробности.

    Reply
  24. rutony

    (23)

    — Обработка

    — Аналог поступления товаров и услуг, переоценки и установки в одном флаконе

    — Расширенная динамическая часть с возможность ввода любых цен (типов цен)

    — Табличная часть Формирование цен, аналог типовой изменения цен в табличной части, типа, наценка, раскинуть сумму по всем позициям и тд

    — Поля с ценами сражу же подсвечиваются если цену нельзя зафиксировать

    — Проверка корректности формируеммых документов

    — Нижняя табличная часть список сформированных документов, которые можно провести, распечатать и тд, и тп

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

    — Возможности работы с параметрами, те. обработка проглатывает параметры список товаров и тд

    — Выгрузка данных в фронт-офисную систему

    — и тд тп

    Вообщем обработка сделана в первую очередь для «горячего» ввода накладных, с установкой любых цен (с наценками/без), конечно же, применительно в первую очередь для Розничных складов, тк. как только они требуют такую цепочку документов…

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

    Reply
  25. redbug

    (24) А где ее скачать можно?

    Reply
  26. meU3

    Спасибо!

    Reply
  27. qwertylion@rambler.ru

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

    Reply
  28. vabue

    В УТ для Украины 2.3 (платформа 8.1.13.41) после выбора документа основания гавкает:

    {ВнешняяОбработка.УстановкаЦенНоменклатуры(134)}: Поле объекта не обнаружено (Хозрасчетный)

    И после этого ничего не происходит.

    Reply
  29. bestuzhev

    (28) Так и должно быть. Вообще делал для России и для УТ.

    Если нужна обработка пишите, по цене договоримся.

    Reply
  30. pollikarp

    Попробовал активно поюзать, и вот какая интересная штука с этой обработкой получается, документ установки цен как-то привязывается к 2-м или 3-м документам поступления и соответственно по последнему основанию цены устанавливает а цены других обнуляет, в остальном 5+

    Reply
  31. umiro54

    qwertilion «идея неплохая, но она дублирует стандартную операцию. Вот если добавить отклонения от старой цены, да еще с разными цветами (например красным — цена выросла, зеленым-упала), то уже интересный анализ цен получаеться» — http://infostart.ru/public/58329/

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

    в одном окне закупочные цены с индексом отклонения от предыдущей цены,

    в другом окне история розничных цен с индексом отклонения от предыдущей розничной цены.

    Т.Е. менеджер по документу прихода видит по каждой позиции, насколько изменилась закупочная и отпускная цена по сравнению с предыдущими ценами

    Reply
  32. AndreyLi9

    Спасибо за идею! Дальше доработаю сам.

    Reply
  33. btg

    Взял, попробовал. Понравилась идея, сейчас переделываю — хочу прицепить непосредственно к документу поступления товаров. Я в 1с 8 новичок, начинал еще с 6.0, сейчас изучаю семерку, эта обработка помогла еще чуть-чуть добавить знаний. Спасибо автору.

    Reply

Leave a Comment

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