gifts2017

АЦРК: система именования переменных

Опубликовал Иванов Алексей (acrk) в раздел Программирование - Практика программирования

Предлагается система префиксов для именования переменных при написании программ на 1С. Сам пользуюсь этой системой более 10 лет

Префиксы имен переменных в программных модулях

Правила именования переменных при разработке конфигураций на платформе 1С:Предприятие 7.7.

Префикс отделяется от основного имени переменной символом «_» для лучшей читаемости программы.
Гл_ - глобальная переменная, процедура или функция. Описана в глобальном модуле с ключевым словом ЭКСПОРТ.
м_ - переменная, описанная явно или неявно в текущем программном модуле. Рекомендуется всегда явно описывать переменные модуля в начале текста модуля с помощью оператора Перем.
л_ - переменная, описанная явно или неявно в текущей процедуре или функции. Рекомендуется никогда явно не описывать локальные переменные процедур и функций, а создавать их с помощью оператора присваивания, например: л_НомерСтроки=0.
п_ - параметр текущей процедуры или функции.
рд_ - реквизит диалога. Описан в форме диалога.
яч_ - ячейка таблицы в режиме ввода данных. Определена в таблице. Может использоваться в тексте программы в качестве переменных. Является первичной ячейкой и/или группой соседних ячеек, объединенных командой "объединить ячейки". Представляет собой единую неделимую единицу ввода и/или отображения информации в таблице.
от_ - область таблицы. Определена в таблице. Представляет собой группу ячеек таблицы. Используется, как правило, для форматирования ячеек области.
Отсутствие префикса означает, что переменная является реквизитом того объекта (справочника, документа, …), модулем которого является фрагмент программы. Как следствие, в модулях отчетов и обработок, в том числе и внешних, не должны встречаться переменные без префикса.

Правила именования переменных при разработке конфигураций на платформе 1С:Предприятие 8.

Гл_ - глобальная переменная, процедура или функция для основного режима работы конфигурации. Описана в модуле приложения с ключевым словом ЭКСПОРТ.
ГлВС_ - глобальная переменная, процедура или функция для работы конфигурации в режиме внешнего соединения. Описана в модуле внешнего соединения с ключевым словом ЭКСПОРТ.
м_ - (переменная модуля) переменная, описанная явно или неявно в текущем программном модуле. Рекомендуется всегда явно описывать переменные модуля в начале текста модуля с помощью оператора Перем.
л_ - переменная, описанная явно или неявно в текущей процедуре или функции. Рекомендуется никогда явно не описывать локальные переменные процедур и функций, а создавать их с помощью оператора присваивания, например: л_НомерСтроки=0.
п_ - параметр текущей процедуры или функции.
рф_ - реквизит формы. Определен как реквизит формы (на закладке «Реквизиты»).
Отсутствие префикса означает, что переменная является реквизитом того объекта (справочника, документа, …), модулем которого является фрагмент программы. Как следствие, в модулях отчетов и обработок, в том числе и внешних, не должны встречаться переменные без префикса.

Комментарий.
Давно пользуюсь этой системой и уже не могу с ней расстаться.
Природа префиксов - "по месту рождения" переменной. Префикс отлично дополняет смысл, который можно узнать из имени переменной. Потому что всегда полезно знать, является переменная локальной или объявлена в модуле или это параметр процедуры (функции) или вообще является реквизитом объекта, к которому модуль относится. Когда писал на 7.7 до этой системы,был у меня случай (и потом еще пара случаев, когда другим помогал), когда объявлена переменная в модуле формы и с таким же именем реквизит диалога на форме. Первый раз очень трудно такую ошибку найти.
При использовании префиксов такое просто невозможно.
Когда ко мне обращались за помощью в поиске ошибки и показывают модуль без префиксов, я часто говорю: "префиксов нет, поэтому и не работает". И на самом деле ошибка находится сама, стоит только расставить префиксы в модуле. Ну не все ошибки, конечно, а те, которые не позволяли двигаться дальше.

