<?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='\
заюзал у себя в конфиге.
+1
товарищ умолчал о следующем 😉
для восстановленния вида списка — надо в процедуре ПриОткрытии)_
вызвать процедуру установки видимости колонок с параметром для восстановления.
..
пока только 2 бяки нашел:
1. надо задавать имя для сохранения настроек видимости вне базы — т.е. писать его вручную…
если где=то случаем написал ФормаСписка для справочника т ФормаСписка дляЖурнала — при восстановлении — ну понятно что будет…
2. не удается задать порядок колонок!!
..чуток причесал внешний вид — обработка отличная.
автор — молодец.
Спасибо за оценку.
Ну, «умолчания», это для «посвященных». Там есть описание параметров процедуры, перемещаемой в глобальный модуль (по третьему варианту реализации). Для тех, кому интересно чтение, в общем. 🙂 А в «Дополнительно» не хотелось перегружать текстом.
По бякам.
1. Имя для сохранения настроек… Можно подумать, как его определить для неизвестной формы. Форма.Заголовок() не потянет… Имя по составу колонок тоже м.б. не уникальным. Ладно.
2. Э… порядок колонок на форме списка? Или в обработке? В обработке это добавить пару кнопок. А на форме списка ИМХО, нельзя. Только Форма.<ЭлементДиалога>.Видимость() и Форма.<ЭлементДиалога>.Заголовок().
работаю над пп 1 и 2 — сильно их не хватает…
я сначала сунулся — вещь..! колонки попередвигал — не оработает ;-.0
потом разобрался…
фейс тока немного переточил.. когда много мелких кнопариков в одну линию — они визуально рассыпаются.. неотровненными кажутся…
п.1 решается формексом.
т.о. между сеансами можно идентифицировать сохраненные настройки
п.1 сделал без формекса, счас выложу. Имя формы = Строка-объединение колонок списка, в общем примерно тоже самое, что и ВСтрокуСРазделителями(СписокРеквизитовФормы). Правдо, «уникальность» для форм с одинаковым набором колонок под вопросом, но таких будет 1% (одинаковый состав = ИМХО, одинаковые требования видимости), и, взамен «удобности не ввода идентификатора формы» пойдет.
По п.2 я понял, тебя смутила кнопка «сортировка». Ну, ее добавил чисто для удобства, — сортировка по алфавиту, помеченные позиции в начало списка, — удобно, если реквизитов, эдак, на несколько «листаний» списка. Да и по описанию — только видимость и заголовки.
п.1 согласен — красиво сообразил.
а вот местами менять…
ИМХО, первое, что пришло на ум по п.2 — это то, что форма списка будет состоять из одних текстовых эл-тов диалога, обращающихся к одной и той же функции с одним параметром — номером колонки. Ну, а из нее возвращать, например, значение списка под тойже строкой. Сортируем список — меняется порядок колонок. ИМХО, коряво это, да и тормозить должно.
нет, это неправильно как-то…
Вот! надо сделать как в штатной 1Сной — параметр/закладка «Активизировать при открытии»
Можно кнопку «Сохранить» просто переименовать в «Набор активизируемых колонок при открытии». Или же сделать встроенный список сохраняемых настроек. В принципе, есть смысл, т.к. счас настройки едины для всех пользователей, а будут: «Для ввода», «Для просмотра», «Общие реквизиты» и т.д.
ПолныйТипОбъекта()
FullObjectType()
Синтаксис:
ПолныйТипОбъекта()
Назначение:
Возвращает полный тип объекта, которому принадлежит расширяемая форма.
Пример:
ФормаРасш = СоздатьОбъект(«РасширениеФормы»);
ФормаРасш.УстановитьФорму(Форма);
Сообщить(ФормаРасш.ПолныйТипОбъекта());
// выводит строку вида: Справочник.Тестовый.ФормаСписка.ДляВыбора
…
м.б. имеет смысл использовать данную возможность для формирования уникального ИДА (как вариант) — обсуждали ниже
Не обрабатываются текстовые колонки в таблиичной части формы документа.
Почему? можно ли это поправить?
Примерно тоже самое обсуждалось здесь:http://www.1cpp.ru/forum/YaBB.pl?num=1176878184
http://openconf.1cpp.ru/beta/artbear/1cpp_classes.rar
http://www.1cpp.ru/files/nightbuild.zip
http://dorex.ru/files/?formex_t.zip
http://infostart.ru/projects/602/
Если влом читать, то скажу, что всё сделано в FormEx. В очередной раз направляю тебя в «Репозитарий классов 1С++ в единой конфе»
Для нормальной работы конфы нужны три компоненты: 1с++, FormEx и RWidjets. Скачать их можно соответственно:
Сергей, добрый день. Как не обрабатываются? Сделал по второму варианту, все как описано, обрабатывает. Пожалуйста, опиши проблему точнее.
хочется с минимумом сторонних привлечений.
спсб. качну свежее — буду смотреть..
Сорри, невнимательно прочитал..
пятую»);
ОткрытьФорму(«Обработка.ColumnVisibilityInForm»,Контекст); ОткрытьФорму(«Обработка.ColumnVisibilityInForm»,»Здесь_должны_быть_идентификаторы_текстовых_колонок_через_за
.. а другого решения получения колонок (не реквизиттов!) МЧ дока — нет…?
через попытку перебирать все известные комбинации букв :))) ;
унифицировать идентификаторы текстовых колонок в конфиге, типа «Ид_ТекстКол##», тогда перебирать придется только 100 вариантов;
или обращаться к формексу
ок.
пока устроит так как есть.
Заюзал для манагеров в одной конторе — а то у них там артикулов море… Посмотрим, что скажут… И мысль даже родилась 😉 как это улучшить…
полет нормальный…