Внешняя обработка для загрузки цен из Excel




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

21 Comments

  1. Ariko-sv

    Хорошо, но если бы еще и для бухгалтерии подходило, то цены бы не было!

    Reply
  2. wonder_boy

    К сожалению в типовой бухгалтерии не реализован механизм обработок табличных частей. Но есть выход из этой ситуации. Эту обработку можно запустить как обычную внешнюю обработку и в открывшейся форме выбрать уже созданный документ установки цен.

    Reply
  3. latrium

    Спасибо.

    Reply
  4. Rom_Kat

    Скажите, как происходит синхронизация номенклатуры? Можно ли загружать из произвольных Excel-файлов (прайс-листы поставщиков)?

    Reply
  5. wonder_boy

    (4) Rom_Kat,

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

    Как правило, эта обработка используется следующим образом:

    1. Выгружаем из программы уже существующую номенклатуру любым доступным способом в Excel. Единственное условие: обязательно наличие трех колонок «Код»,»Наименование»,»Цена» для варианта загрузки без характеристик номенклатуры и четырех колонок «Код»,»Наименование»,»Характеристика»,»Цена» для варианта загрузки с характеристиками. Часто выгрузка осуществляется через контекстное меню «Вывести список» табличной части уже существующего документа установки цен.

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

    3. Производится обратная загрузка отредактированного списка в новый документ установки цен.

    Reply
  6. AlexxxMksv

    Спасибо. Подскажите как корректно отключить контроль уникальности по коду при загрузки файла в табличную часть, мне нужно только по наименованию.

    Reply
  7. AlexxxMksv

    Похоже получилось

    для Процедура ЗагрузитьCХарактеристиками(Парам) закоментировал:

    //КодТОвара = Сокрлп(Строка(Лист.UsedRange.Cells(Ном,1).Value));

    //ЕСли КодТОвара=»» или ИмяТовара=»» или ЦенаТовара=»» тогда

    // Сообщить(«Не заполнены обязательные параметры в строке » + Строка(Ном) + «, код товара:» + СокрЛП(КодТовара) + «, имя товара:» + СокрЛП(ИмяТовара) + «, цена:» + СокрЛП(ЦенаТовара));

    // Продолжить;

    //КонецЕСлИ;

    //КодТовара=СтрЗаменить(КодТовара,» «,»»);

    //Пока СтрДлина(КодТовара)<11 Цикл

    // КодТовара=»0″+КодТовара;

    //КонецЦикла;

    //| И Номенклатура.Код = &Код

    //Запрос.УстановитьПараметр(«Код»,КодТОвара);

    И для Процедура Загрузить(Парам) Закомментировал:

    //КодТОвара = Сокрлп(Строка(Лист.UsedRange.Cells(Ном,1).Value));

    //Если КодТОвара=»» или ИмяТовара=»» или ЦенаТовара=»» тогда

    // Сообщить(«Не заполнены обязательные параметры в строке » + Строка(Ном) + «, код товара:» + СокрЛП(КодТовара) + «, имя товара:» + СокрЛП(ИмяТовара) + «, цена:» + СокрЛП(ЦенаТовара));

    // Продолжить;

    //КонецЕсли;

    //КодТовара=СтрЗаменить(КодТовара,» «,»»);

    //Пока СтрДлина(КодТовара)<11 Цикл

    // КодТовара=»0″+КодТовара;

    //КонецЦикла;

    //| И Номенклатура.Код = &Код

    //Запрос.УстановитьПараметр(«Код»,КодТОвара);

    Reply
  8. AlexxxMksv

    Есть еще одна просьба, как бы доработать обработку чтобы при наличии нескольких столбцов в Excel с ценами, они загружались в табличную часть документа «установка цен номенклатуры» при выборе более одного типа цен.

    Reply
  9. AlexxxMksv

    К сожалению обнаружилось следующее в 1с8.2 УТ :

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

    Reply
  10. wonder_boy

    (9) AlexxxMksv, данная обработка рассчитана на загрузку только первого в списке типа цен. В принципе, не вижу большой сложности доработать ее так, чтобы можно было загружать произвольное количество колонок с ценами. Единственная проблема, это синхронизировать выбранный список типов цен в документе установки цен и колонки с ценами из файла Excel. Думаю это вполне возможно, если колонки с ценами озаглавить наименованиями типов цен и при загрузке из файла соотвествующим образом заполнять колонки цен в табличной части.

    Reply
  11. AlexxxMksv

    Да спасибо, я как раз собираюсь это сделать, нашел где регулируется номер столбца:

    СтрокаТабличнойЧасти[«валюта»+»0»] = РУбли;

    СтрокаТабличнойЧасти[«валюта»+»1»] = РУбли;

    Надеюсь вы не против если я возьму вашу обработку за основу?

    Reply
  12. wonder_boy

    (11) AlexxxMksv, буду рад, если моя обработка поможет вам в работе.

    Reply
  13. Psiheya

    Хорошая обработка, спасибо! очень выручили!

    Удобно использовать, для записи себестоимости, в КА, после загрузки документов оприходования.

    Reply
  14. wonder_boy

    (13) Psiheya, рад, что обработка вам пригодилась.

    Reply
  15. nikita-_-89

    (14) Можете отправит мне на почту а то у меня на счету не хватает баллов для скачивания!

    Reply
  16. Timdf

    (5) Здравствуйте! Подскажите как настроить обработку, чтобы во вкладке «заполнить» в «установке цен номенклатуры» появились строки «заполнить из файла…». У меня не получается. 1С 8.2 УТ 10.3

    Reply
  17. wonder_boy

    Обработку необходимо сначала сконвертировать из 8.1 в 8.2, а потом добавить в справочник Внешние обработки с типом «Обработка табличной части», в табличной части указать принадлежность к типу документа «Установка цен номенклатуры».

    Reply
  18. bes-kkm

    будет ли работать на платформе 8.1 конфигурация управление торговлей «Управление торговлей», редакция 10.3 (10.3.13.2)?

    Reply
  19. wonder_boy

    (18) bes-kkm, Именно для этой конфигурации и создавалась эта обработка

    Reply
  20. MyPuK_OLD

    (19) Доброго времени суток!

    Я так понимаю данная обработка подходит для КА редакции 1.1? Ваша обработка загружает один тип цен? Как должны быть расположены колонки,чтобы все прошло удачно?

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

    Reply
  21. wonder_boy

    (20) MyPuK_OLD, Да эта обработка загружает один тип цен. Выше я уже писал, что не вижу проблем доработать ее так, чтобы можно было загружать их Экселя сразу несколько столбцов с ценами. В коде даже есть некоторые заготовки под это.

    Для успешной загрузки, экселевская таблица должна содержать 3 колонки: код товара из 1С, наименование товара, цена. Загрузка начинается со второй строки.

    Reply

Leave a Comment

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