Для 8-ки практически все то же самое, что и для 7.7. Только в 8 реквизит диалога отделен от данных, поэтому префикса "рд_" нет. Обращение к элементам формы возможно только через свойство формы "ЭлементыФормы", так что префикс не нужен, и так ни с чем не спутаешь. Зато в форме могут быть реквизиты (которые определены на закладке формы "реквизиты"). Для них префикс "рф_".
Еще пока не пришлось пользоваться префиксами "Гл_" и "ГлВС_" - для этого надо конфигурацию с нуля писать.

Хотел еще суффиксы ввести, "Ссылка" и "Объект". Но не прижились: писать долго, и хотя для смысла они очень полезны, но острой проблемы нет. Поэтому я их использую, но только в случаях, когда это необходимо, поэтому в систему для обязательного применения они не записаны. Но требуются они довольно часто, потому что все-таки важно понимать, переменная "л_Контрагент", например, является "л_КонтрагентСсылка" или "л_КонтрагентОбъект".

8-ка правда немного мешает применению этой системе. В 8-ке помощник ввода текстов гораздо мощнее, чем в 7.7. Например, при вставке предопределенных процедур модуля мы получаем заголовок процедуры вместе с параметрами, которые, к сожалению моему, без префиксов «п_». И ставить их мне иногда лень, Поэтому в текстах моих можно встретить небольшие процедуры без префиксов, если очень тороплюсь. Но в большинстве случаев все-таки меняю. И чем больше и сложнее текст процедуры, тем больше важно поставить префиксы у параметров.

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

В общем, попробуйте сами, не пожалеете.

См. также

Подписаться Добавить вознаграждение
Комментарии
0. Иванов Алексей (acrk) 01.01.70 03:00
Предлагается система префиксов для именования переменных при написании программ на 1С. Сам пользуюсь этой системой более 10 лет

Перейти к публикации

1. vkr (vkr) 27.11.11 20:23
Плюс! Любое упорядочение мышления ведет к уменьшению глюков... :)
u_n_k_n_o_w_n; +1 Ответить
2. Сергей Ожерельев (Поручик) 28.11.11 07:53
Это может и хорошо, но фирма 1С в системе стандартов и методик разработки конфигураций для платформы 1С:Предприятие 8 не рекомендует использование подчёркивания _ в наименованиях переменных и реквизитов. У них там целая глава посвящена теме.
3. Александр Рытов (Арчибальд) 28.11.11 08:38
Приведенные соглашения ввел в обиход Камин. Я, кстати, тоже им пользуюсь (нестрого), но без подчерков.
4. Алексей (АлексейН) 28.11.11 09:09
Класная идея!!!
Иногда тоже в сложных отчетах использую, сразу же уменьшается количество глюков и намного проще и понятнее становится текст модуля.
5. Александр Зубцов (iov) 28.11.11 10:32
http://infostart.ru/public/79901/ Разреши добавить в шапку со ссылкой на тебя?
6. Иванов Алексей (acrk) 28.11.11 11:52
(3) Арчибальд,
Да, я там работал, в Камине. Настал момент, когда другой сотрудник (Волков Михаил) предложил ввести некоторую систему. Но он предложил как в Аспекте была, там префиксы по типу переменной использовались. Но их было во-первых, много. Во-вторых, на мой взгляд, бесполезные. Потому что тип переменной и так ясен должен быть из названия. Например, если переменная - это список значений, то в наименовании должно быть слово "Список", если таблица значений, то должно быть слово "Таблица" и т.д. Я по крайней мере этого придерживаюсь: очень читабельность текста повышает. В-третьих, в 1С мягкая типизация, префикс ничего не гарантирует и только заставляет разработчика прилагать дополнительные усилия, чтобы следить за соответствием префикса и содержания.
Соответственно я предложил эту систему, сам ей пользуюсь и считаю, что имею право представлять ее от своего имени. И практика показала, что префикс "по месту рождения" оказался очень удачным (IMHO).
u_n_k_n_o_w_n; Арчибальд; +2 Ответить 1
7. Иванов Алексей (acrk) 28.11.11 12:10
(5) iov,
конечно, пожалуйста.
Хотя в твоей статье речь идет о другом. Я лично придерживаюсь тех принципов, к которым ты призываешь. Кроме комментирования. Я считаю, что раз мы программируем на русском языке (очередной раз спасибо фирме 1С), то программа сама должна читаться как комментарий. А дополнительные комментарии только в тех случаях, где реально нужна помощь в понимании алгоритма.
8. Александр Рытов (Арчибальд) 28.11.11 15:05
(6) Я еще пользую префикс "кн", ибо кнопки в диалоге все-таки на особом положении. И еще у кого-то встречал.
9. Александр Лыткин (TrinitronOTV) 28.11.11 15:23
плюсану, хорошая информация, пригодиться
10. Иванов Алексей (acrk) 28.11.11 21:29
(8) Арчибальд,
я тоже использую, только полностью "Кнопка". Хотел написать, но не стал. Когда слово полностью, то это вроде и не префикс, а часть названия.
11. Александр Орефков (orefkov) 30.11.11 01:28
Статью плюсую, хотя над "В 8-ке помощник ввода текстов гораздо мощнее, чем в 7.7" иронично улыбаюсь...
12. Андрей Акулов (DrAku1a) 30.11.11 06:43
Идея хорошая, многие из нас анализируя примеры 1С, чужого кода и т.п. стараются вникнуть и использовать систему именования переменных, потом процедур и функций.
Префиксы, как и определенные правила структрирования кода - уже стали стандартом профессионализма разработчиков на многих языках (c++, delphi, ...). Это необходима для повышения читабельности кода другими программистами, да и своего-же кода десятилетней давности.

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

