Проведение безвозмездной реализации для Бух 8.1




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

14 Comments

  1. RPV

    И как она работает?

    Reply
  2. e.kogan

    Убирает из движений всё, относящееся к задолженности клиента перед нашей организацией, и ставит флаг ручной корректировки.

    Выложена как образец работы с открытой формой объекта при наличии только ссылки.

    Reply
  3. nestoric

    У меня не работает(((

    Reply
  4. e.kogan

    Что именно не работает? Версия конфигурации?

    Reply
  5. nestoric

    Не очищает проводки! Ни бухгалтерски ни регистры по ндс. Подключил как внешнюю печатную форму, создал документ реализации, запустил. Вне зависимости от ответа ДА или НЕТ никаких действий не происходит. У меня Элит-Строительство. Бухгалтерский учет, редакция 2.1 (2.1.5.1) — последняя. Но это врядли имеет значение, тк все документы реализации не отличаются от типовых.

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

    Reply
  6. e.kogan

    У меня нет доступа к такой конигурации, ничем помочь не могу, смотрите сами. В типовой бухии у нас всё работает. Учтите, что в модуле «зашито» условие на определённое субконто: «Если ТипЗнч(стро.СубконтоКт1)=Тип(«СправочникСсылка.ПрочиеДоходыИРасходы»)

    И ЗначениеЗаполнено(стро.СубконтоКт1) И НРег(стро.СубконтоКт1.Наименование)=»безвозмездная передача» Тогда»

    Reply
  7. RPV

    У меня все тоже самое, что и у (5):

    Не очищает проводки! Ни бухгалтерски ни регистры по ндс. Подключил как внешнюю печатную форму, создал документ реализации, запустил. Вне зависимости от ответа ДА или НЕТ никаких действий не происходит.

    Конфигурация БП 1.6.14.4

    Reply
  8. e.kogan

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

    Reply
  9. RPV

    (8) в табличную часть включил материал со счета 10.09, счет учета доходов

    91.01 субконто ставил и «Доходы (расходы), связанные с безвозмездным получением имущества, работ, услуг или имущественных прав» и «Доходы (расходы), связанные с безвозмездной реализацией имущества, работ, услуг или имущественных прав». Результат все тот же, см. (5), (7), либо надо более конкретную инструкцию.

    Reply
  10. e.kogan

    (9) У субконто наименование «Безвозмездная передача» или какое? Завязано специально по просьбе наших бухов на наименование.

    Reply
  11. RPV

    (10) После того, как я создал новый доход/расход с наименованием «Безвозмездная передача», то, наконец, все получилось.

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

    Кроме того, совсем не согласен с проводками, которые после проведения проводки остаются в налоговом учете, не буду писать какие есть, но напишу какие должны быть:

    91.02.7 (ПР) — 41.хх или 10.хх (НУ) — 1000 рублей (на сумму списанных ТМЦ, товара)

    91.02.7 (ПР) — хххххххххххххххххххх — 180 рублей (выделен НДС)

    НЕ.03 (НУ) — хххххххххххххххххххх — 1000 рублей.

    В этом случае все будет корректно отражено и работать.

    P.S.: вместо счета 91.02.7 м.быть любой другой, например 91.02.4, … и т.д., главное не этом самом счете, а в этой системе отражения проводок с этими суммами по соответствующим видам налогового учета (НУ, ПР, ВР).

    Reply
  12. e.kogan

    (11) Эта обработка НЕ ЯВЛЯЕТСЯ универсальной для всех фирм. Выложена исключительно по причине, указанной в описании. Если кому-то что-то от неё надо — пишите сами, нашим бухгалтерам требовалось именно то, что есть, а на финтифлюшки под всех у меня времени нет.

    Reply
  13. ghostishe

    Я не скачивал, не смотрел, просто напоминаю, что не во всех типовых есть галочка «Ручная корректировка». Автор, там этот случай нормально описан ПопыткамиИсключениями, либо каким-нибудь другим образом?

    Reply
  14. e.kogan

    (13) Ещё раз напоминаю, что обработка выложена как пример работы с открытой формой объекта, на который есть только ссылка. Она никоим образом не претендует на универсальность.

    Reply

Leave a Comment

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