Имя: Пароль:
1C
 
Хорошие и плохие имена переменных и функций
0 Волшебник
 
27.11.25
20:08
Давайте обсудим.
Потом прикручу пост и голосовалку.

Что с венгерской нотацией? Сразу в бан?
Что с длинными именами?

Должно ли быть слово Получить у функции?
1 Voronve
 
27.11.25
20:10
ПолучитьНаименованиеНоменклатуры
сразу в топку, автора - на кол
НоменклатураНаименованиеПолучить
лампово, православно-кошерно
2 Волшебник
 
27.11.25
20:10
Я щетаю, что плохие имена переменных выдают плохое понимание предметной области и контекста. Кстати, это признак бота.
3 Voronve
 
27.11.25
20:12
(2) Угу. Вся БСП - писана ботами
4 d4rkmesa
 
27.11.25
20:13
(0) >>?Что с венгерской нотацией? Сразу в бан?

Устарела, видел в основном в сторонних обработках(от "Контура", например) и отраслевках.

>>Должно ли быть слово Получить у функции?

1С не одобряет, но таких функций в типовых еще много.
5 Волшебник
 
27.11.25
20:13
(3) не исключено
6 Волшебник
 
27.11.25
20:16
(4) если у меня переменная типа СправочникОбъект, я обзываю её оКонтрагент
При этом переменная Контрагент является ссылкой
7 mmg
 
27.11.25
20:15
(0) А смысл? Через пару-тройку лет кто вообще будет код читать, кроме ботов?
8 Voronve
 
27.11.25
20:17
ааа ... так вот кто аффтар имен переменных в клюшках о какого нить Папука: гллгбткуСчетчик = 0;
9 Garykom
 
гуру
27.11.25
20:28
(1) >НоменклатураНаименованиеПолучить

Когда окромя Номенклатура еще много разных то примерно так и делаю
С именами переменных аналогично
Не "КодНоменклатуры" а "НоменклатураКод", "НоменклатураНаименование" и т.д.
10 Garykom
 
гуру
27.11.25
20:31
(0) Слово "Получить" как и прочие типа "Найти", "Создать", или совмещенное "НайтиСоздать" могут присутствовать по необходимости
Для удобства и отличия процедур/функций, аля разных действия с одним видом объекта

Если просто сделать имя функции Номенклатура() - хрен поймешь что это и зачем
И как потом дописывать другие функции
Так что сразу НоменклатураПолучить() или ПолучитьНоменклатура()
11 Garykom
 
гуру
27.11.25
20:35
(9)+ Кстати в последнее время иногда развлекаюсь через структуры
Вместо "НоменклатураКод", "НоменклатураНаименование" делаю структуру "Номенклатура" и у нее значения с ключами "Код" и "Наименование"
Для логичных обращений Номенклатура.Код и Номенклатура.Наименование
И внутри структуры могуть быть другие структуры или массивы а не только простые типы
12 Garykom
 
гуру
27.11.25
20:38
Венгерская нотация удобна для чтения
Но неудобна для написания-разработки

Длинные имена это хорошо! Пока они на экран влезают ))
13 DiMel_77
 
27.11.25
20:49
(0) И вы туда же... Роберт Мартин, Стив Макконнелл и Волшебник :).
А по сути:
1) Венгерская нотация - используется только если это описано во внутренних стандартах проекта. Многие топовые программисты с которыми я работал используют её, но есть общие правила - поэтому иногда приходилось просить переписывать.
2) Длинные имена - хороший стиль требует использование длинных имен, для однозначного определения значений переменных, сокращения допускаются в рамках общепринятых сокращений. Код должен быть понятным программисту, который будет работать после вас.
3) По поводу "Получить", "Установить" и т.д. - лучше не использовать, но иногда для повышения читабельности кода допустимо.

Тут ещё момент с реквизитами формы всплывает, поэтому иногда не зазорно в процедуре или функции "экранировать" потенциально опасные имена переменных.
14 Asmody
 
