Видимость и заголовки колонок формы списка




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

21 Comments

  1. CheBurator

    заюзал у себя в конфиге.

    +1

    товарищ умолчал о следующем 😉

    для восстановленния вида списка — надо в процедуре ПриОткрытии)_

    вызвать процедуру установки видимости колонок с параметром для восстановления.

    ..

    пока только 2 бяки нашел:

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

    если где=то случаем написал ФормаСписка для справочника т ФормаСписка дляЖурнала — при восстановлении — ну понятно что будет…

    2. не удается задать порядок колонок!!

    ..чуток причесал внешний вид — обработка отличная.

    автор — молодец.

    Reply
  2. Shaman100M

    Спасибо за оценку.

    Ну, «умолчания», это для «посвященных». Там есть описание параметров процедуры, перемещаемой в глобальный модуль (по третьему варианту реализации). Для тех, кому интересно чтение, в общем. 🙂 А в «Дополнительно» не хотелось перегружать текстом.

    По бякам.

    1. Имя для сохранения настроек… Можно подумать, как его определить для неизвестной формы. Форма.Заголовок() не потянет… Имя по составу колонок тоже м.б. не уникальным. Ладно.

    2. Э… порядок колонок на форме списка? Или в обработке? В обработке это добавить пару кнопок. А на форме списка ИМХО, нельзя. Только Форма.<ЭлементДиалога>.Видимость() и Форма.<ЭлементДиалога>.Заголовок().

    Reply
  3. CheBurator

    работаю над пп 1 и 2 — сильно их не хватает…

    я сначала сунулся — вещь..! колонки попередвигал — не оработает ;-.0

    потом разобрался…

    Reply
  4. CheBurator

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

    Reply
  5. CheBurator

    п.1 решается формексом.

    т.о. между сеансами можно идентифицировать сохраненные настройки

    Reply
  6. Shaman100M

    п.1 сделал без формекса, счас выложу. Имя формы = Строка-объединение колонок списка, в общем примерно тоже самое, что и ВСтрокуСРазделителями(СписокРеквизитовФормы). Правдо, «уникальность» для форм с одинаковым набором колонок под вопросом, но таких будет 1% (одинаковый состав = ИМХО, одинаковые требования видимости), и, взамен «удобности не ввода идентификатора формы» пойдет.

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

    Reply
  7. CheBurator

    п.1 согласен — красиво сообразил.

    а вот местами менять…

    Reply
  8. Shaman100M

    ИМХО, первое, что пришло на ум по п.2 — это то, что форма списка будет состоять из одних текстовых эл-тов диалога, обращающихся к одной и той же функции с одним параметром — номером колонки. Ну, а из нее возвращать, например, значение списка под тойже строкой. Сортируем список — меняется порядок колонок. ИМХО, коряво это, да и тормозить должно.

    Reply
  9. CheBurator

    нет, это неправильно как-то…

    Reply
  10. CheBurator

    Вот! надо сделать как в штатной 1Сной — параметр/закладка «Активизировать при открытии»

    Reply
  11. Shaman100M

    Можно кнопку «Сохранить» просто переименовать в «Набор активизируемых колонок при открытии». Или же сделать встроенный список сохраняемых настроек. В принципе, есть смысл, т.к. счас настройки едины для всех пользователей, а будут: «Для ввода», «Для просмотра», «Общие реквизиты» и т.д.

    Reply
  12. CheBurator

    ПолныйТипОбъекта()

    FullObjectType()

    Синтаксис:

    ПолныйТипОбъекта()

    Назначение:

    Возвращает полный тип объекта, которому принадлежит расширяемая форма.

    Пример:

    ФормаРасш = СоздатьОбъект(«РасширениеФормы»);

    ФормаРасш.УстановитьФорму(Форма);

    Сообщить(ФормаРасш.ПолныйТипОбъекта());

    // выводит строку вида: Справочник.Тестовый.ФормаСписка.ДляВыбора



    м.б. имеет смысл использовать данную возможность для формирования уникального ИДА (как вариант) — обсуждали ниже

    Reply
  13. CheBurator

    Не обрабатываются текстовые колонки в таблиичной части формы документа.

    Почему? можно ли это поправить?

    Reply
  14. JohnyDeath

    Примерно тоже самое обсуждалось здесь: http://www.1cpp.ru/forum/YaBB.pl?num=1176878184

    Если влом читать, то скажу, что всё сделано в FormEx. В очередной раз направляю тебя в «Репозитарий классов 1С++ в единой конфе» http://openconf.1cpp.ru/beta/artbear/1cpp_classes.rar

    Для нормальной работы конфы нужны три компоненты: 1с++, FormEx и RWidjets. Скачать их можно соответственно:

    http://www.1cpp.ru/files/nightbuild.zip

    http://dorex.ru/files/?formex_t.zip

    http://infostart.ru/projects/602/

    Reply
  15. Shaman100M

    Сергей, добрый день. Как не обрабатываются? Сделал по второму варианту, все как описано, обрабатывает. Пожалуйста, опиши проблему точнее.

    Reply
  16. CheBurator

    хочется с минимумом сторонних привлечений.

    спсб. качну свежее — буду смотреть..

    Reply
  17. CheBurator

    Сорри, невнимательно прочитал..

    ОткрытьФорму(«Обработка.ColumnVisibilityInForm»,Контекст); ОткрытьФорму(«Обработка.ColumnVisibilityInForm»,»Здесь_должны_быть_идентификаторы_текстовых_колонок_через_за­пятую»);

    .. а другого решения получения колонок (не реквизиттов!) МЧ дока — нет…?

    Reply
  18. Shaman100M

    через попытку перебирать все известные комбинации букв :))) ;

    унифицировать идентификаторы текстовых колонок в конфиге, типа «Ид_ТекстКол##», тогда перебирать придется только 100 вариантов;

    или обращаться к формексу

    Reply
  19. CheBurator

    ок.

    пока устроит так как есть.

    Reply
  20. CheBurator

    Заюзал для манагеров в одной конторе — а то у них там артикулов море… Посмотрим, что скажут… И мысль даже родилась 😉 как это улучшить…

    Reply
  21. CheBurator

    полет нормальный…

    Reply

Leave a Comment

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