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




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

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