Ограничение данных регистра бухгалтерии с помощью RLS




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?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='\

42 Comments

  1. WKBAPKA

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

    Reply
  2. sound

    За литературный не буду, но, раз уж мы тут делимся опытом и знаниями, на всякий случай ссылочкой поделюсь, пригодится 🙂 http://school-assistant.ru/?predmet=russian&theme=glagoli_sovershennogo_I_nesovershennog­o_vida

    Reply
  3. WKBAPKA

    (2) sound,

    🙂 почитаю как то на досуге…

    я стремился в статье передать идею

    Reply
  4. WKBAPKA

    мысль была и пропала )

    Reply
  5. WKBAPKA

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

    Reply
  6. q_i

    (1) стиль не смущает, а вот http://tsya.ru почитать очень советую 😉

    Reply
  7. WKBAPKA

    привязались вы к этому слову «стремятся». исправил ошибку 🙂

    Reply
  8. AltF1

    Семь комментариев — и всё ни о чем!

    Reply
  9. Valerich

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

    Reply
  10. WKBAPKA

    (9) Valerich,

    все зависит как наложить ограничение… вполне достаточно это сделать только на чтение, тогда записывать можно будет без проблем… это может быть актуально для разнесения банка. А что касается «не будут видеть своих движений», то тут я не понял вопроса… пользователи не будут видеть всех движений с любыми корреспонденциями по счету учета ЗП. А этого то мы и добивались )

    Reply
  11. WKBAPKA

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

    Reply
  12. Valerich

    (10) гм… а как тогда будет выглядеть, скажем, карточка своего счета или отчет по проводкам?

    в них-то часть проводок будет отсутствовать… хотя итоги и могут быть правильными

    ну и про быстродействие не надо забывать. Эксперименты были?

    Reply
  13. WKBAPKA

    (12) Valerich,

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

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

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

    Reply
  14. erem

    А не проще убрать аналитику с 66 счета вообще… Доделать отражение, что бы только общая сумма в проводки попадала. Общую сумму пусть все бухгалтера видят… А вот к регистру накопления «Взаиморасчеты с работниками орг.» доступ ограничить. Конечно возникает проблема с учетом развернутого сальдо (в отчете «Баланс» например), но ее можно как-то решить. Мы так решили проблему секретности с зарплатой и займами…

    Reply
  15. WKBAPKA

    (14) erem,

    ну вот видите, всеже проще сделать так как описано в статье, что бы не придумывать ,как решать нюансы, это и была основная задача

    Reply
  16. finik1

    Как решаете проблему распухания таблицы итогов? Если была проводка скажем Дт 20 Кт 70 «закрыто», а затем Дт 43 Кт 20 «открыто», итоги по регистру бухгалтерии не сойдутся у вас в ноль из-за несоответствия значений доп. измерения «открыто/закрыто».

    Reply
  17. WKBAPKA

    что то как то заумно написано…

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

    пример

    (Ложь) 92 — 661 (Истина)

    (Истина) 661 — 301 (Ложь)

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

    Reply
  18. finik1

    «В регистрах бухгалтерии в ограничениях можно использовать только балансовые измерения основного объекта ограничения» (ИТС, статья «Ограничение доступа к данным. Сведения о принципах функционирования»). Проверил это на практике в 8.2.15/16.

    В приведеном в (17) примере измерение балансовым не является (указывается в проводке как по дебету, так и по кредиту).

    Как удалось написать RLS к таким измерениям? У меня в этом случае просто выводится ошибка.

    А с балансовым измерением ваш случай выглядит например так:

    92 — 661 (Истина)

    661 — 301 (Ложь)

    Соответственно счет 661 не закроется.

    Ничего не понимаю. Может делаю где-то ошибку. Какая у вас установлена версия платформы?

    Reply
  19. finik1

    Да, и приведеный в статье пример кода показывает что речь идет о балансовом измерении (без характерных окончаний Дт и Кт для небалансовых измерений). Тогда должна как-то решаться проблема незакрытых по измерению в ноль итогов.

    Reply
  20. WKBAPKA

    (19) finik1,

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

    соответственно 661 счет всегда будет закрываться…

    92 — 661 (Истина)

    661 — 301 (Истина) (т.к. присутствует в проводке счет)

    т.е. всегда где присутствует счет который помечаем, всегда будет истина…

    другой вопрос, что корреспондируемые счета могут не закрываться…

    Reply
  21. WKBAPKA

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

    Reply
  22. finik1

    (21) Да, именно об этом я и хотел сказать.

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

    Reply
  23. finik1

    Причем, чем больше градаций аналитик введете (не истина/ложь, а например, разделы учета), тем больше будет не закрытых итогов.

    Reply
  24. WKBAPKA

    на эту тему уже задумался… жалко, что нельзя накладывать RLS на небалансовые измерения

    Reply
  25. WKBAPKA

    попробывал с небалансовым измерением, работает RLS… счаз перепроведу документы и сверю остатки

    Reply
  26. finik1

    Точно с небалансовым? Переписывали на <ИмяИзмерения>Дт/Кт? У меня с небалансовым не работает (как и написано в ИТС).

    Reply
  27. WKBAPKA

    что сделал, взял снял признак балансового измерения, зашел под ограниченными правами сформировал ОСВ, шаблон работает… поменял в коде на Дт и Кт, перепроведу документы за месяц скажу точно

    Reply
  28. WKBAPKA

    сорри, ошибся, не в той базе проверил… да, шаблон выдает ошибку

    Reply
  29. amigo667

    Где про RLS почитать?

    Reply
  30. WKBAPKA

    в ЖКК. там подробно описано.

    можно еще тут: http://forum1c.com.ua/

    введите в поиск RLS

    ну и на инфостарте есть много инфы на эту тему

    Reply
  31. IRLes
    Измерение должно быть не балансовым, что бы в регистре не накапливались итоги по этому измерению!

    Ага, при этом пропадает возможность накладывать ограничения по РЛС в рамках добавленного измерения 😉

    Reply
  32. WKBAPKA

    (31) IRLes,

    так еще сошлись на этом 25.09.2012 🙂

    Reply
  33. Kindman1980

    Довольно часто проповедую добавление измерений. Особенно пригодится где регистр бухгалтерии является источником какого-нибудь GAAP и нужно много аналитик.

    Reply
  34. KrugGans

    Очень помогла статья… Все гениальное — просто!!!

    Reply
  35. romankoav

    Думаю надо удалить статью или написать, что предложенное решение не работает. Нельзя наложить РЛС на не балансовое измерение, а если сделать балансовым то накапливаются итоги…. которые никогда не закроются.

    Reply
  36. fixin

    (35) ну и пусть накапливаются себе, иногда это не критично, а важнее безопасность.

    но указать это в статье надо.

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

    Reply
  37. ikm

    Тоже поэкспериментировал — и наткнулся на непонятку.

    Добавил балансовое измерение, настроил ограничение (ТекущаяТаблица ГДЕ НЕ ТекущаяТаблица.Ограничение)

    Результат: при просмотре регистра проводку не вижу. Но — в ОСВ по счету она присутствует.

    Reply
  38. ikm

    (37) Отвечу сам себе. Отчеты выполняются в привилегированном режиме, поэтому на RLS им фиолетово. Организация стандартно добавляется в отборы. Так что для отчетов пришлось вмешиваться в ОбщийМодуль.БухгалтерскиеОтчетыВызовСервера

    Reply
  39. WKBAPKA

    (38) В типовых для Украины работает, я проверял. В них отчеты не выполняются в привилегированном режиме

    Reply
  40. soulsb

    (38) +1 Спасибо! А я думаю, что эти отчеты все равно выводят данные … Закомментировал привилегированный режим в общем модуле. Заработало!

    Reply
  41. ikm

    Думаю, напрасно, где нибудь аукнется. Таки не зря установлен.

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

    Reply
  42. zodiac99-99

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

    Reply

Leave a Comment

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