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




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *