Именование в 1С 8.3: переменные, объекты метаданных, модули и запросы

· 9 мин

Содержание

Правильно назвать что-либо в 1С — значит дать имя из полных русских слов, слитно, каждое слово с заглавной буквы: СуммаДокумента, ОстаткиТоваров, ЗаполнитьТабличнуюЧасть. Без пробелов, без сокращений вроде Сум и Ткч, без однобуквенных имён, кроме счётчика цикла. Это общее правило для переменных, реквизитов, процедур и объектов метаданных.

Плохие имена не ломают базу сразу. Они ломают её через год, когда код открывает другой программист и не понимает, что лежит в Т2 и почему Флаг равен Ложь. Хорошее имя экономит время на каждом чтении кода, а переименование задним числом в 1С задевает запросы, обмены и внешние обработки.

Базовые правила: как правильно назвать идентификатор в 1С 8.3

Сначала то, что проверяет сама платформа. Нарушить эти правила нельзя: Конфигуратор просто не примет имя.

  • 🔤 Имя начинается с буквы или символа подчёркивания.
  • 🔢 Дальше допускаются буквы, цифры и подчёркивание. Пробелы, точки, дефисы запрещены.
  • 🚫 Нельзя использовать зарезервированные слова языка: Если, Тогда, Процедура, Возврат, Новый и подобные.
  • 🔁 Регистр не различается. СуммаДокумента и суммадокумента для платформы — одно и то же имя.

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

ПравилоПример хорошоПример плохо
Слова слитно, каждое с заглавнойДатаНачалаПериодадата_начала_периода
Полные слова, без самодельных сокращенийКоличествоСтрокКолСтр
Термины предметной областиКонтрагент, НоменклатураКлиент1, Товарчик
Одна раскладка в имениИННКонтрагента (вся кириллица)ИHHКонтрагента (латинская H)

Смешение раскладок — самая коварная ошибка. Латинские A, C, E, H, O, P, X выглядят как кириллические. Имя Cумма с латинской C отличается от Сумма, и код падает с «Переменная не определена», хотя глазами разницы не видно. При странной ошибке перепечатайте имя вручную.

Как называть переменные и параметры

Имя переменной отвечает на вопрос «что здесь лежит». Не «как я это получил» и не «какого это типа».

  1. Существительное для значений. СуммаНДС, ТекущийПользователь, ВыборкаДокументов.
  2. Утверждение для булевых. Имя должно читаться как «да/нет»: ЕстьОшибки, ДокументПроведен, НужноПерезаполнить. Имя Флаг или Признак ничего не говорит.
  3. Без отрицаний в булевых. НеНайден = Ложь читается с трудом. Лучше Найден = Истина.
  4. Однобуквенные имена — только для счётчиков. Для Сч = 1 По 10 Цикл допустимо. А = Запрос.Выполнить() — нет.
  5. Не совпадать с глобальным контекстом. Переменная Метаданные, Справочники, Документы или ТекущаяДата перекроет одноимённое свойство или метод платформы. Код может отработать, но поведение станет неочевидным.

Пример, как выглядит разница на практике:

// Плохо
Т = Новый ТаблицаЗначений;
Для Каждого С Из Док.Товары Цикл
    Ф = С.Количество > 0;
КонецЦикла;

// Хорошо
ТаблицаОстатков = Новый ТаблицаЗначений;
Для Каждого СтрокаТоваров Из Документ.Товары Цикл
    ЕстьКоличество = СтрокаТоваров.Количество > 0;
КонецЦикла;

Параметры процедур и функций называют по тем же правилам. Плюс одно: имя параметра должно объяснять его роль в вызове. Процедура ЗаполнитьЦены(Документ, ДатаЦен, ТипЦен) понятна без чтения тела. Процедура ЗаполнитьЦены(П1, П2, П3) — нет.

💡 Для параметров, которые процедура меняет и возвращает обратно, полезно прямо отразить это в описании процедуры над её объявлением. Имя одно и то же, а комментарий снимает вопрос «можно ли сюда передать константу».

Именование объектов метаданных, реквизитов и форм

