Акт сверки для УТ 11




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

42 Comments

  1. Поручик

    (0) Форма в стиле «клюшек».

    Сделай лучше по образцу http://infostart.ru/public/14228/ или других, цены не будет. Или за деньги будешь продавать.

    Reply
  2. anton.fly7

    или на СКД )) ваще нарядно былоб

    Reply
  3. Поручик

    На СКД, кстати, хорошая тема.

    Reply
  4. sprinter

    Спасибо за конструктивную критику, немножно доработал обработку.

    Reply
  5. Поручик

    (4)

    1. При выборе партнёра контрагента можно подставлять автоматически, если он один.

    2. При добавлении в дополнительные обработки предупреждение: обработка требует разрешить использование в небезопасном режиме.

    ПараметрыРегистрации.Вставить(«БезопасныйРежим», Истина);

    Кстати, в будущей УТ 11.0.6 тоже работает.

    Reply
  6. sprinter

    Спасибо, сделано, ну и если организация одна, тоже автоматом ставится

    Reply
  7. Поручик

    (6) Держи облагороженную обработку, можешь опубликовать как свою.

    [+] Форма в стиле 8.2.

    [+] Сохранение настроек.

    [+] Открытие документа в печатной форме.

    [+] Небольшой рефакторинг кода.

    Reply
  8. Aerie

    Ошибка:При сверке с поставщиками у которых сальдо на начало периода дебетовое — выводит кредитовое!

    Reply
  9. Alen76

    Было бы возможно, поставила бы сотню плюсов! Спасибо!Отлично. Всё работает на Управление торговлей, редакция 11.0 (11.0.6.9)

    Reply
  10. Alen76

    Поручику отдельное спасибо за «наводку»…

    Reply
  11. nikvel

    В УТ 11.0.6.9 есть стандартная обработка «Сверки взаиморасчетов»

    Reply
  12. Alen76

    В УТ 11.0 печатная форма документа «сверка взаиморасчетов» очень не удобоваримая , непонятно зачем нужно было разработчикам выдумывать велосипед, если уже давно была нормальная форма акта сверки, которая в бухгалтерии предпр. 2.0 под 8.2 кстати осталась в нормальном виде.Всё возможные стандартные средства уже проверены и сделаны определенные выводы … Взаиморасчеты в УТ 11 в любом виде (акты, ведомости и пр.)не удобно сделаны, т.к либо нужно «проходить» всех контрагентов на конец каждого периода и делать зачет задолжостей , либо привязку док.оплаты и док. отгрузки (заказа), а иначе долги дает в развернутом виде, а нужно (хотя бы в печатной форме) , чтобы взаиморасчеты были «свернуты», поэтому очень нужен был такой акт сверки, который представлен здесь. Теперь остается дождаться , чтобы ведомость взаиморасчетов со «свернутыми долгами» появилась, как это реализовано в УТ 10.3 (типа «по договору в целом»)

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

    Reply
  13. Иволга

    Очень нужная вещь, особенно когда пользователи-бухгалтера хотят видеть В УТ 11 привычное. Спасибо, все работает. Это еще один аргумент, чтобы консерваторы-бухгалтера не кричали «Вот Ваша 8-ка…, а говорили все есть.»

    Reply
  14. sumv1

    Спасибо. Работает. При этом мягко сказать «удивлен» отсутствием в типовой УТ стандартной формы акта сверки !!!

    Reply
  15. Ty4a

    (5) ,

    «Кстати, в будущей УТ 11.0.6 тоже работает.»

    А эта обработка работает в УТ 11.0.7 ?

    Reply
  16. Поручик

    (15) Проверь сам. Ещё не хватало, чтобы я чужие работы проверял.

    Reply
  17. wwizard

    в mxtv разница между стандартной 8,2 УТ?

    Reply
  18. Поручик

    (0) На УТ 11.0.7.13 уже не работает. Функция ФамилияИнициалыФизЛица() из модуля ФормированиеПечатныхФорм перенесена в ФизическиеЛица.

    Могу подарить рабочую версию.

    С 1С мы без работы не останемся. Постоянные переносы процедур, переименования модулей, объектов не дадут скучать.

    Reply
  19. Ty4a

    (18) Поручик,

    На УТ 11.0.7.13 уже не работает. Функция ФамилияИнициалыФизЛица() из модуля ФормированиеПечатныхФорм перенесена в ФизическиеЛица.

    Могу подарить рабочую версию.


    Я бы не отказался от рабочей версии в 11.0.7.13 😉

    Reply
  20. Поручик

    (19) Обязательно повторять сообщение? Если автор согласится, выложу.

    Reply
  21. sprinter

    «Обязательно повторять сообщение? Если автор согласится, выложу.»

    Добрый день. Если есть уже рабочая версия под 11.0.7.13 выложите пожалуйста, т.к. у меня на данный момент ещё нет такой версии УТ для доработки.

    Reply
  22. sprinter

    Добавил файл обработки для версии УТ 11.0.7.13

    Акт_Сверки_11.0.7.13

    Reply
  23. Поручик

    (21) Надо было указать номер сообщения в круглых скобках, тогда я бы получил уведомление и вывалил в тот же день. Кстати, в своём варианте я сделал вывод входящей даты и номера в поступлении товаров и поступлении ДС.

    Reply
  24. sprinter

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

    Извините, мало общаюсь на форумах поэтому не знал таких нюансов

    Reply
  25. ImPenguin

    Ваш Акт сверки немного подглючивает, посмотрите на первом скриншоте в акте сверки сальдо на 31.12.11 в колонке Дебет, а на втором скриншоте, сальдо на начало периода 01.01.12 в колонке кредит…т.е. неправильно переносит сальдовку между годами.

    Reply
  26. ImPenguin

    Вот еще один пример неверного отображения данных, в этом случае на конец 2011 года сальдовки нет. А в 2012 году она появляется причем в удвоенном размере оборотов 2011 года…

    Reply
  27. sprinter

    (26) Спасибо, посмотрю в чём причина, постараюсь исправить.

    Reply
  28. sprinter

    (26) исправил найденные ошибки

    Reply
  29. ImPenguin

    (28)Спасибо, сейчас потестим!!!

    Reply
  30. ImPenguin

    (27) Посмотрел, для тех партнеров которых я приводил в пример, все нормально. Попробовал взять партнера с более частыми отгрузками, вот что получилось: опять проблема с сальдо…

    Reply
  31. sprinter

    (31) Спасибо за сообщение, тестирую обработку, пока что не получается воспроизвести ситуацию, которая изображена на экране. Использую и возвраты и предоплату и не доплату: а также ситуацию когда один контрагент выступает и в качестве покупателя и в качестве продавца, ни как не выходит.

    Reply
  32. ImPenguin

    Может я смогу помочь еще информацией, этот партнер — это партнер родитель, т.е. у него есть еще несколько партнеров у которых контрагент просто ИП Никитенко. Я пораскрывал в акте сверки реализации и туда пападают все реализации по контрагенту ИН Никитенко, а партнеры (клиенты) в этих реализациях разные. А сальдо, возможно, переносится только по оному партнеру.

    Прикреплю еще один скриншот, который охватывает весь период на предыдущих скриншотах.

    И скриншот, где видно какая структура у партнера ИП Никитенко.

    Reply
  33. ImPenguin

    Интересно узнать, работаете ли Вы надо доработкой акта сверки? Я думаю причина его некорректной работы кроется именно в том, что имеются партнеры-родители и контрагенты-родители.

    Reply
  34. sprinter

    (34) К сожалению пока ещё не разбирался с описанной Вами ситуацией, на текущий момент много работы. Как только обновлю версию отчёта сразу же отпишусь в комментариях.

    Reply
  35. ov1

    а как произвести печать из самого документа?

    Reply
  36. sprinter

    (36) Обработка сделана не как внешняя печатная форма. Поэтому ни как.

    Reply
  37. realm

    Не проверил ли кто работоспособность отчета на УТ 10? Заранее, спасибо.

    Reply
  38. m1kll

    данная обработка будет работать на КА в управляемом интерфейсе?

    Reply
  39. romul_666

    1С:Предприятие 8.2 (8.2.17.169)

    Управление торговлей, редакция 11.1 (11.1.1.11)

    В ней нет реквизитов ТекущийРуководитель уже… Соответственно нужно изменить код для подбора руководителя и бухгалтера из подчиненного справочника ОтветственныеЛицаОрганизаций.

    Reply
  40. romul_666

    нашел код вот этот в модуле пользователя:

    ТекущаяОбласть = Макет.ПолучитьОбласть(«Подвал»);

    ТекущаяОбласть.Параметры.ДатаОкончания = Формат(ДатаОкончания, «ДФ=dd.MM.yyyy»);

    ТекущаяОбласть.Параметры.Организация = Организация;

    ТекущаяОбласть.Параметры.Контрагент = Контрагент;

    ТекущаяОбласть.Параметры.СальдоКонечное = Формат(ИтоговоеСальдо, «ЧДЦ=2»);

    ТекущаяОбласть.Параметры.СуммаПрописью = СуммаПрописью;

    ТекущаяОбласть.Параметры.Результат = Результат;

    ТекущаяОбласть.Параметры.ОрганизацияИНН = Организация.ИНН;

    ТекущаяОбласть.Параметры.КонтрагентИНН = Контрагент.ИНН;

    ТабличныйДокумент.Вывести(ТекущаяОбласть);

    и после него вставил вот так:

    // Получить выборку по ответственным лицам организации.

    Выборка = Справочники.ОтветственныеЛицаОрганизаций.Выбрать( , Организация);

    Пока Выборка.Следующий() Цикл

    ФИО= ФизическиеЛица.ФамилияИнициалыФизЛица(Выборка.ФизическоеЛицо.Наименование);

    Должность = сокрЛП(Выборка.ОтветственноеЛицо);

    Если СокрЛП(Должность) = «Руководитель» тогда

    РуководительФИО = ФИО;

    РуководительДолжность = Должность;

    КонецЕсли;

    Если СокрЛП(Должность) = «Главный бухгалтер» тогда

    ГлавныйБухгалтерФИО = ФИО;

    ГлавныйБухгалтерДолжность = Должность;

    КонецЕсли;

    КонецЦикла;

    Если ТипПодписи = «Руководитель» Тогда

    ТекущаяОбласть = Макет.ПолучитьОбласть(«Подпись»);

    ТекущаяОбласть.Параметры.ФИО = РуководительФИО;

    ТекущаяОбласть.Параметры.ПредставлениеДолжности = РуководительДолжность;

    ТабличныйДокумент.Вывести(ТекущаяОбласть);

    ИначеЕсли ТипПодписи = «Оба» Тогда

    ТекущаяОбласть = Макет.ПолучитьОбласть(«Подпись»);

    ТекущаяОбласть.Параметры.ФИО = РуководительФИО;

    ТекущаяОбласть.Параметры.ПредставлениеДолжности = РуководительДолжность;

    ТабличныйДокумент.Вывести(ТекущаяОбласть);

    ТекущаяОбласть = Макет.ПолучитьОбласть(«Подпись»);

    ТекущаяОбласть.Параметры.ФИО = ГлавныйБухгалтерФИО;

    ТекущаяОбласть.Параметры.ПредставлениеДолжности = ГлавныйБухгалтерДолжность;

    ТабличныйДокумент.Вывести(ТекущаяОбласть);

    Иначе

    ТекущаяОбласть = Макет.ПолучитьОбласть(«Подпись»);

    ТекущаяОбласть.Параметры.ФИО = ГлавныйБухгалтерФИО;

    ТекущаяОбласть.Параметры.ПредставлениеДолжности = ГлавныйБухгалтерДолжность;

    ТабличныйДокумент.Вывести(ТекущаяОбласть);

    КонецЕсли;

    ТекущаяОбласть = Макет.ПолучитьОбласть(«МП»);

    ТабличныйДокумент.Вывести(ТекущаяОбласть);

    Возврат ТабличныйДокумент;

    Reply
  41. romul_666

    Хотел еще шапку доработать, чтобы вписывались сами ответственные лица, но руки пока не дошли…

    Reply
  42. sk_acc

    (41) romul_666,

    спасибо за код…

    Reply

Leave a Comment

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