Лично я в именах переменных стараюсь заключить не месторождение переменной (место объявления, можно всегда узнать встав на нее и нажав F12), а то, какой тип значения планирую в ней хранить.
Например:
сзКонтрагенты = новый СписокЗначений;
тзСписокДокументов = новый ТаблицаЗначений;


Локальные переменные процедур и функций стараюсь объявлять - привычка осталась от Delphi. А вот почему это не рекомендуется?

Единственное - в типовых решениях 1С глобальные переменные действительно обзываются с "гл", а локальные для модуля формы и экспортные для модуля объекта - все начинаются с "м". И массивы у меня начинаются с "м" - и тут, бывает, возникает путаница...
Кстати, еще один нюанс - зачем подчеркивание нужно? Предлагаю считать префиксом первые буквы переменной, если они в нижнем регистре - до буквы верхнего регистра, вполне читабельно, собственно фирма 1С в своих стандартных решениях именно так и делает.
13. Keyfly (Oleg_nsk) 30.11.11 08:24
Использую такую же префиксацию, только без именования локальных переменных и без подчеркивания. На мой взгляд, подчеркивание уднинняет текст модуля, а то, что первая буква маленькая уже указывает на то, что это префикс. Что касается локальных переменных, то соглашусь префикс "л" может быть полезен, но тогда придется по этому стандарту еще и счетчики префиксить. Скажите у вас в коде перебор так выглядит: "...Для л_Счетчик = 1 По 100 Цикл..." или "...Для каждого л_Строка1 Из л_Дерево.Строки Цикл..."? На мой взгляд криво выглядит...
14. Александр Рытов (Арчибальд) 30.11.11 08:32
(12)
Единственное - в типовых решениях 1С глобальные переменные действительно обзываются с "гл"
Это тоже появилось от Камина. Во всяком случае, позже.
15. Дмитрий Перминов (l_men) 30.11.11 09:31
А я предлагаю расширить этот список:
для 8:
например если тип переменной структура - "стк",
Таблица значений - "тбз",
Дерево значений - "двз",
Список значений - "спз",
и т.д.
16. Иванов Алексей (acrk) 30.11.11 10:18
(12) DrAku1a,
Вот я как раз против таких префиксов.
Считаю, что "тзСписокДокументов = новый ТаблицаЗначений;" - это неправильно. С таким же успехом можно писать "тзМассивДокументов = новый ТаблицаЗначений;" или "тзДеревоДокументов = новый ТаблицаЗначений;". Кроме префиксов надо еще и имена осмысленные давать. Если у вас таблица документов, то почему вы назвали ее "..СписокДокументов"?
Правильно, с моей точки зрения, "тзТаблицаДокументов = новый ТаблицаЗначений;", но в эом случае префикс "тз" не нужен. Кроме того, мягкая типизация не препятствует вам хранит в переменной тзСписокДокументов хоть массив, хоть дерево, хоть число.
Префиксы по типам плохи тем, что их слишком много - трудно для запоминания и извлечения из памяти. Информация о типе как правило ясна из смыслового названия переменной.
А вот префикс по "месту рождения" действительно дает новую информация и весьма важную для понимания алгоритма. Клафишей F12 пользоваться неудобно, только текст перед глазами прыгать будет, а в голове постоянно надо будет держать информацию о том, где какая переменная объявлена.
nayd; karnilaev; ShantinTD; Арчибальд; +4 Ответить 2
17. Александр Рытов (Арчибальд) 30.11.11 10:30
(16) Согласен. "ТИповые" префиксы имеют смысл в языках, где переменная объявляется вместе с типом, но не в 1С.
18. Andrey Smirnov (dusha0020) 30.11.11 11:59
Идея понимания самому своего кода и облегчения понимания другим хороша. Но... Такой стандарт должен исходить от 1С и штатных разработчиков конфигураций. В собственных разработках это замечательно, но когда дописывешь стандартную конфигурацию получается каша, хотя индекс гл уже вроде стандартен. Думаю эта идея префиксов должна быть принята как 1С так и партнерами и тогда большинство разработчиков просто присоединятся. Почему это до сих пор не сделано большой большой вопрос...
19. Иванов Алексей (acrk) 30.11.11 19:59
(18) dusha0020,
Было бы очень хорошо, если бы такое исходило от 1С. Но на это надеяться не надо. Стандарты разработки 1С, например, меня наполовину не устраивают.
Да и вообще, никто не запрещает любому создавать свои стандарты, лучшие из них могут стать отраслевыми, и не обязательно таких будет один.
Любой стандарт становится стандартом "де-факто", когда обретает поддержку большого количества сторонников.
20. Александр Рытов (Арчибальд) 01.12.11 08:22
(18) Большлй скептицизм вызывает предположение, что 1С может предпринять какие-то шаги в этом направлении. И это при наличии "системы стандартов и методик..."
21. Михаил Ефимов (bssat) 01.12.11 11:09
А мне кажется, что красивее, да и правильнее, глобальные переменные начинать с Большой буквы. Хотя, на вкус и цвет... Но упорядочивание информации - это всегда правильно.
22. Тимофей Шантин (ShantinTD) 02.12.11 11:51
Я согласен с тем, что префикс следует начинать с маленьких букв, тогда будет видно, что это именно префикс.
Относительно подчеркивания - наверное иногда есть смысл его использовать, потому что 1С кроме мягкой типизации позволяет еще и регистронезависимость. Так вот для тех, кто не любит выделять регистром начала слов - наверное можно немного удлинить код.
Префикс по типу переменной или по месту ее рождения? На мой взгляд - по месту рождения. Опять же из соображений мягкой типизации.
Относительно имен переменных - имя должно трактоваться однозначно. Полностью поддерживаю (16).

