std485
#std485
std 485
стандарт 485
привилегированный режим
использование привилегированного режима
отключаем проверку прав

ID: #std485

# Использование привилегированного режима

#### 1.1.

Привилегированный режим позволяет:

- выполнять операции с данными от имени пользователей,
  которым эти данные напрямую недоступны;
- повышать производительность,
  так как при его использовании не применяются ограничения доступа к данным.

#### 1.2.

Используйте привилегированный режим, когда:

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

#### 2.

Ниже приведены типовые сценарии использования привилегированного режима.

#### 2.1.

Если подчиненные регистры (движения документов) нужны пользователю только для отчетов:

- оставляйте для них права только на чтение;
- запись выполняйте в привилегированном режиме.

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

#### Пример

Есть объекты:

- `Документ.ОприходованиеТоваров`;
- `РегистрНакопления.ОстаткиНаСкладах`;
- `Отчет.ОстаткиНаСкладах`.

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

#### 2.2.

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

Чтение/запись в такие регистры выполняйте только в привилегированном режиме.

#### Пример

Регистр сведений `ВерсииПодсистем` используется только через служебные функции общего модуля.
Пользователям права на регистр не выдаются.

#### 2.3.

Если для разрешенной операции требуются заранее недоступные пользователю данные,
получайте эти данные в привилегированном режиме,
но соблюдайте два ограничения:

- не передавайте такие данные на клиент;
- используйте их на сервере только в рамках запланированной операции.

#### Пример

Есть объекты:

- `Документ.РеализацияТоваровИУслуг`;
- `РегистрНакопления.Продажи`;
- `РегистрНакопления.Взаиморасчеты`.

Требования:

- кладовщик проводит документ, который меняет регистр `Продажи`,
  но сам регистр кладовщику недоступен;
- при проведении выполняется проверка по `Взаиморасчеты`,
  при этом доступ к регистру пользователю не открывается.

#### 2.4.

Привилегированный режим можно использовать для повышения производительности,
если это не открывает пользователю неразрешенные действия и данные.

#### Пример

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

#### Пример

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

```bsl
Функция ТекущийПользователь() Экспорт
    УстановитьПривилегированныйРежим(Истина);
    Возврат ПараметрыСеанса.ТекущийПользователь;
КонецФункции
```

#### 3.

Неоправданное использование привилегированного режима создает риски безопасности.

#### 3.1.

Опасны экспортные серверные процедуры и функции,
которые безусловно включают привилегированный режим:
это отключает проверку прав текущего пользователя.

