Переброска остатков со счета на счет




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

23 Comments

  1. Хегга

    А под 8.2 такое не планируется?

    Часто достаточно открыть обработку в конфигураторе 8.2 и она переконвертируется, а тут сделал,хХотел перекинуть остатки на 003.01 с одного Субконто1 «Контрагенты» на другое, а мне ошибка:

    {Форма.Форма.Форма(46)}: Ошибка при вызове метода контекста (Выполнить): {(5, 22)}: Поле не найдено «ХозрасчетныйОстатки.Субконто4»

    ХозрасчетныйОстатки.<<?>>Субконто4,

    Рез=Запрос.Выполнить();

    по причине:

    {(5, 22)}: Поле не найдено «ХозрасчетныйОстатки.Субконто4»

    ХозрасчетныйОстатки.<<?>>Субконто4,

    Конфигурация Бухгалтерия предприятия, редакция 1.6 (1.6.24.7)

    Reply
  2. EugeneK

    хоть один написал 🙂

    к концу дня прикреплю и для 8.2

    Reply
  3. EugeneK

    для 8.2 добавил

    Reply
  4. Хегга

    1. «Остатки» видимо имелись в виду только суммовые? Потому что количественные не трогает.

    2. По 10му счету, по кнопке «Заполнить остатки» отбирает все что нужно. То же самое по 003.01 — выводит только заголовки колонок «Субконто 1», «Субконто » и т.п. — и пусто.

    3. За обработку все равно спасибо. В существенно меньшем объеме чем хотелось бы, но все равно полезна и относительно универсальна.

    +1

    Reply
  5. EugeneK

    какого функционала не хватает ? делалось для себя для определенной задачи, посему выслушаю предложения. Количество добавлю 🙂

    Reply
  6. Хегга

    Эта обработка может претендовать на универсальность в деле формирования операций переноса ВСЕГО с одного счета и/или субконто, на другой.

    Не хватает:

    1. Если выбирается счет с признаком «Количественный», то переносим и количество.

    2. Если выбирается счет с признаком «Валютный», то переносим и валюту.

    3. Если выбирается счет с признаком «Учет по подразделениям», то в простейшем случае переносим подразделение. А в идеале — имеем возможность с одного на другое подразделение переносить.

    4. Мне лично страсть как не хватает чтобы обработка работала еще и с забалансовыми счетами. Прежде всего 003.01.

    5. Более гибкий отбор. Не только указанный элемент, например номенклатуры, а хотя бы еще «в группе».

    Справочно:

    Почему эта обработка иногда будет незаменима.

    Нередко бывает что клиент/руководство запрещает вносить какие-либо изменения в Конфигурацию, и красиво не сделать, приходится использовать костыли.

    Например, Строительная организация получает Давальческие материалы от Заказчика, из которых что-то строит. т.е. материалы поступают «Поступление товаров и услуг» на 003.01 Субконто1 «Контрагент».

    Большинство строительных организаций привлекают субподрядчиков, которым отдают участки работы. Возникает необходимость передать им часть этих самых давальческих материалов Заказчика. «Передача в переработку (из Переработки)» с 003.01 Субконто 1 «Контрагент».

    Только вот в документе поле «Контрагент» одно. А значит передать материалы кому-либо другому, чем Заказчик — невозможно. Типа «нет в остатках».

    Приходится делать Ручную операцию и переносить необходимые остатки с одного Контрагента на 003.01, в другого.

    Reply
  7. Ламия

    А у меня почему то организацию не выбирает и остатки не заполняет, соответственно результата ноль (((

    Reply
  8. Ламия

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

    Reply
  9. sergch2005

    А будет работать для Управления Торговлей?

    Reply
  10. Felix1

    Вопрос почему название организации нужно вбивать вручную?

    Reply
  11. Felix1

    Вобщем ничего не заполняет обработка явно сырая и толку от нее 0

    Reply
  12. Felix1

    (8) Ламия, подскажите как установить организацию ?

    Reply
  13. Ламия

    (12) Felix1, В модуле немного обработку подправить нужно, если немного конфигуратор знаете, то поймете, там всего одна строка. Завтра могу на работе глянуть, что там именно, давно было, не особо помню

    Reply
  14. Felix1

    (13) Ламия, к сожалению не знаю конфигуратора

    Reply
  15. Felix1

    (13) Ламия, Спасибо за отклик, еще связался с автором он обещал при возможности сделать ее более функциональной по платформу 8.2 и выложить ее здесь.

    Reply
  16. EugeneK

    обновлена обработка под 8.2

    Исправлен баг с организацией.

    добавлен перенос количества, валюты, валютных сумм, налогового назначения

    Reply
  17. Felix1

    (16) Спасибо работает теперь работает, реально помогает экономить время на рутине +

    Reply
  18. dndw

    Нашел то, что искал.

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

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

    Давно думал о подобной функции.

    К счастью нашел!

    Большое спасибо автору!

    Reply
  19. JLaikova

    Так и не получилось ничего перенести… ((( Правда пробую в обычном приложении БП 3.0 — даже остатки по счетам неправильные находит..

    Reply
  20. EugeneK

    (19) JLaikova, как то странно, у всех работает, у Вас нет. Может ругалось на что-то ?

    Reply
  21. JLaikova

    (20) Остатки заполняет верно, а по кнопке перенести выходит ошибка

    Форма.Форма.Форма(139)}: Поле объекта не обнаружено (Подразделение)

    Проводка[изм.Имя] = стр[изм.Имя];

    А обработка очень нужна((…. Счет 62.02 поделили на 62.02.1 и 62.02.2 и обороты с января перенести.. Буду рада, если поможете

    Reply
  22. JLaikova

    Пробую закомментировать строку с ошибкой.. Далее выходит следующая

    {Форма.Форма.Форма(147)}: Поле объекта не обнаружено (СуммаПР)

    Проводка[рес.Имя] = стр[рес.Имя+»РазвернутыйОстатокДт»]-стр[рес.Имя+»РазвернутыйОстатокКт»];

    если и ее убрать, то записывается пустая Операция вручную без остатков из таблицы..

    Reply
  23. JLaikova

    Плюс конечно же.. Спасибо, но для 8.3 пришлось доработать.

    Reply

Leave a Comment

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