Пример того, к чему приводит пренебрежение: определена переменная модуля; определена функция с параметром, названным точно так же; и в качестве аргумента при вызове используется она же (переменная модуля). Работает? В одном единственном частном случае - работает правильно. В остальных - работает долго, и портит все посчитанное ранее.
23. Виталий (nafa) 03.12.11 00:27
18
dusha0020 пишет:
Думаю эта идея префиксов должна быть принята как 1С так и партнерами и тогда большинство разработчиков просто присоединятся.

Лучше бы возможность назначениям переменных типов сделали.
24. Oleg . (oaf_is) 04.12.11 13:39
+1. Стараюсь .. придерживаться.... подобного. Нужно и полезно.
25. Виктор Клименко (dicwork) 08.12.11 10:41
Раньше приходилось программировать на Delphi и прочитал в одной книге (по моему автор Хендерсон) о префиксах в названиях переменных. На 1С программирую недавно, но стараюсь и здесь придерживаться такого принципа:
тз ТаблицаЗначений
сз СписокЗначений
сп Справочник
дк Документ
за Запрос
Получается спОборудование, заСписокОборудования, тзСписокОборудования
меньше приходится придумывать наименований переменных префикс помогает сразу по тексту определить тип.
В именовании по "месту рождения" переменной пока смысла не вижу. Может кто объяснит, чем это лучше?
26. Иванов Алексей (acrk) 08.12.11 11:08
(25) dicwork,
Вот аргументы против:
1. тзСписокОборудования - это неправильно. Запутывает читателя: это все-таки СПИСОК или ТАБЛИЦА ?
2. Вот есть набор префиксов по типу и набор имен переменных по смыслу. Делаем все комбинации префиксов и имен. Смысл имеет ТОЛЬКО ОДНА комбинация. Тогда вопрос: что нового дает префикс ? Какой новый смысл? Никакого, потому что тип ясен из смыслового имени переменной. Если это "Сумма", то ясно, что она число, зачем еще префиксом это дублировать ?
И вот есть другой набор префиксов - по месту рождения. Делаем все комбинации префикса и имени. Во-первых их меньше. Во-вторых - все имеют смысл. В-третьих, смысл у всех немного разный, причем с очень важным оттенком. Потому что ясно, что л_Сумма, м_Сумма, п_Сумма, рф_Сумма и просто Сумма - это все числа, в которых хранится некая сумма. Но очень важно понимать, локальная ли это переменная или параметр, или переменная модуля, или реквизит объекта, или реквизит формы, который не является реквизитом объекта.

