"Учет серийных номеров" для типовой конфигурации УТ — доработанная версия




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-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='\

27 Comments

  1. dim0n_la

    Упрощённый ввод новых серийных номеров. Типовая форма ввода доработана поиском по серийным номерам.

    Контроль ввода серийных номеров для товара, по которому ведется учет серийных номеров. (Документ нельзя провести, если количество товара в операции расходится с количеством введенных серийных номеров)

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

    Изменения типовой конфигурации минимальны.

    Перейти к публикации

    Reply ↓
  2. Поручик

    (0) Если не секрет, это где нибудь применяется?

    Reply ↓
  3. dim0n_la

    Интернет магазинам, торгующим электроникой вполне подходит.

    Reply ↓
  4. dynamite

    подходит ли для 1с УТ 10.3?

    Reply ↓
  5. dynamite
    Reply ↓
  6. dim0n_la

    Да, при обновлении не нужно обновлять типовые документы. Они присутствуют в конфигурации «Учет серийных номеров» только для сохранения типизации реквизитов.

    А ошибка появилась из-за того, что обновился модуль объекта документа.

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

    Reply ↓
  7. dynamite

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

    Reply ↓
  8. dynamite

    Я ОБНОВИЛ ТАК КАК ВЫ СКАЗАЛИ НО ВЫДАЕТ ОШИБКУ ПРИ ПРОВЕДЕНИЕ ПОСТУПЛЕНИЕ ТОВАРОВ И УСЛУГ

    Ошибка при выполнении обработчика — ‘ОбработкаПроведения’

    по причине:

    {ОбщийМодуль.dmn_УчетСерийныхНомеров.Модуль(186)}: Поле объекта не обнаружено (dmn_УчетСерийныхНомеров)

    Reply ↓
  9. dim0n_la

    Добавил краткое описание обновления в статью.

    (7) dynamite, прошу прощения за введение в заблуждение относительно процедуры обновления. Думаю скриншоты должны помочь.

    Reply ↓
  10. dynamite

    Спасибо Димон, все настроил.

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

    Reply ↓
  11. dynamite

    + (9) Если можно было сделать отчет типа ведомость по товарам на складах было бы супер, можно было бы найти всю историю товар… или подскажите как можно добавит в «отчет ведомость по товарам на складах» в отборах по серийному номеру

    Reply ↓
  12. dim0n_la

    Да так и есть.

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

    Поэтому а отчете и не планировалась такая информация. Он показывает только наличие для сверки.

    Reply ↓
  13. dynamite

    Спасибо за ответ (11)

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

    Пример; Делаю Поступления товаров: Ручка 3 шт под серийниками 1,2,3

    Карандаш 3шт под серийниками 5,6,7

    И проводим закрываем

    Делаю Реализацию товаров: Ручка 2шт под серийниками 6,7 (то что является серийником для Карандаша)

    И потом проводим закрываем ( И без проблем проводится)

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

    Reply ↓
  14. dim0n_la

    (12) Для ввода серийных номеров используете поставленную с конфигурацией «Учет серийных номеров» обработку «Ввод серийных номеров.epf»? Если да, то эта обработка не должна была позволить вам «перепутать» товары и серийники между собой.

    Reply ↓
  15. qwerty45

    Идея интересная. Скачал, но не могу самостоятельно переписать под УТ 10.3 на 8.2. Обновление не планируете?

    Reply ↓
  16. fratriaArzgir

    А что представляет собой упрощенный ввод серийных номеров в данной обработке?

    Reply ↓
  17. MAXXL

    Так эта обработка работает в УТ10.3 в 8.2 или нет? Еще вопрос — в списке для скачивания три файла, нужно качать их все или обработка и отчет есть внутри прилагаемой конфигурации?

    Reply ↓
  18. Marina__

    А в УПП будет работать?

    Reply ↓
  19. dim0n_la

    (18) umnica2, почему нет. Может. только смотря какая версия. Там в УПП и свои серийки есть. Так что эту обработку брать не обязательно. Просто в УТП все было сложно с ними

    Reply ↓
  20. KillHunter

    проще самому накатать свою обработку!

    Reply ↓
  21. dim0n_la

    Конечно проще! Накатывайте !

    Reply ↓
  22. m.minchuk

    а будет ли работать с 1С Управление Торговым Предприятием для Украины? какой алгоритм работы? Сможет ли работать по схеме менеджер выписал реализацию, передал на склад, там выписали расходный ордер и заполнили серийные номера?

    Reply ↓
  23. GrafB

    напрасно потратил старбакс, хорошо что только cf скачал. не указано для какой версии УТ, для новых это совсем не подходит. конечно виноват сам не посмотрел когда файл опубликован, но всё же комменты свежие более менее.

    Reply ↓
  24. dim0n_la

    (23) GrafB, ну как же, все указано

    Платформа

    1C: Предприятие 8.1

    Конфигурация

    1С:Управление торговлей 8

    да разработка старая, и уже мало кому нужна

    Reply ↓
  25. andpal
    Конфигурация

    1С:Управление торговлей 8

    По моему такой конфигурации не бывало.

    Есть: Управление торговлей, редакция 11.х или 1Управление торговлей, редакция 10.х

    Reply ↓
  26. andpal
    Конфигурация

    1С:Управление торговлей 8

    По моему такой конфигурации не бывало.

    Есть: Управление торговлей, редакция 11.х или Управление торговлей, редакция 10.х

    Возможно в «Управлении торговлей для Украины» есть редакция 8?

    Reply ↓
  27. micha26

    Интересно конечно — у меня к примеру такая вот ошибка выскакивает:

    РегистрНакопления.НДСАвансыПоДоговорамКомиссии: Ни один из документов не является регистратором для регистра…При чем тут регистр накопления? Регистратор я к нему конечно прикручу — но почему такая ошибка выскакивать стала…

    Reply ↓

Leave a Comment

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