<?php // Полная загрузка сервисных книжек, создан 2025-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='\
за литературный стиль сильно не бейте, писал на коленке, да и вообще я писать статьи не умею…
За литературный не буду, но, раз уж мы тут делимся опытом и знаниями, на всякий случай ссылочкой поделюсь, пригодится 🙂http://school-assistant.ru/?predmet=russian&theme=glagoli_sovershennogo_I_nesovershennog o_vida
(2) sound,
🙂 почитаю как то на досуге…
я стремился в статье передать идею
мысль была и пропала )
Хотелось бы добавить, что если сделать не балансовое измерение с типом данных «ПланСчетовСсылка.Хозрасчетный», тогда можно накладывать ограничения на конкретные счета.
(1) стиль не смущает, а вотhttp://tsya.ru почитать очень советую 😉
привязались вы к этому слову «стремятся». исправил ошибку 🙂
Семь комментариев — и всё ни о чем!
ИМХО такое ограничение будет не вредным только для сотрудников, которые с зарплатой даже в корреспонденции не пересекаются. Иначе часть «своих» движений они не увидят… да и записать не смогут.
(9) Valerich,
все зависит как наложить ограничение… вполне достаточно это сделать только на чтение, тогда записывать можно будет без проблем… это может быть актуально для разнесения банка. А что касается «не будут видеть своих движений», то тут я не понял вопроса… пользователи не будут видеть всех движений с любыми корреспонденциями по счету учета ЗП. А этого то мы и добивались )
все же я больше склоняюсь к мысли, что ограничения накладывать надо на разделы учета, в которые входит несколько счетов. Так будет и проще и логичнее, чем если это делать для каждого счета. Правда для каждого счета ограничение более гибче
(10) гм… а как тогда будет выглядеть, скажем, карточка своего счета или отчет по проводкам?
в них-то часть проводок будет отсутствовать… хотя итоги и могут быть правильными
ну и про быстродействие не надо забывать. Эксперименты были?
(12) Valerich,
конечно были, я таким образом накладывал ограничение на счет учета ЗП.
Карточка счета и отчет по проводкам будут показывать движения без учета движений по ЗП и что самое главное, итоги будут без учета проводок по ЗП. Это и есть главное отличие от технологии предложенной в статье на которую я ссылаюсь.
По быстродействию мне сложно сказать, насколько RLS в принципе влияет на производительность, но как видите, запрос на ограничения супер простой, без соединений, из чего можно сделать вывод, что производительность не должна упасть
А не проще убрать аналитику с 66 счета вообще… Доделать отражение, что бы только общая сумма в проводки попадала. Общую сумму пусть все бухгалтера видят… А вот к регистру накопления «Взаиморасчеты с работниками орг.» доступ ограничить. Конечно возникает проблема с учетом развернутого сальдо (в отчете «Баланс» например), но ее можно как-то решить. Мы так решили проблему секретности с зарплатой и займами…
(14) erem,
ну вот видите, всеже проще сделать так как описано в статье, что бы не придумывать ,как решать нюансы, это и была основная задача
Как решаете проблему распухания таблицы итогов? Если была проводка скажем Дт 20 Кт 70 «закрыто», а затем Дт 43 Кт 20 «открыто», итоги по регистру бухгалтерии не сойдутся у вас в ноль из-за несоответствия значений доп. измерения «открыто/закрыто».
что то как то заумно написано…
т.к. у нас вроде как двойная запись принята в бухгалтерии, счета в любом случае должны закрыться… т.е. всегда для одного счета будет две записи, по дебету и по кредиту…
пример
(Ложь) 92 — 661 (Истина)
(Истина) 661 — 301 (Ложь)
как видно из примера должно закрыться
«В регистрах бухгалтерии в ограничениях можно использовать только балансовые измерения основного объекта ограничения» (ИТС, статья «Ограничение доступа к данным. Сведения о принципах функционирования»). Проверил это на практике в 8.2.15/16.
В приведеном в (17) примере измерение балансовым не является (указывается в проводке как по дебету, так и по кредиту).
Как удалось написать RLS к таким измерениям? У меня в этом случае просто выводится ошибка.
А с балансовым измерением ваш случай выглядит например так:
92 — 661 (Истина)
661 — 301 (Ложь)
Соответственно счет 661 не закроется.
Ничего не понимаю. Может делаю где-то ошибку. Какая у вас установлена версия платформы?
Да, и приведеный в статье пример кода показывает что речь идет о балансовом измерении (без характерных окончаний Дт и Кт для небалансовых измерений). Тогда должна как-то решаться проблема незакрытых по измерению в ноль итогов.
(19) finik1,
относительно не балансовых измерений не пробывал, поэтому ничего не могу сказать… относительно балансого измерения, смысл сводится к тому что бы помечать проводки с конкретным счетом…
соответственно 661 счет всегда будет закрываться…
92 — 661 (Истина)
661 — 301 (Истина) (т.к. присутствует в проводке счет)
т.е. всегда где присутствует счет который помечаем, всегда будет истина…
другой вопрос, что корреспондируемые счета могут не закрываться…
относительно итогов, вы правы, но итоги накапливаются только на корреспондирующих счетах с ограничиваемомым счетом…
(21) Да, именно об этом я и хотел сказать.
Если не нашли способа, как с ними бороться, то для тяжелых баз данных такой подход может быть опасен из-за избыточного распухания таблиц итогов.
Причем, чем больше градаций аналитик введете (не истина/ложь, а например, разделы учета), тем больше будет не закрытых итогов.
на эту тему уже задумался… жалко, что нельзя накладывать RLS на небалансовые измерения
попробывал с небалансовым измерением, работает RLS… счаз перепроведу документы и сверю остатки
Точно с небалансовым? Переписывали на <ИмяИзмерения>Дт/Кт? У меня с небалансовым не работает (как и написано в ИТС).
что сделал, взял снял признак балансового измерения, зашел под ограниченными правами сформировал ОСВ, шаблон работает… поменял в коде на Дт и Кт, перепроведу документы за месяц скажу точно
сорри, ошибся, не в той базе проверил… да, шаблон выдает ошибку
Где про RLS почитать?
в ЖКК. там подробно описано.
http://forum1c.com.ua/
можно еще тут:
введите в поиск RLS
ну и на инфостарте есть много инфы на эту тему
Ага, при этом пропадает возможность накладывать ограничения по РЛС в рамках добавленного измерения 😉
(31) IRLes,
так еще сошлись на этом 25.09.2012 🙂
Довольно часто проповедую добавление измерений. Особенно пригодится где регистр бухгалтерии является источником какого-нибудь GAAP и нужно много аналитик.
Очень помогла статья… Все гениальное — просто!!!
Думаю надо удалить статью или написать, что предложенное решение не работает. Нельзя наложить РЛС на не балансовое измерение, а если сделать балансовым то накапливаются итоги…. которые никогда не закроются.
(35) ну и пусть накапливаются себе, иногда это не критично, а важнее безопасность.
но указать это в статье надо.
Плюс ставлю за то, что почерпнул для себя, что RLS на бух регистры работает криво, я до последнего надеялся, что можно как-то ограничить.
Тоже поэкспериментировал — и наткнулся на непонятку.
Добавил балансовое измерение, настроил ограничение (ТекущаяТаблица ГДЕ НЕ ТекущаяТаблица.Ограничение)
Результат: при просмотре регистра проводку не вижу. Но — в ОСВ по счету она присутствует.
(37) Отвечу сам себе. Отчеты выполняются в привилегированном режиме, поэтому на RLS им фиолетово. Организация стандартно добавляется в отборы. Так что для отчетов пришлось вмешиваться в ОбщийМодуль.БухгалтерскиеОтчетыВызовСервера
(38) В типовых для Украины работает, я проверял. В них отчеты не выполняются в привилегированном режиме
(38) +1 Спасибо! А я думаю, что эти отчеты все равно выводят данные … Закомментировал привилегированный режим в общем модуле. Заработало!
Думаю, напрасно, где нибудь аукнется. Таки не зря установлен.
Правильнее донастроить в отчетах, помнится там несколько строк изменить..
Такая же задача встала, пришлось в ручную переписывать так как рлс полностью скрывает счета, мне же необходимо было выводить общую сумму по зп счетом, но не выводить расшифровку… геморрой еще тот