Вывод остатка товаров на складе в документ Реализация товаров и услуг (для конфигурации Управление Торговлей 11.2 / 11.3 / 11.4)




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

18 Comments

  1. Ramir555

    Добрый день, спасибо за статью. Не подскажите, зачем НоваяКоманда.Скрыть = Истина?

    В описание нашел

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

    Но так и не понял о каком объекте идет речь, что истина что ложь все равно отображается и в форме документа. Вы для чего её используете?

    Reply
  2. dklp

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

    Reply
  3. yandesi

    Нужна такая же для УНФ 1.6.7

    Reply
  4. Pagor

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

    Reply
  5. dklp

    (4) добавил аналогичную обработку для Заказа клиента

    Reply
  6. Pagor

    большое спасибо

    Reply
  7. Pagor

    протестировал на ут 11.2.3.300 в заказах, работает! но, остаток показывает общий по номенклатуре, а не отдельно как (у многих наверное) у меня по характеристикам. возможно поправить?а так даже очень полезная вещь) спасибо

    Reply
  8. dklp

    (7) с остатками в разрезе серий и характеристик пока не разбирался 🙁

    Reply
  9. Pagor

    очень жаль:(

    Reply
  10. MAER2305

    Здравсвуйте! скачала Вашу обработку, спасибо. Правда одаптировала под ЧекККМ, но не понятно, почему кнопка появляется только в ФормаДокумента, а мне нужен остаток в ФормаДокументаРМК. (УТ11.2 Документ.ЧекККМ) Подскажите как добавить команту Показать Остатки на другую форму Документа. Заранее благодарю.

    Reply
  11. dklp

    (10)

    в сведениях о внешней обработке поле Назначение задает тот объект конфигурации, для которого будет назначена обработка

     ПараметрыРегистрации.Назначение.Добавить(«Документ.РеализацияТоваровУслуг»);

    укажите в этой строке вместо РеализацияТоваровУслуг тот документ, который вам нужно

    Reply
  12. user669256

    Здравствуйте! Самая востребованная обработка!!! С момента появления работала под всеми релизами УТ 11.3…, без нее, уже все ни то и все ни так. Пожалуйста, адаптируйте ее для УТ11.4.

    Заранее спасибо!

    Reply
  13. dklp

    (12)

    После обновления конфигурации на 11.4 нужно внести небольшие изменения в код функции СведенияОВнешнейОбработке() модуля объекта внешней обработки:

    1) во-первых, находим и полностью убираем или комментируем строку кода

    НоваяКоманда.Скрыть = Истина; 

    2) во-вторых (а вот здесь интересно!) меняем представление команды

    НоваяКоманда.Представление = НСтр(«ru = ‘Показать доступность товара на складе'»);

    на более короткое

    НоваяКоманда.Представление = НСтр(«ru = ‘Показать остатки'»);

    Если этого не сделать, то на форме документа с настройками по умолчанию команда будет отображаться только в виде значка (без текста). Либо нужно будет в настройках самой формы поменять для команды свойство Отображение с «Авто» на «Текст».

    В шапке уже выложены доработанные обработки с поддержкой конфигурации Управление торговлей 11.4

    Reply
  14. igor2011

    Подскажите, а как в том же заказе клиента, вновь полученный столбец вывести на печать?

    Reply
  15. dklp

    (14) вывод на печать не предусмотрен. для этого нужно создавать отдельную печатную форму

    Reply
  16. aden_one

    А вывести остатки по складам в заказы возможно?

    Reply
  17. pollack

    Кто-нибудь разобрался, как в обработку заполнения типа «ЗаполнениеФормы» на сервер передается управляемая форма

    (ПараметрыВыполнения.ЭтаФорма)?

    Reply
  18. alexruzh67

    Как ведет себя обработка при использовании группы складов?

    Reply

Leave a Comment

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