Материальный отчет бухгалтерия 3.0




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

    А почему для скачки предоставлено два файла? Один, похоже, erf-файл — отчет. А во втором что? Довесок к первому?

    Reply
  2. AT_Kam

    (1) b1958,

    Основной файл (Материальный отчет бух 3.0.erf), второй не смог удалить.

    Reply
  3. NVKom

    Хотелось бы видеть отбор по организациям.

    Reply
  4. irina1964

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

    Reply
  5. AT_Kam

    Необходимо в модуле объекта добавить функцию

    Функция СведенияОВнешнейОбработке() Экспорт
    
    РегистрационныеДанные = Новый Структура;
    
    РегистрационныеДанные.Вставить(«Наименование», «Материальный отчет»);
    
    РегистрационныеДанные.Вставить(«БезопасныйРежим», Истина);
    
    РегистрационныеДанные.Вставить(«Версия», «1.0»);
    
    
    
    //ДополнительнаяОбработка
    
    //ДополнительныйОтчет
    
    //ЗаполнениеОбъекта
    
    //Отчет
    
    //ПечатанаяФорма
    
    //СозданиеСвязанныхОбъектов
    
    РегистрационныеДанные.Вставить(«Вид», «ДополнительныйОтчет»);
    
    
    
    РегистрационныеДанные.Вставить(«Информация», «Материальный отчет для бухгалтера»» «);
    
    
    
    ///////////// команды /////////////////////////
    
    тзКоманд = Новый ТаблицаЗначений;
    
    тзКоманд.Колонки.Добавить(«Идентификатор»);
    
    тзКоманд.Колонки.Добавить(«Представление»);
    
    тзКоманд.Колонки.Добавить(«Модификатор»);
    
    тзКоманд.Колонки.Добавить(«ПоказыватьОповещение»);
    
    тзКоманд.Колонки.Добавить(«Использование»);
    
    
    
    строкаКоманды = тзКоманд.Добавить();
    
    строкаКоманды.Идентификатор = «1»;
    
    строкаКоманды.Представление = «команда «»Материальный отчет»» (ОткрытиеФормы)»;
    
    строкаКоманды.ПоказыватьОповещение = Истина;
    
    строкаКоманды.Использование = «ОткрытиеФормы»;
    
    
    
    //строкаКоманды = тзКоманд.Добавить();
    
    //строкаКоманды.Идентификатор = «2»;
    
    //строкаКоманды.Представление = «команда «»Материальный отчет»» (ВызовКлиентскогоМетода)»;
    
    //строкаКоманды.ПоказыватьОповещение = Истина;
    
    //строкаКоманды.Использование = «ВызовКлиентскогоМетода»;
    
    
    
    //строкаКоманды = тзКоманд.Добавить();
    
    //строкаКоманды.Идентификатор = «3»;
    
    //строкаКоманды.Представление = «команда «»Материальный отчет»» (ВызовСерверногоМетода)»;
    
    //строкаКоманды.ПоказыватьОповещение = Истина;
    
    //строкаКоманды.Использование = «ВызовСерверногоМетода»;
    
    
    
    РегистрационныеДанные.Вставить(«Команды», тзКоманд);
    
    
    
    ////////////// назначение (в каких объектах используется) /////////////////////////
    
    //для печ.форм, заполнения, ввода свазанных объектов
    
    //МассивНазначений = Новый Массив;
    
    //МассивНазначений.Добавить(«Документ.*»); // все документы назначаются
    
    //МассивНазначений.Добавить(«Документ.АвансовыйОтчет»);
    
    //МассивНазначений.Добавить(«Документ.ЗаказПокупателя»);
    
    //РегистрационныеДанные.Вставить(«Назначение», МассивНазначений);
    
    
    Возврат РегистрационныеДанные;
    
    КонецФункции

    Показать

    Reply
  6. ppotap

    При добавлении Функции куча ошибок. Не получается скопировать-вставить. Очень бы хотелось чтоб работало при добавлении в дополнительные отчеты.

    Reply
  7. ppotap

    Проблема тут..

    строкаКоманды = тзКоманд.Добавить();

    строкаКоманды.Идентификатор = «1»;

    строкаКоманды.Представление = «команда «»Материальный отчет»» (ОткрытиеФормы)»;

    строкаКоманды.ПоказыватьОповещение = Истина;

    строкаКоманды.Использование = «ОткрытиеФормы»;

    Как корректно написать?

    Reply
  8. AT_Kam

    (7) ppotap, исправил добавил возможность регистрации в программе

    Reply
  9. AT_Kam

    (7) ppotap,

    должно быть так..

    Проблема тут..

    строкаКоманды = тзКоманд.Добавить();

    строкаКоманды.Идентификатор = «1»;

    строкаКоманды.Представление = «команда «»Материальный отчет»» (ОткрытиеФормы)»;

    строкаКоманды.ПоказыватьОповещение = Истина;

    строкаКоманды.Использование = «ОткрытиеФормы»;

    Reply
  10. ppotap

    А за повторную скачку опять снимет Sm ???

    Reply
  11. 1c-kt

    Все равно отчет не добавляется. Ругается на ХранилищеВариантов

    {ОбщийМодуль.ДополнительныеОтчетыИОбработки.Модуль(2277)}: Поле объекта не обнаружено (ХранилищеВариантов)

    Если ВнешнийОбъектМетаданные.ХранилищеВариантов <> Неопределено Тогда

    Reply
  12. AT_Kam

    (12) 1c-kt, Сейчас только что скачал и проверил отчет все нормально подключается.

    Reply
  13. Slovar

    {ОбщаяФорма.ФормаОтчета.Форма(1548)}: Ошибка при вызове метода контекста (СкомпоноватьРезультат)

    СкомпоноватьРезультат(РежимКомпоновкиРезультата.Авто);

    по причине:

    Ошибка исполнения отчета

    по причине:

    Ошибка получения данных

    по причине:

    Ошибка создания набора данных «НаборДанных1»

    по причине:

    Ошибка при исполнении запроса набора данных

    по причине:

    {(24, 80)}: Не задано значение параметра «Счет»

    РегистрБухгалтерии.Хозрасчетный.Ос

    Reply
  14. Slovar

    {ОбщаяФорма.ФормаОтчета.Форма(1548)}: Ошибка при вызове метода контекста (СкомпоноватьРезультат)

    СкомпоноватьРезультат(РежимКомпоновкиРезультата.Авто);

    по причине:

    Ошибка исполнения отчета

    по причине:

    Ошибка получения данных

    по причине:

    Ошибка создания набора данных «НаборДанных1»

    по причине:

    Ошибка при исполнении запроса набора данных

    по причине:

    {(25, 78)}: Не задано значение параметра «ТипЦен»

    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = <<

    Reply
  15. Slovar

    как бы за что 1 доллар?

    Reply
  16. AT_Kam

    (16) Slovar, Эта ошибка появляется, если не выбрали тип цен или можно просто поставить галочку тип цен, аналогичная ситуация со счетом.

    Reply
  17. Slovar

    это понятно…но при указании всего что Вы указали, результат пустая таблица.

    Зачем вообще указание типов цен?

    Reply
  18. Slovar

    простите за тавтологию

    Reply
  19. AT_Kam

    (19) Slovar, Изменил немножко отчет ставить галочку тип цен и места хранения необязательно, но если стоить галочка места хранения , тогда обязательно нужно выбрать склад иначе отчет пустой будет

    Reply
  20. lesna

    Отбор по мат.отв.лицу есть?

    Reply
  21. AT_Kam

    (21) lesna, Добавил в отчет (Материалный отчет. За основу взят запрос ОСВ посчету) отбор по МОЛ

    Reply
  22. Brawler

    сторнирующие проводки учитываются этим отчетом как приходы и расходы?

    Reply
  23. AT_Kam

    (23) Brawler, все движение.

    Reply
  24. JLaikova

    Очень нужный отчет, но обновила до БП 3.0.30.12 и выходит ошибка при открытии

    ОбщаяФорма.ФормаОТчета.Форма(144,3):Недостаточно фактических параметров(БыстрыеНастрйокиЗаполнить).. Если исправите, буду очень балгодарна

    Reply
  25. AT_Kam

    (25) JLaikova, Обновите платформу

    Reply
  26. JLaikova

    (26) AT_Kam, платформа стоит 8.3.4.389

    Reply
  27. JLaikova

    а релиз был 27 — все работало, как поставила 3.0.30.12.. так ошибка.. В этом релизе интерфейс визуально сильно отличается

    Reply
  28. AT_Kam

    (28) JLaikova, У меня тоже самое было пока не обновил платформу до 8.3.4.437 из-за этого сделал материальный отчет без СКД, вым отправил ссылку.

    У вас какая платформа?

    Reply
  29. JLaikova

    (29) AT_Kam, Платформа 8.3.4.389

    Reply
  30. JLaikova

    (29) AT_Kam, За ссылку отдельное спасибо! Без СКД отчет намного лучше и цена есть и период стандартный формируется, не надо с временем мудрить..

    Reply
  31. Старый

    Скачал оба отчета. Какой-то развод. Во-первых то что на картинке в описании и реально отличается.Во-вторых нет выбора нескольких счетов. В-третьих отчет не формирует ничего, он пустой. ОСВ результаты дает, а отчет нет. У меня стоит Бухгалтерия 3.0.30.14 и платформа 8.3.4.437. Автор прошу Вашего ответа.

    Reply
  32. Старый

    Ну и дайте ссылку на отчет без СКД

    Reply
  33. AT_Kam

    (33) Старый, отправил

    Reply
  34. Старый

    (34) AT_Kam, Спасибо получил. Пока особо не разбирался, но сразу видно если галку ставлю галку по всем складам, то все хорошо, если выбираю какой-то склад отчет пустой. Оборотно-сальдовая ведомость не пустая цифры есть

    Reply
  35. fuser

    Если в Свойствах отчета (Действия-Свойства) заполнить Хранилище вариантов, то отчет можно будет разместить на панели отчетов

    Reply
  36. Brawler

    (24) AT_Kam, я имел ввиду что сторно прихода должно трактоваться в отчете как расход и пихаться в колонку расход, обратная ситуация для сторно расхода, должно быть как приход на склад. Если в лоб учитывать просто обороты, то гандурас получается, когда есть сторно проводки.

    Reply
  37. ppotap

    Ранее скачивал ваш отчет. После очередного обновления у Бухгалтеров у которых стоит стандартная роль «Бухгалтер» при попытке открать отчет выдается сообщение «Недостаточно прав»

    Reply
  38. klaus38

    БП 3.0.33.20 СКД версия отчета, полет нормальный,примите благодарности

    Reply
  39. M.Nikitin

    poctak, в колонке «Цена» — какая цена — поступления или средняя?

    Reply
  40. AT_Kam

    (40) M.Nikitin,

    в отчете «МатериальныйОтчет3МОЛ» цена средняя

    Reply
  41. kauksi

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

    Reply
  42. AT_Kam

    (42) kauksi, Попробуйте вот это прикрепленный файл.

    Reply

Leave a Comment

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