Счет-фактура с возможностью изменения подписей




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

36 Comments

  1. 1108

    Счет-фактура с возможностью изменения подписей для 1С: Бухгалтерия 2.0 и 1С: Бухгалтерии КОРП на платформе 8.2.

    Перейти к публикации

    Reply
  2. MAUCPP

    Обработка очень нужная, но как её поставить в программу? Пожалуйста, подскажите для «чайника»

    Reply
  3. 1108

    (1) Сервис->Дополнительные отчеты и обработки->Дополнительные внешние печатные формы->Заменить файл внешней обработки->Принять пораметры авторегистрации->Зайти в документ Счет-фактура->Печать->

    Reply
  4. kefan

    А почему на просмотр и печать выходит без даты?

    Reply
  5. 1108

    (3)Исправил.

    Reply
  6. kefan

    Кстати, графу «К платежно-расчетному документу» то же не заполняет (по ранее полученным авансам). НДС к возмещению — в пролете.

    Reply
  7. 1108

    (5) Проверил. Графа «К платежно-расчетному документу» заполняется нормально. НДС к возмещению, честно говоря в Счет-фактуре выданной вообще не нашел. Пожалуйста, опишите при каких условиях возникают ошибки, или как заполняете документ?

    Reply
  8. gev

    Спасибо за обработку, мне она очень нужна. Но, к сожалению, в графе «К платежно-расчетному документу» постоянно забивается «№ 32 от 21.03.2011» для всех контрагентов (((

    Reply
  9. 1108

    (7) см. (6)

    Опишите, куда входите, что нажимаете?

    Reply
  10. gev

    Сначала зарегистрировала внешнюю печатную форму для своей БП 2.0.23.9. Потом действую стандартно — создаю СФ из ТН, причём в экранной форме СФ вижу правильный номер и дату платёжно-расчётного документа. Нажимаю на печать «СФ с подписями» — и в печатном виде вылезает в графе «К платежно-расчетному документу»: № 32 от 21.03.20011. Это поступление у меня в базе зарегистрировано для одного контрагента. Но почему-то вылезает в счетах-фактурах и для других контаргентов. И даже если отгрузка происходит до оплаты — всё равно вылезает этот неверный номер. Не пойму где это можно обнулить. Подскажите, пожалуйста.

    Reply
  11. andru_dv

    Спасибо за обработку. Для УТ 8.1 есть подобная внешняя форма?

    Reply
  12. cafeit

    очень бы хотелось для УТ 8.2. спасибо

    Reply
  13. Вячеслав Л

    Действительно есть проблема с номером платежно-расчетного документа.

    Возникает она в момент, когда мы формируя первую счет-фактуру с подписями ответственных лиц, делаем сохранение этих настроек.

    После этого дата и номер платежки из первой счет-фактуры подставляется во все последующие печатные формы.

    «Обнулить» можно только, если удалить сохраненную настройку.

    Reply
  14. gev

    Спасибо, Вячеслав, за совет по «обнулению». Получается, что сохранять настройку нельзя? Всё время заново выбирать ответственных лиц и забивать их приказы?

    Reply
  15. Вячеслав Л

    Будем надеяться, что автор внесет коррективы

    Reply
  16. 1108

    Ошибку исправил.

    Reply
  17. gev

    Спасибо! Теперь всё ОК.

    Reply
  18. 364140230

    Спасибо! Очень пригодилась.

    Reply
  19. Selena1505

    Спасибо! Очень пригодилась. ПРОСТО СПАСЕНИЕ и

    экономия времени.

    Reply
  20. multilab

    Обработка хорошая, но хотелось бы сохранять настройки без косяков.

    Reply
  21. gev

    (19) — У меня после последних изменений автора настройки работают без косяков.

    Reply
  22. nshrek2

    Спасибо автору. пригодилась как раз

    Reply
  23. just_xd

    Спасибо, очень помогла)Посмотрел как сделали и сделал на возврат товара от покупателя))

    Reply
  24. dreamland

    Почти обрадовала, но пришлось разочароваться, у меня платформа 1С 8.2 конфигурация Бухгалтерия предприятия 2.0.28.3. Форма открывается, но не выводит «На основании …», что делать, помогите?

    Reply
  25. 1108

    (23) «На основании…» имеется в виду «На основании приказа №… от …»? В окне выбора ФИО руководителя и бухгалтера заполните номера и даты приказов.

    Reply
  26. dreamland

    (24) сейчас попробовал запустить опять эту форму, и заработало! Первый раз ни в какую не хотело, видимо из-за того что при первом запуске указал только фамилии в реквизитах, потом уже заполнял их (ФИО, № приказа, дату) полностью, но не помогало. Спасибо за форму, очень выручила, но по ходу ее надо еще дорабатывать, например, нашел еще «косяк», когда закрываещь окно с реквизитами через «крестик» открывается печатная форма, чего по идее не должно происходить.

    Reply
  27. seven77782

    После обновления на Версию Бухгалтерия предприятия, редакция 2.0 (2.0.30.8)

    Ошибка

    Не удалось сформировать внешнюю печатную форму!

    Поле объекта не обнаружено (НДСВидСчетаФактуры)

    Reply
  28. 1108

    (26) seven77782, Вы правы. В 30.8 релизе 1С изменила название перечисления с «НДСВидСчетаФактуры» на ВидСчетаФактурыВыставленного.

    Выход: либо изменить в модуле обработки все «НДСВидСчетаФактуры» на «ВидСчетаФактурыВыставленного», либо скачать печатную форму снова. Исправленный файл перезалил.

    Reply
  29. seven77782

    Спасибо.

    Reply
  30. V.Nikonov

    Для переделаных конфигураций, показалось более удобным использовать следующий алгоритм:

    В справочник Организаций добавляем реквизит с текстом «Приказа о подписях» и ТЧ со списком пользователей имеющих право подписи.

    При печати:

    1) Проверяется текущий пользователь на право подписи. Если имеет право, то допечатывается ссылка на приказ и данные пользователя;

    2) Проверяется реквизит Ответственный из документа. Если имеет право, то допечатывается ссылка на приказ и данные Ответственного;

    3) Оставляем штатный механизм подписей руководителя/ГлавБуха.

    Reply
  31. 1108

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

    Reply
  32. V.Nikonov

    (30) создать обновление для типовой конфигурации не сверх сложная задача. Но отследить последующие обновления (что бы не затёрлось…) это много сложнее. К тому же, если конфигурация изменённая, то есть программист. Это его задача внести оптимальный алгоритм через изменения в программе.

    Reply
  33. Pashikuss

    Спасибо! Очень пригодилась.

    Reply
  34. Гость

    Спасибо за обработку! Форма очень пригодилась.

    Reply
  35. Leanna

    Спасибо за обработку. Все работает.

    Reply
  36. Ele1234567

    Только не всем подойдет…

    Reply

Leave a Comment

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