27.11.25
20:53
Во-первых, мне не нравится стандарт 1С о наименовании переменных https://its.1c.ru/db/v8std/content/454/hdoc

В частности, вот это: "При этом, каждое слово в имени пишется с прописной буквы" и вот это "Имена переменных запрещается начинать с подчеркивания".

Я имена локальных переменных метода начинаю с маленькой буквы. Тогда хоть как-то понятна область её действия.
Параметры методов я часто начинаю с "п", если имя параметра может конфликтовать, например, с именем свойства или реквизита.
Переменные модуля, коли таковые есть, я предпочитаю начинать с "м" по той же самой причине: показать область действия (и "червячок", что от них надо избавляться).
Имена локальных методов модуля я так же стараюсь начинать с маленькой буквы.
С "_" у меня начинаются имена общих модулей, которые реализуют "библиотечные" методы, не относящиеся к бизнес-логике и поведению метаданных и интерфейса, типа "синтаксического сахара".
Например, "_Массивы" - содержит общие методы для работы с массивами. У меня есть даже модуль "__", содержащий наиболее часто используемые "хелперы". Например, __.ЕслиНеопределено() или __.ЭтоСегодня() и т.д.

Подход Волшебника с "о" в ту же тему: видно, что это объект.
Раз наш желтый вендор не удосужился снабдить нас инструментами для явного указания типа переменных, то какого хрена он запрещает нам писать так код, как нам удобно?
15 Garykom
 
гуру
27.11.25
20:59
(14) А какой смысл использовать однобуквенные сокращения?
Да еще в нижнем регистре, который 1С не отличает?

Имхо сделать префикс и писать с ним
пИмяПараметр = ПараметрМетодаИмяПараметра
мИмяПеременной = ПеременнаяМодуляИмяПеременной
"_Массивы" - почему не обозвать нормально и вызывать ОбщегоНазначенияМассивы.ИмяМетода()
16 Garykom
 
гуру
27.11.25
21:02
(15)+ Я к тому что букв мало, на все случаи коротких префиксов не хватит
А слов много - лучше писать словами понятно сразу без изучения специфической нотации
И не ограничиваться "п", "м" или "_" - разделять нормально! И будет сразу всем понятно!
17 Garykom
 
гуру
27.11.25
21:07
(15) (16)+ А еще лучше использовать структуры
Зачем заводить кучу "п" или "м"
Когда можно создать одну структуру и внутри нее хранить
По имени структуры все понятно, внутри как хочется обзывать
18 Волшебник
 
27.11.25
21:06
Пишите-пишите, я конспектирую...
19 Волшебник
 
27.11.25
21:07
(7) вы считаете себя не ботом?
20 Asmody
 
27.11.25
21:11
(15) где я написал про "однобуквенные сокращения"? такого я не писал

сравни:

Процедура КакойТоМедодОбработки(ПараметрНоменклатура, ПараметрКонтрагент, ПараметрОрганизация); 

   Номенклатура = ПараметрНоменклатура;
   Контрагент = ПараметрКонтрагент;
   Организация = ПараметрОрганизация;

КонецПроцедуры

или

Процедура какойТоМетодОбработки(пНоменклатура, пКонтрагент, пОрганизация);

   Номенклатура = пНоменклатура;
   Контрагент = пКонтрагент;
   Организация = пОрганизация;

КонецПроцедуры


или

МассивЧегоНибудь = ОбщегоНазначенияМассивы.НовыйМассив(ЧтоНибудь, ЕщеЧтоНибудь, ИЕщеЧтоНибудь);


массивЧегоНибудь = _Массивы.НовыйМассив(
  ЧтоНибудь,
  ЕщеЧтоНибудь,
  ИЕщеЧтоНибудь); 


Я не против длинных имен, я даже наоборот очень за.
Но я хочу, чтобы имена уменьшали когнитивную нагрузку, а не увеличивали её.
И чтобы было меньше "смыслового мусора".
"ПараметрМетода", "ОбщегоНазначения" - это смысловой мусор.
И 1Совские "КлиентСерверПовтИспПереопределяемый" - это тоже смысловой мусор, от бедности и безысходности
21 Garykom
 
