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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *