Рабочий стол администратора/программиста на управляемой форме




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

56 Comments

  1. Aleksey.Bochkov

    (0) Обработка однозначно полезная.

    Мелкое замечание — двуязычность сделана неудачно.

    Все-таки лучше использовать типовые средства для локализации строк (НСтр) и интерфейсов (синонимы на разных языках).

    Сейчас открываешь обработку в английской конфигурации — а там каша в интерфейсе.

    Если не секрет — почему код на английском? 🙂

    Reply
  2. Vladimir Litvinenko

    (1)

    Все-таки лучше использовать типовые средства для локализации строк (НСтр) и интерфейсов

    Да, применение НСтр было бы лучше. Руки переписать пока не дошли, но потом обязательно доработаю.

    Сейчас открываешь обработку в английской конфигурации — а там каша в интерфейсе.

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

    Если не секрет — почему код на английском?

    Честное слово, я свято чту традиции «низкого порога вхождения» в программирование на 1С и для бухгалтеров всегда пишу на русском 🙂 Но 1С вроде бы начинает заявлять о себе, как о международном решении. Может стоит хотя бы начать тренироваться писать код, понятный людям, живущим за пределами РФ и Узбекистана? 🙂 В чем была бы ценность Java или C++ если бы весь код для них был написан на украинском?

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

    Reply
  3. Aleksey.Bochkov

    (2) пример

    Reply
  4. Vladimir Litvinenko

    (3)

    Еще раз спасибо, что начали копать в этом направлении. Исправил и загрузил новый файл.

    Еще добавил иногда нужную возможность задавать ключи командной строки при запуске 1С:Предприятия от имени пользователя (см. картинку)

    Reply
  5. rasswet

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

    Reply
  6. rasswet

    для внешних файлов можно выводить отдельным столбцом время изменения? сделать сортировку по этом времени.

    Reply
  7. Vladimir Litvinenko

    (5) Пользователь для запуска на третьей вкладке также ищется по имени и по полному имени. Удобно когда известно только имя, фамилия или отчество. Забыл отметить это в описании.

    для внешних файлов можно выводить отдельным столбцом время изменения? сделать сортировку по этом времени

    Учту при доработке. Сортировки по времени изменения уже самому не хватает.

    Reply
  8. SYSokolov

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

    Reply
  9. Vladimir Litvinenko

    (8)

    Еще бы возможность комментарии дописывать к подключенным внешним файлам и папкам

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

    Можно сохранять комментарии к файлам в хранилище только если они были изменены, а в качестве ключа использовать полный путь к файлу. По идее это не превратит хранилище в мусорку, но проверку сохраненного значения придется все равно делать для каждого файла из списка. Это может заметно тормозить обновление списка файлов, особенно когда их несколько сотен.

    Reply
  10. rus128

    (9) а в текстовом csv-файле (по аналогии с descript.ion) в каждой папке? Имя файла — ключ, за ним через «;» — комментарий.

    Reply
  11. Vladimir Litvinenko

    (10) Это вариант. Достаточно даже одного файла в корне, чтобы не захламлять лишними файлами каталоги. Еще можно в сохраняемом реквизите формы (списке значений) держать соответствие полного пути к файлу (значения) комментарию (представлению). И удалять элементы из реквизита-списка, если при обновлении списка файлов не обнаружен файл с сохраненным путем. Оба способа позволят хранить комментарий не вызывая сильных тормозов при обновлении списка.

    Reply
  12. rayastar

    очень простая и функциональная вещь. давно просилась. +

    Reply
  13. Den_D

    Если бы было можно я бы больше плюсов поставил!

    Reply
  14. zelevova

    Круто. Жалко что только на управляемых формах. Есть еще в арсенале несколько старых конфигураций.

    Спасибо.

    Reply
  15. mulla1979

    Отличная разработка! Респект автору!!!

    Reply
  16. Avatar

    Очень удобно, спасибо!

    Reply
  17. Flashback1979SE

    зачетная обработка

    Reply
  18. bayce

    А на сколько это правильно запускать что либо от имени другого пользователя?

    Не уменьшает ли это доверие пользователей к системе???

    Reply
  19. ikekoval

    (18) bayce, Имея права администратора ты и так можешь всегда запустить приложение от имени любого пользователя, просто тут это автоматизированно.

    Обработка прекрасна! Выкачал бы ее на все sm, если бы работал на УФ =(

    Reply
  20. bayce

    добрый день!

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

    Здесь же на сколько я понял ты пароль не сбрасываешь?

    Reply
  21. Dzenn

    Шикарная вещь, спасибо. Я бы за такую денег брал, рублей 100 хотя бы

    Reply
  22. Vladimir Litvinenko

    (21) На Инфостарте в свободном доступе есть и более полезные для повседневной работы вещи. Если каждый начнет требовать копейку за мелкую разработку, то мы больше потеряем, чем приобретем. Гораздо важнее отзывы, помогающие найти и устранить ошибки.

    Reply
  23. Dzenn

    (22) другими словами, она очень полезная и приятная)

    Reply
  24. brunet

    Спасибо. Очень удобно использовать в управляемых формах.

    Reply
  25. AllexSoft

    Спасибо! Круто… за гифки в статье особое спасибо

    Reply
  26. gull22

    Перешел на УФ, даже не надеялся найти нечто подобное. Огромное спасибо автору.

    Reply
  27. gull22

    Вопрос. Заполнил закладку «Внешние файлы» по каталогам, часть внешних файлов удалил за ненадобностью через кнопку «Удалить», в настройках поставил галку для кнопки «Обновить». Нажал ее и вернул удаленные внешние файлы. Предлагаю подумать о сохранении списка на этой закладке при повторных открытиях Вашей обработки.

    Reply
  28. Vladimir Litvinenko

    (27) Надо будет подумать. Вкладка «Внешние файлы» предусматривалась как быстрый аналог команды «Файл -> Открыть» и сейчас предполагает работу с каталогами, в которых находятся только файлы-инструменты для повседневной работы. Если сделать возможность убирать из списка файлы так, чтобы при обновлении списка они не добавлялись снова, то придется предусматривать и функцию возврата этих файлов в список.

    Reply
  29. gull22

    Как говорится, гулять так гулять!

    В БП 3.0 в динамическом списке при выборе документов нельзя установить видимость поля = Комментарий. Желательно это поле видеть.

    Если будете развивать свой проект хотелось бы видеть не только документ но и его движения (как это реализовано http://infostart.ru/public/15317/)

    Успехов в работы для нашего счастья 🙂

    Reply
  30. Vladimir Litvinenko

    (29) Значит поле «Комментарий» — это строка неограниченной длины.

    Скрытие поля «комментарий» в данный момент — техническая необходимость. Дело в том, что этот универсальный список изначально предназначался только для того, чтобы иметь возможность проводить отборы по реквизитам табличных частей. Для проведения отборов по реквизитам табличных частей в запросе динамического списка приходится проводить группировку по реквизитам основной таблицы, а группировка по полям неограниченной длины невозможна.

    Метод кстати очень интересный и описан здесь: http://infostart.ru/public/237017/. К сожалению этот метод не позволяет устанавливать отборы при работе в обычном интерфейсе и интерфейсе «Такси» на 8.3. А комментарий видеть очень хочется, в этом Вы правы 🙂 Поэтому при доработке либо придется отказаться от отборов по реквизитам ТЧ, либо дать возможность пользователю выбирать, хочет он видеть реквизиты неограниченной длины, либо проводить такие отборы.

    Спасибо за предложения по развитию обработки. Надеюсь, что в ближайшие дни появится на это время 🙂

    Reply
  31. dufrein

    Огромное спасибо, ценная обработка

    Reply
  32. dufrein

    Спасибо, статья оформлена на ура

    Reply
  33. break

    здоровская, понравилась!

    Reply
  34. break

    только не хватает отображения отчетов и обработок по справочнику «Внешние отчеты и обработки»

    Reply
  35. dufrein

    Для УПП 1.3 не подходит, пытается открыться, затем ничего не происходит(

    Reply
  36. krv2k

    (30)

    Скрытие поля «комментарий» в данный момент — техническая необходимость. Дело в том, что этот универсальный список изначально предназначался только для того, чтобы иметь возможность проводить отборы по реквизитам табличных частей. Для проведения отборов по реквизитам табличных частей в запросе динамического списка приходится проводить группировку по реквизитам основной таблицы, а группировка по полям неограниченной длины невозможна.

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

    ПОДСТРОКА(Документ.Комментарий, 1, 1000)
    К сожалению этот метод не позволяет устанавливать отборы при работе в обычном интерфейсе и интерфейсе «Такси» на 8.3.

    В 8.3 отбор по ТЧ встроен в платформу, ничего дописывать не нужно.

    Reply
  37. softgarant

    Кто то что то похожее под обычные формы видел?

    Reply
  38. ks2003

    для обычных форм:

    http://infostart.ru/public/160397/

    Reply
  39. mikhailovaew

    запомню публикацию на будущее) надеюсь, автор не планирует забирать обработку из бесплатного доступа

    Reply
  40. kenza

    После обновления версии платформы до 8.3.5 стала зависать намертво при попытке входа под другим пользователем. До этого работала как часы. Не подскажете в чем может быть проблема? Управляемые формы, конфигурация не типовая.

    Reply
  41. kenza

    Вопрос, снят. По всей видимости проблема в самой базе ( Буду делать тестирование и исправление, может поможет

    Reply
  42. sword444

    Автор спасибо за инструмент

    Reply
  43. jacknk

    Изменение раскладки через COMОбъект реализовали?

    Reply
  44. sertak

    Спасибо, удобная замена команде Все функции.

    Reply
  45. leosoft

    Скачал, спасибо. Не понял — что нового в версии отт 18.05.2018?

    Заметил проблемку — выставил группировку по регистру накопления,

    при выборе другого регистра группировка осталась? Но это ничего,

    а при выборе другого регистра, у которого нет такого реквизита прошел

    вылет по ошибке.

    Reply
  46. Vladimir Litvinenko

    (46) В обновлении только другая строка запуска 1С под пользователем. И в обработчике «ПриЗакрытии» нет обращений к серверу, если происходит закрытие всего предложения. Не стал обозначать эти незначительные изменения в публикации, просто заменил файл.

    Reply
  47. Alexsur

    Спасибо автору!

    Reply
  48. Vladimir Litvinenko

    (50) Надо было на немецком? «Универсальные» инструменты с открытым исходным кодом, написанные на языке отличном от английского, являются псевдоуниверсальными. Особенно если созданы для IT-специалистов, а не бухгалтеров ))

    Reply
  49. Vladimir Litvinenko

    (52) Хотелось бы изменить описанную Вами ситуацию. Помимо Инфостарта есть еще GitHub, GitLab и т.д. Также рекомендую следить за тенденциями и действиями фирмы 1С: https://hh.ru/employer/3271505.

    Reply
  50. o.nikolaev

    Отличная штука.

    Reply
  51. o.nikolaev

    🙂 Но динамический список регистра бухгалтерии — без видов и значений субконто.

    Reply
  52. Светлый ум

    Интересная — по сути консоль администратора +1

    Reply
  53. Tolpinski

    Динамический список не все поля выводит?

    Взял документ ВводОстатков в ЕРП, а Комментария нет

    Reply
  54. Tolpinski

    (57)

    If Field.Type.ContainsType(Type(«TypeDescription»)) Or ( Field.Type.StringQualifiers.AllowedLength = AllowedLength.Variable And Field.Type.StringQualifiers.Length = 0 And Field.Type.ContainsType(Type(«String»)) ) Then

    Continue;

    EndIf;

    Не выводит строки переменной длинны и длинной 0 🙁

    Reply
  55. Tolpinski

    (58) Слегка доработал отчёт, пока работает

    Reply
  56. mineralka

    Без обид, но помойму слишком громоздкая! Слишком много кнопочек и галочек! А в целом за труд 5+ !!!

    Reply

Leave a Comment

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