Ведомость по товарам на складам с ценами и резервом (УТ 10.3)




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

48 Comments

  1. sobeyko2008

    Задумка хорошая, Но отчет начинает очень сильно врать! Если всмотритесь в фото то сами все поймете.

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

    Reply
  2. acapulco

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

    Reply
  3. sobeyko2008

    Не помогло!

    Reply
  4. acapulco

    (3) можете сформулировать вопрос словами, а не картинкой? что не так в отчете?

    Reply
  5. sobeyko2008

    Во первых откуда взялась цифра 71 на начало отчета если товара пришло 100шт 30.07.13. После мы наблюдаем что какимто волшебным образом их стало 58шт хотя движений не было! После мы делаем перемещение и их по прежднему остается 58шт, но в следующей строке мы наблюдаем что их стало уже 104шт. потом мы продаем 1шт и остается опять 104шт. Потом делаем перемещение 10шт и у нас становится 99шт))) ну и т.д.

    Reply
  6. m-serg74

    (5) кстати только что в УТ11.1 такую же фигню наблюдаю в ВедомостьПоТоварамНаСкладахВЦенахНоменклатуры если делаешь группировку по дням, а по складам не группируешь, такой же неадекват)))

    Reply
  7. acapulco

    (5) а что показывает типовой отчет «Ведомость по товарам на складах» при такой же настройке?

    При аналогичной настройке я вижу другую картину

    Reply
  8. sobeyko2008

    Тут тоже куча ошибок! Например Возврат товаров поставщику 6-1=5 а отчет считает 4

    Reply
  9. sobeyko2008

    Вот что показывает стандартный отчет:

    Reply
  10. m-serg74

    (7) acapulco, ну и тоже там лажа, ведомость по складам, а склад и не отбираете и группировку не делаете, толку смотреть на перемещения например: с одного склада минус столько же на другой плюс, а если без склада то лажа какая то

    Reply
  11. acapulco

    (8) обновил отчет

    Reply
  12. sobeyko2008

    Вот теперь почти все ок! Осталось поправить ошибку с резервом. Резерв Завышает аж в 4 раза и вообще не понятно откуда он формирует эти цифры. Хорошо бы видеть документы резерва. т.е. добавить колонку свободный остаток и в резерве. Точнее в резерве уже есть колонка но она врет

    Reply
  13. acapulco

    (12) резервы еще в работе

    Reply
  14. sobeyko2008

    С нетерпением ждем!

    Reply
  15. sobeyko2008

    И еще один косяк нашел: Когда в настройках настроишь отчет как тебе нужно, сформируешь его, а после решишь поставить какую нибудь галочку справа настройки слетают. Например добавляется группировка склад и исчезает группировка документ движения, а также появляется иерархия.

    Reply
  16. acapulco

    (15) отчет обновлен (убрал «закравшееся» событие по установке начальных настроек при изменении флажка «только нулевые остатки», допилил резервы)

    Reply
  17. sobeyko2008

    Куда теперь делись начальный и конечный остаток?

    Reply
  18. sobeyko2008

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

    Reply
  19. acapulco

    (17) для группировки «регистратор» построчные остатки будут недоступны

    Reply
  20. acapulco

    (18) так изначально поставлена задача (установка цен фиксирует только повышение)

    Reply
  21. sobeyko2008
    так изначально поставлена задача (установка цен фиксирует только повышение)

    Чето не совсем мне понятно зачем он мне будет показывать розничную цену в документе поступления да еще и не соответствующую дате документа????

    для группировки «регистратор» построчные остатки будут недоступны

    — это окончательный вердикт?

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

    Reply
  22. acapulco

    (21) думаю, вам больше подойдет этот отчет http://infostart.ru/public/178202/

    Reply
  23. sobeyko2008

    Это тоже очень хороший отчет, но не то что нужно! Задача в твоем отчете отследить движение товара т.е. сколько пришло товара, сколько поставили в резерв, сколько ушло и сколько осталось в итоге. Цены впринципе вообще не интересуют

    Reply
  24. acapulco

    (23) для регистра «ТоварыВРезервеНаСкладах» нельзя получить регистратор, отсюда и выливается ограничение отчета. Без регистратора все прекрасно видно

    Reply
  25. sobeyko2008

    Раньше пользовался 7кой тотже самый отчет был по умолчанию и все работало. в 8ке же добится этого отчета не могу

    Reply
  26. acapulco

    (25) обновил отчет, добавил конечные остатки по регистраторам

    Reply
  27. sobeyko2008

    Ну вот а говорил что не возможно. Но вот только нужно чтобы в колонке резерв отображалось не количество зарезервированного по документу, а общее(накопительное) количество зарезервированного товара. А то по этому отчету не понять сколько в резерве а сколько свободного остатка товара. Для примера воспользуйся скриншотом с 7ки.

    Reply
  28. gull22

    Судя по переписке можно видеть резервы в отчете. Предлагаю автору добавить или обновить скриншоты. А так «+»

    Reply
  29. acapulco

    (28) gull22, Все верно! Резервы в отчете были изначально. Был скоррективан их вывод для регистраторов

    Reply
  30. Tarlich

    Захотел только один резерв вывести — не дало.

    Reply
  31. leha.mos

    Отличный отчет! «+» Однозначно, Правда я не тривиально ее использовал, но все равно отчет полезный!

    Reply
  32. acapulco

    (31) leha.mos, спасибо!))

    Reply
  33. IDija

    Что за космические остатки??? Отчет точно рабочий?

    Еще и цену поднял! Протестируйте сначала отчет.

    Reply
  34. acapulco

    (33) IDija, за какой период вы смотрите ведомость и на какую дату остатки? Проверьте настройки отчета

    Reply
  35. IDija

    (34) acapulco, 01.01.15 — 24.06.15. Дата остатков 24.06.15

    Reply
  36. acapulco

    (35) IDija, к сожалению, у меня нет возможности отладить отчет на вашей базе. В демо-базе подобного не наблюдается.

    Reply
  37. ВладимирГ

    Здравствуйте, при установке отбора по складам, отчет выдает пустое поле( настройки на скриншоте, УТ 10.3.29.1), если же включить «показывать нулевые остатки» то отчет поазывает все позиции без движений и остатков, хотя они присутствуют.

    Reply
  38. acapulco

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

    Reply
  39. ВладимирГ

    Покрутил по разному… при включенном отборе по складам — не работает. Без отбора по складам с включенным отображением нулевых остатков и с группировка по складам — общие движения по фирме показывает, по складам — данные не группируются. То есть со складами всё-таки какой то косяк, или подскажите, как его заставить выдать данные по 1или нескольким складам?

    Reply
  40. acapulco

    (39) ВладимирГ, попробуйте группировку по складу сделать в строке

    Reply
  41. ВладимирГ

    С группировкой в строке тоже не работает. Выдает только шапку отчета.

    Reply
  42. acapulco

    (41) ВладимирГ, прикладываю скрины из актуальной рабочей базы (похожие есть и в описании публикации) с отбором по складу.

    Данные выводятся в отчет.

    Reply
  43. ВладимирГ

    Сможете перезалить отчет на сайт? кажется тут висит другая его версия, и название отличается и в шапке отчета нет настроек: Организация, Склад, Номенклатура. Скриншот скаченного прикрепляю.

    Reply
  44. acapulco

    (43) ВладимирГ, отчеты идентичные. Название для клиента и сайта разные, а если быть точнее, то для сайта название расширенное.

    Reply
  45. HameleonA

    Скачал, потом только почитал комментарии. Отчет был бы хороший, если бы формировал правильно. При идентичных настройках стандартный отчет и этот показывают совершенно разные остатки. Извините, но до 3см он недоработан

    Reply
  46. avalakh

    Либо доделай и отправь, либо верни стартмани, а то что-то много стоит, а не работает!!! Остатки по складам показывает не верно. Если есть необходимость могу рассказать подробнее.

    На скриншоте этот и стандартный отчет. Отборы одинаковые.

    Reply
  47. acapulco

    (46) avalakh, настройки, как минимум, различаются группировками: в типовом вывод в разрезе серий, с ведомости — без.

    Корректность вывода для серий в этом отчете не проверялась.

    Reply
  48. LavinVadik

    в отличие типового отчета «Ведомость по товарам на складах», который строит остатки на основании регистра «ТоварыНаСкладах»

    этот отчет формирует остатки на основании регистров накопления «ТоварыВРезервеНаСкладах» и «ТоварыОрганизаций»

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

    Reply

Leave a Comment

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