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




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

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