<?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='\
Еще не смотрел, но тема больная. Плюсик ставлю авансом
Вот тоже хотел свой динамический интерфейс развивать в этом направлении. Слушай вот еще бы подумать в сторону назначения прав для групп пользователей, было бы очень чудесно!
если быть точнее для справочника «Группы пользователей»
а вот в функции Функция ЕстьДоступ(ТипДоступа,Пользователь,Метаданные)
вместо
Возврат РезультатЗапроса.Парам;
надо наверно написать
Возврат РезультатЗапроса[0].Парам;
у тебя же РезультатЗапроса — это таблица значений
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
или я не прав?
вообщем довести бы это дело…
ээх по моему маловато событий у подписок
(4) Прав. Исправил
уже хорошо, чо насчет групп? 🙂
Похоже сам делал…
http://infostart.ru/projects/4262/
(9) дак в том то и дело, что
«В те формы справочников, гду нудно запретить открытие и т.д нужно вставить в процедуру «ПередОткрытием» глобальну процедуру:»
Вот если б можно было на все окна, по контексту, повесить подписку на событие «ПередОткрытием» а не писать в каждом справочнике и документе, тогда бы было гут…
(10)ага..
базу можно пропадчить.. (выгрузить все модуля в текстових, обработкой пербрать, вставить все что нужно, и загрузить обратно)..
Нечто подобное у меня на 7-ке.
Куда выположить скрин?
(11) ну это как самое простое решение просто, взять и скопом сделать. А потом предупредить строго настрого всех программистов, чтобы в каждую форму вставляли пару строк 🙂
(11) ну это дело принципа..
(10) возьми редактировать, там есть картинки — там и добавляеш…
Добавил возможность установки ограничений по группам пользователей. Исправил несколько багов в обработке
В подписках очепятки или так задумано?:
ДоступП(р)ометкаУдаления
ДоступСправочникП(р)ометкаУдаления
(15) а не хочешь сделать, чтобы взял создал чистую базу, загрузил с полной заменой твою конфу (а не объединять с типовыми), и чтоб можно было потыкаться.
Думаю любой здавомыслящий чел вряд ли станет ставить на живую базу такие штуки.
А то когда выскакивает на чистой базе:
Пользователь = <<?>>глЗначениеПеременной(«глТекущийПользователь»);
сразу всякое желание юзать ЭТО пропадает.
Я понимаю, это быстро лечится, но вот оно мне надо?
Или дт-шник чтоли выложи с примером
(17) это духи стырых версий типовых конфигураций
Назначение прав по пользователям/должностям
http://infostart.ru/projects/4527/
(19) Да видел я и твои деяния, но по подпискам мне кажется более логичным, хоть у них и маловато событий.
В общем, что могу сказать: что одно что другое что третье — сплошное «можно делать так», ну то есть ни одной полнофункциональной версии. Идеи то хорошие, только бы до ума довести..
(20) Согласен. Если внимательней присмотреться, то можно увидеть что все что можно было прицепить к подпискам реализовано подписками 🙂
Мой вариант взят с рабочей конфигурации, но так она далека от типовой, никак руки не дойдут допилить до какой нибудь полнофункциональной версии.
(21) Как руки дойдут, отпишись 🙂
решение по подпискам на открытие формы найдено не так давно — это ВК, генерирующая события при открытии дочернего окна 1С, она передает заголовок окна числом или hwnd — процедуа ЕДИНСТВЕННОГО внесенного в конфу доп.модуля получает по заголовку окно и собственно форму, затем через DOMDocument определяется основной реквизит формы и все остальные.
Результат — вы получаете форму объекта (либо любую другую) перед открытием (по сут пользователю можно запретить открыть даже калькулятор), получаете основной реквизит формы, а он может быть СправочникСписок или же ДокументОбъект, ну дальше дело техники — прикрутить сюда какой нибудь справочник с правами пользователей.
А вообще до полноценной 8.2 с ее суперкомандным интерфейсом уже недалеко, поэтому я думаю скоро это все станет не актуально.
(23) и что же это за ВК если не секрет
мы заказывали ее в НИИ Автоматизации у программеров на шарпе при автоматизации одного холдинга. А вообще нечто подобное (в зачатке) я встречал здесь на ИС.
А как, мне интересно при выводе в отчет для пользователя фильтруются контрагенты?
1с 8.1 УТ 10.3.7.8
ошибка
{Обработка.РедактированиеДоступаКОбъектам.Форма.Форма(28)}: Метод объекта не обнаружен (ГруппыПользователя)
Запрос.УстановитьПараметр(«ГруппыПользователя»,ДоступКОбъектам.ГруппыПользователя(ВыбранныйПользователь));
P.S.S. Ограничение «Просмотр» не реализованно еще.
Так как еще событие перед открытием или открытие отсутствует в 1С, предлагаю вот эту обработку парсинг модулей:http://infostart.ru/public/64952/?sphrase_id=2227
Можно по выбору вида формы подставить однотипно процедуру, которая будет проверять открытие формы. Я уже реализовавыл такое.
Один минус, жесткое вмешательство в конфигурацию… вынести отдельно пока никак.
Имеется решение открытия большей части форм элементов, это вмешательство в одну процедуру:
Общий модуль: МеханизмНумерацииОбъектов
Процедура: УстановитьДоступностьПоляВводаНомера
При открытии почти всех типовых документов и справочников, ссылается на эту процедуру, с передачей параметра «ФормаОбъекта».
Так что пока-что самое удачное решение выявления открытия элемента базы.