гуру
27.11.25
21:11
(20) Сравни
Процедура КакойТоМедодОбработки(ПараметрСтруктура); 

   Номенклатура = ПараметрСтруктура.Номенклатура;
   Контрагент = ПараметрСтруктура.Контрагент;
   Организация = ПараметрСтруктура.Организация;

КонецПроцедуры
22 Garykom
 
гуру
27.11.25
21:12
(20) >"ПараметрМетода", "ОбщегоНазначения" - это смысловой мусор.

Это не смысловой мусор!
Это человекопонятный без заучивания лишнего
Да многословность как недостаток, но малословность с изобилием аббревиатур и непонятных имен ничуть не лучше
23 Asmody
 
27.11.25
21:13
В типовых 100500 модулей начинается одинаково.
Поэтому, ctrl+пробел не спасает.
Проще поставить "_" и дойти до нужного, чем выбирать из дохера вариантов
24 Asmody
 
27.11.25
21:14
(21) Теперь тебе еще надо как-то проверить, что в этой структуре именно те свойства, которых ты ожидаешь.
Без типов такой стиль очень небезопасен
25 Garykom
 
гуру
27.11.25
21:16
(21)+ когда надо допиливать - не приходится изменять объявления методов
только внутрь составного параметра докинуть и все

на большом проекте внедрения типовых (с глобальными доработками, причем с кучей итераций) это сильно облегчает
26 Asmody
 
27.11.25
21:16
(21) хуже всего, конечно,

Процедура КакойТоМедодОбработки(ПараметрСтруктура); 

   ЗаполнитьЗначенияСвойств(ЭтотОбъект, ПараметрСтруктура);

КонецПроцедуры


и такое в типовых встречается
27 DiMel_77
 
27.11.25
21:17
(24) Стандартами разработки предусмотрено не более 7-ми параметров в процедурах или функциях (насколько я помню), а передача структуры облегчает дальнейшую доработку в случае необходимости. Я своим стажерам тоже рекомендую структуры использовать.
28 Garykom
 
гуру
27.11.25
21:17
(23) Используй Сервис - Шаблоны текста
Там есть замена
29 Garykom
 
гуру
27.11.25
21:17
(24) Не надо
Точнее тогда надо и кучу параметров метода проверять ))
30 Asmody
 
27.11.25
21:18
(25) когда в платформе будет нормальная проверка типов. а не вот это вот //@strict-types
31 Garykom
 
гуру
27.11.25
21:19
(26) Это идеальный код!
Даже доработки не нужны когда новое внутри ЭтотОбъект и ПараметрСтруктура добавляется, причем имена совпадают
Вот если нужно иное перекрытие или не полное заполнение приходится с доп.параметрами ЗаполнитьЗначенияСвойств() возиться
32 Garykom
 
гуру
27.11.25
21:20
(30) Это уже будет не 1С а нечто иное
Согласен что строгая типизация лучше
Но нетути
33 Asmody
 
27.11.25
21:20
1С плодит программистов-уродов.
Это хреново, конечно
34 PR
 
27.11.25
21:20
(0) Код должен быть читабельным и самодокументируемым, все остальное от лукавого
По поводу Получить есть мнение, что НаименованиеНоменклатуры ничем не отличается от ПолучитьНаименованиеНоменклатуры, а значитПолучить можно и опустить, чтобы сделать название короче
35 H A D G E H O G s
 
27.11.25
21:20
Называйте, как хотите. Но реализуйте всё функциями, возвращающими структуру с результатом

Функция ПолучитьКонтрольноеЧислоGS1(Знач ID) Экспорт
    СтруктураВозврата=Новый Структура;
    СтруктураВозврата.Вставить("Результат",Истина);
    СтруктураВозврата.Вставить("ОписаниеОшибки","");
    СтруктураВозврата.Вставить("КонтрольноеЧисло",Неопределено);
    
    Если АСФОбщегоНазначенияКлиентСервер.ЕстьНеЦифрыВСтроке(ID) Тогда
        СтруктураВозврата.ОписаниеОшибки="Переданный идентификатор семейства GS1 должен содержать только цифры.";
        СтруктураВозврата.Результат=Ложь;
        Возврат СтруктураВозврата;
    КонецЕсли;
