Акт выполненных работ (оказанных услуг)




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

41 Comments

  1. DamTumaka

    Скачал, попробовал для УСН на договоры аренды подключить Вашу печ.форму, но не получилось. Сообщение об ошибке:

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

    Ошибка при вызове метода контекста (Выполнить): {(75, 2)}: Таблица не найдена «Документ.РеализацияТоваровУслуг.АгентскиеУслуги»

    <<?>>Документ.РеализацияТоваровУслуг.АгентскиеУслуги КАК РеализацияТоваровУслуг

    Reply ↓
  2. heavymetal

    Это печатная форма для Бухгалтерии предприятия редакции 2.0, а не для 1.6

    Reply ↓
  3. heavymetal

    Выложил и для 1.6

    Reply ↓
  4. DamTumaka

    Спасибо, теперь порядок!

    Если нетрудно — добавьте для исполнителя указание должности.

    Reply ↓
  5. bearcat

    скачала

    не смогла прицепить в 1С бух 8.1.15.14 ред 1.6.25.6

    пишет, что это не обработка или не подходит к данной конфигурации

    вот так

    Reply ↓
  6. heavymetal

    Теперь добавил должности для формы 1.6, при этом меняется немного подвал, если не будет устраивать, пишите свои предложения. Я делал для того, чтобы длинные должности более менее помещались. А если эта функция не включена, то у формы прежний вид

    + форму 1.6 добавил для платформы 8.1

    Для формы 2.0 добавлю позже

    Reply ↓
  7. bearcat

    скачала сегодня еще раз

    Что не так делаю?

    1. сервис >дополнительные внешние обработки>добавить>выбираю скачанную обработку>открыть

    и снова

    выбранный файл не является внешней обработкой. Либо данная обработка не предназначена для запуска в этой конфигурации.

    еще служебное сообщение

    {Справочник.ВнешниеОбработки.Форма.ФормаЭлемента(189)}: Ошибка при вызове метода контекста (Создать): Ошибка загрузки документа.

    Внешняя обработка не может быть прочитана текущей версией программы.

    пробую выбрать допонительные внешние печатные формы

    тот же резултьтат

    не работает ваш акт

    Reply ↓
  8. heavymetal

    Какой файл качаете? Там их три, два из них для 8.2, а один для 8.1. Там все подписано

    Reply ↓
  9. bearcat

    (8) виновата… недосмотрела… скачивала по основной картинке, т.е. платформу 2

    спасибо за совет..

    в благодарность , мож быть кому-то будет полезно:

    1. скачать файл 8.1,

    2. загрузить обработку в дополнитеоьные внешние печатные формы,

    3. добавить ПРЕДСТАВЛЕНИЕ (выбрать реализацию товаров работ услуг),

    4. дать наименование кнопке, например, АКТ УСЛУГ ИНФОСТАРТ,

    5. открыть любой акт в журнале Реализация, нажимаете на печать , видите наименование АКТ УСЛУГ ИНФОСТАРТ, распечатываете

    Reply ↓
  10. bearcat

    (8) можете еще добавить ИНН и КПП контрагентам по аналогии как в ТОРГ-12 ?

    потому что, например, в СПб есть пять фирм с наименованем ОПТИМА

    Reply ↓
  11. heavymetal

    (10) Добавил ИНН и КПП к контрагентам. (6) В форме 2.0 сделал вывод подписей с должностями

    Reply ↓
  12. bearcat

    (11) здорово!!!

    молодец!!!

    Reply ↓
  13. bearcat

    (12)

    поставила плюс, но почему-то не вижу, чтобы он был учтен, мож быть он учитывается не сразу?

    сделала, чтобы в акте были указаны должности, все получилось!

    Параметры обработки<Задать параметры>

    ИМЯ «ДОЛЖНОСТИ»

    значение ИСТИНА

    чтоб еще попросить? 😉

    Reply ↓
  14. heavymetal

    (13) Есть такое здесь глюк, я обновил Кэш, теперь плюс есть. Если что придумаете, пишите, я намерен сделать суперский акт выполненых работ, чтоб всех устраивал и ни у кого вопросов не возникало

    Reply ↓
  15. salve-salve

    Я ещё в акте, под строкой <В том числе НДС> вывожу отдельное поля, для «непонятливых» — Всего к оплате

    Ибо были случаи, когда оплачивали только строку итого =)

    Reply ↓
  16. heavymetal

    (15) Интересно. Сделаю такое же, спасибо. У меня просто без НДС и обычно счет на оплату выписываю, я и не задумывался даже

    Reply ↓
  17. heavymetal

    Добавил акт для Комплексной автоматизации 1.1 + для нее сделал еще и возможность подключения к Поступлению товаров и услуг для печати акта за поставщика

    Reply ↓
  18. bearcat

    (17) если можно, добавьте возможность пользоваться данной обработкой

    1. для УТ для распечатки акта из «Реализации»

    так как менеджеры создают акты именно в 1С УТ и мне приходится за них все переделывать в 1С БП, т.к. они ж делают типовой в 1С. А для «Реализации».

    В 1С БП Ваша обработка ПРОСТО ОЧЕНЬ ЗАМЕЧАТЕЛЬНАЯ , НЕ СРАВНИТЬ с типовой в 1С.

    2. для БП 1.6 возможность подключения к «поступлению товаров и услуг» для печати акта за поставщика.

    пока что выдает сообщение:

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

    Преобразование значения к типу Булево не может быть выполнено»

    Reply ↓
  19. RayCon

    (14)

    >Если что придумаете, пишите,

    Вообще-то, всё уже давно придумано. 🙂

    >я намерен сделать суперский акт выполненых работ,

    >чтоб всех устраивал и ни у кого вопросов не возникало

    Для этого нужна ещё преамбула, в которой указывается не только ФИО и должности подписантов, но и основания их полномочий. Если с самим текстом проблем у тебя не будет, то реквизита «Основание полномочий» в конфигурациях 1С нет.

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

    И вот ещё что… Ты бы разместил нормальные скриншоты, а то с замазываниями — как-то не комильфо. Уж больно неряшливый вид получается, который никак не соответствует «суперскому» реноме. 🙁

    (15) +1

    Это существенное замечание. Вот только по уму надо бы писать не «Всего к оплате», а «Всего к оплате, вкл. НДС». Кстати, в тексте суммы прописью НДС тоже надо обязательно указать.

    Reply ↓
  20. СержТ

    > если не указан — «Без договора»

    А можно не «Без договора» а наименование договора из поля «Наименование» договора

    Reply ↓
  21. Petrel
    bearcat пишет:

    2. для БП 1.6 возможность подключения к «поступлению товаров и услуг» для печати акта за поставщика.

    пока что выдает сообщение:

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

    Преобразование значения к типу Булево не может быть выполнено»

    Аналогично, но для 2.0 — выдает такую же ошибку!

    Reply ↓
  22. KomarovaV

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

    Reply ↓
  23. lazy sea

    Да, для 2.0 подключение к акту за поставщика было бы очень интересно.

    Reply ↓
  24. scraper79

    Как изменить шапку документа, т.е. название. Что бы было: «Акт оказанных услуг» вместо «Акт выполненных работ (оказанных услуг)» г. «

    Reply ↓
  25. pantera190

    спасибо!!

    Reply ↓
  26. and-dex

    При подключении к 1С 8.2 КА выдает ошибку «»Не удалось сформировать внешнюю печатную форму! Преобразование значения к типу Булево не может быть выполнено», подключал к документы «Поступление товаров и услуг». Подскажите, куда копать?!?!?

    Reply ↓
  27. nshrek2

    Цитата

    bearcat пишет:

    2. для БП 1.6 возможность подключения к «поступлению товаров и услуг» для печати акта за поставщика.

    пока что выдает сообщение:

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

    Преобразование значения к типу Булево не может быть выполнено»

    Аналогично, но для 2.0 — выдает такую же ошибку!

    форма нужная, но видимо придется допилить

    Reply ↓
  28. itt

    очень нужная форма

    Reply ↓
  29. lady_lace@mail.ru

    Спасибо за акт, было бы замечательно если бы поттягивались реквизиты заказчика и исполнителя ИНН КПП и адрес

    Reply ↓
  30. Xeops

    Благодарю за проделанную работу. Помогло.

    Reply ↓
  31. Evrosm

    минус пока не ставлю, но не работает, пишет:

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

    Метод объекта не обнаружен (ПолучитьЧастьЗапросаДляВыбораСодержания)


    /БП редакция 2.0 (2.0.29.10)/

    Скачал с значка не ту форму.

    Теперь всё работает. Отлично!

    Большой жирный плюс и человеческое спасибо!

    Reply ↓
  32. koba-74

    Редакция БП 2.0 работает замечательно, только фамилия контрагента не выводится почему-то. Можно поправить? И выравнивание вправо в ячейках с фамилиями сделать.

    Reply ↓
  33. heavymetal

    Насчет выравнивания вправо постараюсь сделать чуть позже, сейчас нет времени.

    А на счет фамилии контрагента я не понял. Где не выводится? Если имеется в виду в подписях, то в описании публикации http://infostart.ru/public/73176/ все это описано:

    Подвал «Подписи» добавлена расшифровка подписей, у поставщика руководитель организации (из ответственных лиц), у контрагента из контактов (основное контактное лицо);

    Добавлена возможность вывода должностей в подписях, для включения этой возможности в поле дополнительных параметрах (при подключении печ.формы) добавить параметр с именем «Должности» и булевым значением Истина/Да. При этом меняется подвал формы, сделал это для того, чтобы «длинные» должности более менее помещались, если есть другие предложения, пишите в комментарий.
    Reply ↓
  34. нинас

    Попробую прицепить в КА.

    Reply ↓
  35. heavymetal

    (34) нинас, только самое главное скачайте правильный файл

    Reply ↓
  36. brrart

    +1

    спасибо!!! но всёж немного переделал под себя

    Reply ↓
  37. mikhailovaew

    Спасибо, сэкономила время )

    Reply ↓
  38. Котяня

    Спасибо, пригодилась.

    Reply ↓
  39. kivit

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

    Reply ↓
  40. heavymetal

    (39) kivit, логотип, на сколько я помню, предусмотрен только в форме для БП 2.0 и сработает только на файловой базе, а настраивается очень просто:

    1. В каталог информационной базы копируете файл изображения логотипа (рекомендую PNG или JPG).

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

    Если серверный вариант, то нужно немного переправить саму печатную форму. Если нужно, можете выслать изображение логотипа, я Вам сделаю. Делать универсальное решение, уже не вижу смысла, БП 2.0 доживает свои дни.

    Reply ↓
  41. kivit

    Спасибо, изменил печатную форму.

    Reply ↓

Leave a Comment

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