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




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

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 не будет опубликован. Обязательные поля помечены *