Часто возникает необходимость в частичном ограничении доступа к данным. Например, когда пользователь должен видеть документы только своей организации. В таких случаях в 1С используется механизм ограничения доступа на уровне записей (так называемый, RLS – Record Level Securiy).
Для примера предположим, что перед нами стоит следующая задача. На предприятии ведется многофирменный учет и каждый контрагент и пользователь базы данных относится к определенной организации. Необходимо обеспечить доступ к справочнику “Контрагенты” таким образом, чтобы каждый пользователь мог просматривать, редактировать и добавлять контрагентов только своей организации.
Для решения задачи будем использовать платформу “1С:Предприятие 8.2″. Создадим новую конфигурацию в свойствах которой в качестве основного режима запуска будет выбран вариант “Управляемое приложение”.
Далее создадим справочник “Организации” и ещё два справочника – “Контрагенты” и “Пользователи” с реквизитом “Организация”. Кроме справочников нам понадобятся два параметра сеанса – “Организация” и “Пользователь” (соответствующих типов). Значения этих параметров устанавливаются при запуске сеанса работы с конфигурацией и хранятся до его завершения. Именно значения этих параметров мы и будем использовать при добавлении условий ограничения доступа на уровне записей.
Установка параметров сеанса выполняется в специальном модуле – “Модуль сеанса”
В этом модуле опишем предопределенную процедуру “УстановкаПараметровСеанса” в которой вызовем функцию заранее подготовленного общего модуля “ПолныеПрава”. Это необходимо в силу особенностей работы базы данных в режиме управляемого приложения, когда часть программного кода может выполняться только на стороне сервера (подробно на объяснении этих принципов в данной статье я останавливаться не буду).
В свойствах модуля “ПолныеПрава” необходимо отметить флажки “Сервер”, “Вызов сервера” и “Привилегированный” (последнее означает, что процедуры и функций данного модуля будут выполнятся без контроля прав доступа). Текст модуля будет выглядеть так:
В модуле управляемого приложения будем проверять наличие пользователя конфигурации в справочнике “Пользователи” (для простоты будем искать его по наименованию) и завершать работу системы если он не найден. Это необходимо для того, чтобы обеспечить заполнение параметров сеанса.
Теперь можем перейти непосредственно к описанию ограничений доступа. Для этого создадим роль “Пользователь” и перейдем на закладку “Шаблоны ограничений”, где добавим новый шаблон “КонтрагентыЧтениеИзменение” со следующим текстом шаблона: ГДЕ Организация =Организация #Параметр(1)
Текст шаблона ограничений является расширением языка запросов. В отличии от обычного запроса, текст ограничения должен в обязательном порядке содержать условие “ГДЕ”. В качестве значений параметров запроса (в нашем случае это “&Организация”) используются значения одноименных параметров сеанса. Конструкция вида #Параметр(1) означает, что на это место система подставит текст, переданный в качестве первого параметра в месте использования шаблона. С помощь приведенного шаблона будет выполняться проверка каждой записи таблицы (в нашем случае это будет справочник “Контрагены”). Для записей, значение реквизита “Организация” которых совпадает с заданным в соответствующем параметре сеанса, условие описанное в шаблоне будет выполняться. Таким образом эти записи будут доступны для чтения, изменения или добавления (в зависимости от того для какого из этих прав применяется шаблон). Продемонстрирую вышеизложенное на нашем примере.
Перейдем на закладку “Права” роли “Пользователь” и откроем список прав справочника “Контрагенты”. Будем использовать шаблон ограничений “КонтрагентыЧтениеИзменеие” для прав “Чтение”, “Изменение” и “Доблавление”.
Для права “Чтение” будем использовать шаблон с параметром “ИЛИ ЭтоГруппа”. При этом пользователям данной роли будет разрешено чтение не только элементов справочника “Контрагенты” своей организации, но и всех групп этого справочника.
#КонтрагентыЧтениеИзменение("ИЛИ ЭтоГруппа")
Поскольку при добавлении новых элементов справочника системой выполняется неявное чтение предопределенных реквизитов (это нужно, например, для нумерации), то необходимо обеспечить беспрепятственное чтение этих полей. Для этого добавим дополнительную строку с пустым текстом ограничения в таблицу ограничения доступа к данным и перечислим поля для которых действует данное правило – Ссылка, Версия данных, Родитель, Код.
Таким образом, поставленная задача ограничения доступа на уровне записей решена. Пользователи с действующими ограничениями получат доступ на просмотр и редактирование данных только своей организации.
Чтоб заставить всех, кто работает без пароля, установить пароль. Можно применить программный ограничитель. Для этого в модуле приложения добавляем функцию:
и в предопредленной процедуре ПриНачалеРаботыСистемы (мы не можем использовать ПередНачаломРаботыСистемы т.к. в ней еще не существует окна программы и нет возможности открыть общую форму ввода пароля) делаем вызов
Круглов Дмитрий дмитриевич:
Скрипт определяет наличие предыдущих платформ и деинсталлирует их..
далее устанавливает последнююю версию, прописывает нужные базы и прямые ярлыки
Рябко Михаил Евгеньевич:
При установке файла 1CEnterprise 8.2.msi через GPO платформа ставилась, но потом ее не могли удалить (после выключения из групповых политик установки). Никакой unistaller ee не брал. Потом почистили реестр, вроде победили.
Более того, инсталлер не прописывал ярлыки в каталог %SystemRoot%\Installer\{8150646B-4F88-4415-AF2A-F96199E3DA37},из за этого все ярлыки были без картинок.
Даже если бы все работало, этот способ не очень понравился, т.к. для 8.2 через те же GPO нельзя прописать базы. А смысл тогда?
Далее пробовали через скрипт. Такое же непредсказуемое поведение по деинсталляции платформы. Кроме этого появлялось 2 ярлыка после установки. Один - который прописан в скрипте, другой - после работы инсталлятора. Ну ладно, написал файл трансформации, чтобы лишний ярлык не создавал, но проблема ошибки при выполнения скрипта ("Требуется объект") и деинсталляции осталась.
Точно также проблема деинсталляции и с ярлыками остается при прямой установке 1CEnterprise 8.2.msi (без трансформации, запуском из проводника), разве что из списка программ удаляется, а все файлы остаются.
В итоге пришли к решению в лоб. Раз уж запуск 1cestart.exe на расшаренной папке дает более-менее положительный результат вручную, то нужно и идти по этому пути. Написал скрипт установки. Вроде работает. Правда, чтобы ограничится установкой без запуска, пришлось создать базу-пустышку и намеренно внести ошибку в параметр запуска. Далее по комментариям все должно быть понятно.
А так есть подозрение, что причина в кривом файле 1CEnterprise 8.2.msi (ярлыки то хотя бы он должен создавать нормально?). То ли дело установка через Setip.exe - тут все в шоколаде и работает.
Итак, альтернативный скрипт (сохранить с расширением *.vbs)
В Конфигураторе, нажимаем правой кнопкой на конфигурацию:
Модуль управляемого приложения
Модуль управляемого приложения является аналогом модуля приложения, но используется для управляемого приложения. 1С:Предприятие 8 исполняется в режиме управляемого приложения, если запущен тонкий клиент, Веб-клиент или толстый клиент и при этом установлен режим управляемого приложения либо на всю конфигурацию, либо у конкретного пользователя. В модуле управляемого приложения могут располагаться объявления переменных, процедуры, функции и тело модуля.
Кроме того, в модуле управляемого приложения могут располагаться предопределенные процедуры ПередНачаломРаботыСистемы, ПриНачалеРаботыСистемы, ПередЗавершениемРаботыСистемы, ПриЗавершенииРаботыСистемы, ОбработкаВнешнегоСобытия. Все процедуры и функции отрабатывают на клиенте. В процедурах и функциях модуля управляемого приложения доступны экспортные процедуры и функции общих модулей управляемого клиента, а также общих неглобальных серверных модулей. Процедуры, функции и переменные модуля управляемого приложения доступны из клиентской части модулей форм и команд.
Когда-то я работал консультантом SAP. В SAPe есть настройка изменения цвета главного окна программы и у нас было негласное правило: Рабочая программа - Красный фон, Тестовая - Зеленый, Разработка - Синий.
Работая в 1С, всегда открыто по 5-6 программ, и перепутать рабочую базу с базой для тестирования, не составляет труда.
Конечно, можно зайти Справка - О программе и посмотреть значения Режим, База, Каталог. Но я решил применить опыт SAP проектов к 1С:
1. Нужно чтобы в заголовке программы всегда отображалось с какой базой работаем.
Для этого в Модуль приложения, в самый конец процедуры ПриНачалеРаботыСистемы() добавляем:
2. Нужно чтобы рабочая база была в стандартных цветах, а база разработки Сине-бирюзовый
У нас разделение следующее, на сервере только рабочие базы, базы разработки на локальных компьютерах, соответственно серверные базы должны быть как обычно, локальные Сине-бирюзовые.
Для этого открываем конфигурацию - Общие -Стили - Копируем и вставляем слой Основной, получается Основной1, меняем его название на Разработка и открываем. В своем примере я меняю только цвет Фона кнопки на Сине-бирюзовый и в Модуль приложения, в самый конец процедуры ПередНачаломРаботыСистемы() добавляю:
Так выглядит Рабочая база, только еще Строка Соединения Информационной Базы в заголовке: