В процессе разработки на платформе 1С:Предприятие 8 часто возникает дилемма: следовать ли букве официальных стандартов или отдавать предпочтение субъективной читаемости кода. Одним из самых острых вопросов является рекомендация фирмы «1С» отказываться от использования глаголов «Получить» (Get) в названиях функций. Рассмотрим подробнее, к каким последствиям это приводит, почему возникают конфликты имен переменных и функций и как правильно организовать свой код, чтобы он оставался надежным и понятным.
Согласно системе стандартов и методик разработки «1С», имя функции должно четко описывать возвращаемое значение. Идея заключается в том, что функция — это сущность, результат. Например, вместо ПолучитьТаблицуДокументов() стандарт рекомендует использовать ТаблицаДокументов(). Это приближает язык 1С к объектно-ориентированным практикам, где обращение к свойству или вычисляемому значению выглядит лаконично.
Однако проанализируем ситуацию, которая беспокоит многих разработчиков. Если мы называем функцию ТаблицаДокументов(), то внутри процедуры мы часто пишем следующий код:
Процедура РассчитатьДанные()
ТаблицаДокументов = ТаблицаДокументов();
// Дальнейшая обработка
КонецПроцедуры
Здесь мы видим полное совпадение имени локальной переменной и имени вызываемой функции. С точки зрения платформы 1С это допустимо, так как функция всегда вызывается со скобками (), а переменная — без них. Но с точки зрения разработчика это создает «когнитивную нагрузку»: при беглом просмотре кода легко запутаться, где мы обращаемся к кэшированному значению в переменной, а где инициируем новый вызов функции.
Разберем серьезную опасность, на которую указывают практикующие программисты. При совпадении имен функции и переменной внутри самой функции легко совершить опечатку, которая приведет к аварийному завершению работы программы. Рассмотрим пример:
Функция ТаблицаДокументов()
ТаблицаДокументов = Новый ТаблицаЗначений;
// ... логика заполнения таблицы ...
Возврат ТаблицаДокументов(); // Ошибка: лишние скобки превращают переменную в рекурсивный вызов
КонецФункции
В данном примере разработчик хотел вернуть локальную переменную ТаблицаДокументов, но по привычке или из-за автоподстановки добавил скобки. Система воспримет это как вызов функции саму себя, что приведет к бесконечной рекурсии и ошибке «Превышен максимальный уровень стека вызовов». Если бы функция называлась ПолучитьТаблицуДокументов(), такая ошибка была бы практически невозможна, так как переменная и функция имели бы разные имена.
Проанализируем лучший способ избежать конфликтов — это конкретизация имен. Проблема «одинаковости» часто возникает тогда, когда имена слишком абстрактны. Вместо того чтобы использовать общее название ТаблицаДокументов, постараемся отразить в имени функции суть возвращаемых данных. Посмотрим на примере:
// Вместо этого:
ТаблицаДокументов = ТаблицаДокументов();
// Используем это:
ПараметрыЗаполнения = ДанныеДляЗаполненияДокументов();
ДокументыКПроведению = СписокНепроведенныхДокументов();
Когда имя функции описывает специфику данных (например, ПросроченныеРеализации()), а переменная — контекст их использования в текущем алгоритме (например, ТаблицаДляАнализа), вероятность конфликта и ошибок сводится к нулю. Хорошим тоном считается, если имя переменной чуть короче или специфичнее имени функции.
Выясним еще один эффективный прием, который часто применяется в типовых конфигурациях и БСП (Библиотеке стандартных подсистем). Если функция возвращает коллекцию (массив, таблицу значений, список), называйте её во множественном числе, а переменную, используемую для итерации — в единственном.
Процедура ОбработатьЗаказы()
ЗаказыКлиентов = ЗаказыКлиентов(); // Функция возвращает таблицу
Для Каждого ЗаказКлиента Из ЗаказыКлиентов Цикл
// Обработка одного заказа
КонецЦикла;
КонецПроцедуры
Такой подход делает код «самодокументирующимся»: из названия сразу понятно, где мы работаем со всей выборкой, а где с конкретным элементом.
Важно понимать, что стандарты 1С — это не догма, а набор рекомендаций для повышения качества кода. В самих стандартах есть уточнение: если получение данных связано с интенсивными вычислениями, запросами к базе данных или обращением к внешним ресурсам, использование глагола Получить оправдано. Это сигнализирует другому разработчику, что вызов этой функции «дорогой» и результат лучше сохранить в переменную, а не вызывать функцию многократно в цикле.
Рассмотрим пример правильного использования префиксов:
ЗначениеРеквизита() — легкая функция, возможно, берет данные из кэша.ПолучитьДанныеОстатковНаСкладах() — тяжелая функция, выполняющая сложный запрос.ЭтоНовыйОбъект() — функция, возвращающая булево значение (стандарт рекомендует префиксы Это, Имеет, Содержит).Для тех, кто хочет достичь идеала в именовании, существуют инструменты автоматизированной проверки. Разберем работу 1С:ACC (Автоматизированная проверка конфигураций). Этот инструмент проверяет ваш код на соответствие стандартам, включая правильность именования методов. Если вы используете «СделатьВсе()» для функции, ACC обязательно выдаст предупреждение.
Однако помните: никакая автоматика не заменит здравый смысл. Как отмечают опытные разработчики, иногда лучше немного отступить от стандарта (например, добавить «Получить»), если это делает сложный алгоритм более прозрачным и защищает от случайных рекурсий при опечатках. Код должен быть в первую очередь понятен человеку, который будет его поддерживать через год.
Подводя итог, проанализируем основные правила, которые помогут вам писать качественный код в 1С:
Данные() пишите ДанныеПродажЗаПериод(). Чем точнее имя, тем меньше шансов на совпадение с переменной.Возврат.Это..., Можно..., Нужно... никогда не конфликтуют с существительными-переменными.Разберем последнюю рекомендацию на практике: если вы работаете в команде, договоритесь о едином стиле. Если вся команда привыкла к префиксу Получить, резкий переход на новые стандарты может вызвать волну ошибок. Внедряйте стандарты 1С постепенно, начиная с новых модулей и используя инструменты статического анализа кода.