Подсистема сохранения и восстановления настроек динамических списков




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

40 Comments

  1. artbear

    Хорошая работа. Плюсую.

    Reply
  2. iov

    Отличное оформление- грамотный подход к созданию подсистемы — однозначно плюс в карму!

    Reply
  3. KliMich

    Грамотный подход. Такого в БСП (Библиотеке Стандартных Подсистем) не видел!

    Reply
  4. Noy12

    Неплохо сработал. Уважуха

    Reply
  5. Поручик

    (0) Чтоб мне так жить! Отличная вещь, даже не глядя. В первый же понедельник завнедрю в рабочий проект.

    Reply
  6. Georgsius

    Спасибо, отличная работа!

    Reply
  7. Vikt0r0vna

    Здорово! Испробую!

    Reply
  8. dem_mad

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

    Reply
  9. ander_

    Молодец, поклал в копилку. Спасибо.

    Reply
  10. Поручик

    Всегда самого напрягало отсутствие сохранить настройки списка.

    Reply
  11. dim0n_la

    Подскажите, есть ли возможность сбросить все настройки списка. Так сказать вернуться к стандартной настройке, такой как она задана в конфигураторе. Очень интересна именно такая возможность.

    Reply
  12. esodin

    (11) dim0n_la,

    Кнопки «Сбросить все настройки» нет. Но возможность сбросить все настройки есть: создайте настройку «без настроек» и восстанавливайте ее при необходимости.

    Меня смущает только «… как она задана в конфигураторе.». Возможно, вы в конфигураторе задаете настройки, которые зависят от каких-то параметров. Например, при открытии формы заказов в форму передаете параметр Контрагент, форма открывается с программно установленным отбором по этому контрагенту. В таком случае придется отказаться от автовосстановления настройки для того, чтобы работал ваш механизм отбора.

    Reply
  13. dim0n_la

    (12)

    esodin пишет:

    создайте настройку «без настроек» и восстанавливайте ее при необходимости.

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

    Нужен именно такой вариант.

    Никаких параметров не передается, просто в конфигураторе я настраиваю, к примеру, цвет строк проведенных документов зелененькими. Пользователи работают так 2 дня, соответственно эта настройка у них сохранилась, и каждый раз восстанавливается предприятием сама. Но теперь я ещё добавляю в конфигураторе настройку, которая подсвечивает все помеченные на удаление — красненьким, обновляю, но у пользователей при новом входе ничего не обновилось. Для того чтобы настройки применились, им нужно каждому у себя удалить всё оформление, закрыть форму и снова открыть. Неудобно!

    Reply
  14. esodin
    Reply
  15. dim0n_la

    (14)Большое спасибо за развернутый ответ. И первый и второй вариант вполне имеет право на жизнь. Уже рассматривал для себя их оба. Думаю второй вариант мне больше подходит, но не полностью, а только в части возможности распространения настройки на всех пользователей, чтобы они могли ее увидеть и при желании переключиться.

    Reply
  16. esodin

    (15)

    Хорошо. Сделаю второй вариант — настройки для всех пользователей и для группы пользователей. Выложу как следующую версию. Ориентировочно — на ближайших выходных.

    Reply
  17. roha

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

    Есть следующие вопросы, можна ли сделать так чтоб сохранялися так же настройки колонок (видимость,порядок) с возможностью востановления другим пользователем (то что изменяется через «Изменить Форму»), хть ети настройки и сохраняет платформа но они часто вылетают + есть необходимость копировать настройки колонок и расположения другим пользователям

    Reply
  18. EgorGGG

    Ребята!

    Подсистема реально нужная!

    Но не хотелось бы снимать конфигурацию с поддержки, можно ли «заставить» платформу сохранять хотя бы последний вариант динамического списка стандартными способами?

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

    Reply
  19. koka

    Хорошая, удобная доработка. Однозначно плюс. Только желательно в начале публикации указать, что заточена для управляемого приложения, чтобы коллеги сразу понимали ограничения.

    Reply
  20. YPermitin

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

    Reply
  21. friend0

    Отличная вещь! Начинаю воевать с управляемыми формами — очень помогло. Вот только столкнулся с одной проблемой:

    Делаю навороченную форму списка справочника. В ней у меня несколько динамических списков — один основной, и парочка информационных. Для основного списка использую командную панель формы, для информационных вообще не делаю, чтоб не загромождать. И вот вопрос — как мне вытащить кнопки сохранения/восстановления на панель формы? Тыкался-тыкался ничего не придумал, кроме как допилить функцию унсСервер.ПриСозданииНаСервере третьим параметром, чтоб добавляло в панель формы даже если динамический список не один. Это, конечно, коряво, но работает, если во втором параметре один элемент.

    А вообще, наверное, надо будет массив на таблицу значений заменить и в ней указывать добавлять ли на командную панель формы и в контекстное меню. Насколько я понимаю, сейчас контекстное меню вообще не используется? А то вещь-то удобная.

    Reply
  22. Stitchi

    Странно, что публикация не доступа для скачивания…

    Reply
  23. WalterMort

    Платформенная фишка:

    УправляемаяФорма.ПриСохраненииДанныхВНастройкахНаСервере (ManagedForm.OnSaveDataInSettingsAtServer)

    УправляемаяФорма (ManagedForm)

    ПриСохраненииДанныхВНастройкахНаСервере (OnSaveDataInSettingsAtServer)

    Синтаксис:

    ПриСохраненииДанныхВНастройкахНаСервере(<Настройки>)

    Параметры:

    <Настройки>

    Тип: Соответствие.

    Настройки формы.

    Описание:

    В обработчик передается объект-соответствие, в который будут сохраняться настройки. В объекте уже заполнены значения реквизитов, которые требовалось сохранять.

    В обработчике можно добавить в объект настроек какую-либо информацию. Например, поместить в реквизит настроек отбор. <========== ЧИТАТЬ ТУТ.

    Reply
  24. AleksSF

    Не совсем понятно как увязывается справочник Пользователи со встроенным списком пользователей. Их нужно вручную дублировать или я что-то пропустил

    Reply
  25. mc1c80

    Спасибо большое. Очень помогло.

    Reply
  26. kenza

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

    Reply
  27. zba

    Блин вообще уважуха тебе, прям нуу прям вообще, сэкономил мне н-ое количество часов, а то и дней моей жизни.

    Reply
  28. ture

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

    База в почти 2 тб на 500 активных юзаков вешается.

    Вылезли все глупости с ростом активных юзверей.

    этот «разработчик» приоткрытии ставит отборы, которые идут следом за отборами присозданиенасеревре, т.е. база колбасит дважды.

    этот «разработчик» навязывает свои «последние» отборы автоматом, а глупые зверьки и без того боятся и не понимают программу. это все надо вырубать, т.к. последние отборы часто бесполезны, т.к. зверьки работают во вкладках УФ, а вот нагрузка отборов мимо индексов, которую надо будет сразу после открытия зверьку менять, нагружает сервак до нельзя.

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

    Reply
  29. AndreyS55

    Отличная подсистемка, автору + за идею и исполнение.

    Reply
  30. AndreyS55

    (29) ture, и что что пришлось переписывать? Я тоже немного подработал напильником под себя, и оптимизировал. Не вижу ни одной причины писать «разработчик» в кавычках. Тем более подсистема бесплатная.

    Reply
  31. mrm1212

    Кто-нибудь знает, есть ли что-то похожее с сохранением видимости и порядка полей динамического списка???? очень нужно!

    Reply
  32. lefthander

    (32)В свойствах динамического списка есть Автоматическое Сохранение Пользовательских настроек

    СП

    ДинамическийСписок (DynamicList)

    АвтоматическоеСохранениеПользовательскихНастроек (AutoSaveUserSettings)

    Использование:

    Чтение и запись.

    Описание:

    Тип: Булево.

    Управляет автоматическим сохранением пользовательских настроек.

    Истина (значение по умолчанию) — пользовательские настройки динамического списка автоматически сохраняются при закрытии формы и автоматически загружаются при открытии формы, содержащей данный список.

    Доступность:

    Тонкий клиент, веб-клиент, сервер, толстый клиент.

    Reply
  33. mrm1212

    (33)

    данный список.

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

    Reply
  34. Xershi

    (34) настрой как надо в предприятии и скопируй настройку нужным пользователям.

    Reply
  35. mrm1212

    (35)

    и скопируй

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

    но, похоже, нет возможности получить пользовательские настройки, которые делают пользователи в форме команды «Изменить форму» в УФ. Есть возможность управлять свойством «Видимость» для поля, но оно может отличаться от того что установит пользователь. вот и думал что можно перехватывать целиком настройки, которые пользователь сделал и положить их в регистр сведений «Сохраненные настройки» и затем можно было бы копировать пользователям.

    Reply
  36. lefthander

    (36)Администрирование — Настройки пользователей — Персональные настройки пользователей — есть два пункта

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

    Это для БП 3.0

    Reply
  37. Xershi

    (36) все это есть. Если типовая то это базовый функционал, если самописка, то на ИС есть обработки и по копированию.

    У меня только по очистке:

    https://infostart.ru/public/635729/

    Reply
  38. mrm1212

    (38)

    Сделана в УПП обработка на УФ, поэтому нет механизмов типовых для сохранения настроек управляемых форм.

    Reply
  39. Xershi

    (39) качайте тогда готовую обработку или сами код напишите, ссылку я вам дал с чего начать!

    Reply
  40. mrm1212

    (40)

    Спасибо! вот пишу щас под свою задачу!

    Reply

Leave a Comment

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