Остатки и цены номенклатуры всегда под рукой




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

39 Comments

  1. Novice21

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

    А вот использовать готовую обработку — это остроумно.

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

    Расскажите, плз, как Вы вызывали эту обработку.

    Reply
  2. O-Planet

    Хорошее решение. Наглядно и удобно.

    Reply
  3. Dwiss

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

    Бух на складе ей не нравится 8 ка, привыкла к 7 ке вот и пришлось придумать инструмент чтобы оперативно видеть остатки и цены

    Reply
  4. Novice21

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

    Какие параметры передаете?

    Reply
  5. Novice21

    (3) перечитал (4), поправляю:

    Я имел в виду, какие нужно переделки сделать в существующем модуле обработки подбора.

    Если этот модуль попросту перенести во внешнюю обработку, наверное, будут ошибки?

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

    Где описаны принципы построения внешних обработок, желательно с примерами?

    Reply
  6. Dwiss

    (5)конечно будут ошибки вот задача и была переделать так чтобы все работало чтобы все запросы выполнялись в кратце описать сложно

    Берете сравниваете с типовой и все отличия будут видны в отчете

    Reply
  7. cuba8

    Для УТ неплохо бы такую же.

    Reply
  8. Novice21

    (6) Спасибо!

    В какой конфигурации делали?

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

    Как разбирались (отладчиком, читали вызов из Счета или Накладной и т.п.)

    Reply
  9. Душелов

    (7) В УТ это — стандартная форма подбора.

    Reply
  10. Novice21

    (6) Номер релиза, пожалуйста!

    Reply
  11. Dwiss

    (10) В описании указано

    1С:Предприятие 8.1 (8.1.12.101) Бухгалтерия предприятия, редакция 1.6 (1.6.13.3)

    (9) В УТ и УБ одинаково есть форма подбора, просто не удобно ее вызывать, обязательно из документа надо, а здесь запуск обработки она задает параметры для запросов в форме.

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

    Reply
  12. Novice21

    (11) — (10), извините, был невнимателен, спасибо.

    Хорошо, я сравнивал модули объекта стандартной ОбработкиПодбора и Вашей обработки.

    Модуль объекта почти не изменялись, менялись только модули формы?

    Был вопрос, где Вы брали Организацию, потом увидел, что она и др. параметры выбираются в форме. Это очень удобно.

    У меня маленький вопрос, если можно.

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

    Какая функция Вашей обработки вызывается первой? Модуля объекта или формы?

    (Просто немного неясно, каким образом происходит вызов внешник обработок, какие передаются параметры, где почитать о написании внешних обработок).

    Спасибо! Очень красивое решение!

    Reply
  13. Dwiss

    (12) на диске ИТС есть описания создания внешних обработок

    Reply
  14. alnik

    удобно, а это уже не мало

    Reply
  15. vasvas

    Kak-to ne pošlo versija 10.3 ,pišet:

    {Форма.ОсновнаяФорма(673,22)}: Переменная не определена (УправлениеПроизводством)

    Спецификация = <<?>>УправлениеПроизводством.ОпределитьСпецификациюПоУмолчанию(ВыбСтрока, ДатаРасчетов);

    {Форма.ОсновнаяФорма(703,22)}: Переменная не определена (УправлениеПроизводством)

    Спецификация = <<?>>УправлениеПроизводством.ОпределитьСпецификациюПоУмолчанию(Номенклатура, ДатаРасчетов);

    Reply
  16. Душелов

    Эта обработка для БП, а не для УТ!

    Reply
  17. saleg_20

    Удобно та быстро .)

    Reply
  18. vb2007

    А у меня вот такая ошибка возникла….

    {Форма.ОсновнаяФорма(680,12)}: Переменная не определена (Ценообразование)

    Цена = <<?>>Ценообразование.ПолучитьЦенуНоменклатуры(Номенклатура,СтруктураИсходныхПараметров.ТипЦен, ДатаРасчетов, ВалютаЦены);

    {Форма.ОсновнаяФорма(707,12)}: Переменная не определена (Ценообразование)

    Цена = <<?>>Ценообразование.ПолучитьЦенуНоменклатуры(Номенклатура,СтруктураИсходныхПараметров.ТипЦен, ДатаРасчетов, ВалютаЦены);

    Reply
  19. Dwiss

    (18) какая конфигурация у вас?

    Reply
  20. vb2007

    1С:Предприятие 8.1 (8.1.12.101) Бухгалтерия для Казахстана, редакция 1.5, (1.5.8.12)

    Reply
  21. Dwiss

    (20) Тестировалось на обычной 1С:Предприятие 8.1 (8.1.12.101) Бухгалтерия предприятия, редакция 1.6 (1.6.13.3) все работает

    для казахстана у меня нет такой конфы

    Reply
  22. vb2007

    Жалко,а так нужно…плохо(((

    Reply
  23. cheri

    Очень удобно! Спасибо! Плюс!

    Reply
  24. Dwiss

    (20) У меня такой нет так что ни чем помочь не могу

    Reply
  25. belka76

    Очень удобно, то что нужно было

    Reply
  26. dar_t

    Отличная обработка! Спасибо!

    Reply
  27. Римуля

    Здорово!Спасибо! очень облегчило работу!

    Reply
  28. lavlisa

    Очень удобно!!!!Замечательно! Спасибо большущее, что поделились :)!!!

    Reply
  29. Petrel

    А для 1С упрощенки 8.1 подходит? А то запускаю — выдает показанную на скриншоте табличку, а ни товарного остатка, ни цены- нет…

    Reply
  30. angelika74

    В Предприятие 8.1 этого так не хватает…

    Огромное спасибо!

    Reply
  31. Olya R

    Так данная информация же по остаткам отражается при оформлении реализации или перемещения

    Reply
  32. orsprog

    {Форма.ОсновнаяФорма(680,12)}: Переменная не определена (Ценообразование)

    Цена = <<?>>Ценообразование.ПолучитьЦенуНоменклатуры(Номенклатура,СтруктураИсходныхПараметров.ТипЦен, ДатаРасчетов, ВалютаЦены);

    {Форма.ОсновнаяФорма(707,12)}: Переменная не определена (Ценообразование)

    Цена = <<?>>Ценообразование.ПолучитьЦенуНоменклатуры(Номенклатура,СтруктураИсходныхПараметров.ТипЦен, ДатаРасчетов, ВалютаЦены);

    вот такая вот ошибка вылезает

    Reply
  33. Dwiss

    (33) А конфигурация какая у вас?

    Reply
  34. margo2007

    8.2 комплексная — не работает. Ни одного остатка…

    Reply
  35. Dwiss

    (35) ну ведь написано же в описании для Конфигурации: 1С:Бухгалтерия 8

    зачем писать что не работатет там где не должно работать

    Reply
  36. yar555

    Спасибо, удобно и быстро

    Reply
  37. lady_lace@mail.ru

    Спасибо, полезная обработка

    Reply
  38. angelika74

    В 2.0 работает, СПАСИБО!!!

    Reply
  39. Nevermore

    Спасибо.

    Reply

Leave a Comment

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