Особенно внимательно проверяйте экспортный API сервера
(см. [#std678](https://v8std.ru/std/678/))

#### Неправильно

```bsl
Процедура ИзменитьИлиУдалитьДанные(...) Экспорт
    УстановитьПривилегированныйРежим(Истина); // Отключаем проверку прав
    // Изменяем данные
    ...
КонецПроцедуры
```

#### Правильно

```bsl
Процедура ИзменитьИлиУдалитьДанные(...) Экспорт
    // Изменяем данные
    // Если прав недостаточно, платформа вызовет исключение
    ...
КонецПроцедуры
```

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

#### 3.2.

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

Чаще всего дополнительный код не нужен:
при корректно настроенных ролях и `RLS` исключение возникнет автоматически,
например:

- запрос без ключевого слова `РАЗРЕШЕННЫЕ`;
- `ПолучитьОбъект()` по недоступной ссылке;
- вызов недоступного метода глобального контекста.

Если нужна явная проверка, используйте `ВыполнитьПроверкуПравДоступа()`.

#### Пример

```bsl
Процедура ИзменитьИлиУдалитьДанные(...) Экспорт
    ВыполнитьПроверкуПравДоступа(...);
    УстановитьПривилегированныйРежим(Истина);

    // Изменяем данные в привилегированном режиме
    ...
КонецПроцедуры
```

#### См. также

- [#std415: Ограничения на использование ключевого слова "РАЗРЕШЕННЫЕ" в запросах](https://v8std.ru/std/415/)
- [#std499: Перехват исключений в коде](https://v8std.ru/std/499/)

#### 3.3.

Включайте привилегированный режим точечно:

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

#### Неправильно

```bsl
Процедура ПодготовитьДанные()

    УстановитьПривилегированныйРежим(Истина);

    // Подготовка запроса, где нужна проверка прав
    // Выполнение запроса
    Выборка = Запрос.Выполнить().Выбрать();

    // Обработка результатов, где тоже нужна проверка прав
КонецПроцедуры
```

#### Правильно

```bsl
Процедура ПодготовитьДанные()

    // Подготовка запроса

    УстановитьПривилегированныйРежим(Истина);
    Выборка = Запрос.Выполнить().Выбрать();
    УстановитьПривилегированныйРежим(Ложь);

    // Обработка результатов
КонецПроцедуры
```

#### 4.

Для перехода в привилегированный режим используйте возможности платформы:

1. В обработчиках документа `ОбработкаПроведения` и `ОбработкаУдаленияПроведения`:

    - через свойства документа `Привилегированный режим при проведении` и `Привилегированный режим при отмене проведения`;
    - если состав выборки должен ограничиваться правами пользователя, эти свойства не используйте, а включайте режим точечно через `УстановитьПривилегированныйРежим()`.

2. Свойство бизнес-процесса `Привилегированный режим` (для создания задач в привилегированном режиме).

3. Свойство функциональной опции `Привилегированный режим при получении`.

4. Процедуру глобального контекста `УстановитьПривилегированныйРежим()` в нужной точке кода:

```bsl
УстановитьПривилегированныйРежим(Истина);
// Фрагмент кода в привилегированном режиме
...;
УстановитьПривилегированныйРежим(Ложь);
```

5. Общий модуль со свойством `Привилегированный`.

#### См. также

- [#std678: Безопасность прикладного программного интерфейса сервера](https://v8std.ru/std/678/)
- [#std488: Стандартные роли](https://v8std.ru/std/488/)
- [#std470: Использование функциональных опций](https://v8std.ru/std/470/)

#### Источник

https://its.1c.ru/db/v8std#content:485

Привилегированный режим позволяет:

Ограничения на использование ключевого слова РАЗРЕШЕННЫЕ в запросах #std415

Использование функциональных опций #std470

Стандартные роли #std488

Перехват исключений в коде #std499

Безопасность прикладного программного интерфейса сервера #std678

Использование привилегированного режима #std485


стандарт 486

ID: #std486

# Использование модуля объекта, модуля менеджера объекта и общих модулей

#### 1.

`Модуль объекта` отвечает за поведение
конкретного экземпляра объекта
(`СправочникОбъект`, `ДокументОбъект` и т.п.).

Размещайте в нем процедуры и функции,
которые работают с данными объекта
(`ЭтотОбъект` и переменные модуля),
в том числе когда объект еще не записан в базу.

Например:

- обработчики событий объекта;
- процедуры заполнения экземпляра.

Учитывайте, что для вызова экспортных процедур и функций
из других модулей обычно нужно сначала получить экземпляр
через `ПолучитьОбъект()`.

Это загружает объект целиком вместе с табличными частями
и может быть ресурсоемко.

#### 2.

`Модуль менеджера` предназначен для "статической" логики,
которая относится к объекту метаданных,
но не зависит от состояния конкретного экземпляра.

Это могут быть процедуры и функции:

- относящиеся к совокупности объектов:
  печать списка, общая информация для всех экземпляров,
  обновление данных, связанное с объектом метаданных;
- работающие с уже записанным объектом,
  когда на вход передается ссылка:
  печатная форма по ссылке, формирование движений по ссылке.

Для функций модуля менеджера
не должен требоваться экземпляр объекта данных
(`СправочникОбъект`, `ДокументОбъект` и т.п.).

#### 3.

Если функциональность нельзя однозначно отнести
к одному объекту метаданных,
она считается общей для нескольких объектов.

В таком случае размещайте ее в `общем модуле`.

#### См. также

- [#std496: Чтение отдельных реквизитов объекта из базы данных](https://v8std.ru/std/496/)

#### Источник

https://its.1c.ru/db/v8std#content:486

Модуль объекта отвечает за поведение конкретного экземпляра объекта (СправочникОбъект, ДокументОбъект и т.п.).

Чтение отдельных реквизитов объекта из базы данных #std496

Использование модуля объекта, модуля менеджера объекта и общих модулей #std486


стандарт 487

ID: #std487

# Минимизация количества серверных вызовов и трафика

#### 1.1.

Контролируйте количество серверных вызовов из клиентского кода.
В ряде сценариев дополнительно контролируйте объем передаваемых данных между клиентом и сервером.

Общее количество серверных вызовов складывается из:

- обращений, которые выполняет сама платформа;
- вызовов из клиентского кода конфигурации.

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

#### Исключение

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

#### 1.2.

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

## Запуск клиентского приложения

#### 2.1.

Код обработчиков `ПередНачаломРаботыСистемы` и `ПриНачалеРаботыСистемы` в простом сценарии не должен обращаться к серверу.

Если без сервера не обойтись:

- не вызывайте серверные процедуры и функции напрямую из модуля приложения, модуля управляемого приложения и модуля внешнего соединения;
- передавайте на клиент все стартовые параметры за один серверный вызов.

Если одни и те же параметры старта нужны в разных местах клиентского кода, используйте
[#std724: модуль с повторным использованием возвращаемых значений](https://v8std.ru/std/724/)
Тогда сервер вызывается один раз, а затем результат кешируется на клиенте.

#### Пример

```bsl
// Общий серверный модуль ПараметрыПовтИсп (с повторным использованием возвращаемых значений)
Функция ПараметрыРаботыКлиента() Экспорт
    Параметры = Новый Структура;
    Параметры.Вставить("ИнформационнаяБазаФайловая", ОбщегоНазначения.ИнформационнаяБазаФайловая());
    // Инициализация других параметров, необходимых на клиенте при запуске приложения
    // Параметры.Вставить(ИмяПараметра, ЗначениеПараметра);
    Возврат Параметры;
КонецФункции
```

```bsl
// Код обработчика ПриНачалеРаботыСистемы
ИнформационнаяБазаФайловая = ПараметрыПовтИсп.ПараметрыРаботыКлиента().ИнформационнаяБазаФайловая;
Если ИнформационнаяБазаФайловая Тогда
    // обработка этого случая в клиентском коде
КонецЕсли;
```

#### 2.2.

Если в конфигурации используется БСП, применяйте ее программный интерфейс:

- размещайте серверный код запуска в процедурах `ПриДобавленииПараметровРаботыКлиентаПриЗапуске` и/или `ПриДобавленииПараметровРаботыКлиента` модуля `ОбщегоНазначенияПереопределяемый`;
- на клиенте вызывайте `ПараметрыРаботыКлиентаПриЗапуске` или `ПараметрыРаботыКлиента` модуля `СтандартныеПодсистемыКлиент`, их результат кешируется после первого вызова.

#### См. также

- [#std459: Использование значений, влияющих на поведение клиентского приложения](https://v8std.ru/std/459/)

## Периодические серверные вызовы

#### 3.1.

Когда нужно периодически передавать данные с клиента на сервер или проверять состояние сервера,
объединяйте проверки в один вызов и выбирайте период как можно реже, обычно не чаще одного раза в `20` минут.

Типовые сценарии:

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

По возможности используйте уведомления клиентам через `МенеджерУведомленийКлиента`,
а не периодический опрос сервера с клиента.

#### 3.2.

Если используется БСП, реализуйте периодическое взаимодействие через ее программный интерфейс.

#### 3.2.1.

Для длительных операций ожидайте результат через `ДлительныеОперацииКлиент.ОжидатьЗавершение`.

#### 3.2.2.

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

Для форм на начальной странице периодические вызовы по возможности заменяйте кнопкой `Обновить`.
Если периодический вызов нужен, делайте его выключенным по умолчанию и с интервалом не чаще раза в минуту.

#### 3.2.3.

Для периодической проверки состояния сервера и отправки оповещений клиентам:

- описывайте серверные оповещения в `ПриДобавленииСерверныхОповещений` модуля `ОбщегоНазначенияПереопределяемый`;
- реализуйте отправку из регламентного задания `ОтправкаСерверныхОповещенийКлиентам` в `ПриОтправкеСерверногоОповещения` нужного общего модуля;
- реализуйте обработку на клиенте в `ПриПолученииСерверногоОповещения` этого же модуля.

#### 3.2.4.

Для периодической отправки данных с клиента на сервер:

- добавляйте клиентские данные в `ПередПериодическойОтправкойДанныхКлиентаНаСервер` модуля `ОбщегоНазначенияКлиентПереопределяемый`;
- обрабатывайте данные на сервере в `ПриПериодическомПолученииДанныхКлиентаНаСервере` модуля `ОбщегоНазначенияПереопределяемый`;
- обрабатывайте ответ сервера на клиенте в `ПослеПериодическогоПолученияДанныхКлиентаНаСервере` модуля `ОбщегоНазначенияКлиентПереопределяемый`.

## Открытие управляемой формы

#### 4.1.

Если форма открывается из кода, выполняйте это за один вызов `ОткрытьФорму`.
(Для платформы `8.2` и более ранних версий также `ОткрытьФормуМодально`).

Параметры передавайте через параметр `Параметры` этого метода.

#### 4.2.

При открытии формы не вызывайте сервер из клиентских обработчиков `ПриОткрытии` и `ПриПовторномОткрытии`.
Если нужны серверные данные, заполните реквизиты формы заранее в `ПриСозданииНаСервере`.

#### Пример

Фоновое задание длительного расчета запускайте в `ПриСозданииНаСервере`,
а проверку готовности стартуйте в `ПриОткрытии`.
См..

#### Неправильно

```bsl
НастройкаПроксиСервера = СерверныйМодуль.НастройкаПроксиСервера();
ПараметрыОткрытия = Новый Структура("Настройка", НастройкаПроксиСервера);
ОткрытьФорму("ОбщаяФорма.ПараметрыПроксиСервера", ПараметрыОткрытия);
```

#### Правильно

```bsl
ОткрытьФорму("ОбщаяФорма.ПараметрыПроксиСервера");
```

Значение константы получайте в `ПриСозданииНаСервере` формы `ПараметрыПроксиСервера`.

Также при открытии формы не вызывайте серверные функции с повторным использованием возвращаемых значений:
при первом вызове кеш еще не прогрет и возникает лишний вызов сервера.

#### 4.3.

Не подключайте несколько разных обработчиков ожидания (`ПодключитьОбработчикОжидания`) для проверки готовности фоновых заданий одной формы.
Это создает избыточные серверные вызовы.

Объединяйте проверки в один обработчик, который за один вызов получает все нужные статусы и результаты.
По возможности объединяйте и сами фоновые задания, если это не противоречит логике.

Если используется БСП, запускайте длительные операции через `ДлительныеОперации` и `ДлительныеОперацииКлиент`.
В них уже реализовано объединение обработчиков и оптимальные интервалы ожидания.

## Выполнение локальной команды управляемой формы

#### 5.1.

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

Если команда делает только клиентские действия (открывает форму, меняет отбор, оформление и т.д.),
нужные данные заранее передавайте на клиент: готовьте их в `ПриСозданииНаСервере` и сохраняйте в реквизитах формы.

#### Пример

При выборе номенклатуры нужно запретить выбор групп.
Для этого не вызывайте серверную функцию проверки группы,
а добавьте признак `ЭтоГруппа` в таблицу, связанную с полем списка.

```bsl
ТекущаяСтрока = Элемент.ТекущиеДанные;
Если ТекущаяСтрока.ЭтоГруппа Тогда
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = НСтр("ru = 'Выбор группы запрещен.'");
    Сообщение.Сообщить();
    Возврат;
КонецЕсли;
```

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

## Выбор из справочника

#### 5.2.

В общем случае выбор из справочника должен вызывать только один серверный вызов из кода:
вызов, который возникает при `ОткрытьФорму` (или `ОткрытьФормуМодально`).

#### 6.3.

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

## Выполнение глобальной команды

#### 6.1.

Глобальная команда должна приводить максимум к одному серверному вызову из кода.
Если команда открывает форму, этот вызов должен происходить при `ОткрытьФорму`
(или `ОткрытьФормуМодально`).

## Выполнение команды формирования отчета

#### 7.1.

При выполнении команды формирования отчета не делайте дополнительных серверных вызовов из кода конфигурации.

В частности, при открытии формы отчета не обращайтесь к серверу в `ПриОткрытии` и `ПриПовторномОткрытии`.

#### Неправильно

```bsl
&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ВывестиОтчет();
КонецПроцедуры

&НаСервере
Процедура ВывестиОтчет()
    // Код формирования отчета
КонецПроцедуры
```

#### Правильно

- открывать форму отчета с параметром `СформироватьПриОткрытии = Истина`;
- или устанавливать `СформироватьПриОткрытии = Истина` в `ПриСозданииНаСервере`.

## Выполнение подбора элементов

#### 8.1.

При подборе элементов между формой объекта и формой подбора передается список выбранных элементов.
Объем таких данных может быть большим.

Не передавайте потенциально большой массив напрямую параметром формы подбора.
Если массив хранится как `ДанныеФормыКоллекция`, форма может передать его неполностью,
и платформа выполнит дополнительное дочитывание данных с сервера.

#### 8.2.

Для оптимизации передачи данных между формами используйте временное хранилище,
а чтение и запись выполняйте на сервере.

Ниже пример подбора товаров в документ `РасходТовара`:

- при открытии формы подбора: первый вызов на сервер для помещения данных во временное хранилище, второй вызов для открытия формы;
- при закрытии формы подбора: первый вызов для записи результата в хранилище, второй вызов для загрузки результата в форму документа.

```bsl
// Форма документа
&НаКлиенте
Процедура ОбработчикКомандыПодбора()
    АдресТоваровВХранилище = ПоместитьТоварыВХранилище();

    ПараметрыПодбора = Новый Структура;
    ПараметрыПодбора.Вставить("АдресТоваровДокумента", АдресТоваровВХранилище);
    ПараметрыПодбора.Вставить("ВидЦен", Объект.ВидЦен);
    ПараметрыПодбора.Вставить("Склад", Объект.Склад);

    ОткрытьФорму("Документ.РасходТовара.Форма.ФормаПодбора", ПараметрыПодбора, Элементы.Товары);
КонецПроцедуры

&НаСервере
Функция ПоместитьТоварыВХранилище()
    Возврат ПоместитьВоВременноеХранилище(
        Объект.Товары.Выгрузить(, "Товар,Цена,Количество"),
        УникальныйИдентификатор
    );
КонецФункции
```

```bsl
// Форма подбора
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Экспорт
    АдресТоваровДокумента = Параметры.АдресТоваровДокумента;
    Объект.Товары.Загрузить(ПолучитьИзВременногоХранилища(АдресТоваровДокумента));
КонецПроцедуры
```

```bsl
// Закрытие формы подбора
&НаКлиенте
Процедура ОКВыполнить()
    АдресТоваровВоВременномХранилище = ЗаписатьПодборВХранилище();
    ОповеститьОВыборе(АдресТоваровВоВременномХранилище);
КонецПроцедуры

&НаСервере
Функция ЗаписатьПодборВХранилище()
    Возврат ПоместитьВоВременноеХранилище(Товары.Выгрузить(), АдресТоваровДокумента);
КонецФункции
```

```bsl
// Форма документа: обработка результата подбора
&НаКлиенте
Процедура ПриОбработкеПодобранныхТоваров(Элемент, АдресТоваровВХранилище, СтандартнаяОбработка) Экспорт
    Если АдресТоваровВХранилище = Неопределено Тогда
        Возврат;
    КонецЕсли;

    ПолучитьТоварыИзХранилища(АдресТоваровВХранилище);
КонецПроцедуры

&НаСервере
Процедура ПолучитьТоварыИзХранилища(АдресТоваровВХранилище)
    ПодобранныеТовары = ПолучитьИзВременногоХранилища(АдресТоваровВХранилище);
    Объект.Товары.Загрузить(ПодобранныеТовары);
    УдалитьИзВременногоХранилища(АдресТоваровДокумента); // освобождаем память
КонецПроцедуры
```

#### 8.3.

При работе с временным хранилищем используйте один из двух вариантов:

- хранение на время жизни формы (по `УникальныйИдентификатор`) с последующей очисткой;
- предварительная инициализация и переиспользование одного адреса.

Если этого не делать, при многократном выполнении действия (например, повторный подбор) растет расход оперативной памяти.

```bsl
&НаСервере
Процедура ПриСозданииНаСервере(Отказ)
    АдресТоваров = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор);
КонецПроцедуры

&НаСервере
Функция ТоварыВоВременномХранилище()
    Возврат ПоместитьВоВременноеХранилище(Товары.Выгрузить(), АдресТоваров);
КонецФункции
```

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

```bsl
&НаСервере
Процедура ПолучитьТоварыИзХранилища(АдресТоваровВХранилище)
    ПодобранныеТовары = ПолучитьИзВременногоХранилища(АдресТоваровВХранилище);
    Объект.Товары.Загрузить(ПодобранныеТовары);
КонецПроцедуры
```

## Запись формы

#### 9.

Не добавляйте отдельный серверный вызов из клиентских `ПередЗаписью` и `ПослеЗаписи`.
Размещайте серверную логику в `ПередЗаписьюНаСервере`, `ПриЗаписиНаСервере`, `ПослеЗаписиНаСервере`.

Данные передавайте на клиент через `ПараметрыЗаписи` или реквизиты формы.

#### Неправильно

```bsl
&НаКлиенте
Процедура ПослеЗаписи()
    УправлениеФормой();
КонецПроцедуры

&НаСервере
Процедура УправлениеФормой()
    ...
КонецПроцедуры
```

#### Правильно

Вызывайте `УправлениеФормой` в `ПослеЗаписиНаСервере`.
Перед вызовом проверяйте, будет ли форма закрыта: если форма закрывается, управлять ею не нужно.

## Неявные серверные вызовы

#### 10.

Учитывайте клиентские методы и свойства, которые могут вызывать сервер:

- `ПолучитьИзВременногоХранилища`, `УдалитьИзВременногоХранилища`;
- свойства поля формы, например `Заголовок`, `Доступность`, `Подсказка`, `ТолькоПросмотр`;
- `ПолучитьФункциональнуюОпциюИнтерфейса`, `ПолучитьФункциональнуюОпциюФормы`;
- другие методы и свойства из синтаксис-помощника с аналогичным поведением.

Избегайте многократных вызовов таких методов из клиентского кода.
Объединяйте их в один серверный вызов: используйте одно временное хранилище или переносите логику в одну серверную процедуру.

Также не вызывайте серверные функции с повторным использованием возвращаемых значений в сценариях,
где первый вызов приходится на открытие формы или другой критичный путь.
Используйте подходы из [п. 4.2](https://v8std.ru/std/487/#42) для модулей форм и из [п. 2.1](https://v8std.ru/std/487/#21) для прочего клиентского кода

## Передача данных между клиентом и сервером

#### 11.

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

#### Неправильно

```bsl
&НаКлиенте
Процедура ПриАктивизацииСтрокиСпискаКонтрагентов()
    ОбновитьПанельКонтактнойИнформацииСервер();
КонецПроцедуры

&НаСервере
Процедура ОбновитьПанельКонтактнойИнформацииСервер()
    КонтактнаяИнформацияПанель.ОбновитьДанныеПанели(ЭтотОбъект, ТекущийКонтрагент);
КонецПроцедуры
```

#### Правильно

```bsl
&НаКлиенте
Процедура ПриАктивизацииСтрокиСпискаКонтрагентов()
    ОбновитьПанельКонтактнойИнформации();
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьПанельКонтактнойИнформации()
    ДанныеПанели = ДанныеПанелиКонтактнойИнформации(ТекущийКонтрагент);
    КонтактнаяИнформацияПанельКлиент.ЗаполнитьДанныеПанелиКИ(ЭтотОбъект, ДанныеПанели);
КонецПроцедуры

&НаСервереБезКонтекста
Функция ДанныеПанелиКонтактнойИнформации(Контрагент)
    Возврат КонтактнаяИнформацияПанель.ДанныеПанелиКонтактнойИнформации(Контрагент);
КонецФункции
```

#### 12.

Не возвращайте с сервера обратно параметры, которые пришли с клиента.
Вместо этого делайте серверную функцию, которая возвращает только нужный результат.

В параметрах серверных процедур и функций, вызываемых с клиента,
рекомендуется использовать префикс `Знач`.
Это снижает объем обратной передачи параметров, особенно для сложных типов (`Структура`, `Массив` и т.д.).

Правило относится к:

- экспортным процедурам и функциям общих модулей с признаком `Вызов сервера`;
- процедурам модулей форм и команд с директивами `&НаСервере`, `&НаСервереБезКонтекста`;
- процедурам без директив (неявное `&НаСервере`).

#### Пример

```bsl
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    НовоеОбсуждение = НовоеОбсуждение(ПараметрКоманды);
    ...
КонецПроцедуры
```

#### Неправильно

```bsl
&НаСервере
Функция НовоеОбсуждение(ПользовательСсылка)
    ...
    Возврат ПолучитьНавигационнуюСсылку(Обсуждение.Идентификатор);
КонецФункции
```

#### Правильно

```bsl
&НаСервере
Функция НовоеОбсуждение(Знач ПользовательСсылка)
    ...
    Возврат ПолучитьНавигационнуюСсылку(Обсуждение.Идентификатор);
КонецФункции
```

#### См. также

- [#std459: Использование значений, влияющих на поведение клиентского приложения](https://v8std.ru/std/459/)
- [#metod4105: Оптимизация клиент-серверного взаимодействия прикладных решений](https://v8std.ru/metod8dev/4105/)

#### Проверки
[#bslls:MissingTempStorageDeletion](https://v8std.ru/diagnostics/bslls/MissingTempStorageDeletion/)

#### Источник

https://its.1c.ru/db/v8std#content:487

Отсутствует удаление данных из временного хранилища после использования BSLLS:MissingTempStorageDeletion

Использование значений, влияющих на поведение клиентского приложения #std459

Использование модулей с повторным использованием возвращаемых значений #std724

Минимизация количества серверных вызовов и трафика #std487


стандарт 488

ID: #std488

# Стандартные роли

#### 1.1.

Если в конфигурации есть разграничение прав доступа,
настраивайте доступ только ролями.

Состав ролей определяйте от бизнес-задач,
а не от технического удобства реализации.

#### 1.2.

Роли можно строить двумя способами:

- по должностям (`Директор`, `Бухгалтер`, `Кладовщик`);
- по функциям с назначением комбинаций ролей.

Для функционального подхода поставляйте типовые комбинации ролей (профили доступа).

#### 2.

В конфигурации должны быть обязательные роли:

- `ПолныеПрава`;
- `АдминистраторСистемы`;
- `ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок`.

#### 2.1.

`ПолныеПрава` (`FullAccess`) должна:

- назначаться пользователям как самостоятельная роль;
- давать неограниченный доступ к прикладным данным области;
- позволять прикладное администрирование (настройка программы, администрирование пользователей в области и т.п.);
- не включать интерактивное удаление (см. [раздел 5](https://v8std.ru/std/488/#5))

Также роль должна включать следующие права:

- [x] `Администрирование данных`
- [x] `Активные пользователи`
- [x] `Журнал регистрации`
- [x] `Монопольный режим`
- [x] `Тонкий клиент`
- [x] `Веб-клиент`
- [x] `Сохранение данных пользователя`
- [x] `Вывод`
- [ ] `Интерактивное открытие внешних отчетов`
- [ ] `Интерактивное открытие внешних обработок`

Назначение роли зависит от режима работы конфигурации:

- если конфигурация работает в модели сервиса, роль `ПолныеПрава` назначайте администраторам абонентов
  (администраторам областей данных);
- если конфигурация работает в локальном режиме, назначайте `ПолныеПрава` только вместе с
  `АдминистраторСистемы`, так как в этом режиме функции системного и прикладного администрирования
  обычно совмещены.

#### 2.2.

`АдминистраторСистемы` (`SystemAdministrator`) — роль системного администрирования.

Она должна:

- назначаться только вместе с `ПолныеПрава`;
- давать доступ к системному администрированию информационной базы;
- предоставлять неограниченный доступ ко всем общим данным всех областей данных в модели сервиса;
- не включать интерактивное удаление (см. [раздел 5](https://v8std.ru/std/488/#5))

По правам к корню конфигурации:

- [x] `Администрирование`
- [x] `Администрирование данных`
- [ ] `Интерактивное открытие внешних отчетов`
- [ ] `Интерактивное открытие внешних обработок`

#### 2.3.

`ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок`
дает право интерактивно открывать внешние отчеты и обработки.

- [x] `Интерактивное открытие внешних отчетов`
- [x] `Интерактивное открытие внешних обработок`

Назначение роли зависит от режима работы конфигурации:

- в локальном режиме роль `ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок`
  назначайте администраторам, но при необходимости администратор может запретить ее использование
  для повышения безопасности информационной базы;
- в модели сервиса роли `АдминистраторСистемы`, `ПолныеПрава` и
  `ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок` назначаются администраторам сервиса.

#### 2.4.

Роли `ПолныеПрава`, `АдминистраторСистемы` и
`ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок`
должны входить в свойство конфигурации `ОсновныеРоли`.

#### 2.5.

Если нужно дать «неполноправным» пользователям право на удаление,
добавьте отдельную роль `УдалениеПомеченныхОбъектов` (`DeleteMarkedObjects`).

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

#### 3.

Для общих прав работы с информационной базой
используйте отдельные роли, которые назначаются в комбинации с прикладными ролями.

#### 3.1.

`Администрирование` (`Administration`) предоставляет права:

- [x] `Администрирование`
- [x] `Администрирование данных`
- [x] `Администрирование расширений конфигурации`
- [x] `Активные пользователи`

#### 3.2.

`ВыводНаПринтерФайлБуферОбмена` (`OutputToPrinterFileClipboard`) предоставляет право:

- [x] `Вывод`

#### 3.3.

`ЗапускAutomation` (`StartAutomation`) предоставляет право:

- [x] `Automation`

#### 3.4.

`ЗапускВебКлиента` (`StartWebClient`) предоставляет право:

- [x] `Веб-клиент`

#### 3.5.

`ЗапускВнешнегоСоединения` (`StartExternalConnection`) предоставляет право:

- [x] `Внешнее соединение`

#### 3.6.

`ЗапускТолстогоКлиента` (`StartThickClient`) предоставляет право:

- [x] `Толстый клиент`

#### 3.7.

`ЗапускТонкогоКлиента` (`StartThinClient`) предоставляет право:

- [x] `Тонкий клиент`

#### 3.8.

`ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок`
предоставляет права:

- [x] `Интерактивное открытие внешних обработок`
- [x] `Интерактивное открытие внешних отчетов`

#### 3.9.

`ОбновлениеКонфигурацииБазыДанных` (`UpdateDatabaseConfiguration`)
предоставляет право:

- [x] `Обновление конфигурации базы данных`

#### 3.10.

`ПросмотрЖурналаРегистрации` (`ViewEventLog`)
предоставляет право:

- [x] `Журнал регистрации`

#### 3.11.

`РежимТехническогоСпециалиста` (`TechnicalSpecialistMode`)
предоставляет право:

- [x] `Режим технического специалиста`

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

#### 3.12.

`СохранениеДанныхПользователя` (`SaveUserData`)
предоставляет право:

- [x] `Сохранение данных пользователя`

Обычно эту роль назначают всем пользователям.

Исключения:

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

Конфигурация должна корректно работать и без права `СохранениеДанныхПользователя`.

Если код обращается к:

- пользовательским настройкам и хранилищам настроек
  (`ХранилищеОбщихНастроек`, `ХранилищеВариантовОтчетов`, `ХранилищеНастроекДанныхФорм`,
  `ХранилищеПользовательскихНастроекОтчетов`, `ХранилищеСистемныхНастроек`);
- истории работы пользователя и избранному
  (`ИсторияРаботыПользователя`, `ИзбранноеРаботыПользователя`);
- пользовательским настройкам отчетов
  (метод `УстановитьТекущиеПользовательскиеНастройки` расширения управляемой формы отчета);

то при отсутствии права `СохранениеДанныхПользователя` этот код должен пропускаться
без влияния на основные сценарии работы пользователя.

Если в конфигурации есть отдельные элементы интерфейса для пользовательских настроек
(история вводимых значений, флажки `Запомнить мой выбор` и т.п.),
они не должны быть доступны пользователям без этого права.

Если используется БСП, для работы с общими настройками используйте функции
`ХранилищеОбщихНастроекЗагрузить` и `ХранилищеОбщихНастроекСохранить`
общего модуля `ОбщегоНазначения`.

#### 4.1.

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

Типовые примеры:

- временный доступ для аудитора;
- постоянный доступ для собственника или директора.

#### 4.2.

Если роли в конфигурации построены по должностям
(`Директор`, `Бухгалтер`, `Кладовщик` и т.п.),
добавьте отдельную роль `ТолькоПросмотр` (`ViewOnly`).

Роль `ТолькоПросмотр` должна включать:

- [x] `Чтение`
- [x] `Использование`
- [x] `Просмотр`
- [x] `Ввод по строке` (если применимо)

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

#### 4.3.

Если роли построены по отдельным функциям,
назначайте пользователям комбинации ролей,
которые дают доступ только на чтение.

Примеры функциональных ролей:

- `ЧтениеПроизводственныхДокументов`;
- `ЧтениеСкладскихДокументов`;
- `ЧтениеКассовыхДокументов`.

В составе конфигурации поставляйте типовые комбинации таких ролей
(например, готовые профили для аудитора, собственника, директора).

Если пользователю нужен неограниченный просмотр всех данных,
для него отключайте (не задавайте) условия ограничения доступа на уровне записей (`RLS`).

#### 5.

Ни в одной роли, включая `ПолныеПрава` и `АдминистраторСистемы`,
не должны быть установлены следующие права
(кроме отдельных обоснованных случаев):

- [ ] `Интерактивное удаление`
- [ ] `Интерактивное удаление предопределенных данных`
- [ ] `Интерактивная пометка удаления предопределенных данных`
- [ ] `Интерактивное снятие пометки удаления предопределенных данных`
- [ ] `Интерактивное удаление помеченных предопределенных данных`

Право `Удаление` рекомендуется оставлять только в ролях
`ПолныеПрава` и `АдминистраторСистемы`.

- [x] `Удаление`

#### Проверки
[#v8cs:right-delete](https://v8std.ru/diagnostics/v8-code-style/right-delete/)

## Стандартные роли в расширениях конфигурации

#### 6.

При разработке расширений не рекомендуется заимствовать и изменять роли
`АдминистраторСистемы` и `ПолныеПрава`.
Добавляйте в расширение собственные роли по описанному ниже принципу.

#### 6.1.

Если права на все объекты расширения одинаковые для всех категорий пользователей:

- создайте роль `ОбщиеПрава`;
- настройте в ней нужные права на объекты расширения;
- включите роль в `Основные роли` расширения.

#### 6.2.

Если права на объекты расширения различаются для администратора и пользователей,
создайте две роли:

- `ПолныеПрава` (включается в `Основные роли` расширения);
- `БазовыеПрава`.

#### 6.3.

Если права различаются для администратора, пользователей и внешних пользователей,
создайте три роли:

- `ПолныеПрава` (включается в `Основные роли` расширения);
- `БазовыеПрава`;
- `БазовыеПраваВнешнихПользователей`.

Подробнее про внешних пользователей см. в документации БСП.

#### 6.4.1.

В конфигурациях на базе БСП роли из пп. [6.1](https://v8std.ru/std/488/#61)-[6.3](https://v8std.ru/std/488/#63)
автоматически включаются в профили групп доступа при установке расширения:

- роль `ОбщиеПрава` включается во все профили с ролями
  `БазовыеПраваБСП`, `БазовыеПраваВнешнихПользователейБСП`, `ПолныеПрава`;
- роль `БазовыеПрава` включается в профили с ролью `БазовыеПраваБСП`;
- роль `БазовыеПраваВнешнихПользователей` включается в профили
  с ролью `БазовыеПраваВнешнихПользователейБСП`;
- роль `ПолныеПрава` включается в профили с ролью `ПолныеПрава`.

#### 6.4.2.

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

Такие роли автоматически в профили не включаются.
Их можно:

- программно добавлять в поставляемые профили;
- интерактивно назначать в справочнике `Профили групп доступа`.

#### 6.5.

В конфигурациях без БСП (или без использования профилей)
роли расширений из пп. [6.1](https://v8std.ru/std/488/#61)-[6.3](https://v8std.ru/std/488/#63)
назначайте пользователям ИБ:

- программно средствами встроенного языка;
- интерактивно.

Так расширение можно единообразно подключать как в конфигурациях на БСП,
так и в конфигурациях без БСП, без изменения состава ролей расширения.

#### См. также

- [#std485: Использование привилегированного режима](https://v8std.ru/std/485/)
- [#std658: Эффективные условия запросов](https://v8std.ru/std/658/)
- [#std689: Настройка ролей и прав доступа](https://v8std.ru/std/689/)
- [#std669: Ограничение на выполнение внешнего кода](https://v8std.ru/std/669/)

#### Проверки
[#v8cs:right-active-users](https://v8std.ru/diagnostics/v8-code-style/right-active-users/)
[#v8cs:right-administration](https://v8std.ru/diagnostics/v8-code-style/right-administration/)
[#v8cs:right-all-functions-mode](https://v8std.ru/diagnostics/v8-code-style/right-all-functions-mode/)
[#v8cs:right-configuration-extensions-administration](https://v8std.ru/diagnostics/v8-code-style/right-configuration-extensions-administration/)
[#v8cs:right-data-administration](https://v8std.ru/diagnostics/v8-code-style/right-data-administration/)
[#v8cs:right-exclusive-mode](https://v8std.ru/diagnostics/v8-code-style/right-exclusive-mode/)
[#v8cs:right-interactive-open-external-data-processors](https://v8std.ru/diagnostics/v8-code-style/right-interactive-open-external-data-processors/)
[#v8cs:right-interactive-open-external-reports](https://v8std.ru/diagnostics/v8-code-style/right-interactive-open-external-reports/)
[#v8cs:right-output-to-printer-file-clipboard](https://v8std.ru/diagnostics/v8-code-style/right-output-to-printer-file-clipboard/)
[#v8cs:right-save-user-data](https://v8std.ru/diagnostics/v8-code-style/right-save-user-data/)
[#v8cs:right-start-automation](https://v8std.ru/diagnostics/v8-code-style/right-start-automation/)
[#v8cs:right-start-external-connection](https://v8std.ru/diagnostics/v8-code-style/right-start-external-connection/)
[#v8cs:right-start-thick-client](https://v8std.ru/diagnostics/v8-code-style/right-start-thick-client/)
[#v8cs:right-start-thin-client](https://v8std.ru/diagnostics/v8-code-style/right-start-thin-client/)
[#v8cs:right-start-web-client](https://v8std.ru/diagnostics/v8-code-style/right-start-web-client/)
[#v8cs:right-update-database-configuration](https://v8std.ru/diagnostics/v8-code-style/right-update-database-configuration/)
[#v8cs:right-view-event-log](https://v8std.ru/diagnostics/v8-code-style/right-view-event-log/)

[#acc:162](https://v8std.ru/diagnostics/acc/162/)
[#acc:164](https://v8std.ru/diagnostics/acc/164/)
[#acc:165](https://v8std.ru/diagnostics/acc/165/)
[#acc:192](https://v8std.ru/diagnostics/acc/192/)
[#acc:193](https://v8std.ru/diagnostics/acc/193/)
[#acc:194](https://v8std.ru/diagnostics/acc/194/)
[#acc:195](https://v8std.ru/diagnostics/acc/195/)
[#acc:218](https://v8std.ru/diagnostics/acc/218/)
[#acc:219](https://v8std.ru/diagnostics/acc/219/)
[#acc:220](https://v8std.ru/diagnostics/acc/220/)
[#acc:224](https://v8std.ru/diagnostics/acc/224/)
[#acc:251](https://v8std.ru/diagnostics/acc/251/)
[#acc:419](https://v8std.ru/diagnostics/acc/419/)
[#acc:420](https://v8std.ru/diagnostics/acc/420/)
[#acc:1046](https://v8std.ru/diagnostics/acc/1046/)
[#acc:1149](https://v8std.ru/diagnostics/acc/1149/)
[#acc:1150](https://v8std.ru/diagnostics/acc/1150/)
#### Источник

https://its.1c.ru/db/v8std#content:488

Отсутствует обязательная роль. АПК:1046

Установлено право "Интерактивное удаление". АПК:1149

Не установлено право в роли "ПолныеПрава". АПК:1150

Не установлено право. АПК:162

Установлено право "Удаление". АПК:164

Установлено лишнее право. АПК:165

Установлено право "ИнтерактивноеУдалениеПредопределенныхДанных". АПК:192

Установлено право "ИнтерактивнаяПометкаУдаленияПредопределенныхДанных". АПК:193

Установлено право "ИнтерактивноеСнятиеПометкиУдаленияПредопределенныхДанных". АПК:194

Установлено право "ИнтерактивноеУдалениеПомеченныхПредопределенныхДанных". АПК:195

Установлены все права в роли "ПолныеПрава" для объекта, не входящего в состав разделителя. АПК:218

Установлены все права в роли "АдминистраторСистемы" для объекта, входящего в состав разделителя. АПК:219

Не установлено право в роли "АдминистраторСистемы". АПК:220

Для обязательной роли установлен неправильный синоним. АПК:224

Обязательная роль не установлена как основная роль конфигурации. АПК:251

В правах роли установлены ограничения (RLS) для объекта метаданных. АПК:419

В праве "Удаление" роли установлены ограничения (RLS) для объекта метаданных. АПК:420

Право установлено: Активные пользователи (right-active-users)

Право установлено: Администрирование (right-administration)

Право установлено: Режим "Все функции" (right-all-functions-mode)

Право установлено: Администрирование расширений конфигурации (right-configuration-extensions-administration)

Право установлено: Администрирование данных (right-data-administration)

Установлено право "Удаление" (right-delete)

Право установлено: Монопольный режим (right-exclusive-mode)

Право установлено: Интерактивное открытие внешних обработок (right-interactive-open-external-data-processors)

Право установлено: Интерактивное открытие внешних отчетов (right-interactive-open-external-reports)

Право установлено: Вывод (right-output-to-printer-file-clipboard)

Право установлено: Сохранение данных пользователя (right-save-user-data)

Право установлено: Automation (right-start-automation)

Право установлено: Внешнее соединение (right-start-external-connection)

Право установлено: Толстый клиент (right-start-thick-client)

Право установлено: Тонкий клиент (right-start-thin-client)

Право установлено: Веб-клиент (right-start-web-client)

Право установлено: Обновление конфигурации базы данных (right-update-database-configuration)

Право установлено: Журнал регистрации (right-view-event-log)

Использование привилегированного режима #std485

Эффективные условия запросов #std658

Ограничение на выполнение внешнего кода #std669

Настройка ролей и прав доступа #std689

Стандартные роли #std488


стандарт 490

ID: #std490

# Блокировка данных объекта для редактирования из кода

#### 1.1.

Перед изменением существующего объекта информационной базы из встроенного языка предварительно устанавливайте блокировку данных для редактирования (объектную блокировку).

Это позволяет:

- проверить, не заблокирован ли объект в другом месте;
- снизить риск конкурентного изменения данных в других сеансах или экземплярах объекта.

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

Блокировка данных для редактирования не запрещает запись этих данных в других сеансах полностью. Она только не позволяет нескольким объектам одновременно установить блокировку одних и тех же данных.

В отличие от [#std648: транзакционных блокировок данных](https://v8std.ru/std/648/), такая блокировка предназначена для конкурентной работы пользователей с объектами ИБ (документами, элементами справочников и т.д.)
Подробнее о механизме блокировки данных для редактирования см. в документации платформы `1С:Предприятие 8`.

#### 1.2.

Для блокировки из встроенного языка используйте метод `Заблокировать()` у объекта или метод глобального контекста `ЗаблокироватьДанныеДляРедактирования()`.

#### Пример 1

Нужно заблокировать объект и, если блокировка получена, изменить данные.
Если объект уже заблокирован, платформа выдаст исключение с информацией о блокирующем сеансе.

```bsl
ФайлОбъект = ДанныеФайла.Ссылка.ПолучитьОбъект();
// Выполнить блокировку объекта от изменения другими режимами
// или пользователями; в случае блокировки -
// вывести пользователю сообщение об исключении.
ФайлОбъект.Заблокировать();
// Затем изменить и записать объект
ФайлОбъект.Редактирует = Справочники.Пользователи.ПустаяСсылка();
ФайлОбъект.Записать();
```

Аналогично через глобальный метод:

```bsl
ФайлОбъект = ДанныеФайла.Ссылка.ПолучитьОбъект();
// Выполнить блокировку объекта от изменения другими режимами
// или пользователями; в случае блокировки -
// вывести пользователю сообщение об исключении.
ЗаблокироватьДанныеДляРедактирования(ДанныеФайла.Ссылка);
// Затем изменить и записать объект
ФайлОбъект.Редактирует = Справочники.Пользователи.ПустаяСсылка();
ФайлОбъект.Записать();
```

#### Пример 2

Нужно пропускать обработку объекта, если он заблокирован, и повторять попытку при следующем запуске (например, из фонового или регламентного задания).

```bsl
ФайлОбъект = ТекущаяВерсия.ПолучитьОбъект();
// Выполнить блокировку объекта от изменения другими режимами или пользователями.
УстановитьПолноеНаименование = Истина;
Попытка
    ФайлОбъект.Заблокировать();
Исключение
    // в случае блокировки - не выполнять изменение объекта
    УстановитьПолноеНаименование = Ложь;
    // записать предупреждение в журнал регистрации
    ЗаписьЖурналаРегистрации(НСтр("ru = 'Фоновое обновление имен файлов'", Метаданные.ОсновнойЯзык.КодЯзыка),
        УровеньЖурналаРегистрации.Предупреждение,, ФайлОбъект, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;

// Пропустить обработку объекта, если он заблокирован.
Если УстановитьПолноеНаименование Тогда
    ФайлОбъект.ПолноеНаименование = ПолноеНаименование;
    ФайлОбъект.Записать();
КонецЕсли;
```

#### 1.3.

При редактировании данных в формах платформа `1С:Предприятие` автоматически устанавливает блокировку объекта, который указан как основной реквизит формы.

#### 2.

Не проверяйте блокировку объектов для редактирования в случаях:

- выполнения операций с более высоким приоритетом относительно интерактивных действий пользователя (например, загрузка данных при обмене);
- действий, которые гарантированно выполняются в монопольном режиме (например, процедуры обновления и первоначального заполнения ИБ).

#### См. также

- [#std648: Ответственное чтение данных](https://v8std.ru/std/648/)

#### Проверки
[#acc:1327](https://v8std.ru/diagnostics/acc/1327/)
[#acc:1328](https://v8std.ru/diagnostics/acc/1328/)

#### Источник

https://its.1c.ru/db/v8std#content:490

Отсутствует исключительная управляемая блокировка на записываемые (удаляемые) данные. АПК:1327

Отсутствует разделяемая управляемая блокировка на читаемые данные. АПК:1328

Ответственное чтение данных #std648

Блокировка данных объекта для редактирования из кода #std490


стандарт 491

ID: #std491

# Влияние изменения значений параметров сеанса и функциональных опций на производительность механизма ограничения доступа к данным

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

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

Рекомендации:

- устанавливайте значения параметров сеанса `по требованию` в обработчике `УстановкаПараметровСеанса` модуля сеанса;
- не изменяйте часто значения функциональных опций в процессе работы системы.

#### См. также

- [#std413: Использование параметров сеанса](https://v8std.ru/std/413/)
- [#std470: Использование функциональных опций](https://v8std.ru/std/470/)

#### Источник

https://its.1c.ru/db/v8std#content:491

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

Использование параметров сеанса #std413

Использование функциональных опций #std470

Влияние изменения значений параметров сеанса и функциональных опций на производительность механизма ограничения доступа к данным #std491


стандарт 492

ID: #std492

# Обработчики событий модуля формы, подключаемые из кода

Если обработчик формы назначается программно через `УстановитьДействие`, у процедуры должен быть префикс `Подключаемый_` (англ. `Attachable_`).

#### 1.

Используйте префикс `Подключаемый_` для всех обработчиков, которые подключаются из кода.

Это помогает при проверке конфигурации с флажком "Поиск неиспользуемых процедур и функций":

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

#### 2.

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

#### Неправильно

```bsl
Элементы.КонтактнаяИнформация.УстановитьДействие("НачалоВыбора", "КонтактнаяИнформацияНачалоВыбора");

Процедура КонтактнаяИнформацияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    ...
КонецПроцедуры
```

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

```log
Справочник._ДемоПартнеры.Форма.ФормаЭлемента.Форма: Не обнаружено ссылок на процедуру "КонтактнаяИнформацияНачалоВыбора"
```

#### Правильно

```bsl
Элементы.КонтактнаяИнформация.УстановитьДействие("НачалоВыбора", "Подключаемый_КонтактнаяИнформацияНачалоВыбора");

Процедура Подключаемый_КонтактнаяИнформацияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    ...
КонецПроцедуры
```

#### Проверки
[#v8cs:module-attachable-event-handler-name](https://v8std.ru/diagnostics/v8-code-style/module-attachable-event-handler-name/)

[#acc:100](https://v8std.ru/diagnostics/acc/100/)
#### Источник

https://its.1c.ru/db/v8std#content:492

Если обработчик формы назначается программно через УстановитьДействие, у процедуры должен быть префикс Подключаемый_ (англ. Attachable_).

Использован обработчик событий, подключаемый из кода и не содержащий префикса "Подключаемый_". АПК:100

Имя подключаемого обработчка события (module-attachable-event-handler-name)

Обработчики событий модуля формы, подключаемые из кода #std492


стандарт 494

ID: #std494

# Предварительная инициализация локальных переменных

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

Это снижает риск ошибок времени выполнения, когда переменная остается `Неопределено`, а следующий код ожидает конкретный тип.

#### Неправильно

```bsl
Если ЧтоТоТам Тогда
      МояПеременная = 10;
ИначеЕсли
      // ряд следующих веток
      …
КонецЕсли;

... = МояПеременная; // если ЧтоТоТам не ИСТИНА, переменная может быть Неопределено
```

#### Правильно

```bsl
МояПеременная = 0; // значение по умолчанию

Если ЧтоТоТам Тогда
      МояПеременная = 10;
ИначеЕсли
      // ряд следующих веток
      …
КонецЕсли;

... = МояПеременная; // переменная всегда имеет числовое значение
```

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

#### Источник

https://its.1c.ru/db/v8std#content:494

Предварительная инициализация локальных переменных #std494


стандарт 496

ID: #std496

# Чтение отдельных реквизитов объекта из базы данных

При чтении отдельных реквизитов из базы учитывайте: вызов `ПолучитьОбъект` или обращение к реквизитам через точку от ссылки загружает объект целиком, включая табличные части.

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

#### Неправильно

```bsl
Процедура ЗаполнитьКодИНаименованиеСтраны()

  СтранаСсылка = ... // получаем ссылку на элемент справочника
  КодСтраны = СтранаСсылка.Код; // первое обращение загружает объект целиком
  НаименованиеСтраны = СтранаСсылка.Наименование;

КонецПроцедуры
```

#### Правильно

```bsl
Процедура ЗаполнитьКодИНаименованиеСтраны()

  Запрос = Новый Запрос(
      "ВЫБРАТЬ
      |   СтраныМира.Код,
      |   СтраныМира.Наименование
      |ИЗ
      |   Справочник.СтраныМира КАК СтраныМира
      |ГДЕ
      |   СтраныМира.Ссылка = &Ссылка");
  Запрос.УстановитьПараметр("Ссылка", Ссылка);

  Выборка = Запрос.Выполнить().Выбрать();
  Выборка.Следующий();

  КодСтраны = Выборка.Код;
  НаименованиеСтраны = Выборка.Наименование;

КонецПроцедуры
```

Для упрощения синтаксиса можно использовать функции `ЗначенияРеквизитовОбъекта` и `ЗначениеРеквизитаОбъекта` из [Библиотеки стандартных подсистем](http://v8.1c.ru/libraries/ssl/index.htm).

Тогда пример можно записать так:

```bsl
Процедура ЗаполнитьКодИНаименованиеСтраны()

  ЗначенияРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СтранаСсылка, "Код, Наименование");
  КодСтраны = ЗначенияРеквизитов.Код;
  НаименованиеСтраны = ЗначенияРеквизитов.Наименование;

КонецПроцедуры
```

#### Источник

https://its.1c.ru/db/v8std#content:496

При чтении отдельных реквизитов из базы учитывайте: вызов ПолучитьОбъект или обращение к реквизитам через точку от ссылки загружает объект целиком, включая табличные части.

Чтение отдельных реквизитов объекта из базы данных #std496


стандарт 497

ID: #std497

# Запись событий в историю работы пользователя

В историю работы пользователя
автоматически попадают события
интерактивного добавления
и изменения объектов информационной базы
(документы,
элементы справочников и т.д.).

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

Например,
команду `Поместить файл`
для элемента справочника `Файлы`.

Для добавления событий
используется объект
`ИсторияРаботыПользователя`
типа
`МенеджерИсторииРаботыПользователя`.

#### Пример

```bsl
&НаКлиенте
Процедура ПоместитьФайл(Команда)
    // Поместить файл в базу.
    // ...

    // Добавить событие в историю работы пользователя.
    ИсторияРаботыПользователя.Добавить(ПолучитьНавигационнуюСсылку(Объект.Ссылка));
КонецПроцедуры
```

#### Источник

https://its.1c.ru/db/v8std#content:497

Запись событий в историю работы пользователя #std497


std498
#std498
std 498
стандарт 498
журнал регистрации
запись журнала регистрации
UsageWriteLogEvent

ID: #std498

# Использование Журнала регистрации

#### 1.

Журнал регистрации хранит события, которые возникают в работе пользователей с информационной базой.

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

#### 2.

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

Это актуально и для интерактивной бизнес-логики, и для фоновых/регламентных заданий.

Одна запись журнала должна соответствовать одному событию.

#### 2.1.

Используйте строковый идентификатор типа события.

Типы событий группируйте по функциональному признаку:
`НазваниеГруппыСобытий.НазваниеСобытия`.

Например, лучше:

- `Поручения.Уведомление о новых задачах`;
- `Поручения.Уведомление о зависших задачах`.

Хуже:

- `Уведомление о новых задачах`;
- `Уведомление о зависших задачах`.

Не включайте в тип события конкретные данные из ИБ или внешних систем.

Например, неправильно:

- `Не удалось отменить проведение документа `;
- `В информационной базе не найден сотрудник Найденова, банковская карта 3333`.

Метаданные события передавайте в параметр `Метаданные`, данные — в параметр `Данные` метода `ЗаписьЖурналаРегистрации`.

Типы событий делайте более общими, например:

- `Проведение документов.Не удалось отменить проведение`;
- `Сотрудники.В информационной базе не найден сотрудник`.

Текст типа события должен быть локализуемым и задаваться на основном языке конфигурации.

#### 2.2.

Выбирайте уровень важности события по смыслу:

- `Ошибка` — критичные события и сбои;
- `Предупреждение` — потенциальные проблемы и нефатальные ошибки;
- `Информация` — успешные действия;
- `Примечание` — менее значимые сообщения.

#### 2.3.

Комментарий — это текстовая неструктурированная информация о событии.

Не объединяйте в один комментарий несколько событий.

#### Неправильно

Один комментарий содержит целую последовательность разных событий:

```text
[01.01.2010 00:00:01] Начало инициализации обмена данными...
[01.01.2010 00:00:02] Окончание инициализации обмена данными...
[01.01.2010 00:00:03] Начало процесса обмена данными...
[01.01.2010 00:00:04] Начало записи изменений...
[01.01.2010 00:00:05] Окончание записи изменений...
[01.01.2010 00:00:06] Окончание процесса обмена данными...
[01.01.2010 00:00:07] Выполнено, выгрузка данных...
```

Пишите столько записей, сколько событий реально произошло.

Не помещайте в комментарий текстовые данные неизвестного объема (содержимое файлов, ответы веб-сервисов и т.п.).
Ориентир по размеру — до `10 Кб`.

Для записи данных об исключении используйте:

```bsl
ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())
```

Пример регистрации дополнительных событий подсистемы:

```bsl
Попытка
    ЗаписьЖурналаРегистрации(НСтр("ru = 'Мой механизм.Действие с возможной ошибкой'", КодОсновногоЯзыка),
        УровеньЖурналаРегистрации.Информация, , ,
        НСтр("ru = 'Начато действие'"));

    ДействиеСВозможнойОшибкой(ОбъектДействия);

    ЗаписьЖурналаРегистрации(НСтр("ru = 'Мой механизм.Действие с возможной ошибкой'", КодОсновногоЯзыка),
        УровеньЖурналаРегистрации.Информация, , ,
        НСтр("ru = 'Завершено действие'"));

Исключение
    ЗаписьЖурналаРегистрации(НСтр("ru = 'Мой механизм.Действие с возможной ошибкой'", КодОсновногоЯзыка),
        УровеньЖурналаРегистрации.Ошибка, , ,
        НСтр("ru = 'Во время выполнения действия произошла неизвестная ошибка.'") + Символы.ПС
        + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
```

Переменная `КодОсновногоЯзыка` должна содержать код языка хранения данных.
См. [#std784: Автогенерированные данные в информационной базе: требования по локализации, п. 1](https://v8std.ru/std/784/)

#### 3.

Не используйте выборки из журнала регистрации там, где критична высокая скорость.
С ростом объема журнала скорость выборки снижается пропорционально.

Для протоколирования производительных сценариев лучше:

- использовать отдельный регистр;
- обращаться к специализированным объектам платформы (например, `МенеджерФоновыхЗаданий` для истории фоновых заданий).

Это же учитывайте при разработке отчетов по журналу регистрации.

#### См. также

- [#std761: Интерфейсные тексты в коде: требования по локализации](https://v8std.ru/std/761/)

#### Проверки
[#bslls:UsageWriteLogEvent](https://v8std.ru/diagnostics/bslls/UsageWriteLogEvent/)

[#acc:152](https://v8std.ru/diagnostics/acc/152/)
[#acc:153](https://v8std.ru/diagnostics/acc/153/)
[#acc:154](https://v8std.ru/diagnostics/acc/154/)
[#acc:156](https://v8std.ru/diagnostics/acc/156/)
[#acc:157](https://v8std.ru/diagnostics/acc/157/)
[#acc:161](https://v8std.ru/diagnostics/acc/161/)
[#acc:370](https://v8std.ru/diagnostics/acc/370/)
[#acc:371](https://v8std.ru/diagnostics/acc/371/)
#### Источник

https://its.1c.ru/db/v8std#content:498

В параметре "ИмяСобытия" метода "ЗаписьЖурналаРегистрации()" имеется лишний пробел после точки. АПК:152

Не локализован параметр "Комментарий" метода "ЗаписьЖурналаРегистрации()". АПК:153

Если в параметре "Комментарий" метода "ЗаписьЖурналаРегистрации()" указано подробное описание ошибки, то уровень журнала должен быть "Ошибка". АПК:154

Не локализован параметр "ИмяСобытия" метода "ЗаписьЖурналаРегистрации()". АПК:156

Для параметра "ИмяСобытия" метода "ЗаписьЖурналаРегистрации()" не задан основной язык конфигурации. АПК:157

Параметр "ИмяСобытия" метода "ЗаписьЖурналаРегистрации()" инициализируется функцией, возращающей нелокализованную строку. АПК:161

Параметр "ИмяСобытия" метода "ЗаписьЖурналаРегистрации()" инициализируется переменной, содержащей нелокализованную строку. АПК:370

При локализации параметра "ИмяСобытия" для получения кода языка следует использовать функцию ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка(). АПК:371

Неверное использование метода "ЗаписьЖурналаРегистрации" BSLLS:UsageWriteLogEvent

Интерфейсные тексты в коде: требования по локализации #std761

Автогенерированные данные в информационной базе: требования по локализации #std784

Использование Журнала регистрации #std498


стандарт 499

ID: #std499

# Перехват исключений в коде

#### 1.

Не перехватывайте исключения без необходимости.

Необработанное исключение:

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

Для распространенных ошибок платформа уже содержит категории и шаблоны сообщений.
В сервис регистрации обычно отправляются ошибки программного кода,
например: `Значение не является значением объектного типа`,
`Поле объекта не обнаружено`, `Слишком много фактических параметров`,
`Ошибка при вызове метода контекста`.

#### 2.

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

Это особенно важно для ошибок интеграции и внешних ресурсов:

- почтовые серверы;
- веб-сервисы;
- принтеры;
- криптопровайдеры;
- каналы связи.

#### Проверки
[#v8cs:empty-except-statement](https://v8std.ru/diagnostics/v8-code-style/empty-except-statement/)

#### 2.1.

В таких случаях допустимо перехватить и перевызвать исключение
с уточнением, но без потери исходной информации об ошибке.

Блоки `Попытка ... Исключение` размещайте локально,
только вокруг потенциально проблемного вызова.

Не открывайте широкий блок `Попытка` вокруг большого участка кода,
чтобы не перехватывать несвязанные ошибки соседнего кода.

#### Правильно

```bsl
Попытка
    ЗагрузитьФайлИзИнтернета(...);
Исключение
    ИнформацияОбОшибке = ИнформацияОбОшибке();
    ТекстСообщения = ОбработкаОшибок.СообщениеОбОшибкеДляПользователя(ИнформацияОбОшибке);
    ТекстСообщения = НСтр("ru = 'Не удалось загрузить файл классификатора АУЦ:'")
        + Символы.ПС + ТекстСообщения
        + Символы.ПС + НСтр("ru = 'Возможные причины:
        | • Нет подключения к Интернету;
        | • На веб-узле возникли неполадки;
        | • Брандмауэр или другое промежуточное ПО (антивирусы и т.п.) блокируют попытки программы подключиться к Интернету;
        | • Подключение к Интернету выполняется через прокси-сервер, но его параметры не заданы в программе.'");

    ДляАдминистратора = ДиагностикаСоединенияСИнтернет();
    ВызватьИсключение(ТекстСообщения, , , ДляАдминистратора, ИнформацияОбОшибке);
КонецПопытки;
```

#### Рекомендация

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

#### 2.2.

В особых сценариях (например, обработчики обновления информационной базы)
допустима собственная обработка исключения без `ВызватьИсключение`.

В таком случае исключение не перевызывается, а обрабатывается.

#### Правильно

- фильтруйте и отправляйте ошибки программного кода в сервис регистрации ошибок
  (см. `ИнформацияОбОшибке.ЯвляетсяОшибкойКатегории()` и `ОтчетОбОшибке.Отправить()`);
- фиксируйте причину ошибки в журнале регистрации для диагностики администратором;
- записывайте в журнал подробное представление исключения,
  а пользовательское сообщение добавляйте в текст ошибки
  (см. `ОбработкаОшибок.ПодробноеПредставлениеОшибки()`
  и `ОбработкаОшибок.СообщениеОбОшибкеДляПользователя()`).

#### Неправильно

не используйте `ОписаниеОшибки()`;

#### Правильно

`ОбработкаОшибок.ПодробноеПредставлениеОшибки()`

#### Неправильно

не используйте `ОбработкаОшибок.КраткоеПредставлениеОшибки()`

#### Правильно

`ОбработкаОшибок.СообщениеОбОшибкеДляПользователя()`.

#### 3.

Частные случаи некорректного перехвата исключений.

#### 3.1.

Не анализируйте текст исключения для интерпретации причины ошибки.

Текст исключения может меняться в зависимости от локализации
и версии платформы или конфигурации.

Текст пользователю выводите «как есть».
При необходимости добавляйте прикладное пояснение операции
и возможные причины.

#### Пример

```bsl
Попытка
    ЗагрузитьФайлИзИнтернета(...);
Исключение
    ИнформацияОбОшибке = ИнформацияОбОшибке();
    ТекстСообщения = ОбработкаОшибок.СообщениеОбОшибкеДляПользователя(ИнформацияОбОшибке);
    ТекстСообщения = НСтр("ru = 'Не удалось загрузить файл классификатора АУЦ:'")
        + Символы.ПС + ТекстСообщения
        + Символы.ПС + НСтр("ru = 'Возможные причины:
        | • Нет подключения к Интернету;
        | • На веб-узле возникли неполадки;
        | • Брандмауэр или другое промежуточное ПО (антивирусы и т.п.) блокируют попытки программы подключиться к Интернету;
        | • Подключение к Интернету выполняется через прокси-сервер, но его параметры не заданы в программе.'");

    ДляАдминистратора = ДиагностикаСоединенияСИнтернет();
    ВызватьИсключение(ТекстСообщения, , , ДляАдминистратора, ИнформацияОбОшибке);
КонецПопытки;
```

Если в конфигурации используется БСП, применяйте `ОбщегоНазначенияКлиентСервер.УточнениеИсключения()`:

#### Пример с БСП

```bsl
Попытка
    ЗагрузитьФайлИзИнтернета(...);
Исключение
    ИнформацияОбОшибке = ИнформацияОбОшибке();
    Уточнение = ОбщегоНазначенияКлиентСервер.УточнениеИсключения(
        ИнформацияОбОшибке,
        НСтр("ru = 'Не удалось загрузить файл классификатора АУЦ:'"));
    Уточнение.Текст = Уточнение.Текст
        + Символы.ПС + НСтр("ru = 'Возможные причины:
        | • Нет подключения к Интернету;
        | • На веб-узле возникли неполадки;
        | • Брандмауэр или другое промежуточное ПО (антивирусы и т.п.) блокируют попытки программы подключиться к Интернету;
        | • Подключение к Интернету выполняется через прокси-сервер, но его параметры не заданы в программе.'");

    ДляАдминистратора = ДиагностикаСоединенияСИнтернет();
    ВызватьИсключение(Уточнение.Текст, Уточнение.Категория, , ДляАдминистратора, ИнформацияОбОшибке);
КонецПопытки;
```

#### Иллюстрация

Изображение: Пример окна исключения с уточненным сообщением (499.exception-dialog.png)

#### 3.2.

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

#### Неправильно

```bsl
Попытка
    // код, приводящий к вызову исключения
    ...
Исключение
    // перехват любых исключений
КонецПопытки;
```

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

#### Правильно

```bsl
Попытка
    // код, приводящий к вызову исключения
    ...
Исключение
    // Пояснение причин перехвата всех исключений «незаметно» от пользователя.
    // ...
    // И запись события в журнал регистрации для системного администратора.
    ЗаписьЖурналаРегистрации(
        НСтр("ru = 'Выполнение операции'"),
        УровеньЖурналаРегистрации.Ошибка,
        ,
        ,
        ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
```

#### 4.

Порядок обработки исключений при использовании транзакций
описан в стандарте [#std783: Транзакции: правила использования](https://v8std.ru/std/783/)

#### См. также

- [#std542: Доступ к файловой системе из кода конфигурации](https://its.1c.ru/db/v8std#content:542), удаление временных файлов.
- [#std783: Транзакции: правила использования](https://v8std.ru/std/783/)

#### Проверки
[#bslls:MissingCodeTryCatchEx](https://v8std.ru/diagnostics/bslls/MissingCodeTryCatchEx/)
[#bslls:TryNumber](https://v8std.ru/diagnostics/bslls/TryNumber/)
[#bslls:UsageWriteLogEvent](https://v8std.ru/diagnostics/bslls/UsageWriteLogEvent/)
[#v8cs:begin-transaction](https://v8std.ru/diagnostics/v8-code-style/begin-transaction/)
[#v8cs:commit-transaction](https://v8std.ru/diagnostics/v8-code-style/commit-transaction/)
[#v8cs:lock-out-of-try](https://v8std.ru/diagnostics/v8-code-style/lock-out-of-try/)
[#v8cs:rollback-transaction](https://v8std.ru/diagnostics/v8-code-style/rollback-transaction/)

[#acc:280](https://v8std.ru/diagnostics/acc/280/)
[#acc:1319](https://v8std.ru/diagnostics/acc/1319/)
[#acc:1320](https://v8std.ru/diagnostics/acc/1320/)
#### Источник

https://its.1c.ru/db/v8std#content:499

После инициализации блокировки отсутствует вызов "Заблокировать()". АПК:1319

Вызов "Заблокировать()" находится вне попытки. АПК:1320

Конструкция "Попытка...Исключение...КонецПопытки" не содержит кода в исключении. АПК:280

Конструкция "Попытка...Исключение...КонецПопытки" не содержит кода в исключении BSLLS:MissingCodeTryCatchEx

Приведение к числу в попытке BSLLS:TryNumber

После начала транзакции отсуствует блок Попытка-Исключение (begin-transaction)

Проверка нарушения схемы работы с транзакциями (commit-transaction)

Конструкция "Попытка...Исключение...КонецПопытки" не содержит кода в исключении (empty-except-statement)

Вызов "Заблокировать()" находится вне попытки (lock-out-of-try)

Проверка нарушения схемы работы с транзакциями (rollback-transaction)

Транзакции: правила использования #std783

Перехват исключений в коде #std499


стандарт 531

ID: #std531

# Реквизит «Комментарий» у документов

#### 1.

Для всех документов рекомендуется создавать реквизит `Комментарий` (строка неограниченной длины).

Используйте его для служебных заметок, которые не относятся к прикладной сути документа.
Например, для фиксации причины пометки на удаление.

Права доступа к реквизиту `Комментарий` должны соответствовать правам на сам документ:

- если документ только для чтения, комментарий тоже только для чтения;
- если документ можно изменять, комментарий тоже можно изменять.

#### Проверки
[#v8cs:md-object-attribute-comment-incorrect-type](https://v8std.ru/diagnostics/v8-code-style/md-object-attribute-comment-incorrect-type/)
[#v8cs:md-object-attribute-comment-not-exist](https://v8std.ru/diagnostics/v8-code-style/md-object-attribute-comment-not-exist/)

#### 2.

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

#### Пример

В документе `Заказ клиента` для фиксации договоренностей с клиентом используйте реквизит `Дополнительная информация`, а не служебный реквизит `Комментарий`.

#### 3.

В простом варианте для внешнего редактирования комментария используйте функцию `ВвестиСтроку`.

Если в конфигурации используется БСП, можно применять специализированную процедуру `ПоказатьФормуРедактированияКомментария` общего модуля `ОбщегоНазначенияКлиент`.

#### См. также

#### Проверки

[#acc:108](https://v8std.ru/diagnostics/acc/108/)
[#acc:109](https://v8std.ru/diagnostics/acc/109/)
#### Источник

https://its.1c.ru/db/v8std#content:531

Для всех документов рекомендуется создавать реквизит Комментарий (строка неограниченной длины).

Документ не имеет реквизита "Комментарий". АПК:108

Реквизит "Комментарий" имеет недопустимый тип. АПК:109

Реквизит «Комментарий» у документов (md-object-attribute-comment-incorrect-type)

Документ не имеет реквизита "Комментарий" (md-object-attribute-comment-not-exist)

Реквизит «Комментарий» у документов #std531


стандарт 532

ID: #std532

# Установка прав для новых объектов и полей объектов

#### 1.

При разработке ролей выбирайте методику установки прав, которая не допускает появления ролей с доступом к полям объекта без доступа к самому объекту.

Это помогает избежать проблем на внедрении, когда пользователю по ошибке выдают роль с доступом ко всем реквизитам объекта метаданных.

#### 2.

- [x] `Устанавливать права для новых объектов` должен быть установлен только у роли `ПолныеПрава`.

#### 3.

При добавлении новой роли:

- [x] `Устанавливать права для реквизитов и табличных частей по умолчанию` должен быть установлен;
- [ ]  `Независимые права подчиненных объектов` должен быть снят.

#### 4.

Если нужно дать права только на поля объекта метаданных (просмотр/редактирование реквизитов, табличных частей, измерений, команд и т.п.) без прав на сам объект, сначала:

- [x] `Независимые права подчиненных объектов` установите флажок;
- [ ]  `Устанавливать права для реквизитов и табличных частей по умолчанию` снимите флажок с очисткой прав на все реквизиты и табличные части.

#### 5.

При добавлении новых объектов или новых полей существующих объектов обязательно настраивайте права на них в соответствующих ролях.

#### Пример

Пример настройки прав в роли `ДобавлениеИзменениеВидовКонтактнойИнформации`:

Изображение: Пример настройки прав в роли (532.roles-rights-example.png)

#### Проверки

[#acc:145](https://v8std.ru/diagnostics/acc/145/)
[#acc:146](https://v8std.ru/diagnostics/acc/146/)
#### Источник

https://its.1c.ru/db/v8std#content:532

Выключен флаг "Устанавливать права для новых объектов" или "Устанавливать права для реквизитов и табличных частей по умолчанию" у роли "Полные права". АПК:145

Флаг "Устанавливать права для новых объектов" должен быть включен только у роли "ПолныеПрава". АПК:146

Установка прав для новых объектов и полей объектов #std532


стандарт 534

ID: #std534

# Удаление устаревших объектов метаданных из конфигурации

#### 1.

При изменении структуры метаданных, если объект связан с данными ИБ, заранее решите: переносить данные или удалять.

#### 1.1.

Не удаляйте устаревшие объекты и реквизиты сразу.
Пометьте их как устаревшие, добавив префикс `Удалить` (англ. `Obsolete`) к имени.

Пример:
`ОсновнойДоговор` → `УдалитьОсновнойДоговор` (`ObsoleteMainContract`).

В синоним добавляйте префикс **(не используется)** (англ. **(not used)**).
Это относится и к стандартным реквизитам.

#### 1.2.

После изменения структуры обеспечьте перенос данных из устаревших объектов и реквизитов в новую структуру.

#### 1.3.

Если удаляемый объект — документ-регистратор, а регистры остаются, решите вопрос сохранения движений.
Рекомендуется:

- запретить формирование движений при проведении таких документов;
- запретить снятие пометки удаления;
- заменить регистратора в существующих движениях на замещающие документы (например, **Перенос данных**, **Операция**);
- пометить все документы этого вида на удаление.

#### 1.4.

Замените по всей конфигурации обращения к устаревшим объектам и реквизитам на новые.
Удалите лишние формы, команды, макеты и код.
Исключите устаревшие объекты из ролей (кроме `ПолныеПрава` и `АдминистраторСистемы` см [#std689: Настройка ролей и прав доступа](https://v8std.ru/std/689/)), подписок и т.п

Исключение — код переноса данных (см. п. [1.2](https://v8std.ru/std/534/#12))

#### 1.5.

Сортируйте устаревшие объекты и реквизиты в дереве метаданных по общим требованиям к конфигурации.

#### 1.6.

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

#### 2.

Перенос данных требуется также при изменении структуры измерений регистров сведений, если:

- удаляется измерение;
- сокращается тип измерения (уменьшается длина `Число`/`Строка`/`Дата`, заменяется тип, удаляется тип в составе, удаляется значение перечисления).

В этих случаях при реструктуризации возможна ошибка **Записи регистра стали неуникальными**.
Решение:

- создать новый регистр с правильной структурой, старый пометить как устаревший и перенести записи;
- или установить у измерения свойство **Режим сокращения типа** = **Удалять данные**, если перенос не нужен.

Устанавливайте **Удалять данные** для измерения регистра сведений, если:

- используется универсальный тип (`СправочникСсылка`, `ДокументСсылка` и т.п.);
- измерение настраивается в типовых решениях (напрямую, через определяемый тип или через изменения состава значений перечисления).

Новый регистр не требуется, если:

- добавляется новое измерение;
- расширяется состав типов у измерения составного типа.

#### 3.

Удаляйте устаревшие объекты и реквизиты с префиксом `Удалить` (`Obsolete`) только при выпуске новых версий и при одном из условий:

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

#### Пример

В версии 1.1 реквизит `ОсновнойДоговор` помечен как устаревший.

Тогда обновление с версии 1.0 на 2.0 идет в два шага:

- сначала на 1.1,
- потом на 2.0.

Переход напрямую с 1.0 на 2.0 запрещен.

При необходимости выпустите промежуточный релиз для очистки устаревших данных (см. [п. 1.6](https://v8std.ru/std/534/#16))
Иначе реструктуризация регистров может завершиться ошибкой из-за ссылок на устаревшие данные.

#### Проверки

[#acc:236](https://v8std.ru/diagnostics/acc/236/)
[#acc:259](https://v8std.ru/diagnostics/acc/259/)
[#acc:375](https://v8std.ru/diagnostics/acc/375/)
[#acc:1338](https://v8std.ru/diagnostics/acc/1338/)
[#acc:1370](https://v8std.ru/diagnostics/acc/1370/)
[#acc:1371](https://v8std.ru/diagnostics/acc/1371/)
#### Источник

https://its.1c.ru/db/v8std#content:534

Неиспользуемый (с префиксом "Удалить") объект метаданных содержит подчиненные объекты, не относящиеся к переносу данных. АПК:1338

В модуле устаревшего объекта содержится код. АПК:1370

Устаревший объект включен в свойство другого объекта. АПК:1371

Неверно образован синоним объекта с префиксом "Удалить". АПК:236

Имя неверно образовано из синонима с префиксом "(не используется)". АПК:259

Избыточно установлены права на устаревший объект метаданных (с префиксом "Удалить"). АПК:375

Настройка ролей и прав доступа #std689

Удаление устаревших объектов метаданных из конфигурации #std534


стандарт 535

ID: #std535

# Округление результатов арифметических операций в запросах

#### 1.

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

#### Неправильно

```sdbl
0.02 / 28346 * 9287492
```

#### Правильно

```sdbl
0.02 * 9287492 / 28346
```

#### 2.

При арифметических операциях в запросах платформа обычно поддерживает точность до 8 знаков после запятой. Но из-за особенностей разных СУБД реальная точность может отличаться.

Подробнее: [Разрядность результатов выражений и агрегатных функций в языке запросов](https://its.1c.ru/db/metod81/content/2665/hdoc).

Если на разных СУБД получается разная точность в операциях:

- деления;
- `СРЕДНЕЕ`;
- умножения (когда у каждого множителя может быть дробная часть),

рекомендуется явно задавать разрядность оператором:

```sdbl
ВЫРАЗИТЬ(... КАК Число(m, n))
```

`ВЫРАЗИТЬ` применяйте к операндам, если на какой-то СУБД точность недостаточна.

```sdbl
ВЫБРАТЬ
    ВЫРАЗИТЬ(Таблица.Множитель * Таблица.Числитель КАК Число(25,10))
        / ВЫРАЗИТЬ(Таблица.Знаменатель КАК Число(15,10)) КАК Результат
ИЗ Таблица КАК Таблица
```

Разрядность операндов задавайте минимально достаточной. Избыточно большая разрядность может ухудшить точность последующих вычислений и снизить скорость выполнения.

`ВЫРАЗИТЬ` применяйте к результату, если точность на всех СУБД достаточна, но отличается.

```sdbl
ВЫБРАТЬ
    ВЫРАЗИТЬ(Таблица.Множитель * Таблица.Числитель / Таблица.Знаменатель КАК Число(30,10)) КАК Результат
ИЗ Таблица КАК Таблица
```

В ряде случаев целесообразно приводить и операнды, и результат:

```sdbl
ВЫБРАТЬ
    ВЫРАЗИТЬ(
        ВЫРАЗИТЬ(Таблица.Множитель * Таблица.Числитель КАК Число(25,10))
            / ВЫРАЗИТЬ(Таблица.Знаменатель КАК Число(15,10))
        КАК Число(30,10)
    ) КАК Результат
ИЗ Таблица КАК Таблица
```

#### Источник

https://its.1c.ru/db/v8std#content:535

Округление результатов арифметических операций в запросах #std535


стандарт 539

ID: #std539

# Запуск регламентных заданий

#### 1.

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

Например,
предлагать запускать «по кнопке»
обработку данных,
которая обычно выполняется
регламентным заданием в фоне.

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

В частности:

- выполнение регламентных заданий
  может быть осознанно отключено
  на кластере серверов `1С:Предприятия`;
- в файловом режиме
  отсутствовала возможность
  автоматического выполнения
  регламентных и фоновых заданий
  (в отличие от клиент-серверного режима
  `1С:Предприятия` версии `8.2` и ранее,
  где они выполняются на сервере).

Способ ручного запуска
зависит от специфики задания.

#### 1.1.

Если **регламентное задание изменяет в системе данные**,
которые нужны конкретному бизнес-процессу
или показываются
в конкретном рабочем месте (форме),
то в этом рабочем месте
рекомендуется размещать
команду для выполнения этого действия.

Например:

- в форме поиска в данных
  выводится дата актуальности индекса,
  и если индекс неактуален,
  доступна команда `Обновить`;
- в списке входящих писем
  показывается время последнего приема,
  и доступна команда `Получить почту`;
- в рабочем месте ответственного
  за партионный учет
  показывается момент времени
  последнего распределения по партиям,
  и доступна команда `Выполнить`
  для распределения по партиям.

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

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

#### Пример

Пример ручного запуска задания
по очистке устаревших версий объектов:

```bsl
&НаСервере
Процедура ЗапуститьРегламентноеЗадание()
   ИмяМетода = Метаданные.РегламентныеЗадания.ОчисткаУстаревшихВерсийОбъектов.ИмяМетода;

   // Проверка, выполняется ли фоновое задание по очистке устаревших версий.
   Отбор = Новый Структура;
   Отбор.Вставить("ИмяМетода", ИмяМетода);
   Отбор.Вставить("Состояние", СостояниеФоновогоЗадания.Активно);
   ФоновыеЗаданияОчистки = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
   Если ФоновыеЗаданияОчистки.Количество() = 0 Тогда
      НаименованиеФоновогоЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
        НСтр("ru = 'Запуск вручную: %1'"), РегламентноеЗаданиеМетаданные.Синоним);
      ФоновыеЗадания.Выполнить(ИмяМетода,,, НаименованиеФоновогоЗадания);
   КонецЕсли;
КонецПроцедуры
```

#### 1.2.

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

Примеры таких заданий:

- обновление и перестроение агрегатов;
- установка периода рассчитанных итогов.

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

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

Если в конфигурации используется
**Библиотека стандартных подсистем**,
такое рабочее место
уже входит в подсистему `Регламентные задания`
(форма `Регламентные и фоновые задания`).

#### 1.3.

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

Примеры заданий,
которые не изменяют данные в базе:

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

Если в конфигурации используется
**Библиотека стандартных подсистем**,
такое рабочее место
уже входит в подсистему `Регламентные задания`
(форма `Регламентные и фоновые задания`).

#### 2.

Для администраторов информационных баз
рекомендуется:
на время обновления ИБ
блокировать выполнение
регламентных заданий.

Если обновление запускает
неподготовленный пользователь,
особенно в файловом режиме,
рекомендуется дополнительно:

- в файловом режиме,
  при неудачной попытке
  установки монопольного режима
  для обновления данных ИБ,
  предлагать автоматически
  блокировать работу
  регламентных заданий
  (перезапуск программы с ключом
  `/AllowExecuteScheduledJobs -Off`);
- в начале обработчиков
  регламентных заданий
  проверять режим работы
  и прерывать выполнение
  вызовом исключения,
  если обновление ИБ еще не завершено.

Если в конфигурации используется
**Библиотека стандартных подсистем**,
первая рекомендация
уже реализована
в подсистеме `Обновление версии ИБ`.

Для второй рекомендации
предусмотрена процедура
`ПриНачалеВыполненияРегламентногоЗадания()`
общего модуля `ОбщегоНазначения`.
Ее вызов нужно размещать
в начале кода обработчиков
регламентных заданий.

#### См. также

- [#std402: Настройка расписания регламентных заданий](https://v8std.ru/std/402/)
- [#std540: Предопределенные регламентные задания](https://v8std.ru/std/540/)
- [#std760: Ограничения на регламентные задания при работе в режиме сервиса](https://v8std.ru/std/760/)

#### Источник

https://its.1c.ru/db/v8std#content:539

Настройка расписания регламентных заданий #std402

Общие требования к регламентным заданиям #std540

Ограничения на регламентные задания при работе в модели сервиса #std760

Запуск регламентных заданий #std539


стандарт 540

ID: #std540

# Общие требования к регламентным заданиям

#### 1.

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

#### 2.

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

Такие задания
автоматически создаются
в информационной базе
с расписанием и состоянием,
заданными разработчиком в конфигураторе.

Примеры предопределенных заданий:

- загрузка курсов валют;
- извлечение текста
  для полнотекстового индексирования;
- обновление агрегатов.

#### 3.1.

Регламентные задания нельзя выполнять,
если соответствующая функциональность
в программе отключена.

Иначе они будут запускать сеансы
и расходовать ресурсы
сервера `1С:Предприятия`.

Поэтому нужно программно управлять
признаком предопределенного задания
`Использование`
в зависимости
от включенных функциональных опций (`ФО`).

Пример:
есть регламентное задание
`ПолучениеИОтправкаЭлектронныхПисем`
(с установленным флажком `Использование`),
которое должно выполняться
только при включенной ФО
`ИспользоватьПочтовыйКлиент`.

#### Неправильно

Создавать предопределенное регламентное задание,
зависящее от ФО,
с установленным флажком `Использование`.

#### Правильно

Снять флажок `Использование`
и управлять использованием задания
в зависимости от включения/выключения ФО.

Если в конфигурации используется
подсистема `Регламентные задания` БСП,
для настройки используйте процедуру
`ПриОпределенииНастроекРегламентныхЗаданий()`
общего модуля
`РегламентныеЗаданияПереопределяемый`.

#### Пример для БСП

```bsl
Настройка = Настройки.Добавить();
Настройка.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ОбновлениеСтатусовДоставкиSMS;
Настройка.ФункциональнаяОпция = Метаданные.ФункциональныеОпции.ИспользоватьПочтовыйКлиент;
Настройка.ДоступноВМоделиСервиса = Ложь;
```

После этого
в состав определяемого типа
`МестоХраненияФункциональныхОпций`
добавьте константы,
соответствующие ФО,
которые используются
для управления регламентными заданиями.

Для конфигураций без БСП
управляйте использованием задания,
например,
в модуле менеджера
значения константы
`ИспользоватьПочтовыйКлиент`.

#### Пример без БСП

```bsl
Процедура ПриЗаписи(Отказ)

 Задание = РегламентныеЗадания.НайтиПредопределенное(
     Метаданные.РегламентныеЗадания.ПолучениеИОтправкаЭлектронныхПисем);

 Если Задание.Использование <> Значение Тогда
  Задание.Использование = Значение;
  Задание.Записать();
 КонецЕсли;

КонецПроцедуры
```

#### 3.2.

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

Для этого
в начало процедуры-обработчика
добавьте проверку:

```bsl
ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания();
Если Не ПолучитьФункциональнуюОпцию("ИспользоватьПочтовыйКлиент") Тогда
    ВызватьИсключение НСтр("ru = 'Регламентное задание недоступно по функциональным опциям.'");
КонецЕсли;
```

Если используется подсистема
`Регламентные задания` БСП
и настроены зависимости заданий от ФО
(как в п. `3.1`),
достаточно вызова,
показанного в п. `6`.

#### 4.1.

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

Например:

- обмен с другими информационными базами
  должен выполняться
  с каждой базой
  по индивидуальному расписанию;
- запуск каждой дополнительной обработки
  должен выполняться
  по отдельному расписанию.

В таких случаях
создавайте экземпляры
регламентных заданий
и параметризуйте их объектами ИБ
(например,
узлами ИБ,
элементами справочника
`Дополнительные обработки` и т.п.)
из кода встроенного языка
через метод
`РегламентныеЗадания.СоздатьРегламентноеЗадание()`.

В свойстве `Наименование`
указывайте представление объекта,
на основании которого
создается задание.

#### Пример

Для рассылки отчетов,
если настроены расписание и автор:

```bsl
// Снимаем ограничение, что только администратор может создавать регламентные задания.
УстановитьПривилегированныйРежим(Истина);
Задание = РегламентныеЗадания.СоздатьРегламентноеЗадание(
    Метаданные.РегламентныеЗадания.РассылкаОтчетов);

ПараметрыЗадания = Новый Массив;
ПараметрыЗадания.Добавить(РассылкаОтчетов);
Задание.Параметры = ПараметрыЗадания;

Задание.ИмяПользователя = АвторРассылки;
Задание.Использование = Истина;
Задание.Наименование = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
    НСтр("ru = 'Рассылка отчетов: %1'"), СокрЛП(РассылкаОтчетов));
Задание.Расписание = РасписаниеРассылки;
Задание.Записать();
```

#### 4.2.

Если в конфигурации используется
подсистема `Регламентные задания` БСП,
нужно запрещать
интерактивное создание и запуск
параметризованных заданий
из формы `Регламентные и фоновые задания`.

Для этого укажите такое задание
в процедуре
`ПриОпределенииНастроекРегламентныхЗаданий()`
общего модуля
`РегламентныеЗаданияПереопределяемый`.

#### Пример

```bsl
Настройка = Настройки.Добавить();
Настройка.РегламентноеЗадание = Метаданные.РегламентныеЗадания.РассылкаОтчетов;
Настройка.Параметризуется = Истина;
```

Также выполните п. `6`.

#### 5.

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

Это важно,
например,
если копия ИБ
развернута для тестирования
или передана
в службу технической поддержки.

Если используется
подсистема `Регламентные задания` БСП,
перечислите такие задания
в процедуре
`ПриОпределенииНастроекРегламентныхЗаданий()`
общего модуля
`РегламентныеЗаданияПереопределяемый`.

#### Пример

```bsl
Настройка = Настройки.Добавить();
Настройка.РегламентноеЗадание = Метаданные.РегламентныеЗадания.РассылкаОтчетов;
Настройка.РаботаетСВнешнимиРесурсами = Истина;
```

И выполните п. `6`.

В этом случае
при перемещении информационной базы
администратору будет задан вопрос
об отключении таких заданий.

#### 6.

Если регламентное задание
подпадает под требования
п. `3.1`, `4.2`, `5`
и используется подсистема
`Регламентные задания` БСП,
в начало обработчика задания
добавляйте вызов:

```bsl
ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.<ИмяЗадания>);
```

Первый параметр
заполняйте обязательно.

#### См. также

- [#std402: Настройка расписания регламентных заданий](https://v8std.ru/std/402/)
- [#std539: Запуск регламентных заданий](https://v8std.ru/std/539/)
- [#std767: Регламентные задания: требования по локализации](https://v8std.ru/std/767/)
- [#std760: Ограничения на регламентные задания при работе в режиме сервиса](https://v8std.ru/std/760/)

#### Проверки

[#acc:302](https://v8std.ru/diagnostics/acc/302/)
[#acc:496](https://v8std.ru/diagnostics/acc/496/)
#### Источник

https://its.1c.ru/db/v8std#content:540

В начале процедуры обработки регламентного задания отсутствует вызов процедуры "ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания();". АПК:302

Не заполнен параметр "РегламентноеЗадание" при вызове процедуры "ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания();". АПК:496

Запуск регламентных заданий #std539

Регламентные задания: требования по локализации #std767


стандарт 541

ID: #std541

# Уточнение сущности объекта метаданных

#### 1.

Используйте разные типы объектов метаданных для разных сущностей.
Например, сущность «организация» описывайте справочником `Организации`, а сущность «подразделение» - отдельным справочником `Подразделения`.

#### 2.

Для уточнения сущности объекта используйте отдельные реквизиты, которые явно задают вид или состояние.
Это могут быть реквизиты типа `Булево` или перечисления.

Не определяйте вид объекта по косвенным признакам, например по заполненности другого реквизита.

#### Неправильно

В справочнике `Организации` использовать только реквизит `ГоловнаяОрганизация`
и по его заполненности определять вид организации:
«обычная» или обособленное подразделение.

#### Правильно

Помимо реквизита `ГоловнаяОрганизация`
добавить в справочник `Организации`
булев реквизит `ОбособленноеПодразделение`.

По его значению (`Истина` или `Ложь`)
однозначно определять вид организации
и необходимость заполнения `ГоловнаяОрганизация`.

#### 3.

Если у сущности несколько состояний, не заводите несколько булевых реквизитов для каждого состояния.

Например, для справочника `Сотрудники` при наличии реквизитов `ДатаПриема` и `ДатаУвольнения` не стоит добавлять пару `ПринятНаРаботу` и `Уволен`.

Вместо этого используйте один реквизит типа перечисление со статусами, например:
`Работает`, `Уволен`.
При необходимости состав статусов можно расширить.

#### Источник

https://its.1c.ru/db/v8std#content:541

Используйте разные типы объектов метаданных для разных сущностей. Например, сущность «организация» описывайте справочником Организации, а сущность «подразделение» - отдельным...

Уточнение сущности объекта метаданных #std541