У каждого объекта метаданных три поля, которые часто путают:

СвойствоДля когоПример
Имядля кода и запросовПоступлениеТоваровУслуг
Синонимдля пользователя в интерфейсе«Поступление товаров и услуг»
Комментарийдля разработчика, в дереве конфигурации«Доработка под склад №2»

Конфигуратор сам заполняет синоним, разбивая имя по заглавным буквам. Поэтому хорошее имя сразу даёт приличный синоним, а ПТиУ даст синоним «П ти у».

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

  • 📚 Справочники — во множественном числе: Контрагенты, Склады, ВидыОплат. Исключение — собирательные слова вроде Номенклатура.
  • 📄 Документы — в единственном числе, как название одной операции: РеализацияТоваровУслуг, ПриходныйКассовыйОрдер.
  • 📊 Регистры — во множественном числе, по тому, что в них хранится: ТоварыНаСкладах, ЦеныНоменклатуры.
  • 📑 Отчёты и обработки — по действию или результату: ОборотыПоСкладам, ЗагрузкаПрайсЛиста.

Реквизиты и табличные части называют существительными без повтора имени объекта. В документе ПоступлениеТоваровУслуг реквизит Склад, а не СкладПоступления. Табличная часть — Товары, а не ТабличнаяЧастьТоваров.

Префикс для своих объектов в типовой конфигурации

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

В расширениях конфигурации префикс задаётся в свойствах самого расширения — поле «Префикс имён». По умолчанию там стоит Расш1_. Лучше заменить его на осмысленный, например по названию компании или задачи.

Формы и элементы форм

Основные формы объектов обычно называют ФормаЭлемента, ФормаСписка, ФормаВыбора, ФормаДокумента. Дополнительные — по назначению: ФормаНастройкиОбмена.

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

Процедуры, функции и обработчики событий

Процедура что-то делает, поэтому имя начинается с глагола: ЗаполнитьТабличнуюЧасть, ПроверитьЗаполнениеРеквизитов, ОтправитьУведомление.

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

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

Обработчики событий не переименовывают

Имена обработчиков задаёт платформа: ПриСозданииНаСервере, ПередЗаписью, ОбработкаПроведения, ПриОткрытии. Для элементов формы — имя элемента плюс событие: КонтрагентПриИзменении.

Переименовывать предопределённые обработчики модуля объекта нельзя: платформа связывает их с событием по имени. Процедура ПередЗаписьюДокумента в модуле объекта просто не будет вызываться.

Клиент и сервер в имени

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

  • ЗаполнитьНаСервере() — процедура с директивой &НаСервере;
  • ЦенаНоменклатурыНаСервереБезКонтекста() — функция с &НаСервереБезКонтекста;
  • клиентскую процедуру суффиксом обычно не помечают: она и так по умолчанию.

Типичная пара выглядит так:

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

&НаСервере
Процедура ЗаполнитьНаСервере()
    Объект.Товары.Очистить();
    // ...
КонецПроцедуры

Как называть общие модули: суффиксы контекста

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

СуффиксЧто значитПример
без суффиксасерверный модульОбщегоНазначения
Клиентклиентский модульОбщегоНазначенияКлиент
КлиентСерверработает и там, и тамОбщегоНазначенияКлиентСервер
ВызовСерверасерверный, вызывается с клиентаПечатьВызовСервера
ПовтИспс повторным использованием возвращаемых значенийОбщегоНазначенияПовтИсп
Глобальныйглобальный клиентский модульСтандартныеПодсистемыГлобальный
Переопределяемыйточка для доработок без правки типового кодаОбщегоНазначенияПереопределяемый

Флажки свойств модуля («Клиент», «Сервер», «Вызов сервера» и другие) должны совпадать с суффиксом. Модуль с суффиксом Клиент, у которого включён флажок «Сервер», путает каждого, кто его откроет.

💡 Для своего модуля в типовой базе работает та же схема с префиксом: мк_РасчетМаржиСервер и мк_РасчетМаржиКлиент.

Имена в запросах: временные таблицы, псевдонимы, параметры

Запрос — место, где имена страдают сильнее всего. Текст длинный, пакетов несколько, а таблицы называют Т1, Т2, ВТ.