36 Garykom
 
гуру
27.11.25
21:21
(35) Тоже дошло что Процедуры не нужны?
Достаточно Функций
37 H A D G E H O G s
 
27.11.25
21:23
А по хорошему, если чуете, что будет весело, можно пробрасывать дополнительную (пока пустую) структурку в параметрах. Потом может пригодиться.
38 Garykom
 
гуру
27.11.25
21:24
(34) Но когда рядом
НаименованиеНоменклатуры()
ЗаполнитьНаименованиеНоменклатуры()
СформироватьНаименованиеНоменклатуры()
то без префикса выглядит странно
39 Asmody
 
27.11.25
21:24
(31) "Это идеальный код!" - у "нормального" программиста от такого вытекают глаза и волосы дыбом встают
40 Garykom
 
гуру
27.11.25
21:25
(37) Если параметров >2 - стараюсь сразу делать структуру
41 PR
 
27.11.25
21:26
(1) Тут борются два начала: рациональное и прекрасное
Рациональное говорит пиши все без падежов типа НоменклатураНаименованиеУстановить
Прекрасное требует УстановитьНаименованиеНоменклатуры
Я за прекрасное, потому что чаще всего функции и процедуры довольно уникальны, а не так, что сто функций с примерно одинаковой логикой
А если уж их сто, тогда вопрос с чего бы их сто, а не одна с параметром, который может принимать сто значений
А когда процедура или функция одна и называется НоменклатураНаименованиеУстановить, то хочется взять автора за шкирку и долго и внимательно выразительно смотреть ему в глаза
42 Garykom
 
гуру
27.11.25
21:26
(39) А есть утвержденные тесты для проверки "нормальности" программиста?
43 Garykom
 
гуру
27.11.25
21:27
(41) >с чего бы их сто, а не одна с параметром

И с кучей Если ИначеЕсли внутри?
И вызовом других?? А как насчет их имен?
44 Garykom
 
гуру
27.11.25
21:29
(41) >хочется взять автора за шкирку и долго и внимательно выразительно смотреть ему в глаза
Иногда надо сразу думать на будущее
Так влом написать "лишние" буковки?
Зато потом картинка более стройная и понятная
И можно поиском по "Установить" найти/перебрать все нужные методы
45 Kongo2019
 
27.11.25
21:29
НастоящиеПрограммистыПробелимиИСимволамиПодчеркиванияНеПользуются()
46 Garykom
 
гуру
27.11.25
21:30
(45) "Настоящие программисты используют кавычки"."Для вызова методов"()
!
47 Asmody
 
27.11.25
21:30
(35) у меня для такого "псевдомейби" есть

типа:

Если ошибка Тогда
  Возврат _Результат.ВернутьОшибку(текстОшибки);
Иначе
  Возврат _Результат.ВернутьДанные(данные);
КонецЕсли;


и используется:

ответ = ЧтоТоНадоСделать();
Если НЕ _Результат.ЭтоОшибка(ответ) Тогда
   данные = _Результат.ДанныеИз(ответ);
Иначе
   ВызватьИсключение _Результат.ОшибкаИз(ответ);
КонецЕсли;
48 Garykom
 
гуру
27.11.25
21:31
(46)+ Это вы еще кода на китайском с именами (переменных, методов и т.д.) из иероглифов не видали...
49 PR
 
27.11.25
21:31
(21) Нечитабельно и хрен проверишь ошибки в конфигураторе, на кол
50 Garykom
 
гуру
27.11.25
21:33
(47) ПиПиПи...
Тех кто использует исключения для возврата результата метода - ждет отдельный котел
51 Garykom
 
гуру
27.11.25
21:33
(49) В конфигураторе и так хрен что проверишь
Только в режиме предприятия при выполнении кода
52 PR
 
