Учет аналогов в 1С:Предприятии 8.2 — статья и 7 видео-уроков




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

25 Comments

  1. coach

    Ребята, уроки доступны для скачивания?

    В заголовке статьи написано «…посмотреть и скачать все файлы (8)…».

    А внутри вижу только 2 файла..

    Reply
  2. СергейКа

    (1) Вроде все файлы на месте

    Reply
  3. RailMen

    Это не простая тема: тут и методы оптимизации и теория графов и технолигические карты и куча другого. Хорошо, что некоторые подводные камни были вынуты со дна морского.

    Reply
  4. coach

    (2) Ок, видимо у меня браузер страницы закешировал

    (3) Тема эта сильно интересная…

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

    Спасибо за положительный отзыв!

    Reply
  5. _LEV_

    Спасибо, интересная статья. Про файлы не понятно, одним архивом можно положить видеоуроки?

    Reply
  6. coach

    (5) Пытался положить одним архивом, почему-то они не принимались сервером.

    Завтра утром выложу материалы на другой сервер и дам ссылку…

    Reply
  7. alexk-is

    (6) В IE zip выложить проблем не составляет. С другими браузерами периодически возникают проблемы.

    Reply
  8. script

    1C Долго выкладывала на ИТС подсистему прогнозирования там как раз решается вопрос аналогов и как раз с помощью кластерного метода.

    Reply
  9. coach

    (7) Понятно, значит может быть дело в том, что использую хром.

    Спасибо.

    Reply
  10. coach

    (8) Это уже есть на ИТС??

    Нужно заглянуть, спасибо 🙂

    Reply
  11. Abadonna

    (9) С хромом ИС точно не дружит, даже где-то на это ссылка была…

    Reply
  12. alexk-is

    (11) В каждой публикации на закладке «Файлы» красным:

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

    Reply
  13. Abadonna

    (12) Ага! Точно! Просто я обычно как-то не особо обращал на нее внимания, потому как хромом не пользуюсь

    Reply
  14. coach

    (all)

    Мне уже третий раз поступает жалоба на невысокую скорость скачивания видео с инфостарта.

    Поэтому, видео-уроки выложили на наш зарубежный хостинг, ссылка на скачивание находится в pdf-файле.

    Reply
  15. ILM

    Мне понравилось, Молодцы.

    Reply
  16. Valerich

    Интересно оформлено, но сколько нам ошибок трудных готовит…..

    Во втором уроке жуть…..

    1. паарметров в запросе было гораздо больше, чем показано. Хотя можно было в запросе обойтись и без них, наверное, через условия соединения…. не знаю, автору виднее.

    2. Логика развесстого условия явно хромает….

    что же будет дальше….

    Reply
  17. coach

    (16) Спасибо за отзыв!

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

    По п.2 Не совсем понятно о чем конкретно речь…

    Reply
  18. Valerich

    (17) досмотрел до конца…. те ошибки вроде как исправлены, но остались вопросы….

    1. мы слили 2 кластера воедино — пустой кластер остался мусором навеки….??

    2. если номенклатура еще не входит не в один из кластеров — как будет выполняться списание?

    3. с точки зрения пользователя логичнее было бы сначала списать ВСЮ основную номенклатуру какая есть, и только потом обращаться к аналогам. Иначе может возникнуть непонятка… в рамках видеоурока попробуйте списать 15 красных, 10 оранжевых и 6 желтых. Порграмма скажет, что не хватает 1-го желтого. При этом в остатках любой пользователь увидит 10 желтых….. и начнет задавать неудобные вопросы….., на которые неопытный программист будет пытаться объяснить логику списания, а опытный объявит фичей 🙂

    Reply
  19. Valerich

    В общем поставлю плюс, но скорее авансом…. Советую более тщательно прорабатывать все до начала демонстрации…. особенно логику работы системы

    PS и включите же наконец автозавершение кода…. а то на совсем неопытного похожи….

    Reply
  20. coach

    (18) Отвечаю по пунктам.

    Во-первых, не стоит рассматривать материал как законченное и эталонное решение.

    Скорее это «рыба» и пища для размышлений.

    1. На самом деле подход, описанный в статье имеет схожую реализацию с расширенной

    аналитикой в УПП. Там тоже неиспользуемые ключи аналитики будут болтаться вечно…ну или почти вечно, пока внедренец не запустить обработку «Тестирование и исправление ключей аналитики».

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

    2. Если не входит — хорошо, значит у нее нет аналогов, спишется только она, если хватит…

    3. Да, думаю это верно, но опять же я не привожу окончательного решения…

    По поводу одного желтого, точно заметили, фича ))

    Reply
  21. Valerich

    (20) по п. 2 интуиция подсказывает мне что вообще ничего не спишется, хотя в запросы глубоко не вникал и впечатление поверхностное… но пробовать самому все повторить нет времени…

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

    может быть я и не прав.

    Reply
  22. coach

    (21) Отлично, что вы это заметили..

    Этот случай как раз описывается в 7-ом уроке.

    Там и рассматривается способ решения проблемы — создание динамической коллекции.

    Reply
  23. lees

    Отличный материал!!! В свое время были задачи, например в отчете «Анализ точки заказа» учитывать аналоги номенклатуры, ну делал тривиальный вариант, т.е. учитывал аналоги первого уровня (те аналог аналога — уже не аналог). Ладно что заказчиков более-менее устраивало…

    Reply
  24. arktika1

    Скажите а есть готовые решения?

    по описанной Ваме статье.

    также мне кажется что действиетельно, нет смысла обединять почти похожие аналоги, он либо является аналогом, либо нет и если у него есть схожие свойства то лучше при не нахождении аналога предложить поиск по похожим свойствам номенклотуры. Но важно что бы при прописывании А = Б и Б = С сразу прописывалось что и С = А

    иначе возникает проблема надо повторно потом отыскивать связи и писать их дополнительно,

    а это большой объем работ

    Reply
  25. farkhod

    Одним архивом не скачать? По ссылке из PDF файла битые ссылки

    Reply

Leave a Comment

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