Критерий качества системы префиксов - наличие смысла в любой (или большинстве) комбинаций префикса и имени.
27. Виктор Клименко (dicwork) 09.12.11 00:53
(26) acrk
тзСписокОборудования - это таблица значений содержащая список оборудования.
заСписокОборудования - это запрос для формирования списка оборудования
спОборудование = это справочник оборудования
И и не понимаю, почему это неправильно. Идею вычитал в книге Кена Хендерсона "Руководство разработчика баз данных в Delphi 2" в далеком 1998 году. Использовал при программировании на Delphi - теперь перенес эту методику и на работу с 1С. Если такая методика именования переменных была признана такими авторами как Хендерсон, то почему ее нельзя применять в 1С? Хотелось бы и с Вашей стороны услышать ссылки на литературные источники, на которых базируется Ваша методика именования переменных.
28. Катерина Шах (e-katerina) 09.12.11 13:00
(18) dusha0020,

dusha0020 пишет:
когда дописывешь стандартную конфигурацию получается каша


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

А в том, что разработчикам 1С неплохо было бы это включить в систему стандартной методики, - полностью согласна.
29. Иванов Алексей (acrk) 11.12.11 22:09
(27) dicwork,
есть языки программирования разных типов. В delphi (я на нем не работаю, Pascal в свое время использовал и очень любил) жесткая типизация переменных. Там это наверное имеет смысл, чтобы в середине программы не прыгать в начало, чтобы уточнить тип переменной. Потому что использование переменной без знания ее типа приведет к ошибке и потере времени.
А в 1С типизация мягкая. Платформа не мешает присвоить переменной спОборудование число или строку и не посчитает это ошибкой. Более того, многие функции платформы возвращают значение, тип которого жестко не определен. Например, для справочника метод НайтиПоКоду может вернуть значение Неопределено, хоть вы три префикс "сп" поставьте. Поэтому префиксы по типам для 1С не очень удачны.
30. Василий Казьмин (awk) 27.01.12 14:29
Я лично пока вижу только в приставках гл и л. В первом случае не перекрываются локальные имена, а во втором не перекрываются имена реквизитов. Остальное перебор по моему. Кто писал на С++ может видел перфиксы до 10 символов. Все хорошо в меру.
31. vkr (vkr) 27.01.12 14:44
(29) Ну и что, что 1С-функции могут вернуть "Неопределено" ?
Если сразу проверить результат на неопределенность, то потом об этом можно не вспоминать...
А смысловой префикс типа тзн_, сзн_, спр_ и т.п. в любом месте исходника напомнит,
какого типа переменную использует сам разработчик, исходя из собственных мыслей...
Пишите, как Вам лично удобнее - зачем подстраиваться под бредовый стиль 1С ??? :)
(30) Согласен с Вами - на С++ много веселого есть :)
32. Иванов Алексей (acrk) 27.01.12 17:25
(30) awk,
а разве не удобно где-то в недрах большой процедуры увидеть префикс "п" и сразу понять, что это параметр процедуры ?
а префикс "м" даже 1С уже использует, чтобы отличать переменную модуля от локальной или реквизита.
33. Василий Казьмин (awk) 30.01.12 11:24
(32)
1. Переменная модуля = глобальная переменная(хорошо, что в рамках модуля) = зло. Я бы их пефиксировал как хрень_(и подпись с комментариями для чего эта хрень заведена, если нарушать закон - так со знанием).
2. Процедура или функция должна на экран помещаться. Если не помещается - то это то же хрень непонятная и ошибочная.
34. Иванов Алексей (acrk) 30.01.12 12:56
(33) awk,
2. - это в идеале. В типовых встречаются запросы на несколько страниц (даже несколько десятков страниц, даже не экранов), так что это нереально выполнить.
35. Василий Казьмин (awk) 30.01.12 13:13
(34) Видел-видел этих монстров творческой мысли. Практически все разбиваются на части. В идеале - это когда в фирме 1С работают люди с квалификацией выше среднего. :)))
37. Андрей (Krasnyj) 07.03.12 13:50
Полезная идея, сам пользуюсь подобным. Статью оплюсовал.
38. Евгений Сосна (pumbaE) 07.03.12 13:51
Гл - переменная на сервере, клиенте ? Идею не поддерживаю.
39. Андрей Сябренко (AzagTot) 22.06.13 12:16
Идея хорошая. Поддерживаю.
Такая система (или подобная ей) должна быть встроена на уровне конфигурации.
Т.е., префиксы должны добавляться к имени переменной автоматически - это было бы очень удобно, а затраты на реализацию минимальны.
Жаль, что в 1С этого не сделали.
Может можно такую фишку сделать в Снегопате? Никто не пробовал?
40. Евгений Сосна (pumbaE) 22.06.13 12:42
(39) AzagTot, без контекстной подсказки - это пойдет, даже добавив контекстную подсказку к таким переменным , то все равно у разработчиков типовых конфигурации нет снегопата и они не смогут оценить всю задумку, а делать такую вещь для малого процента кода не думаю что стоит.
Это можно сделать, как маленькое дополнение к работе подсказки после точки в снегопате ( когда уже будет, тогда и можно будет задумываться).
41. as asd (edzz) 22.06.13 22:30
Поддеерживаю. Система префиксов очнь хорошо себя показывает в сильно допиленных конфах(у меня пара доков постоянно допиливается, использую эту систему - очень удобно). Да самому писать иногда лениво, но потом привыкаешь и ничего