27.11.25
21:35
(31) Говно это, а не идеал
Все копирования свойств должны быть явно указаны, а не по принципам:
— Если появился новый реквизит, то скорее всего его тоже нужно заполнять, давай заполним
— Если удалили или переименовали реквизит, то и ничего страшного, не будем ругаться, просто заполним остальные свойства, а на этот хрен забьем
53 Asmody
 
27.11.25
21:36
(50) где ты там возврат увидел, болезный?
54 PR
 
27.11.25
21:38
(43) Куча Если ИначеЕсли для установки наименования объекта?
А вы точно программист?
55 Garykom
 
гуру
27.11.25
21:44
(53)
   данные = _Результат.ДанныеИз(ответ);
Иначе
   ВызватьИсключение _Результат.ОшибкаИз(ответ);

Логично предположить что это внутри функции и данные возвращаются?
Или не возвращаются ибо упс происходит исключение
Приходится заворачивать такое в Попытку

Если это не внутри функции и/или прерывание кода нормально то ок
56 Garykom
 
гуру
27.11.25
21:43
(54) Нет для разной обработки одной сущности
В этом случае логично делать разные методы с понятными именами
А не портянку внутри одного метода
57 PR
 
27.11.25
21:41
(44) Не надо при создании обработки заполнения реквизита в существующих контрагентах сразу строить ее на БСП и предусматривать, что она может начать использоваться в англоязычных странах
Будет необходимость — добавишь
Не будет — будет чище код, без всяких мутных вещей, добавленных на случай а вдруг
58 PR
 
27.11.25
21:42
(45) А вот тут, кстати, да, я бы, если бы был начинающим одинесником и понял бы этот момент, пользовался бы подчеркиваниями, конечно
59 PR
 
27.11.25
21:47
(56) Если разность в том, что нужно либо наименование присвоить либо на удаление пометить, то это как бы разные вещи и разные процедуры, конечно же
А если нужно присвоить либо наименование либо код либо автора, то и че и че, просто параметр
60 Asmody
 
27.11.25
21:55
Реально в платформе нужны нормальные неймспейсы. Папочки для общих модулей.
Модули, расширяющие типы ссылок.
61 Asmody
 
27.11.25
22:21
(41) примерно так:

Процедура УстановитьСтатус(Знач Документ, Знач Статус) Экспорт
   // логика стейт-машины
КонецПроцедуры

Процедура УстановитьСтатусОжидание(Знач Документ) Экспорт
   УстановитьСтатус(Документ, Перечисления.СтатусыОпераций.Ожидание);
КонецПроцедуры

Процедура УстановитьСтатусВыполняется(Знач Документ) Экспорт
   УстановитьСтатус(Документ, Перечисления.СтатусыОпераций.Выполняется);
КонецПроцедуры

Процедура УстановитьСтатусВыполнено(Знач Документ) Экспорт
   УстановитьСтатус(Документ, Перечисления.СтатусыОпераций.Выполнено);
КонецПроцедуры


конечно, если этих вариантов не более 5-6.
62 Злопчинский
 
27.11.25
22:37
я все время страдаю
писать типа
Если а=1
или
Если А = 1
63 Злопчинский
 
27.11.25
22:38
Если пишу сейчас полную ветку
Если КакаяТоХрень()=1 Тогда // типа ничего, норма
Иначе
   // всякая шняга пишу тут
КонецЕсли;
64 Garykom
 
гуру
27.11.25
23:30
(61) Такая логика полезна когда код внутри чуть посложней
Не просто сразу УстановитьСтатус а по неким условиям

Но вот Знач совершенно лишнее ибо тип не простой
65 Asmody
 
27.11.25
23:56
(64) откуда ты знаешь, что тип не простой? Или Ссылка для тебя сложный тип?
66 mmg
 
28.11.25
00:13
(1) А еще так учат отдавать приказы. Уж несколько тысяч лет как
67 Zamestas
 
28.11.25
00:22
(41) Полностью согласен.