стандарт 542

ID: #std542

# Доступ к файловой системе из кода конфигурации

#### 1.

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

#### 1.1.

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

#### 1.2.

Если код выполняется на сервере:

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

Рабочие процессы могут быть запущены от имени пользователя, отличного от пользователя агента сервера.
Подробно: [описание служебного файла `swpuser.ini`](https://its.1c.ru/db/v8doc/content/26/hdoc/issogl1_3.20.swpuser.ini).

#### 2.

Запрещено записывать файлы в каталог исполняемых файлов платформы, получаемый через `КаталогПрограммы()`.

`КаталогПрограммы()` допустимо использовать только для чтения или запуска файлов.
Например, в Windows допустим запуск копии тонкого клиента текущей версии:

```bsl
ЗапуститьПриложение(КаталогПрограммы() + "1cv8s.exe");
```

#### 3.

Даже если [#std761: локализация конфигурации на другие языки](https://v8std.ru/std/761/) не планируется, обеспечивайте переносимость автоматически сформированных файлов между ОС с разными кодировками

#### 3.1.

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

Это особенно важно для macOS.

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

#### 3.2.

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

По умолчанию, если это не ухудшает UX, предлагайте англоязычное имя файла и UTF-8 для текстовых файлов.

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

Если конфигурация использует БСП, для транслитерации имен файлов применяйте `СтроковыеФункцииКлиентСервер.СтрокаЛатиницей()`.

## Работа с временными файлами и каталогами

При работе с временными файлами и каталогами соблюдайте правила ниже.

#### 1.

Для получения имени временного файла используйте `ПолучитьИмяВременногоФайла()` (исключение: веб-клиент, см. п. `3.1`).

Иначе возможны:

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

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

```bsl
ИмяПромежуточногоФайла = "C:\Временные файлы 1С\TempFile.xml";
Данные.Записать(ИмяПромежуточногоФайла);
```

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

```bsl
ИмяПромежуточногоФайла = ПолучитьИмяВременногоФайла("xml");
Данные.Записать(ИмяПромежуточногоФайла);
```

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

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

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

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

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

```bsl
Каталог = КаталогВременныхФайлов();
ИмяФайла = Строка(Новый УникальныйИдентификатор) + ".xml";
ИмяПромежуточногоФайла = Каталог + ИмяФайла;
Данные.Записать(ИмяПромежуточногоФайла);
```

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

```bsl
ИмяПромежуточногоФайла = ПолучитьИмяВременногоФайла("xml");
Данные.Записать(ИмяПромежуточногоФайла);
```

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

#### 2.

Для временного каталога также используйте имя, полученное через `ПолучитьИмяВременногоФайла()` (исключение: веб-клиент, см. п. `3.1`).

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

#### 3.1.

В веб-клиенте `ПолучитьИмяВременногоФайла()` недоступен.
Используйте `КаталогВременныхФайлов()` и `УникальныйИдентификатор`.

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

```bsl
Каталог = КаталогВременныхФайлов();
ИмяФайла = "TempDataFile.xml";
ИмяПромежуточногоФайла = Каталог + ИмяФайла;
Данные.Записать(ИмяПромежуточногоФайла);
```

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

```bsl
Каталог = КаталогВременныхФайлов();
ИмяФайла = Строка(Новый УникальныйИдентификатор) + ".xml";
ИмяПромежуточногоФайла = Каталог + ИмяФайла;
Данные.Записать(ИмяПромежуточногоФайла);
```

#### 3.2.

Если в конфигурацию встроена БСП, для создания временных каталогов на клиенте используйте `ФайловаяСистемаКлиент.СоздатьВременныйКаталог()`.

#### 4.

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

```bsl
ИмяПромежуточногоФайла = ПолучитьИмяВременногоФайла("xml");
Данные.Записать(ИмяПромежуточногоФайла);

// Работа с файлом
...

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

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

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

[#std498: Использование Журнала регистрации](https://v8std.ru/std/498/)

#### 5.

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

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

#### 5.1.

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

Тогда обеспечьте:

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

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

#### 1.

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

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

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

```bsl
&НаКлиенте
Процедура ОбработатьФайл()
    ...
    ИмяФайла = "C:\Файлы для обработки\Загрузка.xml";
    Результат = ПроизвестиОбработкуНаСервере(ИмяФайла);
    ...
КонецПроцедуры

&НаСервере
Функция ПроизвестиОбработкуНаСервере(ИмяФайла)
    Чтение = Новый ЧтениеТекста(ИмяФайла);
    ...
    Результат = Чтение.Прочитать();
    Возврат Результат;
КонецФункции
```

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

```bsl
&НаКлиенте
Процедура ОбработатьФайл()
    ...
    ИмяФайлаДляОбработки = "C:\Файлы для обработки\Загрузка.xml";
    ОписаниеОповещения = Новый ОписаниеОповещения(
        "ОбработатьФайлЗавершение", ЭтотОбъект);
    НачатьПомещениеФайла(ОписаниеОповещения,,
        ИмяФайлаДляОбработки, Ложь,
        УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьФайлЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры)
    ...
    Результат = ПроизвестиОбработкуНаСервере(Адрес);
    ...
КонецПроцедуры

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

#### 2.

Если данные файла должны храниться между несколькими серверными вызовами, при помещении в хранилище передавайте `УникальныйИдентификаторФормы` в `ПоместитьФайл()`.

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

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

```bsl
&НаКлиенте
Процедура ОбработатьФайл()
    ...
    // Первый серверный вызов
    ИмяФайлаДляОбработки = "C:\Файлы для обработки\Загрузка.xml";
    ОписаниеОповещения = Новый ОписаниеОповещения(
        "ОбработатьФайлЗавершение", ЭтотОбъект);
    НачатьПомещениеФайла(ОписаниеОповещения,,
        ИмяФайлаДляОбработки, Ложь,
        УникальныйИдентификатор);
    ...
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьФайлЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры)
    ...
    Результат = ПроизвестиНачальнуюОбработкуНаСервере(Адрес);
    ПродолжитьОбработкуФайла();
    ...
КонецПроцедуры

&НаКлиенте
Процедура ПродолжитьОбработкуФайла()
    ...
    // Второй серверный вызов с той же версией файла
    Результат = ПроизвестиПромежуточнуюОбработкуНаСервере(Адрес);
    ...
    // Третий серверный вызов с новой версией файла
    ОписаниеОповещения = Новый ОписаниеОповещения(
        "ПродолжитьОбработкуФайлаЗавершение", ЭтотОбъект);
    НачатьПомещениеФайла(ОписаниеОповещения,,
        ИмяФайлаДляОбработки, Ложь,
        УникальныйИдентификатор);
КонецПроцедуры

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

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

```bsl
&НаКлиенте
Процедура ОбработатьФайл()
    ...
    // Первый серверный вызов
    ИмяФайлаДляОбработки = "C:\Файлы для обработки\Загрузка.xml";
    ОписаниеОповещения = Новый ОписаниеОповещения(
        "ОбработатьФайлЗавершение", ЭтотОбъект);
    НачатьПомещениеФайла(ОписаниеОповещения,,
        ИмяФайлаДляОбработки, Ложь,
        УникальныйИдентификатор);
    ...
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьФайлЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры)
    ...
    Результат = ПроизвестиНачальнуюОбработкуНаСервере(Адрес);
    ПродолжитьОбработкуФайла();
    ...
КонецПроцедуры

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

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

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

#### 3.

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

Чтобы сохранить данные файла между несколькими серверными вызовами, используйте свойство `ИдентификаторФормы` параметра `ПараметрыЗагрузки`.

```bsl
&НаКлиенте
Процедура ОбработатьФайл()
    ...
    ИмяФайлаДляОбработки = "C:\Файлы для обработки\Загрузка.xml";
    ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьФайлЗавершение", ЭтотОбъект);

    ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла();
    ПараметрыЗагрузки.ИдентификаторФормы = УникальныйИдентификатор;
    ПараметрыЗагрузки.Интерактивно = Ложь;

    ФайловаяСистемаКлиент.ЗагрузитьФайл(ОписаниеОповещения,
        ПараметрыЗагрузки, ИмяФайлаДляОбработки);
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьФайлЗавершение(ПомещенныйФайл, ДополнительныеПараметры)
    ...
    Результат = ПроизвестиОбработкуНаСервере(Адрес);
    ...
КонецПроцедуры
```

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

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

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

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

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

Отсутствует удаление временного файла после использования. АПК:441

Вызов функции "КаталогВременныхФайлов()". АПК:495

Доступ к файловой системе BSLLS:FileSystemAccess

Отсутствует удаление временного файла после использования BSLLS:MissingTemporaryFileDeletion

Вызов функции КаталогВременныхФайлов() BSLLS:TempFilesDir

Отсутствует удаление временного файла после использования. (missing-temporary-file-deletion)

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

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

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

Доступ к файловой системе из кода конфигурации #std542


стандарт 543

ID: #std543

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

#### 1.

Подсистемы решают две задачи:

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

#### 1.1.

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

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

Изображение: Иллюстрация 1 (543.img1.png)

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

#### 1.2.

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

Для таких подсистем флажок `Включать в командный интерфейс` должен быть снят.

Примеры:

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

#### 1.3.

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

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

- [Панель разделов](https://its.1c.ru/db/v8std#content:567:hdoc)

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

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

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

Подсистемы решают две задачи:

Неверно снят флажок "Включать в командный интерфейс". Для подсистемы, включенной в пользовательский командный интерфейс, он должен быть установлен. АПК:263

Неверно установлен флажок "Включать в командный интерфейс". Для функциональной подсистемы он должен быть снят. АПК:264

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

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


стандарт 544

ID: #std544

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

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

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

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

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

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

Найдена экспортная процедура или функция в модуле команды. АПК:250

Ограничения на использование экспортных процедур и функций в модуле команд и форм (export-method-in-command-form-module)

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


стандарт 547

ID: #std547

# Ограничение на использование оператора Перейти

#### 1.

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

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

```bsl
Если ПланВидовРасчета = Объект.ПланВидовРасчета Тогда

    Перейти ~ПланВидовРасчета;

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

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

```bsl
Если ПланВидовРасчета = Объект.ПланВидовРасчета Тогда

    ОбработатьПланВидовРасчета();

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

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

#### 2.

Оператор `Перейти` не поддерживается в веб-клиенте. Можно получить ошибку в режиме исполнения.

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

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

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

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

Оператор "Перейти" не поддерживается платформой "1С:Предприятие" в режиме веб-клиента. АПК:249

Использован оператор "Перейти". АПК:89

Используется оператор Перейти (use-goto-operator)

Ограничение на использование оператора Перейти #std547


стандарт 550

ID: #std550

# Имена объектов метаданных в конфигурациях

Стандарт дополняет общие правила именования:
[#std474: Имя, синоним, комментарий](https://v8std.ru/std/474/)

#### 1.

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

#### Примеры

`Финансы`, `Маркетинг`, `НастройкаИАдминистирование`.

См. также: [#std543: Использование подсистем](https://v8std.ru/std/543/)

#### 2.

Для именования общих модулей используйте [#std469: Правила создания общих модулей](https://v8std.ru/std/469/)

#### 3.

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

#### Примеры

`ТекущийПользователь`, `ОбменДаннымиВключен`, `РаботаСВнешнимиРесурсамиЗаблокирована`.

См. также: [#std413: Использование параметров сеанса](https://v8std.ru/std/413/)

#### 4.

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

- прикладные роли именуйте по должности: `Бухгалтер`, `Кассир`, `Администратор`;
- технические роли (для точной настройки прав) именуйте по разрешаемому действию: `ДобавлениеИзменениеНСИ`, `ЧтениеДополнительныхСведений`.

См. также: [#std488: Стандартные роли](https://v8std.ru/std/488/)

#### 5.

Общие реквизиты именуйте по общим правилам наименования метаданных.

#### 6.

Для планов обмена используйте такие правила:

- для РИБ (`Распределенная ИБ = Истина`) имя должно кратко описывать правило синхронизации: `Полный`, `ПоОрганизациям`, `ПоСкладамИОрганизациям`;
- для обмена между конфигурациями имя формируйте из источника и приемника, и в обеих базах имя должно быть одинаковым: `ОбменУправлениеНебольшойФирмойБухгалтерияПредприятия`;
- если обмен выполняется между разными редакциями, добавляйте номера редакций: `ОбменУправлениеТорговлей110РозничнаяТорговля10`.

#### 7.

Критерии отбора именуйте во множественном числе, по списку отбираемых объектов.

#### Примеры

`СвязанныеДокументы`, `ФайлыВТоме`.

#### 8.

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

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

`ЗапретРедактированияРеквизитовОбъектовПередЗаписьюОбъекта`
`НастройкаПорядкаЭлементовПередЗаписью`

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

`ПроверитьИзменениеРеквизитовОбъекта`
`ПересчитатьПорядковыйНомерЭлемента`

#### 9.

Регламентные задания именуйте в единственном числе, от существительного.

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

`УстановитьПериодРасчитанныхИтогов`
`УведомитьИсполнителейОНовыхЗадачах`

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

`УстановкаПериодаРасчитанныхИтогов`
`УведомлениеИсполнителейОНовыхЗадачах`

#### 10.

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

#### Примеры

Для типа `Булево`: `ИспользоватьБизнесПроцессыИЗадачи`, `ИспользоватьВерсионированиеОбъектов`.

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

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

#### 11.

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

#### Примеры

`Организация` (связан со справочником `Организации`).

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

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

#### 12.

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

Не используйте:

- названия стандартных типов (`Строка`, `Число`);
- технические слова, не влияющие на смысл (`Тип...`, `Объект...`, `Ссылка...`).

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

`Строка25`
`СсылкиНаКонтактыВзаимодействий`

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

`АртикулНоменклатуры`
`КонтактВзаимодействий`

См. также: [Использование определяемых типов](https://its.1c.ru/db/v8std/content/704/hdoc).

#### 13.

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

#### Пример

`ХранилищеВариантовОтчетов`.

#### 14.

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

#### Примеры

`НастройкаСистемы`, `МоиНастройки`, `ПараметрыПроксиСервера`, `ВыборОбъектовМетаданных`.

#### 15.

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

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

#### 16.

Группы команд именуйте от существительных.

#### Примеры

`ПараметрыОбменаДанными`, `Печать`.

#### 17.

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

См. также:

- [Общие правила построения интерфейсов](https://its.1c.ru/db/v8std/content/500/hdoc),
- [Общие интерфейсы](https://its.1c.ru/db/v8std/content/501/hdoc).

#### 18.

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

#### Примеры

`ДополнительнаяОбработка`, `КомпонентаTWAIN`, `ОписаниеИзмененийСистемы`.

#### 19.

Общие картинки именуйте по общим правилам наименования метаданных.

Дополнительно:

- можно указывать размер в имени: `УправлениеПоиском32`, `ДлительнаяОперация48`;
- для картинок-коллекций добавляйте префикс `Коллекция`: `КоллекцияВариантыВажностиЗадачи`;
- не используйте лишние слова: `Картинка...`, `Изображение...`, `Пиктограмма...`.

#### Примеры

`Найти`, `ЗакрепитьВариантОтчета`, `Папка`.

#### 20.

`XDTO`-пакеты именуйте на русском языке, от существительных, которые кратко описывают содержимое или назначение.
Не используйте лишние слова (`Пакет...`, `XDTO...`).

#### Пример

`Файлы`.

#### 21.

`Web`-сервисы именуйте на английском языке, от существительных.
Не используйте кириллицу и лишние слова (`Service`, `WebService`).

Операции и параметры `Web`-сервисов также именуйте на английском языке.

#### Примеры

`Files`, `Accounts`, `FlightStatus`, `GetCurrencyRate`.

#### 22.

`WS`-ссылки именуйте от существительных по назначению сервиса.
Не используйте лишние слова (`WebСервис...`, `Сервис...`, `Ссылка...`).

#### Примеры

`ДанныеОтгрузки`, `КонверторВалют`.

#### 23.

Элементы стиля именуйте от существительных по назначению.

В имени допустимо уточнение параметра стиля.

#### Примеры

`ВыполненнаяЗадача`, `ПоясняющийТекст`, `НеСтартованныйБизнесПроцесс`,
`УдаленныйДополнительныйРеквизитЦвет`, `УдаленныйДополнительныйРеквизитШрифт`.

См. также:

- [Элементы стиля](https://its.1c.ru/db/v8std/content/667/hdoc),
-.

#### 24.

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

См. также:.

#### 25.

Языки именуйте по наименованию языка интерфейса.

#### Примеры

`Русский`, `Английский`.

#### 26.

Константы именуйте по таким правилам:

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

#### Примеры

`ТипХраненияФайлов`, `НастройкаПроксиСервера`,
`ВыполнятьПроверкуЭЦПНаСервере`, `ИзменятьЗаданияЗаднимЧислом`.

Не используйте лишние слова (`Константа...`).

#### 27.

Справочники именуйте во множественном числе, по списку хранимых объектов.

#### Примеры

`Валюты`, `ГруппыИсполнителейЗадач`, `ПрофилиГруппДоступа`, `Пользователи`.

Не используйте лишние слова (`Справочник...`).

#### 28.

Документы именуйте в единственном числе.

#### Примеры

`ЗаказПокупателя`, `ПеремещениеТоваров`, `Анкета`.

Не используйте лишние слова (`Документ...`).

#### 28.1.

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

#### Пример

Для процесса сверки взаиморасчетов: `СверкаВзаиморасчетов`.

#### 28.2.

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

#### Пример

`ТоварноТранспортнаяНакладная`.

#### 29.

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

#### Примеры

`СкладскиеДокументы`, `КорректировкиНДС`.

Не используйте лишние слова (`Документы...`).

#### 30.

Перечисления именуйте во множественном числе.

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

`ДействиеСДокументамиПоДвойномуЩелчку`
`ВажностьЗадачи`
`SMTPАутентификация`

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

`ДействияСДокументамиПоДвойномуЩелчку`
`ВариантыВажностиЗадачи`
`ВидыSMTPАутентификации`

Исключения допустимы, но должны быть обоснованы.

#### Пример

`ПолФизическогоЛица`.

#### 31.

Для отчетов и вариантов отчетов применяйте отдельные правила.

#### 31.1.

Имена отчетов и вариантов отчетов образуйте от существительного.

#### Примеры

`ДинамикаИзмененийФайлов`, `СписокЗависшихЗадач`, `СправкаОбИсполнительскойДисциплине`.

#### 31.2.

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

#### Методическая рекомендация

Для отчетов с макетом заголовок размещайте в макете.

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

#### 31.3.

Представление варианта отчета:

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

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

Для отчета `Валовая прибыль`: `Основной`, `По заказам`.

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

Для отчета `Валовая прибыль`: `Валовая прибыль по контрагентам`, `Валовая прибыль по заказам`.

#### 31.4.

Не используйте в именах отчетов и вариантов отчетов лишние слова (`Отчет...`).

#### 32.

Обработки именуйте от существительного.

#### Примеры

`КонтрольЖурналаРегистрации`, `РегламентныеИФоновыеЗадания`, `УправлениеИтогамиИАгрегатами`.

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

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

#### 33.

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

#### Примеры

`ВидыДоступа`, `ВопросыДляАнкетирования`, `ДополнительныеРеквизитыИСведения`.

#### 34.

Планы счетов именуйте в единственном числе, от существительного по назначению.
Не используйте лишние слова (`ПланСчетов...`).

При этом в синониме можно использовать полное наименование.

#### Примеры (имя - синоним)

- `ЕПСБУ` - `ЕПСБУ`
- `БухгалтерскийУчет` - `План счетов бухгалтерского учета`
- `УправленческийУчет` - `План счетов управленческого учета`
- `МеждународныйУчет` - `План счетов международного учета`

Для уточнений используйте свойство `Пояснение`.

#### Примеры с пояснением

`НалоговыйУчет`: `План счетов налогового учета`

Пояснение: `План счетов налогового учета (по налогу на прибыль)`

`ЕПСБУ`: `ЕПСБУ`

Пояснение: `Единый план счетов бюджетного учета`

#### 35.

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

#### Примеры

`ОсновныеНачисления`, `УправленческиеНачисления`, `Удержания`.

#### 36.

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

#### Примеры

`ДокументыФизическихЛиц`, `ФайлыВРабочемКаталоге`, `ДвиженияДенежныхСредств`.

#### 37.

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

#### Примеры

`Хозрасчетный`, `Начисления`.

#### 38.

Бизнес-процессы именуйте так же, как документы: в единственном числе.

#### Примеры

`Задание`, `Согласование`, `Утверждение`, `Поручение`.

#### 39.

Задачи бизнес-процессов именуйте в единственном числе.

#### Пример

`ЗадачаИсполнителя`.

#### 40.

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

#### Примеры

`ДоговорыУправленческойУчетнойСистемы`, `ФайлыОсновнойСЭД`.

Таблицы внешних источников данных именуйте по общим правилам наименования метаданных.

#### Примеры

`Договоры`, `Номенклатура`.

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

- [#std474: Имя, синоним, комментарий](https://v8std.ru/std/474/)
- [#std706: Ограничения на переименование объектов метаданных](https://v8std.ru/std/706/)

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

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

Стандарт дополняет общие правила именования: #std474: Имя, синоним, комментарий.

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

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

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

Имя, синоним, комментарий #std474

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

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

Ограничения на переименование объектов метаданных #std706

Имена объектов метаданных в конфигурациях #std550


стандарт 551

ID: #std551

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

#### 1.

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

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

Библиотечный подход позволяет:

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

#### 2.

Библиотека может стоять на поддержке у другой библиотеки. Так формируется иерархия библиотек.

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

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

#### 3.

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

**Программный интерфейс** содержит экспортные процедуры и функции для внешних потребителей.
Выделяйте две категории:

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

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

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

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

Изображение: Иллюстрация 1 (551.img1.png)

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

- [#std644: Обеспечение совместимости библиотек](https://v8std.ru/std/644/)

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

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

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

Недопустимый вызов служебной процедуры или функции другой подсистемы. АПК:277

Недопустимый вызов служебного программного интерфейса. АПК:278

Обеспечение совместимости библиотек #std644

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


стандарт 552

ID: #std552

# Имена объектов метаданных в иерархии библиотек

#### 1.

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

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

Пример: если в «Управлении предприятием» есть группа команд `Настройки`, конфликтующая с группой `Настройки` из библиотеки «Базовая функциональность», в потребителе нужно выбрать более точное имя, например `НастройкиУправленческогоУчета` или `НастройкиРасчетаСебестоимости`.

#### 2.

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

Чтобы снизить риск конфликтов, называйте объекты метаданных предметно:

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

#### 2.1.

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

Примеры: `ОбщегоНазначения`, `СтроковыеФункции`, `РаботаСФормами`.

#### 2.2.

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

Примеры: `ТорговыйУчет`, `ЗарплатаКадры`, `ПроведениеСкладскихДокументов`.

#### 2.3.

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

Примеры:

- `ОбновлениеИнформационнойБазыМФ` - функции обновления ИБ, специфичные для конфигурации «Мои финансы»;
- `СтроковыеФункцииРегл` - функции общего назначения для библиотеки регламентированного учета;
- `РаботаСФормамиЗарплатаКадры` - функции работы с формами библиотеки зарплатно-кадровой функциональности;
- `УстановитьПометкуУдаленияПрисоединенныхФайловЗарплатаКадры` - подписка на событие из зарплатно-кадровой библиотеки.

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

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

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

Имена объектов метаданных в иерархии библиотек #std552


стандарт 553

ID: #std553

# Переопределяемые и поставляемые объекты библиотеки

#### 1.

Для настройки библиотеки в конфигурации-потребителе делите объекты на три категории:

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

#### 2.

Рекомендуемые правила поставки:

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

Почему это важно:

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

#### 3.

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

Используйте для этого:

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

Примеры обработчиков:

- `ПриПодготовкеМакетаОписанияОбновлений`;
- `ПриЗаписиСпискаБизнесПроцессов`;
- `ПриОпределенииБазовойВерсииКонфигурации`;
- `ПриДобавленииОбработчиковОбновления`.

#### 3.1.

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

#### 3.2.

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

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

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

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

```bsl
Функция ПапкаФайлов(ВладелецФайловСсылка) Экспорт

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

КонецФункции

// Вызывается из библиотеки при необходимости получить папку файлов для указанного владельца.
//
// Параметры:
//  ВладелецФайловСсылка – ЛюбаяСсылка                  - владелец файлов, для которого нужно вернуть папку.
//  ПапкаФайлов          – СправочникСсылка.ПапкиФайлов - в этот параметр нужно записать результат.
//  СтандартнаяОбработка – Булево                       - по умолчанию, Истина. В этом случае папка будет получена способом по умолчанию.
// Если значение параметра установить в Ложь, то в этой процедуре можно реализовать свой способ,
// которым в конфигурации получают папки файлов.
Процедура ПриПолученииПапкиФайлов(ВладелецФайловСсылка, ПапкаФайлов, СтандартнаяОбработка) Экспорт

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

#### 3.3.

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

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

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

```bsl
// Модуль МояБиблиотекаПереопределяемый
// Базовая логика не должна находиться здесь.
Функция НастройкаПараметровРаботы() Экспорт

    ПараметрыРаботы = Новый Структура;
    ПараметрыРаботы.Вставить("ПоказыватьЕдинственныйРаздел", Ложь);
    Возврат ПараметрыРаботы;

КонецФункции
```

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

```bsl
// Модуль МояБиблиотека (непереопределяемый)
Функция НастройкаПараметровРаботы() Экспорт

    ПараметрыРаботы = Новый Структура;

    // Настройки по умолчанию.
    ПараметрыРаботы.Вставить("ПоказыватьЕдинственныйРаздел",     Ложь);
    ПараметрыРаботы.Вставить("ЗадаватьДатуДляПрочихРазделов",    Ложь);
    ПараметрыРаботы.Вставить("ИспользоватьВнешнихПользователей", Ложь);

    // Передаем управление расширению конфигурации-потребителя.
    МояБиблиотекаПереопределяемый.ПриПолученииНастроекПараметровРаботы(ПараметрыРаботы);
    Возврат ПараметрыРаботы;

КонецФункции

// Модуль МояБиблиотекаПереопределяемый
Процедура ПриПолученииНастроекПараметровРаботы(ПараметрыРаботы) Экспорт

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

#### 3.4.

При обновлении библиотеки в конфигурации-потребителе особого внимания требуют:

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

Автоматически обновить такие участки нельзя, поэтому используйте общий порядок:

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

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

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

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

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

Переопределяемые и поставляемые объекты библиотеки #std553


стандарт 554

ID: #std554

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

При разработке нескольких библиотек, стоящих на поддержке друг у друга, снижайте трудоемкость обновления [#std553: переопределяемых общих модулей](https://v8std.ru/std/553/)

#### 1.

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

Пример имени: `БазоваяБиблиотекаПереопределяемый`.

#### 2.

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

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

#### Пример: библиотека верхнего уровня «Базовая библиотека»

```bsl
Процедура НастроитьИнтерфейс(Знач ПараметрыРаботы) Экспорт

    // Начало: Базовая библиотека
    МодульБазовойБиблиотеки.НастроитьИнтерфейс(ПараметрыРаботы);
    // Конец: Базовая библиотека

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

#### Пример: библиотека следующего уровня

```bsl
Процедура НастроитьИнтерфейс(Знач ПараметрыРаботы) Экспорт

    // Начало: Базовая библиотека
    МодульБазовойБиблиотеки.НастроитьИнтерфейс(ПараметрыРаботы);
    // Конец: Базовая библиотека

    // Начало: Библиотека второго уровня
    МодульБиблиотекиВторогоУровня.НастроитьИнтерфейс(ПараметрыРаботы);
    // Конец: Библиотека второго уровня

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

#### 3.

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

#### Пример: конфигурация-потребитель

```bsl
Процедура НастроитьИнтерфейс(Знач ПараметрыРаботы) Экспорт

    // Начало: Базовая библиотека
    МодульБазовойБиблиотеки.НастроитьИнтерфейс(ПараметрыРаботы);
    // Конец: Базовая библиотека

    // Начало: Библиотека второго уровня
    МодульБиблиотекиВторогоУровня.НастроитьИнтерфейс(ПараметрыРаботы);
    // Конец: Библиотека второго уровня

    // Настройки конфигурации-потребителя.
    // ...

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

Такой подход позволяет:

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

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

[#acc:499](https://v8std.ru/diagnostics/acc/499/)
[#acc:500](https://v8std.ru/diagnostics/acc/500/)
[#acc:501](https://v8std.ru/diagnostics/acc/501/)
[#acc:502](https://v8std.ru/diagnostics/acc/502/)
[#acc:503](https://v8std.ru/diagnostics/acc/503/)
[#acc:505](https://v8std.ru/diagnostics/acc/505/)
[#acc:506](https://v8std.ru/diagnostics/acc/506/)
#### Источник

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

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

Процедура переопределяемого общего модуля содержит лишний код (должен быть только код вида ".();"). АПК:499

Имя вызываемой процедуры отличается от имени переопределяемой процедуры. АПК:500

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

Неверный комментарий у процедуры, вызываемой в переопределяемом модуле (должен быть "См. .."). АПК:502

В переопределяемом общем модуле описана функция. АПК:503

В переопределяемом общем модуле описана неэкспортная процедура (функция). АПК:505

В переопределяемом общем модуле описана лишняя внешняя область (должна быть только область "ПрограммныйИнтерфейс"). АПК:506

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

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


стандарт 556

ID: #std556

# Начальные действия при работе конфигурации

#### 1.

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

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

Если в конфигурации используется [Библиотека стандартных подсистем](https://v8.1c.ru/ssl/), применяйте подсистему `Обновление версии ИБ`.

Если БСП не используется, соблюдайте правила ниже.

#### 2.

Первичное заполнение ИБ можно разделять на:

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

#### 3.

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

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

#### 4.

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

#### 5.

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

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

Повторная обработка ИБ должна быть корректной.

Иначе:

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

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

```bsl
ПрофильОбъект = Справочники.ПрофилиГруппДоступа.СоздатьЭлемент();
ПрофильОбъект.Наименование = НСтр("ru = 'Бухгалтер'");
ПрофильОбъект.Предустановленный = Истина;
ПрофильОбъект.Записать();
```

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

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

// Если элемента нет, только тогда нужно создать новый.
Если Запрос.Выполнить().Пустой() Тогда
    ПрофильОбъект = Справочники.ПрофилиГруппДоступа.СоздатьЭлемент();
    ПрофильОбъект.Наименование = НаименованиеПрофиля;
    ПрофильОбъект.Предустановленный = Истина;
    ПрофильОбъект.Записать();
КонецЕсли;
```

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

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

Начальные действия при работе конфигурации #std556


стандарт 557

ID: #std557

# Работа с пользовательскими настройками

#### 1.1.

Для хранения персональных настроек пользователя используйте `ХранилищеОбщихНастроек`.

#### Пример

```bsl
ЗначениеНастройки = ХранилищеОбщихНастроек.Загрузить("НастройкиПрограммы", "ЗадаватьВопросПриВыходе");
ХранилищеОбщихНастроек.Сохранить("НастройкиПрограммы", "ЗадаватьВопросПриВыходе", ЗначениеНастройки);
```

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

#### 1.2.

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

См. [#std488: Стандартные роли](https://v8std.ru/std/488/)

#### 1.3.

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

#### Пример

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

- `ОсновнаяОрганизация`;
- `ОсновнойСклад`.

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

#### 2.1.

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

#### Пример

Пример формы «Мои настройки» есть в демонстрационной конфигурации Библиотеки стандартных подсистем.

Изображение: Форма «Мои настройки» (557.demo.png)

#### 2.2.

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

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

#### 2.3.

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

См. [#std488: Стандартные роли](https://v8std.ru/std/488/)

#### 3.1.

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

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

#### 3.2.

Все настройки в хранилище общих настроек сохраняются в разрезе пользователей по строковому имени пользователя.

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

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

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

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

- [#std488: Стандартные роли](https://v8std.ru/std/488/)

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

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

Для хранения персональных настроек пользователя используйте ХранилищеОбщихНастроек.

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

Работа с пользовательскими настройками #std557


стандарт 603

ID: #std603

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

#### 1.

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

Примеры:

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

#### 2.1.

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

Непроведенный документ - это черновик:

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

Проведенный документ - это чистовик:

- документ сформирован и обработан;
- принято решение, что он участвует в учете.

#### 2.2.

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

Примеры:

- документ `Заказ клиента`: `Не согласован`, `К обеспечению`, `Закрыт`;
- документ `Расходный кассовый ордер`:
  - регистрация в журнале кассовых ордеров (`КО-3`);
  - подпись главного бухгалтера (руководителя);
  - передача в кассу;
  - регистрация в кассовой книге;
  - подпись главного бухгалтера (руководителя).

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

После проведения при смене статуса можно:

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

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

Примеры поведения:

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

#### 2.3.

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

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

Такие документы не проводятся.

#### 2.4.

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

Нельзя решать эту задачу отключением проведения у документа.

#### 3.

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

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

- автоматически;
- вручную.

Автоматический вариант:

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

Ручной вариант:

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

#### 4.

Иногда движения должны формироваться отдельным документом.
Это нужно, когда:

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

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

Пример:

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

#### 5.

Непроведенные и помеченные на удаление документы не должны иметь [#std633: активных движений](https://v8std.ru/std/633/)

#### 6.

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

#### 7.1.1.

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

Исключение: движения по регистру полностью или частично формируются внешними
по отношению к документу алгоритмами (см. п. `4`).

#### 7.1.2.

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

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

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

#### 7.2.

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

#### 7.2.1.

Если пользователь может изменять внешние по отношению к документу данные
(например, реквизиты НСИ), которые влияют на движения,
значения этих реквизитов нужно сохранять в документе.

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

Исключения - см. п. `7.1.2`.

#### 7.2.2.

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

Практические приемы:

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

#### 7.2.3.

Если исключить зависимость движений от настроек не удалось,
нужно реализовать один из вариантов:

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

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

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

#### 7.3.

При изменении логики формирования движений, чтобы выполнить п. `7.1`,
нужно либо предусмотреть [#std690: обработчики обновления информационной базы](https://v8std.ru/std/690/)
либо сохранить старые алгоритмы формирования движений
для документов, существовавших на момент обновления.

#### 8.

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

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

- [#std550: Имена объектов метаданных в конфигурациях](https://v8std.ru/std/550/)
- [#std450: Порядок записи движений документов](https://v8std.ru/std/450/)
- [#std477: Самодостаточность регистров](https://v8std.ru/std/477/)

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

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

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

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

Имена объектов метаданных в конфигурациях #std550

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

Обработчики обновления информационной базы #std690

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


стандарт 629

ID: #std629

# Минимизация кода, выполняемого на клиенте

#### 1.1.

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

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

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

Это требование связано с тем, что:

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

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

[#std487: Минимизация количества серверных вызовов и трафика](https://v8std.ru/std/487/)

#### 1.2.

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

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

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

.

#### 2.1.

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

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

#### 2.2.

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

Например, для кода, недоступного в веб-клиенте:

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

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

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

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

Минимизация кода, выполняемого на клиенте #std629


стандарт 632

ID: #std632

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

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

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

```bsl
// Увеличиваем счетчик проведенных документов в константе
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    ТекущееЗначение = Константы.СчетчикПроведенныхДокументов.Получить();
    Константы.СчетчикПроведенныхДокументов.Установить(ТекущееЗначение + 1);
КонецПроцедуры
```

Во время записи константы работа других сеансов приостанавливается, если они одновременно пытаются записать эту же константу. Подробнее о причинах избыточных блокировок и методах оптимизации см. базу знаний [«Технологические вопросы крупных внедрений»](http://kb.1c.ru).

При этом недопустимо решать проблему блокировок тотальным кешированием констант:

- в [#std413: параметрах сеанса](https://v8std.ru/std/413/)
- в [#std724: общих модулях с повторным использованием возвращаемых значений](https://v8std.ru/std/724/)

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

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

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

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

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


стандарт 633

ID: #std633

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

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

#### 1.

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

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

```sdbl
ГДЕ Активность = ИСТИНА
```

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

#### 2.

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

#### 3.

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

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

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

- [#std603: Требования к проведению документов](https://v8std.ru/std/603/)
- [#std450: Порядок записи движений документов](https://v8std.ru/std/450/)

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

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


стандарт 637

ID: #std637

# Настройка обмена данными для классификаторов между различными информационными базами

#### 1.

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

Примеры: классификаторы банков, стран мира, валют, ОКЕИ, адресный классификатор.

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

#### 2.

Данные классификаторов объектного типа (например, страны мира, ОКЕИ) должны сопоставляться:

- сначала по уникальным идентификаторам ссылок;
- если не найдено совпадение - по полям поиска (автоматическое сопоставление).

Для этого:

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

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

#### 3.

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

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

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

- [Описание инструмента «Конвертация данных»](https://its.1c.ru/db/metod81/content/2943/hdoc)

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

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

Настройка обмена данными для классификаторов между различными информационными базами #std637


стандарт 638

ID: #std638

# Работа с неактуальными (недействительными) объектами

#### 1.

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

Такие объекты не удаляйте из базы, чтобы не нарушать ссылочную целостность.
Ранее созданные данные должны сохранять ссылки на них.

#### 2.

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

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

Пример в этом стандарте: учет пользователей ведется в справочнике `Пользователи`, у которого есть реквизит `Недействителен` (`Булево`, по умолчанию `Ложь`).

#### 2.1.

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

#### 2.1.1.

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

#### Пример реализации

```bsl
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)

    Если Не Параметры.Отбор.Свойство("Недействителен") Тогда
        Параметры.Отбор.Вставить("Недействителен", Ложь);
    КонецЕсли;

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

Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)

    Если ВидФормы = "ФормаВыбора" Тогда
        ПараметрИзменен = Ложь;

        Если Не Параметры.Свойство("Отбор") Тогда
            Параметры.Вставить("Отбор", Новый Структура("Недействителен", Ложь));
            ПараметрИзменен = Истина;
        ИначеЕсли Не Параметры.Отбор.Свойство("Недействителен") Тогда
            Параметры.Отбор.Вставить("Недействителен", Ложь);
            ПараметрИзменен = Истина;
        КонецЕсли;

        // Этот код нужен, чтобы были использованы измененные нами значения параметров.
        Если ПараметрИзменен Тогда
            СтандартнаяОбработка = Ложь;
            ВыбраннаяФорма = "ФормаВыбора"; // Передаем имя формы выбора.
        КонецЕсли;
    КонецЕсли;

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

#### 2.1.2.

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

- если нужен отбор по признаку недействительности, задайте в `Параметры выбора` значение `Отбор.Недействителен(Ложь)`;
- если ограничение не требуется, используйте оба значения: `Истина` и `Ложь`.

#### 2.2.

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

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

#### 3.

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

Он позволяет:

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

#### 4.

Для отображения неактуальных объектов в списках используйте элемент стиля `ТекстЗапрещеннойЯчейкиЦвет` (`192,192,192`).

Изображение: Пример отображения неактуальных объектов (638.users.png)

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

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

Работа с неактуальными (недействительными) объектами #std638


стандарт 639

ID: #std639

# Использование переменных в программных модулях

#### 1.

В большинстве случаев вместо переменных программного модуля используйте более подходящие средства платформы 1С:Предприятие.

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

Примеры некорректного использования и допустимые исключения приведены ниже.
Рекомендации по структуре кода см. в [#std455: Структура модуля](https://v8std.ru/std/455/)

#### 2.

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

#### 2.1.

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

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

```bsl
Перем КонвертацияФайлов Экспорт;

Процедура ПередЗаписью(Отказ)
    Если КонвертацияФайлов Тогда
        ...
    КонецЕсли;
КонецПроцедуры

// Вызывающий код
ФайлОбъект.КонвертацияФайлов = Истина;
ФайлОбъект.Записать();
```

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

```bsl
Процедура ПередЗаписью(Отказ)
    Если ДополнительныеСвойства.Свойство("КонвертацияФайлов") Тогда
        ...
    КонецЕсли;
КонецПроцедуры

// Вызывающий код
ФайлОбъект.ДополнительныеСвойства.Вставить("КонвертацияФайлов", Истина);
ФайлОбъект.Записать();
```

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

#### Пример

```bsl
Перем ПредыдущееЗначениеОрганизации; // Значение реквизита "Организация" до записи объекта в базу.

Процедура ПередЗаписью(Отказ)
    ПредыдущееЗначениеОрганизации = ...;
КонецПроцедуры

Процедура ПриЗаписи(Отказ)
    Если ПредыдущееЗначениеОрганизации <> Организация Тогда
        // Отрабатываем изменение реквизита при записи.
        ...
    КонецЕсли;
КонецПроцедуры
```

#### 2.2.

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

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

```bsl
Перем НетОшибок;
Перем Ошибка_ОбработкиПроверкиЗаполнения;
Перем Ошибка_ЗаписиОбъекта;
Перем Ошибка_БлокировкиОбъекта;

НетОшибок = 1;
Ошибка_ОбработкиПроверкиЗаполнения = 2;
Ошибка_ЗаписиОбъекта = 3;
Ошибка_БлокировкиОбъекта = 4;

Процедура ВыполнитьПерерасчет()
    ...
    Результат = ОбработатьДокументы(...);
    Если Результат = Ошибка_ЗаписиОбъекта Тогда
        ...
    ИначеЕсли Результат = Ошибка_БлокировкиОбъекта Тогда
        ...
    КонецЕсли;
КонецПроцедуры
```

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

```bsl
Процедура ВыполнитьПерерасчет()
    ...
    Результат = ОбработатьДокументы(...);
    Если Результат = "ОшибкаЗаписиОбъекта" Тогда
        ...
    ИначеЕсли Результат = "ОшибкаБлокировкиОбъекта" Тогда
        ...
    КонецЕсли;
КонецПроцедуры
```

#### 2.3.

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

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

#### 3.

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

#### 3.1.

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

Не кешируйте статическую и легко вычисляемую информацию.
В частности, не кешируйте в клиентских переменных модуля формы предопределенные элементы и перечисления.
На клиенте получайте их через [#std443: Получение предопределенных значений на клиенте](https://v8std.ru/std/443/)

#### 3.2.

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

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

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

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

#### Пример

```bsl
&НаКлиенте
Перем ПорядковыйНомерИзображения; // Счетчик для имен файлов при сканировании нескольких изображений.

&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
    Если Источник = "TWAIN" И Событие = "ImageAcquired" Тогда
        Если ПорядковыйНомерИзображения = Неопределено Тогда
            ПорядковыйНомерИзображения = 1;
        КонецЕсли;

        ПорядковыйНомерИзображения = ПорядковыйНомерИзображения + 1;
        ...
    КонецЕсли;
КонецПроцедуры
```

#### 4.

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

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

- [#std455: Структура модуля](https://v8std.ru/std/455/)
- [#std459: Использование значений, влияющих на поведение клиентского приложения](https://v8std.ru/std/459/)
- [#std640: Параметры процедур и функций](https://v8std.ru/std/640/)
- [#std413: Использование параметров сеанса](https://v8std.ru/std/413/)
- [#std443: Получение предопределенных значений на клиенте](https://v8std.ru/std/443/)

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

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

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

Запрет экспортных глобальных переменных модуля BSLLS:ExportVariables

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

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

Структура модуля #std455

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

Параметры процедур и функций #std640

Использование переменных в программных модулях #std639


стандарт 640

ID: #std640

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

#### 1.
Параметры методов надо именовать так же, как переменные.

См. [#std454: Правила образования имен переменных](https://v8std.ru/std/454/)

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

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

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

```bsl
Процедура ПересчитатьСуммуДокумента(ИмяПоляСумма, ДокументОбъект, СуммаВключаетНДС = Истина)

Процедура ПоменятьЦветПоляФормы(Цвет, ИмяПоля, Форма)
```

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

`ДокументОбъект` и `Форма` разместить впереди:

```bsl
Процедура ПересчитатьСуммуДокумента(ДокументОбъект, ИмяПоляСумма, СуммаВключаетНДС = Истина)

Процедура ПоменятьЦветПоляФормы(Форма, ИмяПоля, Цвет)
```

#### 4.
Необязательные параметры (параметров по-умолчанию) располагайте после обязательных.

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

```bsl
Функция КурсВалютыНаДату(Валюта, Дата = Неопределено) Экспорт
```

#### Проверки
[#v8cs:method-optional-parameter-before-required](https://v8std.ru/diagnostics/v8-code-style/method-optional-parameter-before-required/)

#### 5.

Не делайте больше 7 параметров.
Не делайте больше 3 необязательных параметров (параметров по-умолчанию).

Вместо большого количества параметров:

- группируйте похожие параметры в один типа `Структура`, такие как `ДанныеЗаполнения`, `ПараметрыПроведения`, `ДанныеФайла`
- пересмотрите логику работы метода, разбейте логику на несколько методов

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

```bsl
// Добавляет новое поле на форму, инициализирует его значениями по умолчанию.
Функция ДобавитьПолеФормы(ИмяПоля, Заголовок = Неопределено, ОбработчикПриИзменении = "", ОбработчикНачалоВыбора = "",
    ШиринаПоля, ЦветФона = Неопределено, ЦветФонаЗаголовка = Неопределено, Родитель = Неопределено,
    КартинкаШапки = Неопределено, ПутьКДанным = Неопределено, ТолькоПросмотрПоля = Ложь,
    СвязиПараметровВыбора = Неопределено)
    …
КонецФункции

// вызывающий код
НовоеПоле = ДобавитьПолеФормы("СтараяЦена", НСтр("ru='Цена'"),,, 12, ЦветФона, ЦветЗаголовка, НоваяГруппа,,,Истина);
НовоеПоле.ЦветТекста = WebЦвета.Серый;
```

```bsl
// Создает элемент справочника "Номенклатура"
Процедура СоздатьЭлементНоменклатуры(Наименование, ТоварУслуга, ЕдиницаИзмерения, ВесНетто, ПроверятьУникальность = Истина)
    …
КонецПроцедуры
```

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

`ИмяПоля` оставить как ключевой параметр, логику пересмотреть:

```bsl
// Добавляет новое поле на форму, инициализирует его значениями по умолчанию.
Функция НовоеПолеФормы(ИмяПоля)
    …
КонецФункции

// вызывающий код
НовоеПоле = НовоеПолеФормы("СтараяЦена");
НовоеПоле.Заголовок  = НСтр("ru='Цена'");
НовоеПоле.ЦветФона   = ЦветФона;
НовоеПоле.ЦветТекста = WebЦвета.Серый;
НовоеПоле…. = …
```

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

#### 6.
Избегайте громоздких конструкций.

#### 6.1.
Избегайте вложенные вызовы. Передавайте параметры явно.

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

```bsl
СтруктураВложений.Вставить(ПрисоединенныйФайл.Наименование,
    Новый Картинка(ПолучитьИзВременногоХранилища(
        ПрисоединенныеФайлы.ПолучитьДанныеФайла(ПрисоединенныйФайл.Ссылка).СсылкаНаДвоичныеДанныеФайла)));
```

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

Разбивайте параметры с помощью логических переменных:

```bsl
АдресФайлаИзображения = ПрисоединенныеФайлы.ПолучитьДанныеФайла(ПрисоединенныйФайл.Ссылка).СсылкаНаДвоичныеДанныеФайла;
ДанныеИзображения = Новый Картинка(ПолучитьИзВременногоХранилища(АдресФайлаИзображения));
СтруктураВложений.Вставить(ПрисоединенныйФайл.Наименование, ДанныеИзображения);
```

Чувствуете легкость и компактность? Оставьте как есть!
```bsl
Предупреждение(НСтр("ru='Для выполнения операции необходимо установить расширение работы с файлами.'"));

ПеречитатьСуммуПоКурсу(Сумма, КурсВалютыНаДату(Валюта));
```

#### 6.2.
Избегайте вложенные конструкторы.
Вложенные структуры создавайте только если свойств структуры 3 и меньше.

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

```bsl
ЗаполнитьЦены(Объект.Товары, ,
    Новый Структура("Дата, Валюта, Соглашение, ПоляЗаполнения", Объект.Дата, Объект.Валюта, Объект.Соглашение, "Цена, СтавкаНДС, ВидЦены, СрокПоставки"),
        Новый Структура("ПересчитатьСумму, ПересчитатьСуммуСНДС, ПересчитатьСуммуНДС, ПересчитатьСуммуРучнойСкидки, ОчиститьАвтоматическуюСкидку,
        ОчиститьСуммуВзаиморасчетов", "КоличествоУпаковок", СтруктураПересчетаСуммы, СтруктураПересчетаСуммы,
        "КоличествоУпаковок", Неопределено, Неопределено));
```

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

```bsl
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("Дата", Объект.Дата);
ПараметрыЗаполнения.Вставить("Валюта", Объект.Валюта);
ПараметрыЗаполнения.Вставить("Соглашение", Объект.Соглашение);
ПараметрыЗаполнения.Вставить("ПоляЗаполнения", "Цена, СтавкаНДС, ВидЦены, СрокПоставки");

ДействияСИзмененнымиСтроками = Новый Структура;
ДействияСИзмененнымиСтроками.Вставить("ПересчитатьСумму","КоличествоУпаковок");
ДействияСИзмененнымиСтроками.Вставить("ПересчитатьСуммуСНДС", ПараметрыПересчетыСуммы);
ДействияСИзмененнымиСтроками.Вставить("ПересчитатьСуммуНДС", ПараметрыПересчетыСуммы);
ДействияСИзмененнымиСтроками.Вставить("ПересчитатьСуммуРучнойСкидки","КоличествоУпаковок");
ДействияСИзмененнымиСтроками.Вставить("ОчиститьАвтоматическуюСкидку");
ДействияСИзмененнымиСтроками.Вставить("ОчиститьСуммуВзаиморасчетов ");

ЗаполнитьЦены(Объект.Товары, ПараметрыЗаполнения, ДействияСИзмененнымиСтроками);
```

#### 6.3.
Избегайте лишних пробелов:

- перед открывающей скобкой
- после открывающей скобки
- перед закрывающей скобкой
- перед запятыми

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

```bsl
НовоеПоле = НовоеПолеФормы ( ИмяПоля , ТипПоля );
```

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

```bsl
НовоеПоле = НовоеПолеФормы(ИмяПоля, ТипПоля);
```

#### В стандарте не указано

Полную формулировку __"перед запятыми при размещении параметров в одной строке и если параметры не опущены"__ можно трактовать как разрешения писать слитно запятые у необязательных параметров

```bsl
Форма = ПолучитьФорму(ИмяФормы, , , , , , Параметр);
Форма = ПолучитьФорму(ИмяФормы,,,,,, Параметр);
```

равносильно допустимы

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

Для вызова методы:
```bsl
Процедура ПоменятьЦветПоляФормы(Форма, ИмяПоля, Цвет)
```

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

```bsl
ПоменятьЦветПоляФормы(,"РезультатПроверки", ЦветаСтиля.ПоясняющийОшибкуТекст); // пропущен первый параметр Форма
ПоменятьЦветПоляФормы(,,); // пропущены все обязательные параметры
```

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

```bsl
ПоменятьЦветПоляФормы(ЭтотОбъект, "РезультатПроверки", Цвет); // указаны все обязательные параметры
```

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

-  СОВЕРШЕННЫЙ КОД Стив Макконнелл ГЛАВА 7. Высококачественные методы
-  ЧИСТЫЙ КОД Роберт Мартин ГЛАВА 3. Функции
-  Чистый дизайн Кент Бек ГЛАВА 8. Пояснительные переменные
-  Чистый дизайн Кент Бек ГЛАВА 10. Явная передача параметров
- [Передача параметров по ссылке и по значению при вызове процедур и функций](https://its.1c.ru/db/metod8dev/content/2606/hdoc)
- [Руководство разработчика 4.7.4. Передача параметров процедур и функций](https://its.1c.ru/db/v8327doc#bookmark:dev:ti000000151)
- [#std641: Структуры и таблицы значений в качестве параметров процедур и функций](https://v8std.ru/std/641/)

#### Проверки
[#bslls:ExtraCommas](https://v8std.ru/diagnostics/bslls/ExtraCommas/)
[#bslls:MissedRequiredParameter](https://v8std.ru/diagnostics/bslls/MissedRequiredParameter/)
[#bslls:NestedFunctionInParameters](https://v8std.ru/diagnostics/bslls/NestedFunctionInParameters/)
[#bslls:NumberOfOptionalParams](https://v8std.ru/diagnostics/bslls/NumberOfOptionalParams/)
[#bslls:NumberOfParams](https://v8std.ru/diagnostics/bslls/NumberOfParams/)
[#bslls:OrderOfParams](https://v8std.ru/diagnostics/bslls/OrderOfParams/)

[#acc:134](https://v8std.ru/diagnostics/acc/134/)
[#acc:141](https://v8std.ru/diagnostics/acc/141/)
[#acc:142](https://v8std.ru/diagnostics/acc/142/)
[#acc:267](https://v8std.ru/diagnostics/acc/267/)
[#acc:269](https://v8std.ru/diagnostics/acc/269/)
[#acc:271](https://v8std.ru/diagnostics/acc/271/)
[#acc:287](https://v8std.ru/diagnostics/acc/287/)
[#acc:293](https://v8std.ru/diagnostics/acc/293/)
[#acc:294](https://v8std.ru/diagnostics/acc/294/)
[#acc:295](https://v8std.ru/diagnostics/acc/295/)
[#acc:548](https://v8std.ru/diagnostics/acc/548/)
[#acc:549](https://v8std.ru/diagnostics/acc/549/)
[#acc:1383](https://v8std.ru/diagnostics/acc/1383/)
[#acc:1386](https://v8std.ru/diagnostics/acc/1386/)
#### Источник

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

Количество параметров более 7. АПК:134

Имя переменной, содержащей модуль, не соответствует формату "Модуль". АПК:1383

Модуль не входит в подсистему, указанную в функции "ПодсистемаСуществует()". АПК:1386

Необязательные параметры расположены перед обязательными. АПК:141

Количество необязательных параметров более 3. АПК:142

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

Обращение к несуществующей подсистеме. АПК:269

Обращение к несуществующему общему модулю. АПК:271

Обращение к несуществующей процедуре (функции). АПК:287

В конструкторе объекта типа "Структура" указано более 3-х значений свойств. АПК:293

В конструкторе объекта типа "Структура" использован конструктор другого объекта с параметрами. АПК:294

В конструкторе объекта типа "Структура" использован вызов функции с количеством параметров более 3-х. АПК:295

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

Выполняется неявная передача обязательного параметра. АПК:549

Запятые без указания параметра в конце вызова метода BSLLS:ExtraCommas

Пропущен обязательный параметр метода BSLLS:MissedRequiredParameter

Инициализация параметров методов и конструкторов вызовом вложенных методов BSLLS:NestedFunctionInParameters

Ограничение на количество не обязательных параметров метода BSLLS:NumberOfOptionalParams

Ограничение на количество параметров метода BSLLS:NumberOfParams

Порядок параметров метода BSLLS:OrderOfParams

Необязательные параметры процедуры/функции расположены перед обязательными (method-optional-parameter-before-required)

Метод содержит слишком много параметров (method-too-many-params)

Правила образования имен переменных #std454

Структуры и таблицы значений в качестве параметров процедур и функций #std641

Параметры процедур и функций #std640


стандарт 641

ID: #std641

# Структуры и таблицы значений в качестве параметров процедур и функций
Основная статья: [#std640: Параметры процедур и функций](https://v8std.ru/std/640/)

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

#### 1.1.

Помимо функции, которая реализует прикладную функциональность (далее по тексту: вызываемая функция), определите функцию-конструктор параметров, возвращающую:

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

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

Пример вызывающего кода:

#### Пример

```bsl
Процедура ПриИзмененииНоменклатурыСервер(ИдентификаторТекущейСтроки)

    // Получаем новую структуру параметров.
    ПараметрыЗаполненияЦен = ЦенообразованиеКлиентСервер.ПараметрыЗаполненияЦеныВСтрокеТЧ();
    // Заполняем параметры.
    ПараметрыЗаполненияЦен.Дата   = Объект.Дата;
    ПараметрыЗаполненияЦен.Валюта = Объект.Валюта;

    ТекущаяСтрока = Объект.Товары.НайтиПоИдентификатору(ИдентификаторТекущейСтроки);

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

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

Пример функции-конструктора параметров в модуле ЦенообразованиеКлиентСервер:

#### Пример

```bsl
// Функция-конструктор параметров процедуры ЦенообразованиеСервер.ЗаполнитьЦеныВСтрокеТЧ.
//
// Возвращаемое значение:
//  Структура:
//    * Дата – Дата
//    * Валюта - СправочникСсылка.Валюты
//    * ПересчитыватьСумму - Булево
//
Функция ПараметрыЗаполненияЦеныВСтрокеТЧ() Экспорт

    ПараметрыЗаполненияЦен = Новый Структура;
    ПараметрыЗаполненияЦен.Вставить("Дата", ТекущаяДатаСеанса());
    ПараметрыЗаполненияЦен.Вставить("Валюта", ОсновнаяВалюта());
    ПараметрыЗаполненияЦен.Вставить("ПересчитыватьСумму", Истина);
    Возврат ПараметрыЗаполненияЦен;

КонецФункции
```

#### 1.2.

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

#### 1.3.

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

#### 1.4.

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

Например:

#### Пример

```bsl
// Возвращаемое значение:
//   ТаблицаЗначений:
//     * Серия - СправочникСсылка.СерииНоменклатуры - если серия указана и она может
//               использоваться с новым значением номенклатуры на указанном складе,
//               то возвращается переданное значение; если нет - пустая ссылка.
//     * СтатусУказанияСерий - Число - если серии указываются в ТЧ "Товары", то
//               возвращается рассчитанный статус; если для переданной
//               номенклатуры/склада серии не используется - возвращается 0,
//               иначе возвращается переданный статус.
```

#### 1.5.

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

Например:

#### Пример

```bsl
// Параметры:
//  СведенияОбОбновлении - Структура:
//     * КодАдресногоОбъекта - Структура:
//        ** КодРегиона             - Число - код региона (длина - 2).
//        ** КодНаселенногоПункта   - Число - код населенного пункта (длина - 3).
//        ** КодУлицы               - Число - код улицы (длина - 4).
//     * Наименование        - Строка
//     * ОбновлениеДоступно  - Булево
```

#### 2.

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

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

- [#std693: Использование объектов типа Структура](https://v8std.ru/std/693/)
- [#std453: Описание процедур и функций](https://v8std.ru/std/453/)

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

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

Основная статья: #std640: Параметры процедур и функций

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

Параметры процедур и функций #std640

Использование объектов типа Структура #std693


стандарт 643

ID: #std643

# Работа в разных часовых поясах

#### 1.

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

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

Сервер в Москве, пользователи во Владивостоке. Операции - по времени Владивостока.

#### В стандарте не указано

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

#### 2.1.

Используйте `ТекущаяДатаСеанса` вместо `ТекущаяДата` в серверном контексте. `ТекущаяДатаСеанса` приводит время к часовому поясу пользовательского сеанса. `ТекущаяДата` возвращает дату и время серверного компьютера.

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

#### 2.2.

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

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

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

#### 2.3.

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

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

```bsl
ДатаАктуальностиУниверсальная = УниверсальноеВремя(ПолнотекстовыйПоиск.ДатаАктуальности());
ДатаАктуальности = МестноеВремя(ДатаАктуальностиУниверсальная, ЧасовойПоясСеанса());
```

#### 3.1.

Не используйте `ТекущаяДата` на клиенте. Это может привести к сложно расследуемому неожиданному поведению.

Попробуйте вместо этого:

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

#### 3.2.

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

```bsl
&НаКлиенте
Процедура КомандаОткрытьЗакрытиеМесяца(Команда)

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

    ...
```
```bsl
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    ЗаполнитьЗначенияСвойств(Объект, Параметры);
    Если Не ЗначениеЗаполнено(Объект.ПериодРегистрации) Тогда
        Объект.ПериодРегистрации = НачалоМесяца(ТекущаяДата());
    КонецЕсли;

    ...
```

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

```bsl
&НаКлиенте
Процедура КомандаОткрытьЗакрытиеМесяца(Команда)

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

    ...
```
```bsl
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    ЗаполнитьЗначенияСвойств(Объект, Параметры);
    Если Не ЗначениеЗаполнено(Объект.ПериодРегистрации) Тогда
        Объект.ПериодРегистрации = НачалоМесяца(ТекущаяДатаСеанса());
    КонецЕсли;

    ...
```

#### 3.3.

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

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

```bsl
&НаКлиенте
Процедура ПодборТовары(Команда)

    ПараметрыПодбора = Новый Структура;
    ДатаРасчетов = ?(НачалоДня(Объект.Дата) = НачалоДня(ТекущаяДата()), Неопределено, Объект.Дата); // вызов ТекущаяДата() на клиенте
    ПараметрыПодбора.Вставить("ДатаРасчетов", ДатаРасчетов);
    ...
    ОткрытьФорму("Обработка.ПодборНоменклатуры.Форма.Форма", ПараметрыПодбора,
        ЭтотОбъект, УникальныйИдентификатор);

    ...
```

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

```bsl
&НаКлиенте
Процедура ПодборТовары(Команда)

    ПараметрыПодбора = Новый Структура;
    ПараметрыПодбора.Вставить("ДатаРасчетов", Объект.Дата);

    ...
    ОткрытьФорму("Обработка.ПодборНоменклатуры.Форма.Форма", ПараметрыПодбора,
        ЭтотОбъект, УникальныйИдентификатор);

    ...
```

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

```bsl
&НаКлиенте
Процедура ЗачетАвансовДокументАвансаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("КонецПериода",
        ?(ЗначениеЗаполнено(Параметры.Ключ), Объект.Дата - 1, КонецДня(ТекущаяДата()))); // вызов ТекущаяДата() на клиенте
    ...
    ОткрытьФорму("Документ.ДокументРасчетовСКонтрагентом.ФормаВыбора", ПараметрыФормы, Элемент);
    ...
```

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

```bsl
&НаКлиенте
Процедура ЗачетАвансовДокументАвансаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("КонецПериода",
        ?(ЗначениеЗаполнено(Параметры.Ключ), Объект.Дата - 1, КонецДня(Объект.Дата)));
    ...
    ОткрытьФорму("Документ.ДокументРасчетовСКонтрагентом.ФормаВыбора", ПараметрыФормы, Элемент);
    ...
```

#### 3.4.

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

#### 4.

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

#### 5.

Не вызывайте подряд несколько раз функции `ТекущаяДатаСеанса` (`ТекущаяДата`). Возвращаемые значения будут отличаться - это может привести к ошибкам.

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

```bsl
ДатаПоследнегоОповещения = ТекущаяДатаСеанса();
ДатаСледующегоОповещения = РассчитатьДату() + ТекущаяДатаСеанса();
```

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

```bsl
ДатаПоследнегоОповещения = ТекущаяДатаСеанса();
ДатаСледующегоОповещения = РассчитатьДату() + ДатаПоследнегоОповещения;
```

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

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

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

Использование функции "ТекущаяДата()". АПК:143

Использование не рекомендуемых методов (use-non-recommended-method)

Работа в разных часовых поясах #std643