Отчет на СКД с параметрами на форме




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

54 Comments

  1. Armando

    Гениально!

    Reply
  2. Поручик

    (1) Честно говоря, не понял в чём были затруднения у автора. Вещь довольно простая, делается после небольшого изучения свойств и методов СКД.

    Reply
  3. Armando

    (2) Если честно, то я просто отшутился) Вообще не понимаю, зачем из этого делать отдельную публикацию?

    Reply
  4. Spartan

    Присоединяюсь к высказываниям выше. Ну и если уж на то пошло: при изменении параметров через настройки, они должны заполняться и в основной форме, а в публикации описан только обратный процесс.

    Reply
  5. DERL
    Armando пишет:

    Если честно, то я просто отшутился) Вообще не понимаю, зачем из этого делать отдельную публикацию?

    эта публикация как документация для начинающих программистов…

    Автор молодец поддерживаю! плюсик заработал!

    Reply
  6. Поручик

    (6) Документация для начинающих программистов — это ЖКК или «Хрусталева Е.Ю. Разработка сложных отчетов в 1С Предприятии 8. Система компоновки данных», а не мелкие статейки в интернетах.

    Reply
  7. veyron21

    Да, я согласен, что это простое решение. Однако для начинающих программистов такая задачка может стать серьезным камнем преткновения при разработке отчета на СКД. Проверял лично со своими новичками)))

    Reply
  8. DERL
    Поручик пишет:

    Документация для начинающих программистов — это ЖКК или «Хрусталева Е.Ю. Разработка сложных отчетов в 1С Предприятии 8. Система компоновки данных», а не мелкие статейки в интернетах.

    хоть это и простенькая статейка, но в подобных статьях иногда найдешь то, что не пишут Хрусталевы и прочие авторы ИМХО…

    Reply
  9. veyron21

    (7) Поручик, Согласен, что у Хрусталевой описано все отлично, понятным языком и все такое. Но во-первых, под рукой у новичков ее учебник есть не всегда, а во-вторых про данную тему у нее написано довольно расплывчато. Надо дополнительно разбираться в особенностях синтаксиса компоновщика настроек как минимум.

    Reply
  10. O-lesya

    Большое спасибо автору ! Действительно для начинающих программистов -очень нужная вещь.Несколько дней на это убила,а все оказывается очень даже просто.Еще раз спасибо veyron21.

    Reply
  11. Новиков

    Мне кажется, нужно в настройках темы ставить некий тэг — новенький. Они тоже люди, и мы ими все были — но многие, например, это не хотят читать. И это, кстати, тоже понятно.

    В любом случае, автор — молодец.

    Reply
  12. echo77

    Только сегодня такое делал — все просто — разыменовываем КомпоновщикНастроек, ну и отладчик наше все.

    Автор, так же попробуйте на форме разместить табличное поле и в качестве источника данных указать КомпоновщикНастроек.Настройки.Отбор

    Reply
  13. babylon_5
    echo77 пишет:

    Автор, так же попробуйте на форме разместить табличное поле и в качестве источника данных указать КомпоновщикНастроек.Настройки.Отбор

    Ну зачем же так жестко-то?

    Reply
  14. pt_olga

    откровение походу для тех, кто работает с СКД первый день)))

    Автор, у Вас еще море открытий впереди!

    Reply
  15. php5

    Для новичков СКД отличный материал!

    Reply
  16. Alexez

    Отлично на основе данного отчета можно сделать что то свой, отличный шаблон который позволяет экономить время. Спасибо!Спасибо!Спасибо!Спасибо!Спасибо!Спасибо!Спасибо!Спасибо!Спасибо!Спасибо!Спасибо!Спасибо!

    Reply
  17. DragonAgo

    Для новичков как раз полезен данный материал!

    Reply
  18. V.Nikonov

    Хотя, для полноты статьи не мешало бы её подредактировать. Добавить примеры размещения других типов данных параметров, мотивация по размещению и т.п. Тогда получился бы полноценный обзор для начинающих… Ведь многие новички сохраняют подобные странички, как «Полезные советы».

    Плюсик — Авансом.

    Reply
  19. no_registration

    Хорошая информация.

    Reply
  20. extrim-style

    26 плюсов! за что?

    Reply
  21. McCoy77

    А просто вывести параметры СКД в форму разве не проще? И ни одной строчки кода не требуется. ИМХО начинающим программистам нужно давать оптимальное решение.

    Reply
  22. McCoy77

    (9) у Хрусталевой как раз это подробно описано

    Reply
  23. pasha_d

    Для тех, кто только разбирается с СКД — данная обработка будет очень-очень полезна)

    Reply
  24. Meson

    У кого нет времени изучать Хрусталеву, то статья как раз для них.

    (22) Если просто выводить параметры СКД на форму, ИМХО, как то это криво выглядит. Часто лучше вручную их вывести.

    Как вариант можно использовать управляемые формы.

    Reply
  25. Mshaydurov

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

    Reply
  26. McCoy77

    (25) Времени читать Хрусталеву нет, а время заниматься псевдонаписательством получается есть? Когда можно за 10 сек вынести настройки на форму? 🙂 Нелогично. Ну как общая информация по работе с настройками — статья полезная конечно, как предложение к реализации выноски параметров на форму — только вред для начинающих. По себе знаю: начнут параметры вручную на форме размещать по одному, писать тонну кода для обработки событий. Можно конечно, но не оптимально. А насчет «криво выглядит»… дело привычки наверное. Насчет УП согласен. НО! Придется опять же книжки читать 😉

    Reply
  27. MICK77
    McCoy77 пишет:

    А просто вывести параметры СКД в форму разве не проще? И ни одной строчки кода не требуется. ИМХО начинающим программистам нужно давать оптимальное решение.

    Оптимальное, но не всем пользователям это нравиться. Особенно тем кто перешел с 7.7, а этот вариант очень даже удобен. Автору+

    Reply
  28. Созинов
    Честно говоря, не понял в чём были затруднения у автора. Вещь довольно простая, делается после небольшого изучения свойств и методов СКД.

    Для начинающих иногда полезно, хотя можно и хрусталеву почитать, там все понятно расписано

    Оптимальное, но не всем пользователям это нравиться. Особенно тем кто перешел с 7.7, а этот вариант очень даже удобен. Автору+

    Полностью согласен.

    Reply
  29. babylon_5

    (25) А если все-таки почитать Хрусталеву… Таких «открытий» (да и заметок тоже) можно не один десяток сделать. Так что лучше таки найти время…

    Reply
  30. chikov

    Думаю, все-таки полезнее книжку почитать…

    Reply
  31. Attest

    Хочется скачать этот отчет! И побыстрее им воспользоваться. Автору по любому плюс. Новичкам любая информация полезна. Вот узнал что нужно почитать Хрусталеву!

    Как добавить параметр для отчета на форму, созданного на СКД? Чтобы было, как например в оборотно-сальдовой ведомости, выбор начала и окончания периода и, например, организации. В свое время, долгое время поисков не увенчалось успехом. После небольшого перерыва в разработке на 1С, попытки найти что-либо подобное, опять же не увенчались успехом. На форумах находил только стандартный код построителя отчета. Конечно, можно изменить и его, но для несложного отчета, когда требуется для удобства пользователя просто вынести реквизиты на форму, чтобы не залезать каждый раз в настройки отчета, менять стандартный код не требуется. Нужно только внести небольшие коррективы.

    Reply
  32. echo77

    ИМХО, отчет на СКД лучше создавать из шаблона типового отчета — что это такое можно почитать на ИТС в разделе Методическая поддержка8.1демонстрационные конфигурации…

    Reply
  33. ov1

    не работает в бухгалтерии предприятия 2.0.36.4

    Reply
  34. glek

    А шаблон типового отчета на ИТС-е уже не подходит?

    Reply
  35. kredko

    (25) Meson, Странно. В каком месте там криво выходит?

    Reply
  36. Meson

    (36) kredko, в управляемых формах, проще, лучше, красивее )))

    Reply
  37. zhenia74

    очень просто дорабатайте формирование отчета через скд программными средставами и там легко можете установить свои параметры

    Reply
  38. electronik

    Автору спасибо то что искал. Ато все както не получалось и не получалось. Как почитал разобрался сразу все заработало. Так держать продолжайте в том же духе.

    Reply
  39. Serge_ASB

    есть отчет в СКД.

    требуется программно (из настроек или элементов формы (переключатель) менять один параметр в условии:

    Reply
  40. Serge_ASB

    есть отчет в СКД.

    требуется программно (из настроек или элементов формы (переключатель) менять один параметр в условии:

    в оригинале

    ГДЕ
    ОтчетоИспользованияСтороннегоАвтотраспортаМаршрут.ВремяНачала >= &НачалоПериода
    И ОтчетоИспользованияСтороннегоАвтотраспортаМаршрут.ВремяНачала <= &КонецПериода
    И ОтчетоИспользованияСтороннегоАвтотраспортаМаршрут.Ссылка.Проведен
    И (ОтчетоИспользованияСтороннегоАвтотраспортаМаршрут.Ссылка.Договор.Техника <> 2
    ИЛИ ОтчетоИспользованияСтороннегоАвтотраспортаМаршрут.Ссылка.Договор = &Пустойдог)

    условие

    ОтчетоИспользованияСтороннегоАвтотраспортаМаршрут.Ссылка.Договор.Техника <> 2

    нужно по-возможности менять программно на

    ОтчетоИспользованияСтороннегоАвтотраспортаМаршрут.Ссылка.Договор.Техника = 2

    в отчетах «не СКД» это делалось разрывом текста и проверкой условия:

    Если ЭлементыФормы.ВидТехники=2 Тогда

    Запрос.Текст=Запрос.Текст+»

    | ОтчетоИспользованияСтороннегоАвтотраспортаМаршрут.Ссылка.Договор.Техника = 2″;

    иначе

    Запрос.Текст=Запрос.Текст+»

    | ОтчетоИспользованияСтороннегоАвтотраспортаМаршрут.Ссылка.Договор.Техника <> 2″;

    конецЕсли;

    Как такое реализовать в запросе СКД?

    Reply
  41. veyron21

    (41) Serge_ASB, Я не видел целиком ваш запрос, но я бы сделал такое следующим образом. В текст условия внести параметр с типом Булево, который будет переключать условие в самом запросе на то, которое вам нужно.

    Текст условия запросе изначально будет выглядеть так:

    <текст запроса>,

    ГДЕ ОтчетоИспользованияСтороннегоАвтотраспортаМаршрут.Ссылка.Договор.Техника = 2
    

    Вы же меняете условие на такое:

    Выбор Когда &Переключатель = Истина Тогда
    ОтчетоИспользованияСтороннегоАвтотраспортаМаршрут.Ссылка.Договор.Техника = 2
    Иначе
    ОтчетоИспользованияСтороннегоАвтотраспортаМаршрут.Ссылка.Договор.Техника <> 2
    Конец

    этот код вставьте в конструктор в поле «Условие». Параметр «переключатель» вынесите в СКД на форму через «Включать в пользовательские поля» и тогда ваш пользователь будет сам выбирать, какое условие ему задать.

    Если что-то непонятно — пишите. Буду рад помочь.

    Reply
  42. Serge_ASB

    (42)

    Включать в пользовательские поля — это где?

    Reply
  43. Serge_ASB

    Сделал именно так (42)

    Кроме этого, промучался с выносом параметра на форму.

    Решил добавлением элемента управления «Флажок» и

    указанием в процедуре обработки «ПриИзменении», как было описано здесь:

    http://forum.infostart.ru/forum14/topic53460/message589473/#message589473

    Reply
  44. veyron21

    (43) Serge_ASB, Это для управляемых форм. В конструкторе СКД на вкладке «Настройки отчета» правой кнопки мыши по параметру или по элементу отбора (отборы на вкладке «отбор»). И выбрать -> Свойство элемента пользовательских настроек и поставить галку «Включать в пользовательские поля». Если галка стоит, поле появится на форме отчета в верхней части автоматически. Работает в 8.2 в управляемом и обычном приложении , но отчет тогда должен быть на управляемой форме.

    Reply
  45. OrsoBear

    Желающих отправить к Хрусталевой полно.

    И ни одного желающего поделиться своим, более правильным примером решения.

    Тоже давно не пользовался параметрами компоновки, пришлось заехать домой за книжкой.

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

    Нужно более гибкое решение.

    Reply
  46. baracuda

    Простите великодушно, и где же Ваш, КомпоновщикНастроек.Настройки.Отбор???

    Пытаюсь сделать подобный отчет, но столкнулся с трудностями.

    Reply
  47. baracuda

    Ссори погорячился. Все получилось, только компановщик в свойствах появляется только после добавления на форму.

    Все окей.

    Reply
  48. dimongik

    Спасибо за статью! Мне, как начинающему, очень даже помогла!

    Reply
  49. tmixsam

    Спасибо очень пригодилось. Просто и доступно.

    Reply
  50. M.Nikitin

    (45) спасибо за пример -но как сделать, чтобы можно было не обязательно заполнять параметр — не выбрали организацию- получили данные по всем организациям ?

    Reply
  51. veyron21

    (51) M.Nikitin, Это делать уже сложнее. В СКД на последней вкладке, где настраиваются группировки и выводимые поля в отчет, внизу есть раздел «Отборы». Там, собственно, можно выбрать поля, по которым будет устанавливаться отбор. Вот только как их вывести на обычную форму сейчас уже не подскажу((( Уже давно работаю с управляемыми, а там это все автоматически ставится.

    Reply
  52. UserPro

    Просто +

    Reply
  53. MidoMido

    Спасибо автору. Для кого то просто, а кому то помогает)

    Reply
  54. elzetto

    (4)

    (27)В целом лучше книжки читать перед тем как лезть и что — то делать))) а по сути ломать))

    Reply

Leave a Comment

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