Формирование документа "Отчет производства за смену" на основании реализации.




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

35 Comments

  1. Wolfis

    наскока понял, эта обработка просто тупо переносит в документ Отчет производства за смену табличную часть???

    Reply
  2. scape

    (1) «Эту проблему, как и большинство других, можно решить посредством сгибания»

    Робот Бендер Родригес.

    Reply
  3. albinaFM

    Не подскажете где можно найти такой гаджет на 8.1

    Reply
  4. Eillecho

    в строке 16

    Если ПолеВводаДокумент = Документы.ОтчетПроизводстваЗаСмену.ПустаяСсылка() Тогда

    Возврат Таб;

    КонецЕсли;

    ПолеВводаДокумент — это документ реализация у вас, а не отчет производства за смену. Так что это условие никогда не выполняется.

    Далее. Нет варианта для нскольких организаций.

    А еще если выбирать за весь период, то формируется по всем реализациям, а не только со счета 43, но это больше как пожелание, а не недочет

    В целом обработка полезная, после доработки используем. Спасибо

    Reply
  5. kleinerfuchs

    Нам тоже это надо для 8.2 комплексная. Кто нибудь помочь может?

    Reply
  6. cucuruza

    На 8,2 Бухгалтерия 2,0 не работает. Первую строчку заносит в отчет, а дальше выдает ошибку: Поле объекта не обнаружено (Отражать в налоговом учете).

    Reply
  7. 'njz

    для БП Украины тоже не работает

    Reply
  8. scape

    Обработка писалась для бухгалтерии 1.6. Для 2.0 я адаптировал, выложу на днях…

    Reply
  9. madamonika

    Отчет прекрасный, жду прохождения модерации для редакции 2.0. Модераторы! Пропустите быстрее! Работа стоит! У нас бухгалтеров каждый час на счету! А этот отчетик значительно экономит время!

    Reply
  10. Vital451

    Интересно вы ведете учет, сначала продаёте потом выпускаете чтоль ?!

    Reply
  11. scape

    (10) Vital451,

    Ты в каком мире живешь, сынок?

    Reply
  12. Vital451

    (11)Видимо, дед, в другом

    Reply
  13. scape

    (12) Vital451, (-;

    Reply
  14. Виктор1905

    (10) Vital451, А вот так и работают. Сначала одни просят — другие сделали первую попытку — и все радуются (Получилось!!!), не понимая, что это грабли, которые работают в геометрической прогресии. Плюс постоянная потеря управления из-за «заднего числа».

    В итоге рентабельность по чистой прибыли равна инфляции — какой дурак в такое производство будет вкладывать…

    Reply
  15. scape

    На самом деле все гораздо проще…

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

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

    Reply
  16. scape

    (14) Виктор1905,

    Не надо ко всему этому ТАК серьёзно относиться.

    В нашем больном обществе как ни сделай все будет через жопу.

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

    Вся эта «экономика» поросто искусственная надстройка над очень простыми отношениями взаимного обмена продуктами производства (услугами). Если бы не было налоговых (мотырей), банкиров (ростовщиков) и прочих органов б’ольшая чаcть предпринимателей обходилась бы без бухгалтерии, а значит и 1с ни кому не нужна бы была.

    По этому «как бы детя не тешилось, лишь бы не плакало».

    Reply
  17. madamonika

    Отчет супер, вот только один нюанс есть. Когда я его запускаю, он набивает ве производство на основании реализации и ставит сччет автоматом 41! А это ведь у нас 43 счет! Приходиться ручками работать.

    Reply
  18. scape

    (17) madamonika,

    А у Вас заполнен регистр «Счета учета номенклатуры?». Похоже, что нет.

    Reply
  19. madamonika

    А как его мне заполнить?

    Reply
  20. madamonika

    (18) Заполнены счета. Причем, когда повторно выбираешь уже в сформированном отчете производства номенклатуру. Тогда счет автоматом ставиться. А после обработки нет.

    Reply
  21. madamonika

    Если бы склад автоматом становился, тогда бы и 43, автоматом вставал.

    Reply
  22. Svetlana_K

    Спасибо!!! Нужная обработка, а продают, а выпуск забывают показать.

    Reply
  23. Vasileva1

    Если производство-единичное и с большой номенклатурой продукции, нереально вручную формировать отчет производства за смену, такая обработка мне необходима

    Reply
  24. alexstrel

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

    Reply
  25. Stana

    Спасибо большое, очень полезная вещь.

    Reply
  26. vladimir_astapov

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

    Reply
  27. prestige

    Вещь полезная, спасибо.

    Reply
  28. ru5

    Немного переделал для Украины, и заметил ошибку в обработке.

    Суть ее — если в документе реализация продукция продается не в базовых единицах измерения, то количество в созданном документе «Отчет производства за смену» будет неверное.

    Например «продукция» в реализации продана в тоннах 10тн, а в учете производится в килограммах то будет произведено 10кг. Не учитывается коэффициент к единице измерения.

    Reply
  29. ru5

    удалено

    Reply
  30. lidia2506

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

    Reply
  31. IgorQ

    Список номенклатуры пуст! -это что значит, если не секрет

    Reply
  32. LanGrid
  33. LanGrid

    (30) lidia2506, посмотрите http://infostart.ru/public/259165/

    У меня подставляется свой тип цен, доделаю подстановку любой цены.

    Reply
  34. Наталья509

    Добрый день! А для БП 3.0 такой нет?

    Reply
  35. a16a05m11

    Да, нужная вещь, вложила немного в подработку — и теперь счастлива.

    Reply

Leave a Comment

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