Розница 2.0 — 2.2: Заказ поставщику по минимальным остаткам




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

65 Comments

  1. AlexxGor

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

    Reply
  2. Alex441

    Удобная вещь, но нужен бы отбор по поставщикам до полного счастья

    Reply
  3. Alex3691

    В новой рознице не работает. Так как пропал тип значения реквизита — «значения свойств обьектов»

    Reply
  4. Tangram

    (3) Alex3691,

    Спасибо за отзыв, постараюсь исправить в ближайшее время.

    Reply
  5. Alex3691

    И если возможно сделайте разбивку по поставщикам…

    Reply
  6. Alex441

    (4) Здравствуйте, еще можно надеяться на обновление? Ваша обработка очень нужная вещь

    Reply
  7. Tangram

    (6) Alex441,

    Да, обновление будет.

    Reply
  8. Alex3691

    Что-то в новой рознице не позволяет допилить, или просто руки не доходят?

    Reply
  9. sancho86

    Очень бы пригодилось

    Reply
  10. mobistar

    не работает на новой рознице… к сожалению..

    Reply
  11. firml

    Здравствуйте, жаль не почитала сообщения перед покупкой (, в Розница, редакция 2.2 (2.2.5.26) действительно что-то изменилось, при попытке сформировать Заказ пишет: Значение не является значением объектного типа (Наименование), Alex441, может подправите, хорошая же штука…

    Reply
  12. war4un

    Здравствуйте! Розница 2.0.3.4, платформа 8.3.9.1818

    Все сделал как в инструкции, выходит следующее:

    {ВнешняяОбработка.ЗаполнитьЗаказПоставщикуПоМинОстаткам.МодульОбъекта(115)}: Значение не является значением объектного типа (Наименование) СвойствоМинОстаток = ПолучитьПВХизСтроки(СвойствоМинЗапас.Наименование);

    Reply
  13. Tangram

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

    Reply
  14. webandroid

    есть результат? иначе качать нет смысла.

    Reply
  15. firml

    Нет, все без изменений…

    Reply
  16. fenixland

    1С:Предприятие 8.3 (8.3.9.2170)

    Розница, редакция 2.2 (2.2.5.22)

    Отчет не работает

    ИТЕРАТОР для значения не определен!

    Reply
  17. war4un

    (13) Все еще нужно! Жду от вас ответа!

    Reply
  18. Dron1980

    Alex441 а как же настраивается минимальный остаток в версии 2.2.5.27 ?

    Reply
  19. Dron1980

    Старая не работает с новыми изменениями написал свою все работает проверял на версии 2.2.5.27, если есть вопросы пишите zamok2012@mail.ru

    Reply
  20. user594029_angelina-vl

    Добрый день!

    Работает ли обработка в релизе 2.2.4?

    Reply
  21. Tangram

    (20) Нет. Сроки выпуска версии для 2.2 пока уточнить не могу.

    Reply
  22. AlbertBug

    Добрый день, очень ждем обновления

    Reply
  23. Tangram

    (22) В течение недели появится для 2.2.

    Reply
  24. Tangram

    Доступна для скачивания версия обработки для Розница 2.1 — 2.2.

    Reply
  25. shaltay

    Подскажите пожалуйста — сделана разбивку по поставщикам???

    Reply
  26. Tangram

    (25) Есть заполнение с отбором по номенклатуре:

    Reply
  27. Tangram

    (25) То есть можно номенклатуру по поставщикам разбить и выбирать.

    Reply
  28. user794003

    Господа, а как вывести колонку «Минимальный остаток» в справочник «Номенклатура», чтобы наглядно было видно, какие остатки проставлены, а какие нет? Розница 2.0.

    Reply
  29. Tangram

    (28) Можно через консоль СКД сделать отчет где будут колонки «Номенклатура», «Минимальный остаток Склад 1», «Минимальный остаток Склад 2» и т.д.

    Reply
  30. user794003

    Подскажите чайнику, где в конструкторе запроса искать «Минимальный остаток Склад 1»?

    Reply
  31. Tangram

    (30) не найдете (.

    А) свойство номенклатуры «Мин. остаток….» указываете в параметрах отчета и тогда видите Номенклатура и мин. остатки по одному складу.

    Б) Делаете таблицу где по вертикали -Номенклатура, по горизонтали — Свойства. Тогда свойства «Мин. остаток» тоже можно засунуть в параметры с условием «В списке».

    Reply
  32. lifeforeve

    Выдает ошибку при открытии

    Розница 2.2.7.32

    Reply
  33. Tangram

    (32) Уточните пожалуйста момент появления ошибки.

    Reply
  34. grinlawyer

    Можно ссылку на обработку для розницы 2.2. на grinlawyer@yandex.ru

    Reply
  35. user758021

    Добрый день! Будет ли работать на 2.2.9.20?

    Reply
  36. Tangram

    (35) Да, будет. Проверено.

    Reply
  37. firml

    Здравствуйте, раз «заработала», может отправите тогда мне Рабочий вариант? А то купила, а так и не смогла даже посмотреть… мое сообщение по №11… firml@ya.ru

    Reply
  38. firml

    Спасибо!

    Reply
  39. DNMit

    Спасибо автору. Прекрасная и очень продуманная обработка.

    Отбора по поставщикам конечно не хватает, но доработать не долго.

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

    Спасибо!

    Reply
  40. Tangram

    (39) постараюсь выбрать время для обработки заполнения мин. Остатков.

    Reply
  41. www_20981

    Как-то круто взлетели цены на ресурсе!

    Как можно приобрести данную обработку за деньги, а не за SM?

    Reply
  42. sudakov1

    зарабатывать и исправлять свои, как приобрести обращайтесь

    Reply
  43. bestuzhev

    Полез тут код посомтреть, а там……

    Reply
  44. Tangram

    (43), я добавлю в описание что текст программы 16+. На 18+ не дотягивает. Надеюсь, вас не сильно расстроило.

    Reply
  45. sancho86

    программирование — это только для взрослых)

    Reply
  46. _Enot_

    (44)С чем связана ошибка?

    Значение не является значением объектного типа (Наименование)

    Reply
  47. Tangram

    (46) Добрый день! пришлите пожалуйста скриншот ошибки и описание ваших действий, после которых возникает ошибка.

    Если в окне ошибки есть кнопка «Подробно…», нажмите ее и пришлите скриншот или текст из окна «Подробно…». Можно в личку.

    Reply
  48. _Enot_

    (47)

    Текст

    {ВнешняяОбработка.ЗаполнитьЗаказПоставщикуПоМинОстаткам.МодульОбъекта(115)}: Значение не является значением объектного типа (Наименование)

    СвойствоМинОстаток = ПолучитьПВХизСтроки(СвойствоМинЗапас.Наименование);

    Захожу в заказ поставщику — созадать — записываю документ(выбираю поставщика и дату ) — потом заполнить заказ пост. по миним. остаткам и ошибка

    Скажите, а по какому он принципу заполнит количество товара в табличную чаcть?

    Reply
  49. Tangram

    (48) У вас не совпадают наименования:

    Свойство номенклатуры «Минимальный остаток Магазин 1» и значение свойства склада «Свойство — минимальный остаток на складе» «Минимальный остаток Магазин 1» должны быть одинаковыми.

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

    Reply
  50. Tangram

    (48)

    Скажите, а по какому он принципу заполнит количество товара в табличную чаcть?

    В Заказ попадают позиции, количество которых меньше установленного минимального остатка.

    Reply
  51. _Enot_

    (50)а нужно количество для заказа я им сам буду прописывать? Хорошо я проверю свойства и вам отпишусь

    Reply
  52. _Enot_

    (49)такую же ошибку выдает

    Reply
  53. _Enot_

    (50)А что вместо Значения свойств объектов теперь указывать?

    (49)

    Reply
  54. _Enot_

    (11)Не подскажете вы решили данную ошибку?

    Reply
  55. Tangram

    (53) Вам просто нужно сделать все по инструкции. Пришлите мне в личные сообщения скриншоты из вашей программы как в инструкции.

    Reply
  56. _Enot_

    (55) Все по инструкции, У меня нету «Значения свойств объектов» только число, дополнительное значение и т .д

    Reply
  57. user781941

    Добрый день!

    Подскажите, работает ли на Розница, редакция 2.2.11.24 ?

    Тип значения реквизита — «значения свойств обьектов» в Дополнительных реквизитах отсутствует.

    Reply
  58. Tangram

    (57) Добрый день! Я не видел изменений механизма доп. реквизитов в 2.2.11.24 относительно ранее протестированных версий, но проверю и напишу ответ. К сожалению, отвечу не раньше среды.

    Reply
  59. Tangram

    (57) Возможно, ваш вопрос связан с тем, что в тексте публикации размещена инструкция для старой версии Розница 2.0. В архиве с обработкой для 2.2 идет инструкция, где все описано для Розницы 2.2.

    Reply
  60. Axe

    Скажите как добавить свои условия отбора в обработку ?

    Reply
  61. Axe

    обработка удобная. «+».

    интересует расширение функционала.

    есть «магазин 1»

    есть «магазин 2»

    есть «магазин 3»

    есть организация (магазины 1+2+3, т.е. остаток итого по всем магазинам (складам))

    (магазин 1+2+3) = остаток товаров «итого»

    У товара есть минимальный остаток = 100. т.е. если товара осталось 20, то в заказе поставщику количество = 80.

    Задача:

    у товара должно быть :

    1. организация. минимальный остаток = 20 (нижний порог остатка на складе. Товар попадает в заказ только если остаток ниже минимального)

    2. организация. остаток для заказа. = 100.

    3. Товар попадает в заказ только если на остатке меньше 20. т.е. если по факту остаток = 15, то в заказ должно попасть кол-во = 85.

    4. и реализовать заказ с учетом итоговых остатков по предприятию. где фактический остаток для заказа, это суммарный остаток по всем магазинам, т.е. по организации

    Reply
  62. Terminal-t

    Здравствуйте, не получается скачать вашу обработку. Нет стартмани. Есть какие нибудь способы с вами связаться, что бы получить обработку?

    Reply
  63. Axe

    (61) Задача очень актуальна ! Автор выйди на связь

    Reply
  64. ПерваяСистема

    (61) Это уже есть в нашей разработке «Помощник закупок».

    Посмотрите https://infostart.ru/public/612868/

    Reply
  65. Convertovo

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

    Reply

Leave a Comment

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