Универсальный отчет по регистрам, документам и справочникам для 1с 7.7




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

41 Comments

  1. petro_fm

    Три в одном, как маккофе 💡

    Reply
  2. tsvetik123

    Если Дата2 >= ПолучитьДатуТА() Тогда

    {H:1СУНИВЕРСАЛЬНЫЙОТЧЕТ.ERT(1824)}: Метод ПолучитьДатуТА не может быть доступен так как компонента Оперативный учет не загружена!

    Reply
  3. nika.1007

    to tsvetik123

    Спасибо, исправил.

    Reply
  4. Доня

    Не открывает ???

    Прошу справочники …

    Если ЗапросСПериодами.Выполнить(ТекстЗапросаПоПериодам)=0 Тогда

    УНИВЕРСАЛЬНЫЙОТЧЕТ.ERT(1979)}: Неверный диапазон дат!

    Reply
  5. nika.1007

    to Доня

    Неверный диапазон дат — означает что неправильно выбран период, но исправил.

    Reply
  6. Lexus

    в моей конфигурации нет обработки «ПодборОбъектов» 😮

    Reply
  7. jul66

    Пытаюсь выбрать документы.

    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда

    {C:UNIVERSALJNYJOTCHET.ERT(2003)}: Неверный диапазон дат!

    Я не очень понимаю, что значит неправильно выбран период (01.12.2009-31.12.2009)

    Reply
  8. Арчибальд

    (6) Имеется в виду UChoice.ert 😉

    Reply
  9. nika.1007

    to (7)

    значит что дата начала отчета больше даты ТА.

    добавил проверку.

    Reply
  10. Ёпрст

    Не работает… По оборотному регистру ничего нет, а по останкам, при группировке день — полная «радуга» …

    Reply
  11. Ёпрст

    +10 Т.е данные неверные… показывает расход/приход/останки по тем дням где нет вообще никаких движений… + неверная строка итогов.

    Reply
  12. Ёпрст

    И.. по справочникам тоже пусто — в группировку хотя бы нужно добавить код/наименование/текущий Элемент …

    а не только реквизиты.

    Reply
  13. nika.1007

    (10) на скрине №3 результат по оборотному регистру обороты — значит работает.

    (11) — вообще не понял что вы имеете ввиду, остатки он должен показывать независимо от движений.

    (12) — группировку по «Элементу» можно добавить , нажав на кнопку «…» над списком группировок.

    Reply
  14. ValeryZ

    Скачал, работает.

    Всю «пушистость» поисследовать не успел, но интересный «зверёк».

    + прилагается.

    Reply
  15. erasar

    Все работает замечательно. Теперь смогу вывести всех нерадивых на чистую воду. Огромное спасибо автору! 😉

    Reply
  16. legion1C

    есть конечно недостатки (нет отбора документов проведенных /не проведенных), но в целом обработка очень хорошая — «+»

    Reply
  17. tgu82

    Не пробовал но однозначно плюс. Сам что-то подобное рисовал

    Reply
  18. wumka

    М.б. что-то делаю неправильно, но выдаёт пустые отчёты. Единственные данные показываются по «Справочник – Банковские счета».

    Либо выдаёт ошибки.

    (1С Бухгалтерия 7.7 релиз 508)

    Reply
  19. nika.1007

    to (16) — спасибо, исправлю в ближайшее время

    Reply
  20. nika.1007

    to (18).

    Может быть неправильно формируете, напишите мне в личку.

    Reply
  21. CheBurator

    источнЫк данных

    Reply
  22. sam369

    Штука конечно полезная, но немного сыроватая, рекомендую самостоятельно довести до ума и запиисаться в соавторы 🙂

    Конт.ОткрытьПодбор(СправочникПодбора,,ФормаПодбора,?(Режим=»ДобавитьНесколько»,1,0),ТекЭлемент);

    {UNIVERSALJNYJOTCHET.ERT(1475)}: Неверный вид справочника Основной

    Ну и тд и тп. УДАЧИ 😉

    Reply
  23. nika.1007

    к (22)

    Описанную ошибку уже исправил.

    К (21) — очепятку тоже

    Reply
  24. andrewbc

    добротная вещь + однозназный

    хотелось бы получить комментарии автора на http://infostart.ru/public/63360/

    прошу не считать саморекламой, есть желание скооперироваться с автором

    Reply
  25. D9ID9I_SaIIIa

    😮

    1.баг

    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда

    {C:MYUNIREPORTУНИВЕРСАЛЬНЫЙОТЧЕТ.ERT(2022)}: Длина индекса превышает максимальную длину и не может быть уменьшена.

    2.Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда

    {C:MYUNIREPORTУНИВЕРСАЛЬНЫЙОТЧЕТ.ERT(2022)}: <<?>> месяц = Справочник.Параметры.месяц;

    Запрос[3] : Неизвестая ошибка ‘месяц’

    Reply
  26. nika.1007

    ответ (25) :

    Этот отчет — конструктор,

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

    А в 1С есть некоторые ограничения на запросы.

    по баг1. — ответ сдесь mista

    по баг 2.

    Немного исправил формирование запроса. Если Реквизит «Месяц» не используется в группировках — ошибки не будет,

    но если есть — будет предупреждение, ибо нельзя в запросах обращатся к реквизитам , которые имею имена зарезервированных операндов запроса.

    Reply
  27. sicheva_Irina

    Мне отчет понравился. Работает и в «Бухгалтерии» и на «складской» и даже под «Вистой» (там у меня не все отчеты формируютя в складской версии).+

    Reply
  28. dicwork

    Люди, кто скачал, ответьте все ли работает как заявлено. Насколько универсален этот отчет? А то я читаю вначале было много ошибок и нареканий. Стоит ли тратить с трудом заработанные виртуальные «доллары» на скачку этого внешнего отчета?

    Reply
  29. ARTEM123456

    Очень пригодилась. Немного дописал теперь пользуюсь.

    Reply
  30. Ekstrem13

    ВидРегистра = спЗначенийВариантовИсточников.ПолучитьЗначение(спЗначенийВариантовИсточников.ТекущаяСтрока());

    {C:DOCUMENTS AND SETTINGSSEMDESKTOPUNIREPORTУНИВЕРСАЛЬНЫЙОТЧЕТ.ERT(121)}: Индекс не входит в границы списка значений.

    Для м = 1 По Метаданные.Регистр(ВидРегистра).Измерение() Цикл

    {C:DOCUMENTS AND SETTINGSSEMDESKTOPUNIREPORTУНИВЕРСАЛЬНЫЙОТЧЕТ.ERT(122)}: Значение не представляет агрегатный объект (Измерение)

    Reply
  31. pupkinmail

    Как решился вопрос с пустыми отчетами? такая же фигня как и (18) тоже только справочники формирует

    Reply
  32. mixa_gr

    вещь классная. неплохо бы иметь еще следующее:

    1. сохранение настроек.

    2. расшифровку доработать. (у меня так и не заработала. открывает форму отчета и все)

    3. возможность использовать из других отчетов с использованием сохраненной настройки.

    Reply
  33. namazi74

    мне нужны были причины возврата в Приходных накладных. Причины есть, я доволен =) буду дальше тестировать. Первое впечатление — всё отлично!) особенно приятно, что под 7.7

    Reply
  34. namazi74

    (32) mixa_gr, я путаю, или сверху есть кнопички — сохранить и восстановить настройки ?….

    Reply
  35. namazi74

    Вопрос автору — сколько за такую обработку выручили с заказчика ?

    Reply
  36. mixa_gr

    (34) namazi74, да, вы путаете.

    Reply
  37. nika.1007

    (35) — из заказчика я ничего не выручил,

    писал (творил) когда было желание и время.

    Сейчас обработку дописывать уже не собираюсь,

    код открытый — кто хочет — пусть допиливает.

    Reply
  38. Shrek2015

    хорошая штука 🙂

    Reply
  39. Froloid

    Автор, спасибо! Пригодилась.

    Нужно было из 7.7 справочник номенклатуры выгрузить в excel (несколько полей, включая код родителя) — т.е. сущий пустяк. Но то, что на 8-ке делаю быстрее чем запрос в поисковике пишу, в 7-ке вызывает первобытный страх, как у Сишника перед Ассемблером, завуалированный фразой «на кой мне эту рухлядь ковырять» …

    Reply
  40. Bezeus

    Довольно сыровато. Но, как отметил Froloid, помогает преодолеть страх. Простейшие запросы можно накидывать. Автору спасибо

    Reply
  41. yurikmellon

    что то поломалось. По документам выводит пустые строки

    Reply

Leave a Comment

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