Продвинутый курс. МГ сессия от 06.12.10

Новая сессия ответов на вопросы.

Сегодня рассмотрены следующие вопросы.

1. Использование #ТекущаяТаблица.
Можно ли в условиях препроцессора каким-либо образом проверять имя таблицы?
Например: #Если “”#ТекущаяТаблица”” = “Справочник.Склады” #Тогда  (такой вариант, к сожалению, не работает).

2. Проблемы с вложенным запросом.
Для документов поступления и реализации попробовал установить следующий шаблон на чтение : ТекущаяТаблица ИЗ #ТекущаяТаблица КАК ТекущаяТаблица ГДЕ (НЕ 1 В               (ВЫБРАТЬ                    …                ИЗ                #ТекущаяТаблица.Товары КАК Товары ЛЕВОЕ СОЕДИНЕНИЕ …)
Возникла ошибка типа “таблица #ТекущаяТаблицаТовары не найдена”.
Если использовать конструкцию #ТекущаяТаблица.#Параметр(1), где в параметр передается “Товары”, то получается тоже самое.
Работающим оказался только вариант Документ.#Параметр(1).Товары, где в параметр передается имя документа.
С чем связано такое поведение системы?

3. Ошибки в запросе RLS.
В уроке 17 при настройке запроса РЛС для справочника Контрагенты явно видна ошибка в тексте запроса: написано «Справчоник» вместо «Справочник». Однако синтаксический контроль не ругается на этот запрос. Более того, он корректно отрабатывает в пользовательском режиме! Как такое может быть?
Из практики работы с РЛС в 1С:Предприятие 8.1 могу предположить, что указанная в уроке часть запроса «Контрагенты Из Справчоник.Контрагенты КАК Контрагенты» вообще эквивалентна строке «Контрагенты». Т.е. в запросе РЛС не обязательно указывать, откуда выбирать данные, т.к. система сама знает, к какой таблице проверяются права доступа. И первым словом в таком запросе всегда идет либо псевдоним обрабатываемой таблицы (как в уроке), либо слово «ГДЕ».
Например, можно просто написать запрос РЛС «МояТаблица ГДЕ МояТаблица.Поле1 = 100» и этот запрос можно установить в РЛС ДЛЯ ЛЮБОЙ ТАБЛИЦЫ, лишь бы в ней было поле «Поле1» (по возможности, но необязательно,  числового типа :) ). Таким образом, можно достигнуть такой универсальности, что единожды написанное правило (шаблоном) раскопировать по всем таблицам без изменений!

4. РЛС по дате запрета редактирования.
В уроках рассказывается об установке ограничений средствами РЛС по дате запрета редактирования на документы и независимые регистры сведений.
Но ведь в платформе 1С:Предприятие 8 движения документа могут выполняться произвольной датой, а не только датой документа!
Например, приказ о приеме сотрудников в типовых решениях может формировать движения несколькими разными датами, поскольку допускается в одном документе ввести несколько сотрудников с разными датами приема.
В таком случае возникает необходимость контролировать не только дату документа, а и дату движений, которые он формирует. Логичным в такой ситуации выглядит установка РЛС по полю «Период» таких регистров (сведений, подчиненных регистратору; накопления; бухгалтерии; расчета).
Однако в платформе 8.1 существовала проблема с установкой РЛС по полю «Период». Синтаксический контроль не находил поля «Период» у таблиц регистров из-за чего запрос РЛС с учетом поля «Период» вообще нельзя было ввести.
А как обстоят дела с полем «Период» регистров в платформе 8.2? Кроме того, что думаете по поводу такого наложения контроля на таблицы регистров, ведь это существенно «ударит» по производительности системы? Регистры ведь как раз предназначены для обработки больших объемов данных – значит лучше РЛС по ним не делать?

5. Привилегированный режим.
В рамках Базового курса был вопрос, о вызове кода другого модуля из привилегированного режима. Как оказалось, метод обычного модуля, вызванного из привилегированного, выполняется в привилегированном режиме.
В уроке 31 описывается метод программной установки привилегированного режима для заданного участка кода УстановитьПривилегированныйРежим().
В Синтакс-помощнике об этом методе сказано следующее: «Если в процедуре или функции вызовов метода с параметром Ложь сделано больше, чем вызовов с параметром Истина, то будет вызвано исключение.».
Из этого делаю вывод, что метод можно вызывать несколько раз, причем вложено друг в друга, так?
Кроме того, если внутри кода, для которого программно установлен привилегированный режим, вызвать другой метод (этого же модуля, экспортный метод другого модуля) , то вызванный метод будет выполняться также в привилегированном режиме и повлиять на это никак нельзя?
Во вложенном методе УстановитьПривилегированныйРежим(Ложь) не выполнишь, т.к. устанавливался он в вызывающем методе, верно?

