стандарт 396

ID: #std396

# Обработчик события ОбработкаЗаполнения

#### 1.

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

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

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

#### 2.

Чтобы объяснить пользователю причину отказа,
используйте `ВызватьИсключение`
в обработчике `ОбработкаЗаполнения`.

#### Пример

```bsl
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)

    Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Сотрудники") Тогда
        Если ПолучитьЗначениеРеквизита(ДанныеЗаполнения, "ЭтоГруппа") Тогда
            ВызватьИсключение "Ввод приказа о приеме на основании группы сотрудников невозможен!
                            |Выберите сотрудника. Для раскрытия группы используйте клавиши Ctrl и стрелку вниз";
        КонецЕсли;

        // Обработка заполнения объекта по данным заполнения.

    КонецЕсли;

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

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

#### 3.

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

#### 3.1.

Сначала выполняйте специальное заполнение
в зависимости от типа `ДанныеЗаполнения`.

#### Пример

```bsl
ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);
Если ТипДанныхЗаполнения = Тип("Структура") Тогда
    ЗаполнитьДокументПоОтбору(ДанныеЗаполнения);
ИначеЕсли ТипДанныхЗаполнения = Тип("ДокументСсылка.ЗаказКлиента") Тогда
    ЗаполнитьДокументНаОснованииЗаказаКлиента(ДанныеЗаполнения);
// ...
КонецЕсли;
```

#### 3.2.

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

Перед присвоением проверяйте заполненность реквизита
через `ЗначениеЗаполнено()`.

#### Пример

```bsl
Если Не ЗначениеЗаполнено(Подразделение) Тогда
    Подразделение = ЗначениеНастроекПовтИсп.ПодразделениеПоУмолчанию();
КонецЕсли;
```

При возможности используйте свойство метаданных
`Значение заполнения`.
Если `СтандартнаяОбработка = Истина`
и реквизит не был заполнен в обработчике,
значение из этого свойства будет присвоено автоматически
при выходе из `ОбработкаЗаполнения`.

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

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

- [#std499: Перехват исключений в коде](https://v8std.ru/std/499/)

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

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

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

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

Обработчик события ОбработкаЗаполнения #std396


стандарт 402

ID: #std402

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

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

Рекомендации по расписанию:

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

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

- [#std540: Общие требования к регламентным заданиям](https://v8std.ru/std/540/)
- [#std539: Запуск регламентных заданий](https://v8std.ru/std/539/)

#### Проверки
[#v8cs:scheduled-job-periodicity-too-short](https://v8std.ru/diagnostics/v8-code-style/scheduled-job-periodicity-too-short/)

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

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

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

Периодичность выполнения регламентного задания меньше одной минуты. АПК:319

Периодичность выполнения регламентного задания меньше одной минуты. (scheduled-job-periodicity-too-short)

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

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

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


стандарт 407

ID: #std407

# Применение параметров отчета в СКД

#### 1.

При использовании параметров в отчетах на СКД:

- Избегайте параметров отчета, если можно обойтись обычным управлением элементами отбора. Например, не задавайте условие:

```sdbl
ГДЕ Организация = &Организация
```

    Вместо этого дайте пользователю управлять элементом отбора `Организация`.

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

    Для этого используйте элементы расширения языка запросов СКД вида `{ГДЕ...}`.

```sdbl
{ГДЕ Сведения.Период >= &ДатаНачала, Сведения.Период <= &ДатаОкончания}
```

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

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

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

Применение параметров отчета в СКД #std407


стандарт 409

ID: #std409

# Использование РеквизитФормыВЗначение и ДанныеФормыВЗначение

#### 1.

В большинстве случаев в модулях форм используйте метод формы `РеквизитФормыВЗначение()` вместо метода `ДанныеФормыВЗначение()`.

Это упрощает код и снижает вероятность ошибок.
Синтаксис `РеквизитФормыВЗначение()` проще, чем у `ДанныеФормыВЗначение()`.

В `ДанныеФормыВЗначение()` нужно дополнительно передавать тип значения:

```bsl
ТаблицаПодписей = ДанныеФормыВЗначение(ТаблицаПодписей, Тип("ТаблицаЗначений"));
```

Для `РеквизитФормыВЗначение()` это не нужно:

```bsl
ТаблицаПодписей = РеквизитФормыВЗначение("ТаблицаПодписей");
```

Метод формы `РеквизитФормыВЗначение()` добавлен в платформу для удобства.
По эффективности и результату оба метода эквивалентны.

#### Проверки
[#bslls:FormDataToValue](https://v8std.ru/diagnostics/bslls/FormDataToValue/)
[#v8cs:using-form-data-to-value](https://v8std.ru/diagnostics/v8-code-style/using-form-data-to-value/)

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

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

В большинстве случаев в модулях форм используйте метод формы РеквизитФормыВЗначение() вместо метода ДанныеФормыВЗначение().

Использована конструкция "ДанныеФормыВЗначение()". АПК:68

Использование метода ДанныеФормыВЗначение BSLLS:FormDataToValue

Использование РеквизитФормыВЗначение и ДанныеФормыВЗначение (using-form-data-to-value)

Использование РеквизитФормыВЗначение и ДанныеФормыВЗначение #std409


стандарт 411

ID: #std411

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

#### 1.

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

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

#### 2.

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

Например, в конфигурации есть:

- справочник `Сотрудники` с реквизитами `Организация` и `ВидСотрудника` (перечисление со значениями `Основной` и `Совместитель`);
- документ `ПриказОПриеме` с реквизитами `Организация` и `Сотрудник`.

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

Нужно реализовать выбор только основных сотрудников в зависимости от функциональной опции `ВыбратьТолькоИзОсновыхСотрудников`.
Для этого:

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

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

В результате будут работать обе связи параметров выбора:

- по `Отбор.Организация` (из свойств реквизита документа);
- по `Отбор.ВидСотрудника` (из поля формы).

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

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

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

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


стандарт 412

ID: #std412

# Упорядочивание результатов запроса

#### 1.1.

Если алгоритм обработки зависит от порядка записей или результат показывается пользователю, в тексте запроса следует использовать `УПОРЯДОЧИТЬ ПО`.

Без `УПОРЯДОЧИТЬ ПО` нельзя делать предположений о порядке строк результата.

Типичные проблемы без явной сортировки:

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

Вероятность расхождений возрастает:

- при переносе на другую СУБД;
- при смене версии СУБД;
- при изменении параметров СУБД.

#### Примечание

Для запросов, по которым формируются движения, сортировка оправдана только если она является частью алгоритма (например, FIFO).
Иначе сортировка создает лишнюю нагрузку на СУБД.

#### 1.2.

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

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

```sdbl
ВЫБРАТЬ
    СправочникНоменклатура.Ссылка КАК НоменклатураСсылка,
    ЗапасыОстатки.КоличествоОстаток КАК КоличествоОстаток
ИЗ
    Справочник.Номенклатура КАК СправочникНоменклатура
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Запасы.Остатки КАК ЗапасыОстатки
        ПО (ЗапасыОстатки.Номенклатура = СправочникНоменклатура.Ссылка)

УПОРЯДОЧИТЬ ПО
    КоличествоОстаток
