Перенос остатков на склад. БП 3.0




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

29 Comments

  1. alxarz

    а почему инвентаризацией не воспользоваться?

    Заполнили по остаткам пустого склада, количество фактическое в 0 и всё списали. Скопировали инвентаризацию, сменили склад, обновили учетные остатки и всё оприходовали на нужный склад.

    Reply
  2. Alex_E

    Всё могу понять…кроме одного — пошто тут счет 000 приплели? Надо перебросить остатки с пустого склада на склад — ну и делаем напрямую с Кт в Дт — 000 извращение…и ешё, склады не только в регистре бухгалтерии могут быть, нужно посмотреть, возможно понадобится ещё регистры двигать….

    Reply
  3. aksyoma

    (1) и (2) прежде чем писать, поучите бух.учет

    Reply
  4. Alex_E

    (3)О как! Ну дык поучите неразумных, а то как — то из серии сам дурак, и ничё конкретного!

    Главный вопрос, Вы в каком ПБУ в Плане счетов видели счет 000, чтобы использовать его в оборотах?

    Reply
  5. aksyoma

    «Счет 000 является специальным счетом плана счетов типовой конфигурации «Бухгалтерия предприятия» и предназначен для ввода начальных остатков при начале работы с системой… »

    Действительно, причем здесь 000, но так захотели бухи, обработку делал на заказ, могу переделать, если кому нужно

    В других регистрах склады не используются

    Reply
  6. Alex_E

    (5)

    Действительно, причем здесь 000, но так захотели бухи, об…

    — бухи могут много чё захотеть)))) Потом может случиться, что на вопрос тем бухам: — А почему у Вас в базе такое (придумайте что сами, например в оборотах по балансовым счетам есть счет 000, который в балансе не участвует)? будет ответ: — А программист дурацкий попался! (вопрос/ответ — реальный случай из практики) …

    ИМХО Не всё то золото, что блестит что бухи требуют надо делать, иногда стоит позадавать вопросы,и сделать по более/менее по уму…

    Reply
  7. alxarz

    (5)

    но так захотели бухи

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

    Reply
  8. aksyoma

    Разобрался со счетом «000», проводки нужно формировать сторнирующие, чтобы оборот по счету в целом не изменился, если делать напрямую, то обороты изменяются, что влияет на баланс в целом и возникают вопросы у налоговой, обработку поправил!

    Reply
  9. Alex_E

    (8) Вот интересно, а чего с ним разбираться — он ДЛЯ ВВОДА НАЧАЛЬНЫХ ОСТАТКОВ. Используется в движениях с балансовыми счетами БУ (не НУ) только один раз — на дату ввода тех самых остатков, больше его использовать в оборотах текущих периодов НЕЛЬЗЯ, ибо в Плане счетов бухгалтерского учета его НЕТУ!!!! Искусственный это счет, придуманный для ввода остатков в ПРОГРАММУ…

    НЕ, ну завышение оборотов — это страшно, а использование счета, которого нет — нормально)))) Использовать другой счет для сторно и оприходования по складам религия не позволяет?

    Reply
  10. alex_phantom

    Так я и не понял как она с пустого склада переносить должна?

    На все кнопки жал, ничего не заполняет и не создаёт.

    И счета не подбирает, ругается, что для данного типа подбор недоступен.

    Reply
  11. aksyoma

    какой релиз? учет по складам включили? подробное описание ошибки?

    Reply
  12. alex_phantom

    Релиз как в заголовке, учёт по складам включен.

    Остальное как написал. Нужно с пустого склада перенести на существующий остатки.

    Reply
  13. alex_phantom

    Скрин

    Reply
  14. alex_phantom

    Бухгалтерия предприятия, редакция 3.0 (3.0.67.74)

    Платформа 1С:Предприятие 8.3 ((8.3.13.1644)

    Reply
  15. aksyoma

    Выберите организацию, дату остатков и нажмите заполнить, если у вас счета не из списка («07», «08.04», «10», «21», «41», «42.01», «43», «45», «004.01», «003.01») то добавьте вручную, кнопка заполнить (в новой версии)

    проверьте план счетов, Субконто2 должно быть «Склады»

    Reply
  16. alex_phantom

    (15) А свежая опять за СМ?

    Reply
  17. alex_phantom

    Остатки на 10.1 и 41.1, Кнопка заполнить не заполняет счета. Плюсом добавил. Сформировать ничего не делает.

    Субконто склады третье.

    Настройки делали как у вас на 2-х последних скринах.

    Учет номенклатуры по:

    1)Товары

    2)Партии

    3)склады

    Reply
  18. aksyoma

    давайте адрес скину

    Reply
  19. alex_phantom

    (18) Я скачал, СМ не списало.

    Так а что дальше? Я чуть ниже написал по новой версии..

    Reply
  20. aksyoma

    (19) исправил, качайте

    Reply
  21. alex_phantom

    (20) Что со мной не так, почему на мне споткнулось?

    При открытии заполняет счета, по кнопке СОЗДАТЬ выдаёт ошибку:

    {ВнешняяОбработка.ПереносОстатковНаСклад.Форма.Форма.Форма(64)}: Значение не является значением объектного типа (Пустая)

    Если Выборка.Склад = NULL ИЛИ Выборка.Склад.Пустая() Тогда

    В журнале операций появилась пустая проведённая операция.

    Reply
  22. aksyoma

    (21) что в настройках учета?

    Reply
  23. alex_phantom

    (22) По партиям галочка стоит у нас, как и у вас в скриншотах публикации.

    Reply
  24. aksyoma

    (23) давайте скайп зайду удаленно посмотрю

    Reply
  25. alex_phantom

    (24) Скайп или тимвьюер? И в какое время удобно?

    Напиши в личку, что у меня не уходят сообщения.

    Reply
  26. Дон Кихот

    Скачал вашу обработку, есть вопросы, ответите?

    Reply
  27. aksyoma

    спрашивайте

    Reply
  28. Snark13

    Я правильно понимаю, что движение по регистрам, в частности «Раздельный учет НДС» не формируется?

    Просто без этого регистра, при включенном Раздельном учете НДС, пользы от скаченной обработки никакого нет

    Reply
  29. baluba

    Добрый день. сделал вручную проводку по переносу 10-000 -сторнирующую, и 10 основной склад -000 , Раздельный учете НДС-включен, после пытаюсь списать материалы. Увы выдает ошибку : «Для целей учета НДС не списано 2,000 товара Топливо АИ 92 (АМ 462), счет учета: 10.03, склад: Основной склад»

    получилось доработать ?

    Reply

Leave a Comment

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