Как увидеть счет-фактуру в ОСВ по счетам 76.АВ и 76.ВА




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

28 Comments

  1. pm74

    (0) вы проверяли ваш отчет для случаев когда у вас > 1 СФ к расчетному документу ?

    Reply
  2. twiny

    (1) Так пишу об этом:

    К сожалению, не смог проверить работу отчета, если каким-либо образом будут введены 2 счет-фактуры по расчетному документу. По логике записей должно появится более 1 штуки и для предотвращения этого скорее всего нужно переделать запросы по выборке счет-фактур, а возможно что-то еще. Оставлю этот вопрос на суд сообщества, может кто уже проходил эту тему.
    Reply
  3. pm74

    (2) 2 или более СФ могут быть , при наличие расчетов по разным договорам в БП (в одном документе ) или ,например , когда взаиморасчеты ведутся «по заказам» в УТ и по документам расчетов . Мне кажется в этом случае будет дублирование строк отчета , с разными СФ но одной сумой , что приведет к искажению итогов по документу расчетов

    Reply
  4. pm74

    (2) мне кажется в данном случае целесообразно в схеме КД , поле СФ (вместе с суммами) выводить как вычисляемое через ВычислитьВыражениеСГруппировкойТаблицаЗначений(

    Reply
  5. twiny

    (3)

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

    Reply
  6. twiny

    (4) не совсем понял, как это поможет устранить дублирование строк при количестве с/ф более одной

    Reply
  7. pm74

    (6) если честно у меня нет опыта работы с этим выражением , но думаю можно сделать по аналогии с https://infostart.ru/public/267055/

    Reply
  8. twiny

    (7)спсб, посмотрю

    Reply
  9. twiny

    (7)

    если вы подразумевали, что на вывод одной строки расчетного документа будет в соседней колонке выводиться весь набор введенных с/ф, то да, наверное так можно было бы сделать, но я как и вы не силен в «ВычислитьВыражениеСГруппировкойТаблицаЗначений», хотя это повод заняться данным пробелом)

    Reply
  10. Finn71

    Интересно, а будет ли работать этот метод в Бухгалтерии 20

    Reply
  11. twiny

    (10)няп, там отчет тоже на СКД, возможно с небольшими переделками взлетит… или даже без переделок…

    Reply
  12. Finn71

    (11) странно, сделал точно как написано, поля появились, но в отчет не выводится, как будто поле пустое. Бухгалтерия 20

    Reply
  13. twiny

    (12) что же странного? как раз про это и пишу, что возможно нужны переделки какие-либо

    но структура данных мало чем отличается в этом случае, скорее всего что-то несерьезное, но вот что… нужно посмотреть…

    Reply
  14. SoulCast

    спасибо автору за информацию, сэкономил время для решения данной задачи. кстати приведенный отчет для Бухгалтерия 20 тоже рабочий, только добавленный участок кода начинающийся с «Если Отчет.Счет.Код=»76.АВ» надо поставить внутрь цикла.

    Reply
  15. creamcat

    (11) как с вами связаться? не могу вам отправить личное сообщение

    Reply
  16. twiny

    (15) написал в личку, дошло?

    Reply
  17. etlau

    Внешняя форма себя странно ведет в последних релизах бухгалтерии 3.0

    Поля в настройках отчета появляются, но при выводе —

    {ОбщийМодуль.БухгалтерскиеОтчеты.Модуль(241)}: Поле объекта не обнаружено (ДанныеСФВыд)

    Для Каждого ПолеНабора Из Схема.НаборыДанных[ИмяНабора].Поля Цикл

    И схема как будто без этих наборов данных, хотя они есть.

    Чувствую, что 1с как то использует стандартную схему, но не могу понять где.

    Reply
  18. twiny

    (17)посмотрю, клиенту недавно делали обновление, жалоб не было.

    На всех последних релизах ругается?

    Reply
  19. etlau

    (18)

    Я глубоко не проверял, просто внешний отчет взял и запустил на них.

    В результате скопировал стандартный и изменил по рекомендациям в статье. Так работает. Но не как внешний.

    Reply
  20. english

    В Бухгалтерия предприятия КОРП, редакция 2.0.65.41 отчет взлетел.Спасибо автору

    Reply
  21. Elvina

    В новых релизах в СКД совсем пусто… Не подскажете как теперь можно добавить это поле?

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

    Reply
  22. twiny

    (21)не скажу, т.к. еще не обновлялись до свежих релизов, как будут новости то сделаю обновление статьи

    Reply
  23. Veika

    (22) Появилась потребность на использование Вашего внешнего отчета, БП 3.0.74.51.

    Подскажите, когда ждать обновление?

    Reply
  24. twiny

    (23) со временем пока не очень… попробую в выходные заход сделать, если получится, то отпишусь

    Reply
  25. twiny

    (21) там 2 компоновки, смотрите вторую

    Reply
  26. Veika

    Может быть кому-то пригодится такая информация.

    Для отслеживания остатков в разрезе счетов-фактур можно воспользоваться отчетом «Остатки НДС по авансам покупателей» с соответствующей настройкой.

    Reply
  27. sssomov@mail.ru

    На 3.0.73.60 не работает…

    Reply
  28. twiny

    (27)если вы про внешний, то читайте выше в комметах

    Reply

Leave a Comment

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