```

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

```sdbl
ВЫБРАТЬ
    СправочникНоменклатура.Ссылка КАК НоменклатураСсылка,
    ЕСТЬNULL(ЗапасыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток
ИЗ
    Справочник.Номенклатура КАК СправочникНоменклатура
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Запасы.Остатки КАК ЗапасыОстатки
        ПО (ЗапасыОстатки.Номенклатура = СправочникНоменклатура.Ссылка)

УПОРЯДОЧИТЬ ПО
    КоличествоОстаток
```

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

[Особенности работы с различными СУБД](https://its.1c.ru/db/v8310doc/bookmark/dev/TI000001285).

#### 1.3.

Если результаты запроса отображаются пользователю:

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

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

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

[#std781: Особенности сортировки в таблице значений](https://v8std.ru/std/781/)

#### 1.4.

Отсутствие `УПОРЯДОЧИТЬ ПО` допустимо только если одновременно верно:

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

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

## Совместное использование с конструкцией РАЗЛИЧНЫЕ

#### 2.

Если используется `РАЗЛИЧНЫЕ`, сортируйте только по полям, включенным в `ВЫБРАТЬ`.

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

## Ограничения на использование конструкции АВТОУПОРЯДОЧИВАНИЕ

#### 3.

Использование `ПЕРВЫЕ` совместно с `АВТОУПОРЯДОЧИВАНИЕ` запрещено.

В остальных случаях `АВТОУПОРЯДОЧИВАНИЕ` также не рекомендуется, так как разработчик не контролирует поля сортировки. Такая конструкция оправдана только когда конкретный порядок не важен, но должен быть одинаковым на разных СУБД.

Причины использования `АВТОУПОРЯДОЧИВАНИЕ` нужно указывать в комментарии непосредственно перед текстом запроса.

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

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

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

Если алгоритм обработки зависит от порядка записей или результат показывается пользователю, в тексте запроса следует использовать УПОРЯДОЧИТЬ ПО.

В запросе отсутствует проверка на NULL для поля, которое может потенциально содержать NULL. АПК:540

Использование 'ВЫБРАТЬ ПЕРВЫЕ' без 'УПОРЯДОЧИТЬ ПО' BSLLS:SelectTopWithoutOrderBy

Особенности сортировки в таблице значений #std781

Упорядочивание результатов запроса #std412


стандарт 413

ID: #std413

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

#### 1.1.

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

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

#### Примеры параметров сеанса

- `ТекущийПроект` - тип `СправочникСсылка.Проекты`;
- `ОбменДаннымиВключен` - тип `Булево`;
- `РабочееМестоКлиента` - тип `СправочникСсылка.РабочиеМеста`.

Параметры сеанса доступны из встроенного языка:

```bsl
Проект = ПараметрыСеанса.ТекущийПроект;
```

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

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

```sdbl
ГДЕ Документ.Автор = &ТекущийПользователь
```

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

#### 1.2.

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

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

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

#### 1.3.

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

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

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

## Установка параметров сеанса "по требованию"

#### 2.1.

Не инициализируйте параметры сеанса при запуске программы:

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

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

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

```bsl
Процедура УстановкаПараметровСеанса(ИменаПараметровСеанса)

    Если ИменаПараметровСеанса = Неопределено Тогда
        // Установка параметров сеанса при начале сеанса.
        // Здесь инициализируются параметры, которые можно установить сразу.
    Иначе
        // Установка параметров сеанса "по требованию".
        // Если несколько параметров используют одни и те же данные,
        // инициализируйте их группой.
        УстановленныеПараметры = Новый Массив;
        Для Каждого ИмяПараметра Из ИменаПараметровСеанса Цикл
            УстановитьЗначениеПараметраСеанса(ИмяПараметра, УстановленныеПараметры);
        КонецЦикла;
    КонецЕсли;

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

// Устанавливает значения параметров сеанса и добавляет имена
// установленных параметров в массив УстановленныеПараметры.
//
// Параметры:
//   ИмяПараметра - Строка - имя параметра сеанса для инициализации;
//   УстановленныеПараметры - Массив - имена уже инициализированных параметров.
Процедура УстановитьЗначениеПараметраСеанса(Знач ИмяПараметра, УстановленныеПараметры)

    // Если параметр уже установлен в текущем вызове,
    // повторно его не инициализируем.
    Если УстановленныеПараметры.Найти(ИмяПараметра) <> Неопределено Тогда
        Возврат;
    КонецЕсли;

    Если ИмяПараметра = "ТекущийПользователь" Тогда
        ПараметрыСеанса.ТекущийПользователь = <Значение>;
        ПараметрыСеанса.<ДругойПараметрСеанса> = <Значение>;
        УстановленныеПараметры.Добавить(ИмяПараметра);
        УстановленныеПараметры.Добавить("<ДругойПараметрСеанса>");
    КонецЕсли;

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

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

- [#std491: Влияние изменения значений параметров сеанса и функциональных опций на производительность механизма ограничения доступа к данным](https://v8std.ru/std/491/)

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

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

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

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


std415
#std415
std 415
стандарт 415
ВЫБРАТЬ РАЗРЕШЕННЫЕ
выбрать разрешенные
Новый Запрос ВЫБРАТЬ РАЗРЕШЕННЫЕ
ключевое слово РАЗРЕШЕННЫЕ

ID: #std415

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

`РАЗРЕШЕННЫЕ` скрывает недоступные пользователю данные.
Это может исказить результат запроса и нарушить бизнес-логику.

#### 1.

Не используйте `РАЗРЕШЕННЫЕ` в запросах, которые влияют на расчеты и проведение операций.

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

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

#### Например

В механизмах расчета списания себестоимости использование `РАЗРЕШЕННЫЕ` может дать разный результат у разных пользователей.

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

```bsl
// Влияющий на расчет запрос: данные скрываются и результат искажается.
Запрос = Новый Запрос(
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ
    |   Партии.Номенклатура,
    |   Партии.СтоимостьОстаток
    |ИЗ
    |   РегистрНакопления.ПартииТоваровОрганизаций.Остатки КАК Партии");
```

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

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

Запрос = Новый Запрос(
    "ВЫБРАТЬ
    |   Партии.Номенклатура,
    |   Партии.СтоимостьОстаток
    |ИЗ
    |   РегистрНакопления.ПартииТоваровОрганизаций.Остатки КАК Партии");
```

#### 2.

`РАЗРЕШЕННЫЕ` допустимо, когда скрываемые данные не участвуют в бизнес-процессах.

#### Например

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

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

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

РАЗРЕШЕННЫЕ скрывает недоступные пользователю данные. Это может исказить результат запроса и нарушить бизнес-логику.

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


стандарт 432

ID: #std432

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

#### 1.1.

Для реквизитов строкового типа используйте переменную длину строки:
`Допустимая длина = Переменная`.

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

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

#### 1.2.

Если максимальная длина строки заранее известна
(например, регламентирована),
указывайте ее в свойстве `Длина`
(или `Длина наименования` для стандартного реквизита `Наименование`).

Например, длина реквизита `ИНН` справочника `ФизическиеЛица`
должна быть `12 символов`.

#### 1.3.

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

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

#### 1.4.

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

Например:

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

#### 2.

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

#### 2.1.

Когда в строковый реквизит может попадать пользовательский текст
большого объема.

Обычно это многострочные поля формы.
Например, поле `Дополнительное описание` в заказе клиента
или [#std531: поле `Комментарий`](https://v8std.ru/std/531/)

#### 2.2.

Когда в строковом реквизите хранится техническая информация,
которая генерируется программами.

Такие данные чаще всего не предназначены для чтения пользователем,
а используются в алгоритмах обработки.
Например, XML-документы, заголовки почтовых сообщений.

#### 3.

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

#### 3.1.

Для сравнения значений, группировки и получения `РАЗЛИЧНЫЕ`
приводите такие реквизиты к строке определенной длины,
достаточной для корректного вычисления выражения.

Для этого используйте в запросе конструкцию:

```sdbl
ВЫРАЗИТЬ(... КАК СТРОКА(1000))
```

#### 3.2.

В отчетах СКД для таких полей вместо этого
задавайте параметр `Тип значения` поля
(вкладка `Наборы данных`).

Учитывайте, что частое приведение неограниченной строки
к определенной длине в запросах и отчетах СКД
может указывать на неправильное проектное решение.

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

#### 3.3.

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

#### 4.

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

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

Чтобы быстро найти в конфигурации строковые реквизиты
неограниченной длины,
используйте обработку с ИТС
[СтрокиНеограниченнойДлины.erf](https://its.1c.ru/db/files/1CITS/EXE/V8Std/СтрокиНеограниченнойДлины/СтрокиНеограниченнойДлины.zip).

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

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

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

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

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

Реквизит имеет тип фиксированной строки. АПК:1205

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

Использование реквизитов строкового типа #std432


стандарт 434

ID: #std434

# Использование ключевых слов "ОБЪЕДИНИТЬ" и "ОБЪЕДИНИТЬ ВСЕ" в запросах

В общем случае при объединении результатов нескольких запросов используйте `ОБЪЕДИНИТЬ ВСЕ`, а не `ОБЪЕДИНИТЬ`.

Причина: `ОБЪЕДИНИТЬ` удаляет полностью одинаковые строки, и это требует дополнительного времени даже тогда, когда одинаковых строк заведомо быть не может.

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

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

```sdbl
ВЫБРАТЬ
    ПоступлениеТоваровУслуг.Ссылка
ИЗ
    Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    РеализацияТоваровУслуг.Ссылка
ИЗ
    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
```

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

```sdbl
ВЫБРАТЬ
    ПоступлениеТоваровУслуг.Ссылка
ИЗ
    Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    РеализацияТоваровУслуг.Ссылка
ИЗ
    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
```

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

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

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

В общем случае при объединении результатов нескольких запросов используйте ОБЪЕДИНИТЬ ВСЕ, а не ОБЪЕДИНИТЬ.

Использована конструкция "ОБЪЕДИНИТЬ". АПК:96

Использование ключевого слова "ОБЪЕДИНИТЬ" в запросах BSLLS:UnionAll

Использование ключевых слов "ОБЪЕДИНИТЬ" и "ОБЪЕДИНИТЬ ВСЕ" в запросах #std434


стандарт 435

ID: #std435

# Ограничение на использование конструкции "ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ" в запросах

#### 1.1.

При разработке запросов учитывайте, что в клиент-серверном варианте с СУБД **PostgreSQL** производительность запросов с конструкцией `ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ` существенно снижается. Особенно если таких конструкций две и более.

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

Например, исходный запрос:

```sdbl
ВЫБРАТЬ
    ЕСТЬNULL(ПланПродаж.Номенклатура, ФактическиеПродажи.Номенклатура) КАК Номенклатура,
    ЕСТЬNULL(ПланПродаж.Сумма, 0) КАК СуммаПлан,
    ЕСТЬNULL(ФактическиеПродажи.Сумма, 0) КАК СуммаФакт
ИЗ
    ПланПродаж КАК ПланПродаж
        ПОЛНОЕ СОЕДИНЕНИЕ ФактическиеПродажи КАК ФактическиеПродажи
        ПО ПланПродаж.Номенклатура = ФактическиеПродажи.Номенклатура
```

может быть реализован без `ПОЛНОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ` так:

```sdbl
ВЫБРАТЬ
    ПланФактПродаж.Номенклатура КАК Номенклатура,
    СУММА(ПланФактПродаж.СуммаПлан) КАК СуммаПлан,
    СУММА(ПланФактПродаж.СуммаФакт) КАК СуммаФакт
ИЗ
    (ВЫБРАТЬ
        ПланПродаж.Номенклатура КАК Номенклатура,
        ПланПродаж.Сумма КАК СуммаПлан,
        0 КАК СуммаФакт
    ИЗ
        ПланПродаж КАК ПланПродаж

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ФактическиеПродажи.Номенклатура,
    0,
    ФактическиеПродажи.Сумма
ИЗ
    ФактическиеПродажи КАК ФактическиеПродажи) КАК ПланФактПродаж

СГРУППИРОВАТЬ ПО
    ПланФактПродаж.Номенклатура
```

#### 1.2.

Исключение: случаи, когда запрос объективно нельзя переписать без `ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ`.

Для СУБД **PostgreSQL** платформа 1С:Предприятие автоматически заменяет эту конструкцию на эквивалентную исполнимую форму, сохраняя атрибуты запроса: `ПЕРВЫЕ`, `РАЗЛИЧНЫЕ`, `УПОРЯДОЧИТЬ ПО`.

В таких случаях не нужно механически убирать `ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ` только ради самого запрета.

#### 2.

Недопустимо одновременно использовать `ПОЛНОЕ СОЕДИНЕНИЕ` и обращение к табличным частям из раздела `ВЫБРАТЬ`.

Требование связано с особенностями выполнения таких запросов на **PostgreSQL** и необходимостью переносимости прикладных решений на эту СУБД.

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

- [#std467: Общие требования к конфигурации](https://v8std.ru/std/467/)

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

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

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

При разработке запросов учитывайте, что в клиент-серверном варианте с СУБД PostgreSQL производительность запросов с конструкцией ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ существенно снижается....

Использована конструкция "ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ". АПК:70

Использование конструкции "ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ" в запросах BSLLS:FullOuterJoinQuery

Общие требования к конфигурации #std467

Ограничение на использование конструкции "ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ" в запросах #std435


стандарт 436

ID: #std436

# Многократное выполнение однотипных запросов

#### 1.

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

Это ускоряет работу с базой данных.
Для объединения используйте, например,
условие `В`, `ОБЪЕДИНИТЬ ВСЕ`
или пакет запросов.

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

```bsl
ЧастныйЗапрос = Новый Запрос("
    |ВЫБРАТЬ
    |   БанковскиеСчета.Ссылка КАК Счет
    |ИЗ
    |   Справочник.БанковскиеСчета КАК БанковскиеСчета
    |ГДЕ
    |   БанковскиеСчета.Банк = &Банк");

Для каждого Банк Из БанкиДляОбработки Цикл
    ЧастныйЗапрос.УстановитьПараметр("Банк", Банк);
    ВыборкаСчетов = ЧастныйЗапрос.Выполнить().Выбрать();
    Пока ВыборкаСчетов.Следующий() Цикл
        ОбработатьСчетаВБанке(ВыборкаСчетов.Счет);
    КонецЦикла;
КонецЦикла;
```

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

```bsl
ОбщийЗапрос = Новый Запрос("
    |ВЫБРАТЬ
    |   БанковскиеСчета.Ссылка КАК Счет
    |ИЗ
    |   Справочник.БанковскиеСчета КАК БанковскиеСчета
    |ГДЕ
    |   БанковскиеСчета.Банк В(&БанкиДляОбработки)");

ОбщийЗапрос.УстановитьПараметр("БанкиДляОбработки", БанкиДляОбработки);
ВыборкаСчетов = ОбщийЗапрос.Выполнить().Выбрать();
Пока ВыборкаСчетов.Следующий() Цикл
    ОбработатьСчетаВБанке(ВыборкаСчетов.Счет);
КонецЦикла;
```

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

#### 2.

Допускается разделение запроса на серию запросов в следующих случаях:

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

В этих случаях запросы в цикле:

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

#### 3.

Запросы к разным таблицам тоже рекомендуется объединять в один
с помощью `ОБЪЕДИНИТЬ ВСЕ` или пакета запросов.

При этом выигрыш по времени выполнения
может быть незначительным.

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

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

Многократное выполнение однотипных запросов #std436


стандарт 437

ID: #std437

# Оформление текстов запросов

#### 1.

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

#### 2.

Указывайте необязательные части запроса. Явно задавайте псевдонимы полям. Так запрос проще читать, а код, который использует результат, меньше зависит от названий реквизитов.

#### Неправильно
```sdbl
Касса.Валюта
```

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

#### Правильно
```sdbl
Касса.Валюта КАК Валюта
```

Изменение имени реквизита приведет только к изменению текста запроса.

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

#### 2а.

Для полей – реквизитов других полей, например `Касса.Валюта.Наименование` автоматически присваиваемые псевдонимы собираются как `ВалютаНаименование`, а не `Наименование`.

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

#### 2б.

Пишите ключевое слово `КАК` перед псевдонимом поля источника.

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

#### 3.

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

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

```sdbl
ВЫБРАТЬ Т.Наименование КАК Наименование ИЗ Справочник.Номенклатура КАК Т
```

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

```sdbl
ВЫБРАТЬ
    Т.Наименование КАК Наименование
ИЗ
    Справочник.Номенклатура КАК Т
```

#### 4.

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

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

#### 5.

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

#### 6.1.

При программной "сборке" текста запроса комментируйте все этапы.

#### 6.2.

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

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

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

#### 7.

Типичные случаи программной модификации текста запроса.

#### 7.1.

Изменение имени поля выборки.

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

```bsl
ТекстЗапроса =
    "ВЫБРАТЬ
    |   Номенклатура.Наименование  КАК Наименование ,
    |   Номенклатура. " + ИмяПоляКод + " КАК КодАртикул
    |ИЗ
    |   Справочник.Номенклатура КАК Номенклатура";
```

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

```bsl
ТекстЗапроса =
    "ВЫБРАТЬ
    |   Номенклатура.Наименование  КАК Наименование,
    |   &ИмяПоляКод  КАК КодАртикул
    |ИЗ
    |   Справочник.Номенклатура КАК Номенклатура";

ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяПоляКод", "Номенклатура." + ИмяПоляКод);
```

Изменение имени таблицы.

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

```bsl
ТекстЗапроса =
    "ВЫБРАТЬ
    |   ТаблицаСправочника.Наименование КАК Наименование,
    |   ТаблицаСправочника.Код КАК Код
    |ИЗ
    |   &ТаблицаСправочника КАК ТаблицаСправочника";

ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТаблицаСправочника", "Справочник." + ИмяСправочника);
```

Изменение имени таблицы. Вариант 2.

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

```bsl
ТекстЗапроса =
    "ВЫБРАТЬ
    |   Номенклатура.Наименование  КАК НаименованиеТовара,
    |   ЕСТЬNULL(ТаблицаОстатков.ВНаличииОстаток, 0) КАК ОстатокТовара
    |ИЗ
    |   Справочник.Номенклатура КАК Номенклатура
    |   ЛЕВОЕ СОЕДИНЕНИЕ #ТаблицаОстатков КАК ТаблицаОстатков
    |       ПО Номенклатура.Ссылка= ТаблицаОстатков.Номенклатура";

Если ИспользуетсяАдресноеХранение Тогда
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ТаблицаОстатков", "РегистрНакопления.ТоварыВЯчейках.Остатки");
Иначе
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ТаблицаОстатков", "РегистрНакопления.ТоварыНаСкладах.Остатки");
КонецЕсли;
```

#### 7.2.

Использование комментария для помещения во временную таблицу результата запроса.

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

```bsl
ТекстЗапроса =
    "ВЫБРАТЬ
    |   Контрагенты.Ссылка КАК Ссылка
    |   // ПОМЕСТИТЬ втКонтрагенты
    |ИЗ
    |	  Справочник.Контрагенты КАК Контрагенты";

Если ВыгрузитьВоВременнуюТаблицу Тогда
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "// ПОМЕСТИТЬ", "ПОМЕСТИТЬ");
КонецЕсли;
```

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

```bsl
ТекстЗапроса =
    "ВЫБРАТЬ
    |   Контрагенты.Ссылка КАК Ссылка
    |ПОМЕСТИТЬ втКонтрагенты
    |ИЗ
    |   Справочник.Контрагенты КАК Контрагенты";

Если Не ВыгрузитьВоВременнуюТаблицу Тогда
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ПОМЕСТИТЬ втКонтрагенты", "");
КонецЕсли;
```

#### 7.3.

Конкатенация нескольких текстов запросов в пакет.

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

```bsl
ТекстЗапроса = " ";
Если ИспользоватьУпаковки Тогда
    ТекстЗапроса =
        "ВЫБРАТЬ
        |   Упаковки.Ссылка КАК Ссылка
        |ИЗ
        |   Справочник.Упаковки КАК Упаковки;
        |/////////////////////////////////////////////////////////////
        |";
КонецЕсли;

ТекстЗапроса = ТекстЗапроса +
    "ВЫБРАТЬ
    |   Номенклатура.Ссылка КАК Ссылка
    |ИЗ
    |   Справочник. Номенклатура КАК Номенклатура";
```

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

```bsl
ТекстЗапроса = " ";
Если ИспользоватьУпаковки Тогда
    ТекстЗапроса =
        "ВЫБРАТЬ
        |  Упаковки.Ссылка КАК Ссылка
        |ИЗ
        |   Справочник.Упаковки КАК Упаковки";

    ТекстЗапроса = ТекстЗапроса +
        "
        |;
        |/////////////////////////////////////////////////////////////
        |";
КонецЕсли;

ТекстЗапроса = ТекстЗапроса +
  "ВЫБРАТЬ
  |   Номенклатура.Ссылка КАК Ссылка
  |ИЗ
  |   Справочник.Номенклатура КАК Номенклатура";
```

Или

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

```bsl
Разделитель =
    "
    |;
    |/////////////////////////////////////////////////////////////
    |";

ТекстыЗапросовПакета = Новый Массив;

ТекстЗапроса =
    "ВЫБРАТЬ
    |   Упаковки.Ссылка КАК Ссылка
    |ИЗ
    |   Справочник.Упаковки КАК Упаковки";

ТекстыЗапросовПакета.Добавить(ТекстЗапроса);

ТекстЗапроса =
    "ВЫБРАТЬ
    |   Номенклатура.Ссылка КАК Ссылка
    |ИЗ
    |   Справочник.Номенклатура КАК Номенклатура";

ТекстыЗапросовПакета.Добавить(ТекстЗапроса);
ТекстЗапроса = СтрСоединить(ТекстыЗапросовПакета, Разделитель);
```

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

- [Запросы, динамические списки и отчеты на СКД: требования по локализации](https://v8std.ru/std/762/)

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

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

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

Ключевое слово запроса написано не канонически. АПК:254

Назначение псевдонимов выбранным полям в запросе BSLLS:AssignAliasFieldsInQuery

Ошибка разбора текста запроса BSLLS:QueryParseError

Запросы, динамические списки и отчеты на СКД: требования по локализации #std762

Оформление текстов запросов #std437


стандарт 438

ID: #std438

# Проверка на пустой результат выполнения запроса

#### 1.

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

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

```bsl
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    Возврат Истина;
Иначе
    Возврат Ложь;
КонецЕсли;
```

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

```bsl
Возврат Не Запрос.Выполнить().Пустой()
```

#### 2.

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

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

```bsl
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда // избыточный вызов
    Выборка = РезультатЗапроса.Выбрать();
    Пока Выборка.Следующий() Цикл
    ...
```

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

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

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

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

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

Проверка на пустой результат выполнения запроса #std438


стандарт 439

ID: #std439

# Использование директив компиляции и инструкций препроцессора

#### 1.

Директивы компиляции:

- `&НаКлиенте` (`&AtClient`);
- `&НаСервере` (`&AtServer`);
- `&НаСервереБезКонтекста` (`&AtServerNoContext`).

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

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

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

#### 2.

Не используйте проверки `#Если Сервер` / `#Если Клиент` внутри [#std469: клиент-серверных общих модулей](https://v8std.ru/std/469/)
Надежно определить контекст выполнения в таком варианте нельзя.

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

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

```bsl
Функция КодОсновногоЯзыка() Экспорт
#Если НЕ ТонкийКлиент И НЕ ВебКлиент Тогда
    Возврат Метаданные.ОсновнойЯзык.КодЯзыка;
#Иначе
    Возврат СтандартныеПодсистемыКлиент.ПараметрКлиента("КодОсновногоЯзыка");
#КонецЕсли
КонецФункции
```

```bsl
Функция КодОсновногоЯзыка() Экспорт
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
    Возврат Метаданные.ОсновнойЯзык.КодЯзыка;
#Иначе
    Возврат СтандартныеПодсистемыКлиент.ПараметрКлиента("КодОсновногоЯзыка");
#КонецЕсли
КонецФункции
```

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

```bsl
// ОбщийМодуль.ЛокализацияСервер
Функция КодОсновногоЯзыка() Экспорт
    Возврат ЛокализацияКлиентСервер.КодОсновногоЯзыкаСервер();
КонецФункции
```

```bsl
// ОбщийМодуль.ЛокализацияКлиент
Функция КодОсновногоЯзыка() Экспорт
    Возврат ЛокализацияКлиентСервер.КодОсновногоЯзыкаКлиент();
КонецФункции
```

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

При этом в обычных клиентских модулях допустимо ветвление по режимам клиента (например, `#Если ВебКлиент`).

#### 3.

Не разрывайте инструкциями препроцессора и областями:

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

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

```bsl
Процедура Пример1()
  а = 1
#Область ИмяОбласти
    + 2;
#КонецОбласти // разрыв выражения
КонецПроцедуры
```

```bsl
#Область ИмяОбласти
Процедура Пример2()
    // ...
#КонецОбласти // разрыв процедуры
КонецПроцедуры
```

```bsl
Если <...> Тогда
    // ...
#Если ВебКлиент Тогда // разрыв блока Если
Иначе
    // ...
#КонецЕсли
КонецЕсли;
```

```bsl
Результат = Пример4(Параметр1,
#Если Клиент Тогда
    Параметр2, // некорректный вызов функции
#КонецЕсли
    Параметр3);
```

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

```bsl
Процедура Пример1()
    а = 1 + 2;
КонецПроцедуры
```

```bsl
#Область ИмяОбласти
Процедура Пример2()
    // ...
КонецПроцедуры
#КонецОбласти
```

```bsl
Если <...> Тогда
    // ...
Иначе
#Если ВебКлиент Тогда
    // код для веб-клиента
#Иначе
    // код для остальных клиентов
#КонецЕсли
КонецЕсли;
```

```bsl
#Если Клиент Тогда
    Параметр2 = ЗначениеДляКлиента;
#Иначе
    Параметр2 = ЗначениеПоУмолчанию;
#КонецЕсли

Результат = Пример4(Параметр1, Параметр2, Параметр3);
```

Эти ошибки автоматически диагностируются средой [1C:Enterprise Development Tools (EDT)](http://v8.1c.ru/overview/release_IDE_beta/).

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

- [#std469: Правила создания общих модулей](https://v8std.ru/std/469/)
- [#std440: Использование дублирующего кода](https://v8std.ru/std/440/)

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

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

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

Директивы компиляции:

Использована директива компиляции. АПК:104

Использована инструкция препроцессора в клиент-серверном общем модуле. АПК:547

Лишняя директива компиляции BSLLS:CompilationDirectiveNeedLess

Ошибка разбора исходного кода BSLLS:ParseError

Использование директив компиляции модуля формы (form-module-pragma)

Использование дублирующего кода #std440

Правила создания общих модулей #std469

Использование директив компиляции и инструкций препроцессора #std439


стандарт 440

ID: #std440

# Использование дублирующего кода

#### 1.

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

Такой подход усложняет сопровождение:

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

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

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

#### 2.

Дублирование допустимо, если в будущем ожидается заметное расхождение логики в двух вариантах кода.

#### Пример

В функции `СообщитьПользователю()` общего модуля `ОбщегоНазначенияКлиентСервер` понадобилась дополнительная обработка входных параметров на сервере.

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

Использовать [#std439: инструкции препроцессора](https://v8std.ru/std/439/) для разделения серверной и клиентской логики:

```bsl
Процедура СообщитьПользователю(Знач ТекстСообщенияПользователю, Знач КлючДанных = Неопределено, Знач Поле = "", Отказ = Ложь) Экспорт

    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = ТекстСообщенияПользователю;
    Сообщение.Поле = Поле;

    ЭтоОбъект = Ложь;

#Если Не ТонкийКлиент И Не ВебКлиент Тогда
    Если КлючДанных <> Неопределено
        И XMLТипЗнч(КлючДанных) <> Неопределено Тогда

        ТипЗначенияСтрокой = XMLТипЗнч(КлючДанных).ИмяТипа;
        ЭтоОбъект = СтрНайти(ТипЗначенияСтрокой, "Object.") > 0;
    КонецЕсли;
#КонецЕсли

    Если ЭтоОбъект Тогда
        Сообщение.УстановитьДанные(КлючДанных);
    Иначе
        Сообщение.КлючДанных = КлючДанных;
    КонецЕсли;

    Сообщение.Сообщить();
    Отказ = Истина;

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

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

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

1) Серверная процедура:

```bsl
Процедура СообщитьПользователю(Знач ТекстСообщенияПользователю, Знач КлючДанных = Неопределено, Знач Поле = "", Отказ = Ложь) Экспорт

    ЭтоОбъект = Ложь;
    Если КлючДанных <> Неопределено
      И XMLТипЗнч(КлючДанных) <> Неопределено Тогда

        ТипЗначенияСтрокой = XMLТипЗнч(КлючДанных).ИмяТипа;
        ЭтоОбъект = СтрНайти(ТипЗначенияСтрокой, "Object.") > 0;
    КонецЕсли;

    ОбщегоНазначенияСлужебныйКлиентСервер.СообщитьПользователю(ТекстСообщенияПользователю, КлючДанных, Поле, Отказ, ЭтоОбъект);

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

2) Клиентская процедура:

```bsl
Процедура СообщитьПользователю(Знач ТекстСообщенияПользователю, Знач КлючДанных = Неопределено, Знач Поле = "", Отказ = Ложь) Экспорт

    ОбщегоНазначенияСлужебныйКлиентСервер.СообщитьПользователю(ТекстСообщенияПользователю, КлючДанных, Поле, Отказ);

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

3) Общая служебная реализация:

```bsl
Процедура СообщитьПользователю(Знач ТекстСообщенияПользователю, Знач КлючДанных, Знач Поле, Отказ = Ложь, ЭтоОбъект = Ложь) Экспорт

    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = ТекстСообщенияПользователю;
    Сообщение.Поле = Поле;

    Если ЭтоОбъект Тогда
        Сообщение.УстановитьДанные(КлючДанных);
    Иначе
        Сообщение.КлючДанных = КлючДанных;
    КонецЕсли;

    Сообщение.Сообщить();
    Отказ = Истина;

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

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

- [#std551: Разработка конфигураций с повторным использованием общего кода и объектов метаданных](https://v8std.ru/std/551/)

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

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

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

Дублируется картинка. АПК:1343

Дублируется наименование картинки. АПК:1344

Разработка конфигураций с повторным использованием общего кода и объектов метаданных #std551

Использование дублирующего кода #std440


стандарт 441

ID: #std441

# Общие требования к построению конструкций встроенного языка

#### 1.

Ключевые слова встроенного языка пишите канонически, как в документации и Синтакс-помощнике.

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

```bsl
конецЕсли
КОНЕЦЕСЛИ
конецесли
Конецесли
```

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

```bsl
КонецЕсли
```

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

#### 2.

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

```bsl
ДиалогВыбора.ПолноеИмяФайла = ИмяФайла;
ДиалогВыбора.Каталог        = ИмяПути;
ДиалогВыбора.Заголовок      = НСтр("ru = 'Выберите файл со списком запросов'");
ДиалогВыбора.Фильтр         = НСтр("ru = 'Файлы запросов (*.sel)|*.sel|Все файлы (*.*)|*.*'");
ДиалогВыбора.Расширение     = "sel";
```

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

#### 3.

Составные логические выражения в `Если... КонецЕсли` переносите по [#std444: правилам переноса выражений](https://v8std.ru/std/444/)

#### 4.

Логические выражения и значения типа `Булево` не сравнивайте с литералами `Истина` и `Ложь`.

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

```bsl
Если ЭтоНовый() = Истина Тогда
```

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

```bsl
Если ЭтоНовый() Тогда
```

#### 5.

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

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

```bsl
Если Вопрос(НСтр("ru = 'Данные еще не записаны. Записать?'"), РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да) = КодВозвратаДиалога.Да Тогда
  Записать();
Иначе
  Возврат;
КонецЕсли;
```

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

```bsl
Ответ = Вопрос(НСтр("ru = 'Данные еще не записаны. Записать?'"), РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да);
Если Ответ = КодВозвратаДиалога.Да Тогда
  Записать();
Иначе
  Возврат;
КонецЕсли;
```

#### 6.

Используйте системные наборы значений везде, где это возможно.
Например, вместо `Символ(10)` используйте `Символы.ПС`.

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

- [#std444: Перенос выражений](https://v8std.ru/std/444/)
- [#std456: Тексты модулей](https://v8std.ru/std/456/)

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

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

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

Ключевое слово написано не канонически. АПК:1248

Каноническое написание ключевых слов BSLLS:CanonicalSpellingKeywords

Аннотация написана канонически (bsl-canonical-pragma)

Перенос выражений #std444

Тексты модулей #std456

Общие требования к построению конструкций встроенного языка #std441


стандарт 442

ID: #std442

# Определение типа значения переменной

Определяйте тип значения сравнением с типом, а не косвенными проверками.

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

```bsl
Если Ссылка.Метаданные().Имя = "ПоступлениеТоваровУслуг" Тогда
```

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

```bsl
Если ТипЗнч(Ссылка) = Тип("ДокументСсылка.ПоступлениеТоваровУслуг") Тогда
```

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

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

Определение типа значения переменной #std442


стандарт 443

ID: #std443

# Получение предопределенных значений на клиенте

#### 1.

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

#### Пример

```bsl
ЮрФизЛицо = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ЮридическоеЛицо");
```

#### 2.

Если используется БСП версии `2.1.4` и выше, предпочтительно применять `ПредопределенныйЭлемент` из модулей `ОбщегоНазначения` или `ОбщегоНазначенияКлиент`.

Этот API возвращает `Неопределено`, если элемент отсутствует в ИБ, и не требует дополнительного клиентского кеширования.

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

- [#std487: Минимизация количества серверных вызовов и трафика](https://v8std.ru/std/487/)
- [#std697: Использование предопределенных элементов](https://v8std.ru/std/697/)
- [Работа с предопределенными значениями (документация платформы)](https://its.1c.ru/db/v83doc/bookmark/dev/TI000000158)

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

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

В клиентском коде (тонкий клиент, веб-клиент), где недоступны менеджеры вида СправочникМенеджер. и ПеречислениеМенеджер., для получения ссылок на предопределенные элементы...

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

Использование предопределенных элементов #std697

Получение предопределенных значений на клиенте #std443


стандарт 444

ID: #std444

# Перенос выражений

#### 1.

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

#### 2.

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

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

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

```bsl
СуммаДокумента = СуммаБезСкидки
                 + СуммаРучнойСкидки
                 + СуммаАвтоматическойСкидки;
```

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

```bsl
СуммаДокумента = СуммаБезСкидки
    + СуммаРучнойСкидки
    + СуммаАвтоматическойСкидки;
```

#### 3.1.

Длинные строковые константы переносите с помощью символа перевода строки `|`.

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

```bsl
ТекстЗапроса =
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ
    |   ЗаметкиПоПредмету.КоличествоЗаметок КАК КоличествоЗаметок
    |ИЗ
    |   РегистрСведений.ЗаметкиПоПредмету КАК ЗаметкиПоПредмету
    |ГДЕ
    |   ЗаметкиПоПредмету.Предмет = &Предмет";
```

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

```bsl
ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
    НСтр("ru = 'Обновление адресного классификатора не требуется.
               |В программе уже загружены актуальные адресные сведения от %1.'"),
    Формат(ДатаПоследнегоОбновленияКЛАДР, "ДЛФ=D"));

ПоказатьПредупреждение(, ТекстПредупреждения);
```

Не переносите строки, содержащие текст сообщения пользователю (объект `СообщениеПользователю`).

#### 3.2.

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

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

```bsl
ПоляОтбора = "Номенклатура,Характеристика,Склад"
    + ДополнительныеПоляОтбора;
```

#### 3.3.

При конкатенации длинных строк допускается ставить `+` в конце строки, чтобы не ломать общее форматирование текста.

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

```bsl
ТекстЗапроса = ТекстЗапроса +
    "ВЫБРАТЬ
    |   Номенклатура.Ссылка КАК Ссылка
    |ИЗ
    |   Справочник.Номенклатура КАК Номенклатура";
```

#### 4.

Параметры процедур, функций и методов переносите по правилам:

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

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

```bsl
ИменаДокументов.Добавить(Метаданные.Документы.СтрокаВыпискиРасход.Имя,
    Метаданные.Документы.СтрокаВыпискиРасход.Синоним);
```

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

```bsl
ИменаДокументов.Добавить(
    Метаданные.Документы.СтрокаВыпискиРасход.Имя,
    Метаданные.Документы.СтрокаВыпискиРасход.Синоним);
```

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

```bsl
ИменаДокументов.Добавить(Метаданные.Документы.СтрокаВыпискиРасход.Имя,
                         Метаданные.Документы.СтрокаВыпискиРасход.Синоним);
```

#### 5.

Сложные условия в `Если ... ИначеЕсли ... КонецЕсли` переносите по правилам:

- каждое элементарное условие начинайте с новой строки, если выражение длиннее 120 символов;
- операторы `И` и `ИЛИ` ставьте в начале строки;
- условия выравнивайте стандартным отступом или по началу первого условия без учета логических операторов.

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

```bsl
Если (ВидОперации = Перечисления.ВидыОперацийПоступлениеМПЗ.ПоступлениеРозница)
    ИЛИ (ВидОперации = Перечисления.ВидыОперацийПоступлениеМПЗ.ПоступлениеРозницаКомиссия) Тогда
    Возврат Истина;
КонецЕсли;
```

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

```bsl
Если ((СтруктураМодуля[Индекс].Блок = Перечисления.ТипыБлоковМодулей.ЗаголовокПроцедуры)
    ИЛИ (СтруктураМодуля[Индекс].Блок = Перечисления.ТипыБлоковМодулей.ЗаголовокФункции))
    И (Найти(ВРег(СтруктураМодуля[Индекс].Текст), КлючБлока) > 0) Тогда
    ...
КонецЕсли;
```

#### 6.

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

#### Подсказка

В конфигураторе:

- сочетанием Alt+Shift+F
- или через меню `Текст -> Блок -> Форматировать`.

В EDT:

- сочетанием Ctrl+Shift+F
- или нажать правую кнопку мыши и выбрать `Source (Исходный код) -> Format (Форматировать)`.

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

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

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

Длина выражения превышает 120 символов. АПК:101

Неправильный перенос текста в выражении. АПК:102

Строка должна находиться в конце предыдущей. АПК:103

Неправильный перенос выражения BSLLS:IncorrectLineBreak

Перенос выражений #std444


стандарт 445

ID: #std445

# Получение метаданных объектов

#### 1.

Если тип объекта метаданных заранее известен (справочник, документ и т.д.), получайте метаданные через метод `Метаданные()` у самого объекта (или ссылки).

Доступ через глобальное свойство `Метаданные` в таком случае работает заметно медленнее.

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

```bsl
Метаданные.Справочники[ИмяСправочника]
Метаданные.НайтиПоПолномуИмени("Справочник." + ИмяСправочника)
```

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

```bsl
СправочникОбъект.Метаданные()
```

#### 2.

Если тип заранее неизвестен, используйте метод `НайтиПоТипу`.

```bsl
// Получить полное имя объекта метаданных вида
// "Справочник.Номенклатура", "Документ.ПриходнаяНакладная" по переданной ссылке.
ИмяОбъектаМетаданного = Метаданные.НайтиПоТипу(ТипЗнч(Ссылка)).ПолноеИмя();
```

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

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

Если тип объекта метаданных заранее известен (справочник, документ и т.д.), получайте метаданные через метод Метаданные() у самого объекта (или ссылки).

Получение метаданных объектов #std445


стандарт 447

ID: #std447

# Использование объекта РегистрСведенийМенеджерЗаписи

#### 1.

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

#### 2.

`РегистрСведенийМенеджерЗаписи` применяйте только когда нужен отбор одновременно по всем измерениям регистра.

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

#### 3.

В остальных случаях используйте `РегистрСведенийНаборЗаписей`.

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

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

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

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

```bsl
Набор = РегистрыСведений.ЗначенияПравПользователя.СоздатьНаборЗаписей();
Набор.Отбор.НаборПрав.Установить(ЗначениеНабораПрав);
Для Каждого СтрокаТаблицы Из ТаблицаЗначенийПрав Цикл
    Запись = Набор.Добавить();
    Запись.НаборПрав = ЗначениеНабораПрав;
    Запись.Право = СтрокаТаблицы.Право;
    Запись.Значение = СтрокаТаблицы.Значение;
КонецЦикла;
Набор.Записать();
```

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

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

Использование объекта РегистрСведенийМенеджерЗаписи #std447


стандарт 448

ID: #std448

# Копирование строк между таблицами значений (табличными частями и т.п.) произвольной структуры

#### 1.

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

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

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

```bsl
Для каждого СтрокаТаблицыИсточника Из ТаблицаИсточник Цикл
    СтрокаТаблицыПриемника = ТаблицаПриемник.Добавить();
    Для каждого Колонка Из ТаблицаПриемник.Колонки Цикл
        КолонкаТаблицыИсточника = ТаблицаИсточник.Колонки.Найти(Колонка.Имя);
        Если КолонкаТаблицыИсточника <> Неопределено Тогда
            СтрокаТаблицыПриемника[Колонка.Имя] = СтрокаТаблицыИсточника[Колонка.Имя];
        КонецЕсли;
    КонецЦикла;
КонецЦикла;
```

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

```bsl
Для каждого СтрокаТаблицыИсточника Из ТаблицаИсточник Цикл
    СтрокаТаблицыПриемника = ТаблицаПриемник.Добавить();
    ЗаполнитьЗначенияСвойств(СтрокаТаблицыПриемника, СтрокаТаблицыИсточника);
КонецЦикла;
```

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

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

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

Копирование строк между таблицами значений (табличными частями и т.п.) произвольной структуры #std448


стандарт 449

ID: #std449

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

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

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

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

Также учитывайте особенности получения представлений в запросе через поле `Представление` или функцию `Представление()`:

- выполняется неявное соединение с таблицей объекта, для которого получается представление;
- для полей составного типа выполняется несколько соединений, по числу типов в составе;
- запрос может выполняться существенно дольше;
- при большом количестве типов в клиент-серверном варианте возможен выход за ограничение `Microsoft SQL Server 2005` (не более 256 таблиц в запросе).

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

Универсального выбора «лучшего» способа нет: его определяют разработчики по результатам измерений на реальных данных.

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

- [Особенности работы с полем Представление и функцией Представление() языка запросов (статья на ИТС)](https://its.1c.ru/db/metod81/content/2655/hdoc)
- [Вывод ссылочных полей](https://its.1c.ru/db/metod81/content/2656/hdoc)

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

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

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

Получение представлений для ссылочных значений в табличном документе #std449


стандарт 450

ID: #std450

# Порядок записи движений документов

#### 1.

Не используйте явную запись наборов записей регистров методом `Записать()` в процедуре обработки проведения документа.

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

#### 2.

Исключение: данные из регистров нужны в последующих алгоритмах, которые выполняются до выхода из процедуры проведения.

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

- [#std603: Требования к проведению документов](https://v8std.ru/std/603/)
- [#std477: Самодостаточность регистров](https://v8std.ru/std/477/)
- [#std633: Использование активности движений](https://v8std.ru/std/633/)

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

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

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

Не используйте явную запись наборов записей регистров методом Записать() в процедуре обработки проведения документа.

Использована явная запись наборов записей регистров (с помощью метода Записать) в процедуре обработки проведения. АПК:105

Самодостаточность регистров #std477

Требования к проведению документов #std603

Использование активности движений #std633

Порядок записи движений документов #std450


стандарт 451

ID: #std451

# Программное создание прикладных объектов

#### 1.

Для программного создания прикладных объектов используйте методы соответствующих менеджеров (`СоздатьЭлемент()`, `СоздатьДокумент()`, `СоздатьНаборЗаписей()` и т.п.).

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

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

```bsl
ДокументПриходная = Новый("ДокументОбъект.ПоступлениеТоваровУслуг");
```

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

```bsl
ДокументПриходная = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
```

#### 2.

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

Тогда корректно сработают:

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

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

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

```bsl
Папка = Справочники.ПапкиФайлов.СоздатьЭлемент();
// ...
Папка.Записать();
```

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

```bsl
Папка = Справочники.ПапкиФайлов.СоздатьЭлемент();
// ...
Папка.Заполнить(Неопределено);
// ...
Папка.Записать();
```

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

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

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

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

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

Прикладной объект создан с помощью оператора Новый. АПК:99

Программное создание прикладных объектов #std451


стандарт 452

ID: #std452

# Поиск в коллекциях значений

#### 1.

При двух и более операциях поиска в объекте `ТаблицаЗначений` с большим количеством строк рекомендуется:

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

Иначе индексирование может не дать эффекта и даже ухудшить производительность из-за лишних затрат на построение индекса.

Под `большим количеством строк` обычно понимайте `1000 строк` и более.
Учитывайте не только размер таблицы, но и число поисков.
Например, таблицу на `100 строк` имеет смысл индексировать, если поиск по ней выполняется `100 раз`.
Для единичного поиска индекс обычно не нужен.

#### 2.

Для поиска в `ТаблицаЗначений` предусмотрены методы:

- `Найти()`;
- `НайтиСтроки()`.

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

#### 2.1.

Не используйте `Найти()` для поиска по нескольким колонкам в больших таблицах значений.
Этот метод применяет индекс только по одному полю.

#### Пример

```bsl
ТЗ.Индексы.Добавить("Колонка1");
ТЗ.Индексы.Добавить("Колонка2");
... = ТЗ.Найти("найдется все", "Колонка1, Колонка2"); // Индекс НЕ используется!
```

Даже при наличии индексов по `Колонка1` и `Колонка2` поиск выполняется полным перебором строк.

#### 2.2.

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

#### Пример

```bsl
ТЗ.Индексы.Добавить("Колонка1"); // Индекс1
ТЗ.Индексы.Добавить("Колонка2"); // Индекс2

... = ТЗ.НайтиСтроки(Новый Структура("Колонка1, Колонка2 ", "Ищу1", "Ищу2")); // Индекс НЕ используется!
... = ТЗ.НайтиСтроки(Новый Структура("Колонка1", "Ищу1")); // OK - используется Индекс1
... = ТЗ.НайтиСтроки(Новый Структура("Колонка2", "Ищу2")); // OK - используется Индекс2
```

#### Другой пример

```bsl
ТЗ.Индексы.Добавить("Колонка1,Колонка2");

... = ТЗ.НайтиСтроки(Новый Структура("Колонка1, Колонка2", "Ищу1", "Ищу2")); // OK - индекс используется
... = ТЗ.НайтиСтроки(Новый Структура("Колонка2, Колонка1", "Ищу2", "Ищу1")); // OK - индекс используется
... = ТЗ.НайтиСтроки(Новый Структура("Колонка1", "Ищу1")); // Индекс НЕ используется!
... = ТЗ.НайтиСтроки(Новый Структура("Колонка2", "Ищу2")); // Индекс НЕ используется!
```

#### 2.3.

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

#### 3.

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

Поэтому рекомендуется:

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

```bsl
ОбъектСравнения = Новый СравнениеЗначений;
ТаблицаДокументов.Сортировать("Дата,Ссылка", ОбъектСравнения);
```

Это особенно важно для таблиц на сотни и тысячи строк в алгоритмах, критичных ко времени выполнения.

#### 3.1.

При поиске в `Массив` с большим количеством элементов лучше отказаться от массива в пользу:

- `Соответствие`, если порядок элементов не важен;
- индексированной `ТаблицаЗначений`, если порядок элементов значим.

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

Ориентир по размеру — 1000 элементов и более.
Также учитывайте число поисков.
Если поиск выполняется многократно (например, в цикле), рекомендация актуальна и для меньших массивов.
Особенно внимательно проверяйте универсальные механизмы, которые могут работать на больших объемах данных.

#### 3.2.

Чтобы обеспечить уникальность элементов в большом массиве, однократно в конце алгоритма вызывайте `СвернутьМассив()` или `ДополнитьМассив()` с параметром `ТолькоУникальныеЗначения = Истина` (модуль `ОбщегоНазначения` БСП).

#### 4.

Аналогичный недостаток есть у `ДеревоЗначений`: индексов нет, поиск выполняется перебором.
В описанных выше случаях заменяйте `ДеревоЗначений` на индексированную `ТаблицаЗначений`.

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

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

При двух и более операциях поиска в объекте ТаблицаЗначений с большим количеством строк рекомендуется:

Поиск в коллекциях значений #std452


стандарт 453

ID: #std453

# Описание процедур и функций

#### 1.

Описывайте процедуры и функции в комментарии к ним.

Текст комментария отображается в контекстной подсказке процедур, функций и их параметров.

При разработке в 1C:Enterprise Development Tools (EDT) комментарий также используется для уточнения типизации параметров и возвращаемого значения процедур и функций и помогает выявлять ошибки кодирования на этапе разработки.

#### 2.

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

#### Проверки
[#v8cs:doc-comment-export-procedure-description-section](https://v8std.ru/diagnostics/v8-code-style/doc-comment-export-procedure-description-section/)
[#v8cs:export-procedure-missing-comment](https://v8std.ru/diagnostics/v8-code-style/export-procedure-missing-comment/)

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

- [#std544: Ограничения на использование экспортных процедур и функций](https://v8std.ru/std/544/)

#### 3.

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

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

#### 4.

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

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

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

```bsl
// Обработчик события "ПриОткрытии" формы
//
&НаКлиенте
Процедура ПриОткрытии()
...

// Обработчик команды "Рассчитать"
//
&НаКлиенте
Процедура Рассчитать()
...

// Обработчик события "ПриИзменении" элемента формы "РедактированиеТолькоВДиалоге"
//
&НаКлиенте
Процедура РедактированиеТолькоВДиалогеПриИзменении(Элемент)
...

// Функция возвращает статью движения денежных средств по данным документа
//
Функция СтатьяДвиженияДенежныхСредств(ДанныеДокумента)
...
```

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

#### 5.

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

#### 5.1.

Секция `// Описание`» (англ. `// Description`) содержит назначение процедуры (функции), достаточное для понимания сценариев использования без просмотра исходного кода. Также может содержать краткое описание принципов работы и перекрестные ссылки на связанные процедуры и функции.

Может быть единственной секцией для процедур без параметров. Описание не должно совпадать с именем процедуры (функции). Для процедур и функций секция должна начинаться с глагола. Для функций это, как правило, «Возвращает…». Если возвращаемый результат не основной в работе функции, начинайте с основного действия: «Проверяет…», «Сравнивает…», «Вычисляет…» и т.п. Не начинайте описание с избыточных слов «Процедура...», «Функция...» или с имени самой процедуры (функции), если
смысл от удаления не меняется.

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

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

```bsl
// Конструктор объекта WSПрокси.
// ...
Функция WSПрокси(ПараметрыПрокси) Экспорт
...

// Функция СтрокаТаблицыЗначенийВСтруктуру создает структуру со свойствами, соответствующими...
Функция СтрокаТаблицыЗначенийВСтруктуру(СтрокаТаблицыЗначений) Экспорт
...
```

Правильно:

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

```bsl
// Создает прокси на основе определения веб-сервиса и связывает
// его с точкой подключения веб-сервиса.
// В дополнении к платформенному конструктору Новый WSПрокси:
//  - включает в себя вызов конструктора WSОпределения;
//  - на время сеанса кэширует файл WSDL для оптимизации частых обращений к веб-сервису;
//  - не требует явного указания ИнтернетПрокси (он подставляется автоматически, если настроен);
//  - выполняет быструю проверку доступности веб-сервиса с помощью операции Ping.
// ...
Функция WSПрокси(ПараметрыПрокси) Экспорт
...

// Создает структуру со свойствами, соответствующими...
Функция СтрокаТаблицыЗначенийВСтруктуру(СтрокаТаблицыЗначений) Экспорт
...
```

#### 5.2.

Секция `// Параметры:` (англ. `// Parameters:`) описывает параметры процедуры (функции). Если параметров нет, секцию пропускайте. Секция начинается строкой «Параметры:», затем с новой строки размещаются описания всех параметров.

#### 5.2.1.

Описание параметра начинается с новой строки: имя параметра, затем дефис и список типов (*), затем дефис и текстовое описание параметра.

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

Описание типа обязательно. Тип указывайте явно: один тип или список типов. Под «списком типов» понимаются имена типов, разделенные запятыми. Имя типа может быть простым (в одно слово) или составным — в два слова, разделенных точкой.

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

В качестве типов значений используйте только существующие в платформе типы, а также специальные типы, предусмотренные в EDT: `ОпределяемыйТип.`, `СправочникСсылка`, `ОбъектМетаданныхОтчет`, `РасширениеДекорацииФормыДляНадписи` и т.п.

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

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

```bsl
// КоллекцияСтрок - КоллекцияЗначений – коллекция для сравнения;
// ФормируемыйОтчет - ОбъектМетаданных: Отчет
// ПрисоединенныйФайлОбъект - элемент справочника файлов.
```

Правильно:

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

```bsl
// КоллекцияСтрок – ТаблицаЗначений, Массив, СписокЗначений – коллекция для сравнения.
// ФормируемыйОтчет – ОбъектМетаданныхОтчет
// ПрисоединенныйФайлОбъект - ОпределяемыйТип.ПрисоединенныйФайлОбъект - элемент справочника файлов.
```

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

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

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

```bsl
// Проверяет, что переданные адреса включены в задачу. Если проверка не проходит – генерируется исключение.
//
// Параметры:
//  Адреса - Строка - строка, содержащая электронные адреса
//  ЗадачаИсполнителя - ЗадачаСсылка.ЗадачаИсполнителя – проверяемая задача
//
Процедура ПроверитьАдресаЗадачи(Адреса, ЗадачаИсполнителя)
...
```

Правильно:

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

```bsl
// Проверяет, что переданные адреса включены в задачу. Если проверка не проходит – генерируется исключение.
//
// Параметры:
//  Адреса - Строка - содержит электронные адреса, разделенные запятой. Например, support@mycorp.ru,v8@localdomain.
//  ЗадачаИсполнителя - ЗадачаСсылка.ЗадачаИсполнителя
//
Процедура ПроверитьАдресаЗадачи(Адреса, ЗадачаИсполнителя)
...
```

В данном примере текстовое описание для параметра `Адреса` нужно, чтобы:

- указать правило передачи нескольких адресов (через запятую);
- привести пример.

Для параметра `ЗадачаИсполнителя` описание не требуется.

#### 5.2.2.

Для параметров типа `Структура` и `ТаблицаЗначений` (`ДеревоЗначений`) в описании типа указывайте ссылку на функцию, выходным значением которой является эта структура или таблица значений. Например, ссылку на функцию-конструктор.

Пример:

#### Пример

```bsl
// Заполняет цены в строке табличной части
// Параметры:
//  ТекущаяСтрока – СтрокаТабличнойЧасти
//  ПараметрыЗаполненияЦен – см. ЦенообразованиеСервер.ПараметрыЗаполненияЦен
//
Процедура ЗаполнитьЦеныВСтрокеТЧ(ТекущаяСтрока, ПараметрыЗаполненияЦен);
```

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

#### 5.2.3.

Для параметров типа `Массив` указывайте тип элементов с помощью ключевого слова `Из` (англ. `Of`).

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

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

```bsl
// МассивПеренаправленныхЗадач - Массив - массив перенаправленных задач.
// МассивПеренаправленныхЗадач - Массив - задачи (ЗадачаСсылка.ЗадачаИсполнителя), перенаправленные другому исполнителю.
```

Правильно:

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

```bsl
// СведенияОбОбновлении  - Массив из см. ОбновлениеИнформационнойБазы.ПараметрыОбновления
```

Не указывайте тип элементов массивов только в методах, которые работают с массивами универсальным образом. Например, в Библиотеке стандартных подсистем есть методы `ДополнитьМассив`, `УдалитьВсеВхожденияЗначенияИзМассива` и т.д.

#### 5.2.4.

Для параметра типа `СтрокаТаблицыЗначений` (`СтрокаДереваЗначений`) можно задать состав свойств, соответствующий колонкам его таблицы-владельца (дерева-владельца).

Например:

#### Пример

```bsl
// СведенияОРегионе – СтрокаТаблицыЗначений: см. РегистрыСведений.АдресныеОбъекты.КлассификаторСубъектовРФ
```

`КлассификаторСубъектовРФ` — экспортная функция модуля менеджера регистра сведений АдресныеОбъекты, которая возвращает таблицу значений.

#### 5.2.5.

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

Например:

#### Пример

```bsl
// Параметры:
//   Реквизиты - Строка - имена реквизитов, перечисленные через запятую.
//                        Например, "Код, Наименование, Родитель".
//             - Структура, ФиксированнаяСтруктура - в качестве ключа передается
//                        псевдоним поля для возвращаемой структуры с результатом,
//                        а в качестве значения (опционально) фактическое имя поля в таблице.
//                        Если значение не определено, то имя поля берется из ключа.
//             - Массив Из Строка, ФиксированныйМассив Из Строка - имена реквизитов.
```

#### 5.2.6.

Описания также могут задаваться с помощью ссылки на функцию-конструктор в формате `// см. ПутьКФункции` (англ. `// see MethodPath`).

Например:

#### Пример

```bsl
// ПараметрыУказанияСерий - см. НоменклатураКлиентСервер.ПараметрыУказанияСерий
// Дубли - см. ОбработкаОбъект.ПоискИУдалениеДублей.ГруппыДублей
// РеквизитыКомпонент - Массив из см. ВнешниеКомпоненты.РеквизитыКомпоненты
```

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

#### Пример

```bsl
//  Запросы - см. Обработка.КонсольЗапросов.ТабличнаяЧасть.Запросы
//  ТипыДанных - см. Обработка.КонсольЗапросов.Реквизит.ДоступныеТипыДанных
//  Вложения - см. Справочник.ШаблоныСообщений.ФормаЭлемента.Вложения
//  КонтактнаяИнформация - см. Документ.ЗаказПокупателя.ФормаДокумента.Объект.КонтактнаяИнформация
```

В редких случаях, когда подходящей функции-конструктора нет и ее нельзя создать, допускается указывать ссылку на другую процедуру (при полном совпадении параметров) или на параметр другой процедуры или функции. Например:

#### Пример

```bsl
// См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту
//
Процедура ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды) Экспорт

// Параметры:
//  НастройкиФормы - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.НастройкиФормы
//  Источники - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Источники
//  ПодключенныеОтчетыИОбработки - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.ПодключенныеОтчетыИОбработки
//  Команды - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Команды
//
Процедура ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды) Экспорт
```

#### 5.3.

Секция `// Возвращаемое значение:` (англ. `// Returns:`) описывает тип и содержание возвращаемого значения функции. Для процедур секция отсутствует. Секция начинается строкой «Возвращаемое значение:». Затем с новой строки указывается тип возвращаемого значения, дефис и текст описания. Если возвращаемое значение составного типа, каждый тип пишется с новой строки и с дефиса.

Например:

#### Пример

```bsl
// Возвращаемое значение:
//  Строка

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

// Возвращаемое значение:
//  - ЛюбаяСсылка - ссылка на предопределенный элемент.
//  - Неопределено - если предопределенный элемент есть в метаданных, но не создан в ИБ.

// Возвращаемое значение:
//  - СправочникСсылка.Пользователи
//  - СправочникСсылка.ВнешниеПользователи
```

Текстовое описание возвращаемого значения заполняйте, если одного описания функции недостаточно или нужна дополнительная информация о типе, например, о составе свойств или колонок. Также можно привести пример ожидаемого значения или сквозной пример в секции «Пример» ниже.

Формат описания возвращаемого значения с типом Массив аналогичен п. 5.2.3. Формат описания возвращаемого значения с типом `Структура` и `ТаблицаЗначений` описан в стандарте «Структуры и таблицы значений в качестве параметров процедур и функций».

#### 5.4.

Секция `// Пример:`» (англ. `// Example:`) содержит пример использования процедуры или функции. Секция начинается строкой «Пример:». Далее с новой строки приводится пример использования. Имя процедуры (функции) пишите вместе с именем общего модуля, в котором она расположена. Из примера должно быть понятно, что передается на входе и что возвращается на выходе.

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

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

```bsl
// Пример:
//  ПодставитьПараметрыВСтроку(ШаблонСтроки, СтрокаЗамены);
```

Правильно:

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

```bsl
// Пример:
//  СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='%1 пошел в %2'"), "Вася", "Зоопарк") = "Вася пошел в Зоопарк".
```

#### 5.4.1.

В переопределяемых модулях в секции «Пример» приводите пример реализации переопределяемой процедуры, а не пример ее вызова. Например, для процедуры ПриОпределенииОбщихПараметровБазовойФункциональности(ОбщиеПараметры):

#### Пример

```bsl
// Пример:
//  ОбщиеПараметры.МинимальноНеобходимаяВерсияПлатформы = "8.3.4.365";
//  ОбщиеПараметры.РекомендуемыйОбъемОперативнойПамяти = 2;
```

#### 5.5.

В редких случаях, когда сразу несколько параметров имеют дополнительные типы, добавляйте секцию `// Варианты вызова:` (англ. `// Call options:`. Секция начинается фразой «Варианты вызова:», затем идут описания вариантов, каждое с новой строки. Каждый вариант вызова представляется в виде имени функции со списком типов, перечисленных через запятую в круглых скобках, затем следует дефис и текстовое описание варианта.

Например:

#### Пример

```bsl
// ...
//
// Параметры:
//   Параметр1 - Тип11, Тип12        - ...
//   Параметр2 - Тип21, Тип22, Тип23 - ...
//
// Варианты вызова:
//   УниверсальнаяПроцедура(Тип11, Тип21) - описание ...
//   УниверсальнаяПроцедура(Тип12, Тип22) - описание ...
//   УниверсальнаяПроцедура(Тип11, Тип23) - описание ...
//
Процедура УниверсальнаяПроцедура(Параметр1, Параметр2) Экспорт
```

#### 5.6.

В любом месте документирующего комментария можно добавить переход к другим объектам конфигурации, процедурам и функциям (в том числе к функциям-конструкторам структур). В 1C:Enterprise Development Tools среда оформит такие переходы в виде гиперссылки.

Например:

#### Пример

```bsl
// Описание универсальной процедуры.
//
// См. УправлениеДоступом.ЗаполнитьНаборыЗначенийДоступа
//
// Параметры:
//   Параметр1 – Произвольный – описание параметра см. Справочник.Контрагенты.
//
Процедура УниверсальнаяПроцедура(Параметр1)
```

#### 5.7.

Если нужно пометить процедуру (функцию) как устаревшую, в первой строке описания используйте слово `// Устарела` (англ. `// Deprecated`).

Например:

#### Пример

```bsl
// Устарела. Следует использовать ОбщегоНазначения.РазделениеВключено и
// ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных
// ...
Функция ИспользованиеРазделителяСеанса() Экспорт
```

#### 6.

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

Например:

#### Пример

```bsl
// Процедура-обработчик события формы ПриСозданииНаСервере.
// Обрабатывает параметры формы и заполняет реквизиты формы значениями.
// А также выполняет следующие действия:
// ...
//
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
```

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

#### 7.

Код процедур и функций отделяйте друг от друга пустыми строками.

Примеры описания процедур и функций

Пример описания функции с одним параметром:

#### Пример

```bsl
// Определяет доступность ролей ИменаРолей текущему пользователю,
// а также доступность административных прав.
//
// Параметры:
//   ИменаРолей - Строка - имена ролей, доступность которых проверяется, разделенные запятыми.
//
// Возвращаемое значение:
//   Булево - Истина, если хотя бы одна из переданных ролей доступна текущему пользователю,
//   либо у него есть административные права.
//
// Пример:
// Если РолиДоступны("ИспользованиеРассылокОтчетов,ОтправкаПоПочте") Тогда ...
//
Функция РолиДоступны(ИменаРолей) Экспорт
```

Пример описания процедуры без параметров:

#### Пример

```bsl
// В обработчике события ПередЗаписью документа выполняется;
// - очистка табличной части услуги, в случае если указан договор с комиссионером;
// - проверка заполнения реквизита ЕдиницаИзмеренияМест табл. части Товары;
// - синхронизация с "подчиненным" счетом-фактурой;
// - заполнение склада и заказа покупателя в табличных частях Товары и ВозвратнаяТара;
// - удаление неиспользуемых строк табличной части "Серийные номера";
// - заполнение переменной модуля объекта УдалятьДвижение.
//
Процедура ПередЗаписью()

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

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

[#acc:222](https://v8std.ru/diagnostics/acc/222/)
[#acc:223](https://v8std.ru/diagnostics/acc/223/)
[#acc:288](https://v8std.ru/diagnostics/acc/288/)
[#acc:289](https://v8std.ru/diagnostics/acc/289/)
[#acc:388](https://v8std.ru/diagnostics/acc/388/)
[#acc:389](https://v8std.ru/diagnostics/acc/389/)
[#acc:399](https://v8std.ru/diagnostics/acc/399/)
[#acc:400](https://v8std.ru/diagnostics/acc/400/)
[#acc:401](https://v8std.ru/diagnostics/acc/401/)
[#acc:402](https://v8std.ru/diagnostics/acc/402/)
[#acc:403](https://v8std.ru/diagnostics/acc/403/)
[#acc:404](https://v8std.ru/diagnostics/acc/404/)
[#acc:405](https://v8std.ru/diagnostics/acc/405/)
[#acc:406](https://v8std.ru/diagnostics/acc/406/)
[#acc:407](https://v8std.ru/diagnostics/acc/407/)
[#acc:408](https://v8std.ru/diagnostics/acc/408/)
[#acc:409](https://v8std.ru/diagnostics/acc/409/)
[#acc:410](https://v8std.ru/diagnostics/acc/410/)
[#acc:416](https://v8std.ru/diagnostics/acc/416/)
[#acc:417](https://v8std.ru/diagnostics/acc/417/)
[#acc:459](https://v8std.ru/diagnostics/acc/459/)
[#acc:466](https://v8std.ru/diagnostics/acc/466/)
[#acc:1242](https://v8std.ru/diagnostics/acc/1242/)
[#acc:1243](https://v8std.ru/diagnostics/acc/1243/)
[#acc:1334](https://v8std.ru/diagnostics/acc/1334/)
[#acc:1335](https://v8std.ru/diagnostics/acc/1335/)
[#acc:1336](https://v8std.ru/diagnostics/acc/1336/)
[#acc:1360](https://v8std.ru/diagnostics/acc/1360/)
[#acc:1381](https://v8std.ru/diagnostics/acc/1381/)
[#acc:1382](https://v8std.ru/diagnostics/acc/1382/)
#### Источник

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

Отсутствует комментарий к экспортной процедуре (функции). АПК:1242

Отсутствует или неверно описана секция "Описание" в комментарии к экспортной процедуре (функции). АПК:1243

Устаревшая процедура (функция) ссылается на несуществующую процедуру (функцию). АПК:1334

Устаревшая процедура (функция) ссылается на другую устаревшую процедуру (функцию). АПК:1335

Устаревшая процедура (функция) ссылается на процедуру (функцию), расположенную вне области "ПрограммныйИнтерфейс". АПК:1336

Некорректно описан тип элементов массива. АПК:1360

В качестве объекта переадресации из гиперссылки "См. ..." указана устаревшая процедура (функция). АПК:1381

В качестве объекта переадресации из гиперссылки "См. ..." указана процедура (функция), расположенная вне области "ПрограммныйИнтерфейс". АПК:1382

Использование устаревшей процедуры. АПК:222

Использование устаревшей функции. АПК:223

Устаревшая функция содержит код. АПК:288

Устаревшая процедура содержит код. АПК:289

Неэкспортная процедура (функция) в разделе "ПрограммныйИнтерфейс". АПК:388

Неэкспортная процедура (функция) в разделе "СлужебныйПрограммныйИнтерфейс". АПК:389

Отсутствует или неверно описана секция "Параметры" в комментарии к экспортной процедуре (функции). АПК:399

Отсутствует или неверно описана секция "Возвращаемое значение" в комментарии к экспортной функции. АПК:400

Не описаны некоторые параметры в секции "Параметры" в комментарии к экспортной процедуре (функции). АПК:401

Секция "Возвращаемое значение" находится перед секцией "Параметры" в комментарии к экспортной функции. АПК:402

Некорректно оформлена гиперссылка "См. ..." в комментарии к экспортной процедуре (функции). АПК:403

Не найден объект переадресации из гиперссылки "См. ..." в комментарии к экспортной процедуре (функции). АПК:404

Описаны лишние параметры в секции "Параметры" в комментарии к экспортной процедуре (функции). АПК:405

Некорректно описаны некоторые параметры в секции "Параметры" в комментарии к экспортной процедуре (функции). АПК:406

Некорректно описан тип некоторых параметров в секции "Параметры" в комментарии к экспортной процедуре (функции). АПК:407

Описание параметров в секции "Параметры" должно начинаться с новой строки в комментарии к экспортной процедуре (функции). АПК:408

Описание возвращаемого значения в секции "Возвращаемое значение" должно начинаться с новой строки в комментарии к экспортной функции. АПК:409

Описана секция "Параметры" в комментарии к экспортной процедуре (функции), не имеющей параметров. АПК:410

Отсутствует или некорректно описан тип возвращаемого значения в комментарии к экспортной функции. АПК:416

Некорректно описан тип некоторых свойств возвращаемого значения в комментарии к экспортной функции. АПК:417

Описание процедуры (функции) размещено в середине, а не в начале комментария; либо описание параметра без отступа. АПК:459

Нестандартные секции в описании экспортной процедуры (функции). АПК:466

Отсутствует описание параметров метода BSLLS:MissingParameterDescription

Отсутствует описание возвращаемого значения функции BSLLS:MissingReturnedValueDescription

Все методы программного интерфейса должны иметь описание BSLLS:PublicMethodsDescription

Документирующий комментарий не содержит секцию "Описание" для экспортной процедуры (функции) (doc-comment-export-procedure-description-section)

Отсутствует комментарий к экспортной процедуре (функции) (export-procedure-missing-comment)

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

Описание процедур и функций #std453


стандарт 454

ID: #std454

# Правила образования имен переменных

#### 1.

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

#### 2.

Формируйте имена так:

- Удалите пробелы между словами.
- Каждое новое слово напишите с большой буквы.
- Предлоги и местоимения пишите большими буквами.

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

```bsl
масРеквизитов, соотвВидИмя, новСтр
```

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

```bsl
Перем ДиалогРаботыСКаталогом;     // Диалог работы с каталогом
Перем КоличествоПачекВКоробке;    // Количество пачек в коробке
```

#### 3.

Не начинайте имена переменных с подчеркивания `_ИмяПеременной`.

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

#### 4.

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

#### 5.

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

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

```bsl
Перем ЕстьОшибки;     // Признак наличия ошибок в процедуре.
Перем ЭтоТоварТара;   // Признак, что товар относится к возвратной таре.
```

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

- [#std639: Использование переменных в программных модулях](https://v8std.ru/std/639/)

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

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

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

Имена переменных не должны состоять из одного символа. АПК:247

Имена переменных не должны начинаться с подчеркивания. АПК:248

Зарезервированные имена параметров BSLLS:ReservedParameterNames

Правила образования имен переменных (bsl-variable-name-invalid)

Использование переменных в программных модулях #std639

Правила образования имен переменных #std454