6. Безопасный режим.
Что важнее – УстановитьБезопасныйРежим() или УстановитьПривилегированныйРежим() ? В уроке безопасный режим устанавливается ДО установки привилегированного режима. А что будет, если вызвать после? Привилегированный режим отключится?
Как ведет себя безопасный режим при вызове других методов? Во вложенных методах он работает, будучи установленным в вызывающих или его нужно заново устанавливать во вложенном методе? Смущает некий счетчик, описанный в Синтакс-помощнике, который увеличивается/уменьшается при установке/снятии безопасного режима.
Счетчик безопасного режима (описанный в Синтакс-помощнике) при завершении метода, в котором явно установлено использование этого режима, автоматически уменьшается на единицу? Выходит, можно сделать 1000 вызовов метода УстановитьБезопасныйРежим() при начале работы системы, чтобы безопасный режим работал как можно дольше во всей конфигурации? (Чтобы счетчик имел заведомо большое число, которое не скоро обратится в 0)

К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь. Если Вы оплачивали курс, у Вас активирован токен доступа, Вы залогинены, но Вы видите эту запись — напишите нам на e-mail поддержки.

комментариев 11 на “Продвинутый курс. МГ сессия от 06.12.10”

  1. Александр Горлов 09.12.2010 в 01:01

    По пп.5-6.
    Честно говоря, так и осталось неясным назначение некоего счетчика привилегированного/безопасного режимов.
    А также неясна проведенная в уроках аналогия программной установки этих режимов с конструкцией НачатьТранзакцию() -> ЗафиксироватьТранзакцию()

    • Аналогия такая:
      1. Вложенных транзакций в 1С не бывает.
      2. Тем не менее, можно вызвать НачатьТранзакцию() несколько раз. При каждом вызове увеличивается виртуальный счетчик, назовем его N.
      3. При вызове ЗафиксироватьТранзакцию() фиксация не происходит. А происходит уменьшение N на 1.
      4. Транзакция фиксируется, когда N = 0.

      Тоже самое с безопасным и привелегированным режимом. Повторная установка ни к чему не приводит, кроме увеличения счетчика.
      А отключение режиме происходит, когда N = 0.

      Для чего была придумана такая схема?
      Положим есть типовая конфигурация. В некотором общем модуле мы хотим добавить новую строку, работающую в безопасном режиме. Мы можем это сделать, даже если в этом модуле уже используется безопасный режим (по сути нам это не важно).
      Но платформа контролирует наличие парных вызов – установка/снятие.

  2. Евгений, в 3-ем уроке вы говорите:
    – Мы не можем ошибиться в написании имени таблицы…тем не менее я могу написать
    Товары из Савчник.Ном Как Товары Где Истина
    или более короткая форма записи, как Александр предложил, мы просто пишем название таблицы Товары:
    Товары где Истина
    //вот до сюда я все понял. Далее что-то не совсем ясно:
    – Или как используют типовые запросы RLS:
    Т из Т
    И дальше мы обращаемся к полям через Т, тем самым разрабатываются универсальные запросы, которые не зависят от таблицы. Главное, чтобы соответствующие поля были у тех объектов, на которые накладываются ограничения доступа.
    //судя по слайдам, Т – это не имя таблицы, а ее псевдоним? И универсальность получается заключается в том, что один такой запрос, мы можем применить для разных таблиц, где есть одинаковые поля? Предположим, я буду писать не Т из Т, а Б из Б и по-напложу таких сочинений потомкам. В таких запросах, судя по типовым, достаточно проблематично разбираться.
    На мой взгляд, в этом направлении явно переоптимизация на лицо. Глядишь на запрос и даже не сразу поймешь, если он в шаблоне – к чему хоть запрос этот пишется.

    • > И универсальность получается заключается в том, что один такой запрос, мы можем применить для разных таблиц, где есть одинаковые поля?
      Да именно так.
      >Глядишь на запрос и даже не сразу поймешь, если он в шаблоне – к чему хоть запрос этот пишется.
      Для того чтобы была ясность. В запросах РЛС желательно оставлять подробные комментарии.

      А если просто написать “Б из Б”, то пожалуй, сразу и не поймешь что к чему :)

    • Александр Горлов 08.12.2010 в 03:37

      Вместо Т из Т можете вообще написать просто Т. То есть “Т ГДЕ Т.Поле1=0” и тому подобное.
      Имеется в виду разработка универсальных запросов РЛС к сотням таблиц, которые имеют одно или несколько одинаковых полей, по которым настраивается ограничение доступа.
      Сравните: один запрос “Т ГДЕ Т.Организация В(&РазрешенныеОрганизации)” который можно без изменений раскопировать на 200 видов документов (или использовать шаблон) и 200 различных запросов к разным видам документов!
      На Ваш вопрос насчет “Что такое Т?” ответ: Т – это псевдоним любой таблицы, к которой настраиваются права доступа.
      Насчет “сочинений потомкам”. Да, эту возможность можно использовать и во вред. Однако при написании программного кода Вы ведь тоже встречали что-то типа:
      <code>ТЗ = Новый ТаблицаЗначений;
      ТЗ2 = Новый ТаблицаЗначений;</code>
      правда? Так что инструмент – отличный, только благодаря ему в одном проекте удалось за пару дней произвести настройку РЛС с нуля для УПП.
      Глядишь на запрос и даже не сразу поймешь, если он в шаблоне – к чему хоть запрос этот пишется.
      А вот тут позволю себе с Вами категорически не согласиться! Шаблон он ведь на то и шаблон, чтобы использоваться во многих запросах РЛС для многих таблиц! Так что в шаблонах и вообще нельзя писать такой запрос, который “заточен” под конкретную таблицу. Зачем тогда шаблон? Пишите запрос без шаблона. В шаблоне нужно только отличать текущую таблицу от всех других (вспомогательных, в которых права, например, хранятся). А какая она, эта текущая таблица – в шаблоне неважно.

    • Александр Горлов 08.12.2010 в 03:45

      Подводя итог вышесказанному.
      Т – псевдоним любой текущей таблицы, к которой настраиваются права доступа.
      Так придумали разработчики типовых. Вы можете написать, например, ТекТаблица. Только не 2 раза “ТекТаблица”, а 3 раза “МояТаблица”, а во всей конфигурации “ТекТаблица”.
      А запросы типовых тяжело читать не потому, что “Т из Т”, а потому что текст запроса километровый.
      P.S.
      Могу (с разрешения Евгения) привести здесь пример лаконичного шаблона (ОДНОГО ДЛЯ ВСЕХ ТАБЛИЦ!), который мне обеспечил настройку РЛС с нуля для УПП в весьма сжатые сроки.

      • Да, конечно, можете привести здесь текст шаблона.
        Думаю многим будет интересно.

        • Александр Горлов 08.12.2010 в 06:32

          И далее, настроив с помощью такого шаблона запросы ограничения доступа ДЛЯ ВСЕХ ОБЪЕКТОВ ДЛЯ ОДНОЙ РОЛИ, можно средствами платформы раскопировать их НА ВСЕ РОЛИ АВТОМАТИЧЕСКИ.
          Не имеет значения, стоит ли галочка на праве доступа для объекта или нет, текст ограничения доступа все равно можно установить! Без галочки он конечно же не будет иметь смысла, но какая разница?

      • Александр Горлов 08.12.2010 в 06:23

        Универсальный шаблон “РЛС” для УПП (ред. 1.2, когда права хранились в РС “ПраваДоступаПользователейКОбъектам”):

        (#ТекущаяТаблица.#Параметр(1) В (ВЫБРАТЬ ПраваДоступаПользователейКОбъектам.ОбъектДоступа ИЗ РегистрСведений.ПраваДоступаПользователейКОбъектам КАК ПраваДоступаПользователейКОбъектам
        ГДЕ (ПраваДоступаПользователейКОбъектам.ОбластьДанных = ЗНАЧЕНИЕ(Перечисление.ОбластиДанныхОграниченияПравДоступа.#Параметр(2)))
        И (ПраваДоступаПользователейКОбъектам.Пользователь В (&ГруппыТекущегоПользователя))
        И (ПраваДоступаПользователейКОбъектам.#Параметр(3) = ИСТИНА)))
        Примеры использования шаблона в запросах RLS:
        1. Ограничиваем чтение справочника “Номенклатура”:
        ГДЕ #РЛС(“Ссылка”, “Номенклатура”, “Чтение”)
        2. Ограничиваем запись элементов справочника “Склады”:
        ГДЕ #РЛС(“Ссылка”, “СкладыДанные”, “Изменение”)
        3. Ограничиваем чтение справочника “Сотрудники организаций” (непосредственно на сотрудника права не задаются, но сам сотрудник имеет 2 ограничивающих поля – организация и физическое лицо):
        ГДЕ #РЛС(“Физлицо”, “ФизическиеЛица”, “Чтение”) И #РЛС(“Организация”, “ОрганизацииДанные”, “Чтение”)
        4. Ограничиваем чтение документа “Поступление товаров и услуг” (здесь уже 4 ограничивающих поля – организация, контрагент, склад, подразделение):
        ГДЕ #РЛС(“Контрагент”, “КонтрагентыДанные”, “Чтение”) И #РЛС(“Организация”, “ОрганизацииДанные”, “Чтение”) И #РЛС(“СкладОрдер”, “СкладыДанные”, “Чтение”) И #РЛС(“Подразделение”, “ПодразделенияДанные”, “Чтение”)
         
        Думаю, примеры в достаточной мере поясняют работу шаблона. Он точно так же применяется таблиц регистров. Его универсальность заключается в возможности применения его:
        – для таблиц разных видов –  и справочников, и документов, и регистров (проверяемый реквизит гибко задается в виде параметра)
        – для разных видов прав (чтение, запись, добавление)