Как правильно именовать переменные и функции в 1С, чтобы избежать конфликтов и соответствовать стандартам

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки на платформе 1С:Предприятие 8 часто возникает дилемма: следовать ли букве официальных стандартов или отдавать предпочтение субъективной читаемости кода. Одним из самых острых вопросов является рекомендация фирмы «1С» отказываться от использования глаголов «Получить» (Get) в названиях функций. Рассмотрим подробнее, к каким последствиям это приводит, почему возникают конфликты имен переменных и функций и как правильно организовать свой код, чтобы он оставался надежным и понятным.

Суть стандарта и причина отказа от слова Получить

Согласно системе стандартов и методик разработки «1С», имя функции должно четко описывать возвращаемое значение. Идея заключается в том, что функция — это сущность, результат. Например, вместо ПолучитьТаблицуДокументов() стандарт рекомендует использовать ТаблицаДокументов(). Это приближает язык 1С к объектно-ориентированным практикам, где обращение к свойству или вычисляемому значению выглядит лаконично.

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


Процедура РассчитатьДанные()
    ТаблицаДокументов = ТаблицаДокументов();
    // Дальнейшая обработка
КонецПроцедуры

Здесь мы видим полное совпадение имени локальной переменной и имени вызываемой функции. С точки зрения платформы 1С это допустимо, так как функция всегда вызывается со скобками (), а переменная — без них. Но с точки зрения разработчика это создает «когнитивную нагрузку»: при беглом просмотре кода легко запутаться, где мы обращаемся к кэшированному значению в переменной, а где инициируем новый вызов функции.

Риск возникновения бесконечной рекурсии

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


Функция ТаблицаДокументов()
    ТаблицаДокументов = Новый ТаблицаЗначений;
    // ... логика заполнения таблицы ...
    Возврат ТаблицаДокументов(); // Ошибка: лишние скобки превращают переменную в рекурсивный вызов
КонецФункции

В данном примере разработчик хотел вернуть локальную переменную ТаблицаДокументов, но по привычке или из-за автоподстановки добавил скобки. Система воспримет это как вызов функции саму себя, что приведет к бесконечной рекурсии и ошибке «Превышен максимальный уровень стека вызовов». Если бы функция называлась ПолучитьТаблицуДокументов(), такая ошибка была бы практически невозможна, так как переменная и функция имели бы разные имена.

Способ решения 1: Использование более точных имен

Проанализируем лучший способ избежать конфликтов — это конкретизация имен. Проблема «одинаковости» часто возникает тогда, когда имена слишком абстрактны. Вместо того чтобы использовать общее название ТаблицаДокументов, постараемся отразить в имени функции суть возвращаемых данных. Посмотрим на примере:


// Вместо этого:
ТаблицаДокументов = ТаблицаДокументов();

// Используем это:
ПараметрыЗаполнения = ДанныеДляЗаполненияДокументов();
ДокументыКПроведению = СписокНепроведенныхДокументов();

Когда имя функции описывает специфику данных (например, ПросроченныеРеализации()), а переменная — контекст их использования в текущем алгоритме (например, ТаблицаДляАнализа), вероятность конфликта и ошибок сводится к нулю. Хорошим тоном считается, если имя переменной чуть короче или специфичнее имени функции.

Способ решения 2: Правило множественного и единственного числа

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


Процедура ОбработатьЗаказы()
    ЗаказыКлиентов = ЗаказыКлиентов(); // Функция возвращает таблицу
    Для Каждого ЗаказКлиента Из ЗаказыКлиентов Цикл
        // Обработка одного заказа
    КонецЦикла;
КонецПроцедуры

Такой подход делает код «самодокументирующимся»: из названия сразу понятно, где мы работаем со всей выборкой, а где с конкретным элементом.

Способ решения 3: Когда глагол «Получить» все же уместен

Важно понимать, что стандарты 1С — это не догма, а набор рекомендаций для повышения качества кода. В самих стандартах есть уточнение: если получение данных связано с интенсивными вычислениями, запросами к базе данных или обращением к внешним ресурсам, использование глагола Получить оправдано. Это сигнализирует другому разработчику, что вызов этой функции «дорогой» и результат лучше сохранить в переменную, а не вызывать функцию многократно в цикле.

Рассмотрим пример правильного использования префиксов:

Инструментальный контроль: 1С:ACC и SonarQube

Для тех, кто хочет достичь идеала в именовании, существуют инструменты автоматизированной проверки. Разберем работу 1С:ACC (Автоматизированная проверка конфигураций). Этот инструмент проверяет ваш код на соответствие стандартам, включая правильность именования методов. Если вы используете «СделатьВсе()» для функции, ACC обязательно выдаст предупреждение.

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

Итоги и рекомендации

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

  1. Соблюдайте баланс: Старайтесь называть функции существительными, но если это создает явный конфликт с локальными переменными, уточняйте имя функции (добавляйте детализацию).
  2. Избегайте абстракций: Вместо Данные() пишите ДанныеПродажЗаПериод(). Чем точнее имя, тем меньше шансов на совпадение с переменной.
  3. Помните про скобки: Всегда проверяйте вызовы функций. Одинаковые имена переменных и функций требуют повышенной концентрации при написании Возврат.
  4. Используйте префиксы для булевых функций: Вопросы Это..., Можно..., Нужно... никогда не конфликтуют с существительными-переменными.
  5. Документируйте сложные моменты: Если вы сознательно отступаете от стандарта ради читаемости, это лучше, чем слепое следование правилам, ведущее к запутанному коду.

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

← На главную