Временные таблицы

Называйте временную таблицу по содержимому и начинайте с ВТ: ВТОстаткиТоваров, ВТЦеныНаДату, ВТДокументыЗаПериод. Префикс сразу отделяет временную таблицу от таблицы базы, а остальное имя объясняет, что внутри.

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

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

Псевдонимы полей и таблиц

  • ✅ Каждому вычисляемому полю давайте псевдоним через КАК. Без него платформа назовёт поле Поле1, Поле2, и в коде появится Выборка.Поле3.
  • ✅ Псевдоним таблицы — осмысленный: Остатки, Цены, Реализация. Не Т, ТТ, А.
  • ✅ Псевдоним поля в итоговой выборке совпадает с тем, как вы будете обращаться к нему в коде и в схеме компоновки.

Параметры запроса

Параметр называют так же, как переменную, без служебных добавок: &Организация, &ДатаНачала, &СписокСкладов. Имя параметра в тексте запроса и в Запрос.УстановитьПараметр("Организация", ...) должно совпадать посимвольно. Опечатка не даст ошибку сразу: параметр останется неустановленным, и запрос вернёт пустой результат или упадёт уже при выполнении.

Чистота кода и безопасное переименование

Переименовывать стоит, когда имя врёт. Например, переменная СуммаБезНДС, в которой давно лежит сумма с НДС. Но в 1С переименование задевает больше, чем кажется.

Что ломается при смене имени объекта метаданных

Данные в базе привязаны к внутреннему идентификатору объекта, а не к имени. Поэтому после переименования справочника записи никуда не пропадут. Зато сломается всё, что обращается к объекту по имени:

  • 🔗 код модулей и тексты запросов: Справочники.СтароеИмя, Справочник.СтароеИмя;
  • 📋 внешние отчёты и обработки, которые лежат вне конфигурации;
  • 🔄 правила обмена и интеграции через COM или HTTP-сервисы;
  • ⚙️ сохранённые пользовательские настройки отчётов, где фигурирует поле.

Порядок переименования

  1. Сделайте копию базы или выгрузку в .dt, если переименование затрагивает объекты метаданных.
  2. Найдите все упоминания старого имени глобальным поиском по конфигурации. В Конфигураторе это команда «Глобальный поиск» в меню «Правка», комбинация Ctrl+Shift+F.
  3. Для объекта метаданных дополнительно вызовите в контекстном меню «Найти ссылки на объект».
  4. Переименуйте и исправьте все найденные места.
  5. Запустите синтаксический контроль модулей и проверьте внешние обработки отдельно: глобальный поиск их не видит.

В 1C:EDT переименование надёжнее: там есть рефакторинг, который меняет имя сразу во всех ссылках внутри проекта. Внешние файлы он всё равно не исправит.

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

Как поддерживать порядок в именах

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

Проверьте свой следующий модуль перед сдачей:

Имена в модуле перед коммитом
Выполнено: 0 / 7

Частые вопросы об именовании в 1С

Можно ли называть переменные в 1С латиницей?
Платформа это позволяет. Но в русскоязычной конфигурации латинские имена соседствуют с русскими методами и читаются хуже. Используйте латиницу только в конфигурации, где весь код пишется на английском варианте языка.
Нужно ли указывать тип в имени переменной, например стрИмя или чслСумма?
Нет. В 1С так не принято: тип виден из контекста и подсказки. Префикс типа устаревает, когда тип меняется, и начинает вводить в заблуждение.
Какой длины может быть имя?
Ориентируйтесь на смысл: два-четыре слова обычно достаточно. Если имя тянется на пять-шесть слов, процедура, скорее всего, делает слишком много и её стоит разделить.
Пишут «Проведен» или «Проведён» в именах?
В идентификаторах используют «е», без «ё». Так принято в типовых конфигурациях, и так проще искать имя по тексту.
Что делать с чужим кодом с плохими именами?
Не переименовывать всё разом. Исправляйте имена в тех процедурах, которые и так меняете по задаче. Так правки остаются проверяемыми, а код постепенно становится чище.