Именование в 1С 8.3: переменные, объекты метаданных, модули и запросы
Содержание
Правильно назвать что-либо в 1С — значит дать имя из полных русских слов, слитно, каждое слово с заглавной буквы: СуммаДокумента, ОстаткиТоваров, ЗаполнитьТабличнуюЧасть. Без пробелов, без сокращений вроде Сум и Ткч, без однобуквенных имён, кроме счётчика цикла. Это общее правило для переменных, реквизитов, процедур и объектов метаданных.
Плохие имена не ломают базу сразу. Они ломают её через год, когда код открывает другой программист и не понимает, что лежит в Т2 и почему Флаг равен Ложь. Хорошее имя экономит время на каждом чтении кода, а переименование задним числом в 1С задевает запросы, обмены и внешние обработки.
Базовые правила: как правильно назвать идентификатор в 1С 8.3
Сначала то, что проверяет сама платформа. Нарушить эти правила нельзя: Конфигуратор просто не примет имя.
- 🔤 Имя начинается с буквы или символа подчёркивания.
- 🔢 Дальше допускаются буквы, цифры и подчёркивание. Пробелы, точки, дефисы запрещены.
- 🚫 Нельзя использовать зарезервированные слова языка:
Если,Тогда,Процедура,Возврат,Новыйи подобные. - 🔁 Регистр не различается.
СуммаДокументаисуммадокументадля платформы — одно и то же имя.
Остальное — соглашения. Их придумала не платформа, а люди, которые годами сопровождают типовые конфигурации. Соглашения не обязательны технически, но без них код в команде превращается в лотерею.
| Правило | Пример хорошо | Пример плохо |
|---|---|---|
| Слова слитно, каждое с заглавной | ДатаНачалаПериода | дата_начала_периода |
| Полные слова, без самодельных сокращений | КоличествоСтрок | КолСтр |
| Термины предметной области | Контрагент, Номенклатура | Клиент1, Товарчик |
| Одна раскладка в имени | ИННКонтрагента (вся кириллица) | ИHHКонтрагента (латинская H) |
Смешение раскладок — самая коварная ошибка. Латинские A, C, E, H, O, P, X выглядят как кириллические. Имя Cумма с латинской C отличается от Сумма, и код падает с «Переменная не определена», хотя глазами разницы не видно. При странной ошибке перепечатайте имя вручную.
Как называть переменные и параметры
Имя переменной отвечает на вопрос «что здесь лежит». Не «как я это получил» и не «какого это типа».
- Существительное для значений.
СуммаНДС,ТекущийПользователь,ВыборкаДокументов. - Утверждение для булевых. Имя должно читаться как «да/нет»:
ЕстьОшибки,ДокументПроведен,НужноПерезаполнить. ИмяФлагилиПризнакничего не говорит. - Без отрицаний в булевых.
НеНайден = Ложьчитается с трудом. ЛучшеНайден = Истина. - Однобуквенные имена — только для счётчиков.
Для Сч = 1 По 10 Циклдопустимо.А = Запрос.Выполнить()— нет. - Не совпадать с глобальным контекстом. Переменная
Метаданные,Справочники,ДокументыилиТекущаяДатаперекроет одноимённое свойство или метод платформы. Код может отработать, но поведение станет неочевидным.
Пример, как выглядит разница на практике:
// Плохо
Т = Новый ТаблицаЗначений;
Для Каждого С Из Док.Товары Цикл
Ф = С.Количество > 0;
КонецЦикла;
// Хорошо
ТаблицаОстатков = Новый ТаблицаЗначений;
Для Каждого СтрокаТоваров Из Документ.Товары Цикл
ЕстьКоличество = СтрокаТоваров.Количество > 0;
КонецЦикла;
Параметры процедур и функций называют по тем же правилам. Плюс одно: имя параметра должно объяснять его роль в вызове. Процедура ЗаполнитьЦены(Документ, ДатаЦен, ТипЦен) понятна без чтения тела. Процедура ЗаполнитьЦены(П1, П2, П3) — нет.
💡 Для параметров, которые процедура меняет и возвращает обратно, полезно прямо отразить это в описании процедуры над её объявлением. Имя одно и то же, а комментарий снимает вопрос «можно ли сюда передать константу».
Именование объектов метаданных, реквизитов и форм
У каждого объекта метаданных три поля, которые часто путают:
| Свойство | Для кого | Пример |
|---|---|---|
| Имя | для кода и запросов | ПоступлениеТоваровУслуг |
| Синоним | для пользователя в интерфейсе | «Поступление товаров и услуг» |
| Комментарий | для разработчика, в дереве конфигурации | «Доработка под склад №2» |
Конфигуратор сам заполняет синоним, разбивая имя по заглавным буквам. Поэтому хорошее имя сразу даёт приличный синоним, а ПТиУ даст синоним «П ти у».
Число в имени зависит от вида объекта. Так сложилось в типовых конфигурациях, и это стоит повторять:
- 📚 Справочники — во множественном числе:
Контрагенты,Склады,ВидыОплат. Исключение — собирательные слова вродеНоменклатура. - 📄 Документы — в единственном числе, как название одной операции:
РеализацияТоваровУслуг,ПриходныйКассовыйОрдер. - 📊 Регистры — во множественном числе, по тому, что в них хранится:
ТоварыНаСкладах,ЦеныНоменклатуры. - 📑 Отчёты и обработки — по действию или результату:
ОборотыПоСкладам,ЗагрузкаПрайсЛиста.
Реквизиты и табличные части называют существительными без повтора имени объекта. В документе ПоступлениеТоваровУслуг реквизит Склад, а не СкладПоступления. Табличная часть — Товары, а не ТабличнаяЧастьТоваров.
Префикс для своих объектов в типовой конфигурации
Если вы дорабатываете типовую базу, добавляйте ко всем своим объектам один префикс: мк_ОтчетПоМаржинальности, мк_ДатаСогласования. Префикс сразу показывает, что объект не из поставки. При обновлении конфигурации такие объекты легко найти и проверить.
В расширениях конфигурации префикс задаётся в свойствах самого расширения — поле «Префикс имён». По умолчанию там стоит Расш1_. Лучше заменить его на осмысленный, например по названию компании или задачи.
Формы и элементы форм
Основные формы объектов обычно называют ФормаЭлемента, ФормаСписка, ФормаВыбора, ФормаДокумента. Дополнительные — по назначению: ФормаНастройкиОбмена.
Элементы формы платформа называет сама при перетаскивании реквизита: поле колонки табличной части получает имя вида ТоварыНоменклатура. Оставляйте эту схему. От имени элемента платформа строит имена обработчиков, и по имени ТоварыНоменклатураПриИзменении сразу видно, к какому полю он относится.
Процедуры, функции и обработчики событий
Процедура что-то делает, поэтому имя начинается с глагола: ЗаполнитьТабличнуюЧасть, ПроверитьЗаполнениеРеквизитов, ОтправитьУведомление.
Функция что-то возвращает, поэтому имя описывает результат: СуммаДокументаСНДС(), ОстатокНаСкладе(), ДоступныеВидыОплат(). Префикс Получить допустим, но часто лишний: ПолучитьСуммуДокумента() и СуммаДокумента() говорят одно и то же.
Для булевых функций работает то же правило, что для переменных: ЭтоНовыйКонтрагент(), ДокументМожноПровести().
Обработчики событий не переименовывают
Имена обработчиков задаёт платформа: ПриСозданииНаСервере, ПередЗаписью, ОбработкаПроведения, ПриОткрытии. Для элементов формы — имя элемента плюс событие: КонтрагентПриИзменении.
Переименовывать предопределённые обработчики модуля объекта нельзя: платформа связывает их с событием по имени. Процедура ПередЗаписьюДокумента в модуле объекта просто не будет вызываться.
Клиент и сервер в имени
В модулях управляемых форм принято отражать контекст выполнения в конце имени:
ЗаполнитьНаСервере()— процедура с директивой&НаСервере;ЦенаНоменклатурыНаСервереБезКонтекста()— функция с&НаСервереБезКонтекста;- клиентскую процедуру суффиксом обычно не помечают: она и так по умолчанию.
Типичная пара выглядит так:
&НаКлиенте
Процедура Заполнить(Команда)
ЗаполнитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьНаСервере()
Объект.Товары.Очистить();
// ...
КонецПроцедуры
Как называть общие модули: суффиксы контекста
Общие модули называют по предметной области плюс суффикс, который объясняет, где модуль работает. Эту схему используют все типовые конфигурации на БСП, поэтому её стоит знать даже тем, кто пишет только мелкие доработки.
| Суффикс | Что значит | Пример |
|---|---|---|
| без суффикса | серверный модуль | ОбщегоНазначения |
Клиент | клиентский модуль | ОбщегоНазначенияКлиент |
КлиентСервер | работает и там, и там | ОбщегоНазначенияКлиентСервер |
ВызовСервера | серверный, вызывается с клиента | ПечатьВызовСервера |
ПовтИсп | с повторным использованием возвращаемых значений | ОбщегоНазначенияПовтИсп |
Глобальный | глобальный клиентский модуль | СтандартныеПодсистемыГлобальный |
Переопределяемый | точка для доработок без правки типового кода | ОбщегоНазначенияПереопределяемый |
Флажки свойств модуля («Клиент», «Сервер», «Вызов сервера» и другие) должны совпадать с суффиксом. Модуль с суффиксом Клиент, у которого включён флажок «Сервер», путает каждого, кто его откроет.
💡 Для своего модуля в типовой базе работает та же схема с префиксом: мк_РасчетМаржиСервер и мк_РасчетМаржиКлиент.
Имена в запросах: временные таблицы, псевдонимы, параметры
Запрос — место, где имена страдают сильнее всего. Текст длинный, пакетов несколько, а таблицы называют Т1, Т2, ВТ.
Временные таблицы
Называйте временную таблицу по содержимому и начинайте с ВТ: ВТОстаткиТоваров, ВТЦеныНаДату, ВТДокументыЗаПериод. Префикс сразу отделяет временную таблицу от таблицы базы, а остальное имя объясняет, что внутри.
ВЫБРАТЬ
Остатки.Номенклатура КАК Номенклатура,
Остатки.КоличествоОстаток КАК Количество
ПОМЕСТИТЬ ВТОстаткиТоваров
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОстатков, Склад = &Склад) КАК Остатки
;
ВЫБРАТЬ
ВТОстаткиТоваров.Номенклатура,
ВТОстаткиТоваров.Количество,
Цены.Цена КАК Цена
ИЗ
ВТОстаткиТоваров КАК ВТОстаткиТоваров
ЛЕВОЕ СОЕДИНЕНИЕ ВТЦеныНаДату КАК Цены
ПО ВТОстаткиТоваров.Номенклатура = Цены.Номенклатура
Псевдонимы полей и таблиц
- ✅ Каждому вычисляемому полю давайте псевдоним через
КАК. Без него платформа назовёт полеПоле1,Поле2, и в коде появитсяВыборка.Поле3. - ✅ Псевдоним таблицы — осмысленный:
Остатки,Цены,Реализация. НеТ,ТТ,А. - ✅ Псевдоним поля в итоговой выборке совпадает с тем, как вы будете обращаться к нему в коде и в схеме компоновки.
Параметры запроса
Параметр называют так же, как переменную, без служебных добавок: &Организация, &ДатаНачала, &СписокСкладов. Имя параметра в тексте запроса и в Запрос.УстановитьПараметр("Организация", ...) должно совпадать посимвольно. Опечатка не даст ошибку сразу: параметр останется неустановленным, и запрос вернёт пустой результат или упадёт уже при выполнении.
Чистота кода и безопасное переименование
Переименовывать стоит, когда имя врёт. Например, переменная СуммаБезНДС, в которой давно лежит сумма с НДС. Но в 1С переименование задевает больше, чем кажется.
Что ломается при смене имени объекта метаданных
Данные в базе привязаны к внутреннему идентификатору объекта, а не к имени. Поэтому после переименования справочника записи никуда не пропадут. Зато сломается всё, что обращается к объекту по имени:
- 🔗 код модулей и тексты запросов:
Справочники.СтароеИмя,Справочник.СтароеИмя; - 📋 внешние отчёты и обработки, которые лежат вне конфигурации;
- 🔄 правила обмена и интеграции через COM или HTTP-сервисы;
- ⚙️ сохранённые пользовательские настройки отчётов, где фигурирует поле.
Порядок переименования
- Сделайте копию базы
или выгрузку в
.dt, если переименование затрагивает объекты метаданных. - Найдите все упоминания старого имени глобальным поиском по конфигурации. В Конфигураторе это команда «Глобальный поиск» в меню «Правка», комбинация
Ctrl+Shift+F. - Для объекта метаданных дополнительно вызовите в контекстном меню «Найти ссылки на объект».
- Переименуйте и исправьте все найденные места.
- Запустите синтаксический контроль модулей и проверьте внешние обработки отдельно: глобальный поиск их не видит.
В 1C:EDT переименование надёжнее: там есть рефакторинг, который меняет имя сразу во всех ссылках внутри проекта. Внешние файлы он всё равно не исправит.
В типовой конфигурации, стоящей на поддержке, не переименовывайте типовые объекты. Следующее обновление воспримет их как удалённые и добавленные заново. Свои доработки называйте с префиксом с самого начала, тогда переименовывать не придётся.
Как поддерживать порядок в именах
Глазами за именами в большой команде не уследить. Помогают автоматические проверки: встроенная в Конфигуратор проверка конфигурации и внешние анализаторы кода на встроенном языке. Они находят однобуквенные переменные, имена, совпадающие с глобальным контекстом, и смешение раскладок.
Проверьте свой следующий модуль перед сдачей: