Даем названия переменным: как префиксы экономят наше время
Разработка - Рефакторинг и качество кода
На картинке вверху приведена коротенькая функция, в которой "обыграно" только лишь одно слово "Колонка", из которого получилось целых 4 переменных. В других функциях количество переменных из одного ключевого слова может быть и больше. И это благодаря "венгерской нотации переменных".
Понятие "венгерская нотация переменных" хорошо прописано тут: Википедия о венгерской нотации переменных
Венгерская нотация в программировании — соглашение об именовании переменных, констант и прочих идентификаторов в коде программ. Своё название венгерская нотация получила благодаря программисту компании Microsoft венгерского происхождения Чарльзу Симонаи (венг. Simonyi Károly), предложившему её ещё во времена разработки первых версий MS-DOS. Эта система стала внутренним стандартом Майкрософт[1].
Суть венгерской нотации сводится к тому, что имена идентификаторов предваряются заранее оговорёнными префиксами, состоящими из одного или нескольких символов. При этом, как правило, ни само наличие префиксов, ни их написание не являются требованием языков программирования, и у каждого программиста (или коллектива программистов) они могут быть своими.
Применяемая система префиксов зависит от многих факторов:
- языка программирования (чем более «либеральный» синтаксис, тем больше контроля требуется со стороны программиста, а значит, тем более развита система префиксов. К тому же использование в каждом из языков программирования своей терминологии также вносит особенности в выбор префиксов);
- стиля программирования (объектно-ориентированный код может вообще не требовать префиксов, в то время как в «монолитном» для разборчивости они зачастую нужны);
- предметной области (например, префиксы могут применяться для записи единиц измерения);
Этот подход даёт мне, программисту, читаемость текста, экономию сил на выдумывание переменных и контроль типов. Так как тип переменной следует из первых букв нижнего регистра переменной.Пример из обработки "Загрузка выписки из клиент-банка в 1С:Бухгалтерию 2.0" :
//**************************************************************************
// Назначение : загрузить контрагентов, имеющих хоть что-нибудь в поле ИНН *
// проверить справочник на дубли контрагентов *
// Параметры : Печатная форма. *
// Если не передана, то отчет будет выведен в новое окно *
// Возвращает : Истина, если контрагенты не имеют дублей *
// Ложь , если есть задвоенные ИНН *
//**************************************************************************
Функция ПроверитьКонтрагентовНаУникальностьИНН(тдЭлементФормы=Неопределено) Экспорт
// Проверка необходимых параметров перед началом печати отчета
Если спрОрганизация.Пустая() Тогда
Сообщить("Выберите организацию перед проверкой контрагентов !");
Возврат Ложь;
КонецЕсли;
// Определяем макет отчета
мкКонтрагенты=ПолучитьМакет("Контрагенты");
обЗаголовок =мкКонтрагенты.ПолучитьОбласть("Заголовок");
обШапка =мкКонтрагенты.ПолучитьОбласть("Шапка");
обГруппировка=мкКонтрагенты.ПолучитьОбласть("ГруппировкаКонтрагент");
обСтрока =мкКонтрагенты.ПолучитьОбласть("Строка");
// Задаем табличный документ
Если НЕ(тдЭлементФормы=Неопределено) Тогда
// Такое условие задано специально : чтобы в исходном тексте можно было обращаться к свойствам переменной "тдКонтрагенты"
тдКонтрагенты=тдЭлементФормы;
Иначе
тдКонтрагенты=Новый ТабличныйДокумент;
КонецЕсли;
тдКонтрагенты.Очистить();
тдКонтрагенты.РазмерКолонтитулаСверху=9;
тдКонтрагенты.РазмерКолонтитулаСнизу =9;
тдКонтрагенты.ОриентацияСтраницы =ОриентацияСтраницы.Портрет;
тдКонтрагенты.АвтоМасштаб =Истина;
тдКонтрагенты.ПолеСлева =20;
тдКонтрагенты.ПолеСправа =10;
тдКонтрагенты.ПолеСверху =10;
тдКонтрагенты.ПолеСнизу =10;
тдКонтрагенты.ФиксацияСверху = 7;
тдКонтрагенты.ОтображатьЗаголовки=Ложь;
тдКонтрагенты.ОтображатьСетку =Ложь;
тдКонтрагенты.Защита =Ложь;
тдКонтрагенты.ТолькоПросмотр =Истина;
// Выводим заголовок и шапку отчета
обЗаголовок.Параметры.ОрганизацияИмя=СокрЛП(спрОрганизация.НаименованиеПолное);
обЗаголовок.Параметры.ОрганизацияИНН=СокрЛП(спрОрганизация.ИНН);
обЗаголовок.Параметры.ОрганизацияКПП=СокрЛП(спрОрганизация.КПП);
обЗаголовок.ВерхнийКолонтитул.ТекстСлева="Организация : "+СокрЛП(спрОрганизация.НаименованиеПолное)+", ИНН:"+СокрЛП(спрОрганизация.ИНН)+", КПП:"+СокрЛП(спрОрганизация.КПП)+".";
обЗаголовок.ВерхнийКолонтитул.Выводить=Истина;
обЗаголовок.ВерхнийКолонтитул.НачальнаяСтраница=2;
тдКонтрагенты.Вывести(обЗаголовок);
тдКонтрагенты.ПовторятьПриПечатиСтроки=тдКонтрагенты.Вывести(обШапка);
// Начинаем формировать запрос к исходным данным
нЗадвоенийВсего=0;
лУникальностьПоИНН=Истина;
зпКонтрагенты=Новый Запрос;
зпКонтрагенты.УстановитьПараметр("ПустаяСтрока","");
зпКонтрагенты.Текст="ВЫБРАТЬ РАЗРЕШЕННЫЕ
Контрагенты.Ссылка КАК КонтрагентСсылка,
Контрагенты.Наименование КАК Имя,
Контрагенты.ИНН КАК ИНН,
Контрагенты.КПП КАК КПП,
Контрагенты.Код КАК Код,
1 КАК КоличествоРаз
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
Контрагенты.ЭтоГруппа = ЛОЖЬ
И Контрагенты.ИНН <> &ПустаяСтрока
УПОРЯДОЧИТЬ ПО
ИНН,
КПП,
Код
ИТОГИ
СУММА(КоличествоРаз)
ПО
ИНН,
КПП,
Код";
впКонтрагенты=зпКонтрагенты.Выполнить();
Сообщить("Запрос к базе по контрагентам выполнен !");
вбКонтрагентыИНН=впКонтрагенты.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"ИНН");
Пока вбКонтрагентыИНН.Следующий() Цикл
сИНН=вбКонтрагентыИНН.ИНН;
Сообщить(сИНН);
Если СтрДлина(сИНН)<10 Тогда
Продолжить;
КонецЕсли;
вбКонтрагентыКПП=вбКонтрагентыИНН.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"КПП");
Пока вбКонтрагентыКПП.Следующий() Цикл
Сообщить(сИНН+" "+вбКонтрагентыКПП.КПП);
Если вбКонтрагентыКПП.КоличествоРаз>1 Тогда
Если тдЭлементФормы=Неопределено Тогда
Сообщить("Контрагент с ИНН "+СокрЛП(вбКонтрагентыКПП.ИНН)+?(ПустаяСтрока(вбКонтрагентыКПП.КПП),""," и КПП "+СокрЛП(вбКонтрагентыКПП.КПП))+" встречается "+Строка(вбКонтрагентыКПП.КоличествоРаз)+" раз");
КонецЕсли;
лУникальностьПоИНН=Ложь;
нЗадвоенийВсего=нЗадвоенийВсего+1;
обГруппировка.Параметры.НомерПоБазе=Строка(нЗадвоенийВсего)+".";
обГруппировка.Параметры.Заполнить(вбКонтрагентыКПП);
тдКонтрагенты.Вывести(обГруппировка);
нКонтрагент=0;
вбКонтрагентКод=вбКонтрагентыКПП.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Код");
тдКонтрагенты.НачатьГруппуСтрок();
Пока вбКонтрагентКод.Следующий() Цикл
вбКонтрагентСсылка=вбКонтрагентКод.Выбрать();
Пока вбКонтрагентСсылка.Следующий() Цикл
Сообщить(сИНН+" "+вбКонтрагентыКПП.КПП+" "+вбКонтрагентКод.Имя);
нКонтрагент=нКонтрагент+1;
обСтрока.Параметры.НомерПоКонтрагенту=Строка(нКонтрагент)+")";
обСтрока.Параметры.Заполнить(вбКонтрагентСсылка);
тдКонтрагенты.Вывести(обСтрока);
КонецЦикла;
КонецЦикла;
тдКонтрагенты.ЗакончитьГруппуСтрок();
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если тдЭлементФормы=Неопределено Тогда
// Если предстоит выводить отчет в отдельном окне, то проверить : есть ли задвоения ?
// Если задвоений нет, то лишнее окно на экран выводить не следует
Если нЗадвоенийВсего>0 Тогда
тдКонтрагенты.Показать("Отчет о задвоенных контрагентах");
Иначе
Сообщить("Нет задвоенных контрагентов !");
КонецЕсли;
Иначе
// Окно для вывода печати содержится на дополнительной закладке.
// По умолчанию, туда и так выводится отчет и сразу показывается информация.
КонецЕсли;
Возврат лУникальностьПоИНН;
КонецФункции
Я пользуюсь следующим перечнем префиксов :
|
Префикс |
Смысл, тип значения |
| "с" | Строка |
| "л" | Логическая |
| "н" | Number - Число (наследие языка Си) |
| "х" | Икс, любой тип значения |
| "б" | Булево |
| "дт" | Дата |
| "мк" | макет |
| "об" | область макета |
| "тд" | табличный документ |
| "зп" | запрос |
| "вп" | выполнить запрос |
| "вб" | выбрать из запроса |
| "сз" | Список значений |
| "тз" | Таблица значений |
| "тч" | Строка табличной части |
| "зн" | значение из списка значений |
| "пч" | Перечисление |
| "спр" | Справочник |
| "док" | Документ |
| "фрм" | Форма |
| "обр" | Обработка |
| "мс" | Массив |
Функция создана для проверки уникальности контрагентов по ИНН и КПП.
Поэтому в качестве переменной используется ключевое слово "Контрагент".
А благодаря применению префиксов я получил необходимое количество переменных для работы с записями в справочнике "Контрагенты".
Также благодаря префиксам переменных отпадает необходимость придумывать подробные имена переменных. Зачем тратить воображение и буквы, если с первого взгляда становится понятно :
| Переменная | Смысл, содержание |
| сИНН | ИНН контрагента, строка |
| лУникальностьПоИНН | Истина / Ложь - результат проверки уникальности справочника контрагентов |
| нКонтрагент | Счётчик контрагентов с одним ИНН |
| мкКонтрагенты | Макет печатной формы для задвоенных контрагентов |
| обЗаголовок | Область заголовка макета контрагентов |
| тдКонтрагенты | Табличный документ для вывода печатной формы задвоенных контрагентов |
| зпКонтрагенты | Запрос "Контрагенты" |
| впКонтрагенты | Результат выполнения запроса "Контрагенты" |
| вбКонтрагентыИНН | Выборка из запроса "Контрагенты" |
| спрОрганизация | Ссылка на справочник "Организации" |
Напоследок цитата из той же статьи из Википедии :
Преимущества
- Если встроенного механизма типизации не хватает, венгерская нотация позволяет записывать подтип[en] переменной — например,
int cPriceможет означать, что переменная имеет не просто целый тип, а валютный (currency). Именно такое применение префиксов было предложено Симони[2]. Это может пригодиться:
- В низкоуровневом программировании (когда набор доступных типов настолько узок, что, например, целый тип не отличается от булевого).
- В языках с динамической типизацией, например PHP, где одна и та же переменная может хранить значения любого типа.
- В инженерных расчётах (для записи единиц измерения). Это позволяет избавиться от немалого количества ошибок простым подсчётом размерностей.
- В других местах, где переменные одного и того же типа предназначены для хранения разнородных данных — например, в коде защиты от компьютерных взломщиков префикс может указывать на «безопасные» и «небезопасные» данные (SQL-инъекция, XSS).
- Венгерская нотация удобна для написания больших программ в неполнофункциональных (по современным меркам) редакторах без автоматизированной навигации по тексту. Скорее всего, именно поэтому она стала стандартным стилем кода в WinAPI.
- Венгерскую нотацию можно рассматривать как стандартную систему сокращений. Например, поле ввода для поиска и кнопка «Поиск» могут именоваться как
txtSearchиbtnSearch. Такая практика позволяет делать названия переменных короткими и в то же время осмысленными
Опрос по венгерской нотации:
А - Знаю, использую
Б - Знаю, не использую
В - Не знал раньше, попробую использовать
Г - Не знал раньше, отказываюсь применять
Благодарю за Ваши ответы!
Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Инструментарий разработчика Рефакторинг и качество кода Разработчик 1С 8.3 Абонемент ($m)
Проверила, что Analyzer 1C 2.7.65 умеет по руководству и по ответам его REST: граф вызовов, запросов и прав есть; готовых проверок правил команды и CLI для них в исследованной поставке не нашла. Записала договорённости команды правилами, сняла базовую линию на типовой УТ 11.5 (1776 старых нарушений по шести правилам) и на «Нано-УТ» заложила 5 новых: проверка нашла все пять, ложных 0. Прилагаются инструмент с 92 тестами и материалы опыта.
1 стартмани
29.10.2026 379 Ninel_S 0
Рефакторинг и качество кода Разработчик 1С:Предприятие 8 Россия Бесплатно (free)
Одна проверка в обработчике кнопки может выглядеть достаточной, пока ту же операцию не вызовут из другого места. На примере управляемой формы разберём, почему так происходит, как разместить проверку в общей серверной функции и чем отличается удобная проверка ввода от обязательного условия выполнения операции.
29.10.2026 301 YA_777378709 0
Рефакторинг и качество кода Разработчик Бесплатно (free)
Рассказываем, почему качественный код – это не техническая прихоть, а актив, который помогает бизнесу быстрее адаптироваться к изменениям и запускать новые фичи без бесконечного преодоления техдолга. Показываем, как объяснить бизнесу ценность рефакторинга через понятные признаки: замедление разработки, неточные оценки, страх перед legacy и хрупкость системы. Разбираем, почему неправильный рефакторинг может быть дороже его отсутствия, какие анти-паттерны ломают процесс и как не превратить улучшения в бесконечную переделку ради переделки. Объясняем, как сделать рефакторинг частью культуры команды: договориться с бизнесом, научить разработчиков видеть проблемные места, закрепить правила и поддерживать улучшения на уровне тимлидов, архитекторов и всей команды.
28.10.2026 406 Pavel791 0
Рефакторинг и качество кода HighLoad оптимизация Системный администратор Разработчик Стажер 1С 8.3 Абонемент ($m)
Если к HTTP-сервису 1С обращаются сразу несколько программ, сколько запросов в секунду он успеет обработать? Я опубликовала простой HTTP-сервис на нашей "подопытной" конфигурации «Нано-УТ» (файловая база, Apache, без прав администратора) и нагрузила его скриптом на Python. Ответ: около 15-16 запросов в секунду, сколько бы клиентов ни обращалось одновременно. Запросы ждут своей очереди, и при 32 клиентах ответ приходит через 2 секунды вместо 64 мс. Заодно разобрала скрипт из первого варианта статьи: он «проверял» сервер, который отвечал по одному, и считал ошибки вместе с успешными ответами. В архиве исправленный скрипт, учебный сервер, HTTP-сервис для 1С и инструкция по запуску.
1 стартмани
23.10.2026 471 Ninel_S 3
Рефакторинг и качество кода Разработчик 1С 8.3 Абонемент ($m)
Запустили Analyzer 1C 2.7.65 на промышленной конфигурации (596 модулей, 13 669 функций) и исследовали перегруженные функции (до 1887 строк), циклические зависимости и экран «Циклы» (кольцо из 64 модулей). Разобрали, почему популярные метрики (McCabe, связность) не представлены в продукте вендора, и составили пошаговый план разделения модуля. Привели проверенный платформой 8.3.27 пример до и после рефакторинга и выявили скрытую ловушку загрузки модулей с точкой в имени.
9 стартмани
19.10.2026 413 Ninel_S 2
Рефакторинг и качество кода EDT СКД Разработчик 1С 8.3 1С 8.5 1С:Бухгалтерия 3.0 Бесплатно (free)
Одиннадцать граблей схем компоновки, которые не видно в конструкторе и не ловит EDT, на реальных отчетах БП КОРП. Формат числа задается в двух местах, и условное оформление варианта перебивает формат поля. Ресурс складывает штуки с часами, и помогает выражение «только когда единица одна». Ресурс пуст в детальных записях, параметр не появляется в шапке без userSettingID, valueListAllowed ломает границы периода, Остатки и СрезПоследних с параметром периода падают с «Несоответствием типов», title без xsi:type дает «Исключение XDTO» при загрузке. В конце код проверки схемы из файла до обновления базы, сводная таблица и чеклист.
16.10.2026 441 Konstmax13 2
Инструментарий разработчика Нейросети Рефакторинг и качество кода EDT Разработчик 1С 8.3 1С 8.5 1С:Бухгалтерия 3.0 Бесплатно (free)
Как ИИ-агент (Claude Code) работает в живом EDT-проекте 1С:Бухгалтерии КОРП 3.0: из чего собрать стенд с MCP-сервером для EDT, как ставить задачи агенту, где он ломает проект и какие проверки это ловят. Реальные случаи: рукописные метаданные, ронявшие конфигуратор; четыре дня зависшего обновления из-за порядка блоков в Rights.rights; ошибки, которые EDT пропускает, а платформа нет; сплошная сверка вместо «вроде работает». В приложении шаблон CLAUDE.md, шаблон правила, чеклист перед обновлением базы и скрипты проверки ролей и схем СКД.
15.10.2026 3342 Konstmax13 11
Рефакторинг и качество кода Тестирование QA Разработчик 1С 8.3 Абонемент ($m)
Инженерный анализ влияния (Impact Analysis) при изменении общего метода в 1С:Предприятии: почему штатный поиск ссылок скрывает 99% зависимостей и как обратный обход графа вызовов выявляет 370 скрытых потребителей на глубине 3 уровней. В статье — верификация сквозной цепочки обмена с маркетплейсом; в архиве-компаньоне — автономный BFS-анализатор на Python, слепки графа и план регрессионного тестирования.
1 стартмани
12.10.2026 275 Ninel_S 0
префиксы переменным и функциям (да-да, функциям тоже, в зависимости от того, какой тип данных эти функции возвращают) я придумывал свои.
естественно, на языке 1С я стал писать, тоже используя свои префиксы.
например:
- спрслк - СправочникСсылка;
- спробк - СправочникОбъект;
- докслк - ДокументСсылка;
- докобк - ДокументОбъект;
- перслк - ПеречислениеСсылка;
- пвхслк - ПланВидовХарактеристикСсылка;
- пвхобк - ПланВидовХарактеристикОбъект;
- плнобслк - ПланОбменаСсылка;
- плнсчслк - ПланСчетовСсылка;
- мсв - Массив;
- ств - Соответствие;
- стт - Структура;
- элмсв - Элемент массива;
- клзнств - КлючЗначение соответствия;
- клзнстт - КлючЗначение структуры;
- ч - Число
- стр - Строка;
- фл - Булево (от слова Флаг - это из «мира» Ассемблера);
- дт - Дата;
- тз - Таблица значений;
- сз - Список значений;
- стртз - Строка таблицы значений;
- элсз - Элемент списка значений;
- т - Тип;
- от - Описание типов;
- оо - Описание оповещения;
- зпр - Запрос;
- реззпр - Результат запроса;
- выбзпр - Выборка запроса;
- мкт - Макет;
- тблдок - Табличный документ;
- обл - Область табличного документа;
- длг - Диалог выбора файла или чего-нибудь другого;
- тктдок - Текстовый документ;
- зпxml - ЗаписьXML;
- чтxml - ЧтениеXML;
- зпjsn - ЗаписьJSON;
- чтjsn - ЧтениеJSON;
- xdto - различные XDTO объекты;
- дд - Двоичные данные;
- хз - Хранилище значения;
и многие другие.
Потом наступила эра русскоязычных названий на 1С, где немалое преимущество - чтение кода как обычного текста. И с уверенностью могу сказать, что неудобно было использовать эту нотацию.
"Если Отказ Тогда" или из примера выше намного проще по русски читать так:
Функция НомерКолонки(МассивКолонок, ИмяКолонки)
НомерКолонки = 0;
Для каждого Колонка из МассивКолонок Цикл
НомерКолонки = НомерКолонки + 1;
Если Колонка.Имя = ИмяКолонки Тогда
Возврат НомерКолонки;
КонецЕсли;
КонецЦикла;
Возврат 0;
КонецФункции; ПоказатьФункция НомерКолонки(МассивКолонок, ИмяКолонки)
Возврат МассивКолонок.Индекс(МассивКолонок[ИмяКолонки]) + 1;
КонецФункции;Можно ещё добавить проверку на принадлежность искомой колонки массиву колонок.
На моей практике не встречалось случаев, когда можно было бы не найти нормальных имён для переменных и приходилось бы выражать типы значений переменных префиксами. Не стОит умышленно перечёркивать весомое преимущество русскоязычной платформы.
Наверное, в особо критических случаях и у меня может возникнуть такая же мысль.
Хотя я стараюсь придерживаться точки зрения, что сам иногда допускаю обидные "ляпы".
Сам я ведь когда-то тоже был начинающим программистом и делал "детские" ошибки.
В общем, думая о других со злостью, готовы ли мы простить себя за свои бывшие ошибки ?
Поэтому простить нужно не себя, а тех, кто предъявлял к нам избыточные требования, если все это сегодня действительно никому не нужно.
Смайлик, конечно, не заметен в тексте? И в цитату специально его не включили, надо полагать, чтобы о "злости" можно было сказать?
Раньше не знал, но иногда встречалась подобная префиксация, теперь буду знать, что она означает.
Возможно, дело вкуса и привычек каждого, но для меня "МассивРеквизитов" выглядит привлекательнее, чем "мсРеквизиты" или что-то подобное.
Один из плюсов : меньше букв набирать.
А второй плюс : префикс воспринимается как "фон" для смысла самой переменной.
Всё-таки чем короче словосочетание, тем быстрее понимается.
(25)
я у себя ещЁ использую «отображение пробелов и табуляции». давно к этому привык. даже в Word использую отображение форматирования. данные «метки» реально воспринимаю как фон.
возможно мало кто пользуется (а может и много кто) в 1С 8.х есть «#Область... #КонецОбласти». это в «мир» 1С пришло (я так полагаю) из «мира» Visual C++. по крайней мере я впервые там это «нововведение» встретил и стал активно его использовать.
в 1С я использую «области» для группировки кода, который относится к одному смыслу, и для «сворачивания» 100500 строк запроса. лично мне так очень удобно.
#Область обработчики_событий_элементов_формы
…
#КонецОбласти // обработчики_событий_элементов_формы
#Область обработчики_событий_формы
…
#КонецОбласти // обработчики_событий_формы
ПоказатьСам венгерскую нотацию не использую, а вот кто к ней привык уже отказаться трудно.
Когда первый раз сталкиваешься с исходным текстом программы и если нет пояснения от разработчика, и нет "расшифровки" префиксов в дополнение к исходному коду, то действительно сложно понять эту абру-кадабру.
Нет никаких "двойных" стандартов. Есть стандарт фирмы "Камин". К тому же могут быть "исторические" предпосылки к применению ВН. Например когда то давно кто то этот стандарт ввёл внутри компании и теперь учитывая большое количество кода отказаться от неё просто так не могут. То что фирма Камин использует ещё не значит что это правильный и хороший подход.
К тому же не верно делать выводы на основании одного случая. Одна фирма использует, 99 компаний не используют... "Ошибка выжившего".
мне довелось поработать во многих компаниях (торговля, производство, 1С-франчи и даже аутсорс). где-то мне доставался типовой код Фирмы 1С, где-то самописное всЁ было, где-то после кучи разных программистов из 1С-франчей. скажу одно - каждый пишет как умеет. уверен, что кто мой код видел, наверное тоже отзывался не айс, так как либо привык видеть и писать иной код.
в одном 1С-франче я дорабатывал код для нескольких заказчиков после штатных программистов этого франчи. там принцип написания кода был практически един: с «клиента» сразу переходят на «сервер» и там всЁ делают. на «клиенте» кода практически никакого не писали. максимум проверка, что реквизит не пустой, и тут же переход на сервер. мало того, они даже не использовали «&НаСервереБезКонтекста», а тупо всегда и везде писали «&НаСервере». на мой вопрос «зачем и почему так?» отвечали, что на клиенте нельзя работать с таблицами значения, а если без контекста, то не доступны реквизиты на форме. на следующий мой вопрос, что необходимые значения этих реквизитов можно передать как параметры в процедуре или функции, получил ответ: «а зачем? &НаСервере написал и делай что хочешь».
это я немного покидал камушков в огород так называемого «стандарты разработки на 1С».
на моЁм опыте, если не во всех, то скорее всего в очень многих 1С-франчах существует текучка программистов. по разным причинам. где программист оказался плохой, где слишком медленный. собственно в этом и корень всех проблем в 1С-франчах - они покупают сертификаты, а продают часы (для тех, кто не понял: франчи стремятся каждого своего программиста сделать сертифицированным, чтоб этим бравировать перед клиентами, типа имидж и статус, а стоимость услуг своим клиентам выставляют в потраченных человеко-часов на выполнение их задач).
поэтому у программистов нет времени вникать в задачу, разбираться в ней «что да как и почему именно так, а не иначе». программисты в франчах стремятся по-быстрому написать код, лишь бы требуемая задача заработала так, как это хочет клиент. и когда встречаешь такой код (а часто это говнокод), то приходится помимо своей задачи ещЁ и переписывать его. про порой хаотичное форматирование кода я вообще молчу (наверное код откуда-то просто копипастили и некоторые моменты в нЁм подправляли), таких «заплаток» море.
2. Имена следует образовывать путем удаления пробелов между словами. При этом, каждое слово в имени пишется с прописной буквы. Предлоги и местоимения из одной буквы также пишутся прописными буквами.
Пример:
Перем ДиалогРаботыСКаталогом; // Диалог работы с каталогом
Перем КоличествоПачекВКоробке; // Количество пачек в коробке
Примеры некорректных имен переменных:
масРеквизитов, соотвВидИмя, новСтр
Ну и мои 5 копеек - оооочень удобно формулы с такими именами читать.
Обычное сложение в таких типовых зачастую не прочитать, если у тебя экран меньше 17".
Ну и как можно прислушиваться к тем, кто постоянно не доделывает вещи до конца.
Кто может спокойной вставить ДВА новых параметра в середину, а не в конец:
Было
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
Стало
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
Нас за такое в институте повесил бы препод лично.
Разработчики типовых и разработчики платформы разные люди и ту функциональность и подходы которые закладывают разработчики платформы разработчики типовых не всегда понимают и следуют ей.
З.Ы. Это мнение сотрудника 1С высказанное в одном из курсов обучения разработке.
Кстати, пугают, что детей в детский сад не примут или напротив выставят из него.
Чтобы принимать решение, важно понимать плюсы и минусы выбора.
Я иногда обхожусь и без префиксов.
Я бы код сделал чуть по-другому :
// Сначала попытаемся найти строку, на которую непогашенную сумму, можно отнести без ошибок округления
Если НепогашеннаяСумма <> 0 Тогда
тзТовары = Товары.Выгрузить();
тзТовары.Сортировать("Сумма Убыв");
ТестоваяСтрока = Товары.Добавить();
Для нТовары = 0 По тзТовары.Количество() - 1 Цикл
СтрокаТабличнойЧасти = тзТовары[нТовары];
Если СтрокаТабличнойЧасти.Пометка Тогда
ЗаполнитьЗначенияСвойств(ТестоваяСтрока, СтрокаТабличнойЧасти);
Показатьто есть вместо счётчика "Сч" вставил "нТовары" (н - number)
Согласитесь : Проблема не в самой "венгерской нотации", а в непонимании, что автор программного кода хотел сказать, применив какой-либо префикс.
Переменная "Сч" : "Счётчик" или "Счёт". Если вчитаться, то это "Счётчик". Но иногда ведь бывает и "Счёт".
А использовать совместно транслит и русские слова - это феерично.8-D
Дополню автора копи/пастой википедии, которую он почему-то упустил:
- Некоторые программисты считают, что использование префиксов делает имена переменных менее понятными и, таким образом, ухудшает читаемость кода.
- Если неизвестно имя переменной без префиксов, подчас трудно восстановить её префиксы.
- Система автодокументации, если она не понимает системы префиксов, отсортирует алфавитный список по префиксу, что может отрицательно сказаться на качестве документации. Впрочем, имена функций обычно префиксами не снабжают.
- Запись нескольких префиксов из-за частого использования заглавных букв и знаков подчёркивания может стать «пляской на кнопке ⇧ Shift».
- Средства навигации, которые включены в современные редакторы кода, и так позволяют видеть тип любой переменной и быстро переходить к точке, где она определена — то есть, использование префиксов может быть избыточным.
- При изменении типа потребуется изменять имя переменной (не все редакторы кода могут делать это автоматически).
- Существуют и другие средства задания типа переменной в её имени: например, слова is, has и т. д. для булевского типа (IsLoggedIn), count для счётчика (RefCount), множественное число для массива (UserIds). В языках, в которых заглавные буквы не эквивалентны строчным, регистр букв также может кодировать что-либо.
-Известный противник венгерской нотации — Линус Торвальдс: «Вписывание типа переменной в её имя (так называемая венгерская нотация) ущербно — компилятор и так знает типы и может проверить их, и это запутывает программиста».
Автор хотел поделиться своим успешным опытом. Но получил в ответ убеждения в том, что таким способом практически никто не пользуется
И как раз такие рецензенты и потрудились вставить недостающий, с их точки зрения, текст из Википедии в обсуждении к статье.
Видимо, идея применять "венгерскую нотацию" в текстах 1С многих пугает.
Я допускаю такой вариант, если кто-то будет поддерживать мои разработки.
В этом случае достаточно новому программисту ознакомиться с таблицей кодировки : какой префикс что означает. И можно спокойно читать исходные тексты любителей венгерской нотации.
Такая таблица может храниться в макете отчёта, обработки, общем модуле.
В доисторические времена, когда в языках действовали ограничения на длину имен, мы нарушали это правило по необходимости — и не без сожалений . В Fortran первая буква имени переменной обозначала код типа . В ранних версиях BASIC имена могли состоять только из одной буквы и одной цифры . Венгерская запись (HN, Hungarian Notation) подняла эту проблему на новый уровень .Венгерская запись играла важную роль во времена Windows C API, когда программы работали с целочисленными дескрипторами (handle), длинными указателями, указателями на void или различными реализациями «строк» (с разным применением и атрибутами) . Компиляторы в те дни не поддерживали проверку типов, поэтому программистам были нужны «подсказки» для запоминания типов .
В современных языках существует куда более развитая система типов, а компиляторы запоминают типы и обеспечивают их соблюдение . Более того, появилась тенденция к использованию меньших классов и более коротких функций, чтобы программисты видели точку объявления каждой используемой переменной . Java-программисту кодировать типы в именах не нужно . Объекты обладают сильной типизацией, а рабочие среды развились до такой степени, что могут выявить ошибку типа еще до начала компиляции! Таким образом, в наши дни венгерская запись и другие формы кодирования типов в именах превратились в обычные пережитки прошлого . Они усложняют изменение имени или типа переменных, функций и классов . Они затрудняют чтение кода . Наконец, они повышают риск
того, что система кодирования собьет с толку читателя кода .
***
Код должен быть как можно более выразительным . Слишком длинные выражения, венгерская запись, «волшебные числа» — все это скрывает намерения автора .
Суть в том, что переменные нужно именовать так, чтобы из их названия было четко понятно, для чего они. Тогда необходимости в дополнительных нотациях уже не будет.
Иногда действительно удобно обозначить название переменной так, чтобы был понятен смысл и содержание переменной, например, "СписокКлиентов", "СтрокаИнформации", "МассивСсылок". Но это не Венгерская нотация, а просто название переменной.
Вобщем я согласен с Робертом Мартином и против лишних префиксов.
Как по мне, префиксы можно использовать чтобы не было конфликта имен в разных областях видимости.
Например, на форме описан реквизит с именем "Имя1" и в одной из функций описанной в модуле формы вот просто стойкое желание появилось именно с таким же именем переменную заюзать, тогда можно и префикс дописать, но смотрится уже не так как хочется, однако есть же ключевое слово "Перем" позволяющее объявить явно переменную с нужным именем внутри функции/процедуры.
Выходит стоит на постоянной основе явно объявлять переменные, но все отвыкли от этого, так как язык 1С это допускает.
у Вас МассивСсылок у меня мс_СсылкиДокументов - длина примерно одинаковая, а смысловое наполнение у меня больше при приемлемой длине переменных, т.к. выражение еще же надо поместить в одну строку на экране, а поместить
МассивСсылокДокументовПросточенныхИнвентаризацииВозвратовОтО
не так тривиально, и замена Массив на мс_; РезультатЗапроса на рз_; вам может прилично сократить строку.
Вдобавок у нас в 1С все же не ООП, а ПОП - предметно ориентированное программирование и количество используемых классов у нас задано в платфоме и обычно не больше 2х десятков в одном модуле.
Далее - Вы передаете переменные аргументами в другую функцию - и там получаете их уже без объявления и среда разработки вам никак не подскажет, какие методы есть у аргумента. А префикс - подскажет. И если Вам надо поправить код внутри другой функции - то префикс Вас избавит от бегания по всем волженным переопределяемым и прочим модулям с поиском места его объявления, осбенно если отладчик Вам не доступен.
Про аргументы сильной типизации в 1С и отлавливание ошибок на этапе компилятора это для 1С особенно сильно конечно. Одна из фатальных ошибок это смена типа переменной и вот в том числе для этого венгерская запись и нужна.
Могу сказать что венгерская запись сэкономила мне десятки часов при написании и сотни при поддержке кода в языке без типизации. Правильно расставленные префиксы в разделенной декларативной с императивной манерой написания кода - ничего лучшего для дальнейшей поддержки на 1С не встречал настолько, что это другой вообще уровень самодокументации кода. Совершенно другой уровень, недостижимый никакими "правильными именами переменных".
Таким образом, в наши дни венгерская запись и другие формы кодирования типов в именах превратились в обычные пережитки прошлого
Вспоминается старый анекдот про маленькую кастрюльку и сосиски: когда люди действуют по-старинке, потому что так было заведено.
Тоже полностью согласна с Робертом Мартином. Как по мне, читабельность чужого кода, где использовалась венгерская запись, ухудшается. Если даже автор кода где-то оставил комментарий с расшифровкой использовавшихся им префиксов, вряд ли удобно при чтении кода постоянно сверяться со списком. Тоже считаю, что иногда в наименование переменной вполне есть смысл добавить имя типа, но не в виде префикса, т.е. как в примерах, что вы привели. А булево при необходимости можно обозначать словом "Это": "ЭтоВнутреннийСовместитель", "ЭтоПлан" и т.д.
Тех, у кого за долгие годы сложился свой стиль, я разве убеждаю бросить все свои привычки и срочно перейти на "венгерскую нотацию" ?
Для Вас это может быть и спор.
Для меня это возможность поделиться удобным способом.
Мне не нужно спорить, чтобы что-то себе доказать.
Пусть каждый найдёт свой стиль. Лично я спокойно отношусь к исходникам других авторов.
А своих исходниках, иногда приводил свою таблицу соответствий. Это должно решать вопрос полного понимания.
Хотя венгерская нотация сама по себе интуитивно понятна, если раньше про неё немного слышал.
Долгое время я переделывал цветовую гамму конфигуратора на монохромный. Когда на курсах по платформе это увидел препод, он весомо заметил "Не пытайтесь подстраивать под себя платформу и использовать уникальный стиль программирования. Так вы усложняете жизнь и себе, и другим." Со временем я бросил эту затею и привык к штатной цветовой гамме. Я не переделываю её теперь на каждом компе и севший после меня программер не восклицает "омг, что за хрень тут с 1С случилась!"
Так же и тут вы советуете новичкам использовать архаизм. Это плохо.
Разве статья о типизации переменных ?
Это бывает удобно при работе в отладчике
Но при этом польза и в том, что :
1)В модулях объектов это позволяет избежать затирку переменных типовой конфигурации или реквизитов и табличных частей.
2)Увеличивает количество доступных для разработки переменных, которые названы однотипно
3)Сокращает длину переменных
4)Делает код лучше читаемым.
Естественно, это моё субъективное мнение.
Ломать свои привычки каждому из нас трудно, особенно если нет особой выгоды.
Для кого-то выгода в том, что увидев процедуры и функции с венгерской нотацией, сможет легко разобраться в чужом коде.
Если 1/10 программистов иногда применяет этот способ - уже хорошо.
А некоторые просто не слышали о таком методе.
Странная ситуация получается : у меня многолетний способ применения нотации. Я рассказываю о своём успешном опыте на конкретных примерах,
А меня в ответ отговаривают и убеждают прекратить это.
Разве я кого-то отговариваю от его персонального способа написания переменных ? От чего же так немилостивы некоторые рецензенты ?
И "гуглить "то не знаю что" - какой результат ожидаете ?
Ничего не затирается, потому что глобальные переменные начинаются с префикса "гл", а реквизиты адресуются через "Объект". Исключение - модуль объекта, но и там ничто не мешает использовать новичкам "ЭтотОбъект", раз уж вы считаете этот кейс настолько распространённым.
В примере выше я показывал, что в русском языке достаточно слов и словосочетаний для уникальных имён переменных. А если проблемы всё же возникают, то следует поработать в направлении более точного определения сущности переменных и развитием лексикона. У меня в примере не было проблем с дублированием имён переменных, так ведь?
Садись, два. Ctrl+Пробел работает во всех версиях платформы.
В примере выше я наглядно показал, насколько лучше читается код с переменными, именованными в соответствии со своей сутью.
Считаю навязывание утратившей актуальность практики программирования начала 90х вредным для сообщества.
А в языках со статической типизацией разве тип переменной определяется префиксом ?
Суть статьи изложена в её первом абзаце.
За счёт префикса переменной можно получить достаточное количество переменных для работы с одним понятием.
Но пока наблюдаю неопределённые отсылы к другим ссылкам. Может, текст запроса для поиска на www "наставник" пришлёт Или явно напишет, что хотел сказать.
Сложно услышать, когда не говорят конкретно, что беспокоит. А намекают то на типы языков с динамической типизацией. То отсылают ещё что-нибудь погуглить.
Такое ощущение, меня пытаются отговорить от того, что удобно мне и что доказало свою пользу.
Может, моя статья пытается кого-то из коллег отговорить от собственного стиля работы с переменными ?
Тогда в чём дело ? Попробуйте объяснить.
Никто вас не отговаривает. Продолжайте делать так как вам нравится.
1С не единственный язык с динамической типизацией. Внезапно?
От того кто даже не попробовал никакого.
В MS где на сколько я знаю и придумали использовать HN почему то от неё отказались... даже жирным выделили.
"Да я всегда так делала", "Да мы всегда так работали" и тд. Любой бухгалтер которому сказали что он делает что то не правильно. Но это не аргумент.
Иногда встречается ещё не есть система префиксов. Если бы эта система была из разряда best practics то наверное её использовала бы 1С, она была бы описана в стандартах и ею бы пользовались. В коде можно много чего встретить, его пишут люди. Применить один раз префикс "тз" это не то же самое что писать весь код таким подходом.
Звучит как клуб анонимных ....
Пусть каждый придерживается общепринятых стандартов и практик в конкретной среде и языке.
Только надо знать в каком макете или какой обработке она хранится. Внезапно окажется что у 10 программистов 10 разных стандартов префиксации и они работают над одним проектом....
Намекают не на "типы", а прямо говорят что тип переменной определяется хранимым в ней значением. И если вдруг окажется что там будет другой тип? Или необходимо в переменную поместить значение другого типа, то придётся создавать ещё одну переменную?
Не надо учить других плохому.
Для того что бы "помнить" какого типа переменная есть другие подходы.
Варианты СписокКлиентовПорядочных , СписокВредныхРаботниковПоКоторымОбязательноПроизойдетКакойЛи
по непонятным причинам не только выговорить, но и написать не могу...
С днем Победы!
За 30 лет - это опыт программирования, видимо ? То есть :
Как не применяете - это понятно. Я тоже стараюсь быть кратким при создании переменных в разумных пределах.
Хотя в одной моей разработке я был вынужден использовать переменные-словосочетания из 3 и даже 4 слов.
А что означает
Можете привести несколько примеров ?
И только затем можно говорить о командной работе, преемниках и удобстве обслуживания вашего кода другими людьми.
Какой смысл пытаться стать полноценным членом команды при отсутствии понимания программы?
Другой вопрос в том что рефакторинг становится сложнее. Его и раньше было сложно обосновать в финансовом плане.
Вы будете от своего ребенка требовать в год и два месяца грамматически верно произносить прозу Толстого?
То, что программисты взрослые люди не значит что при использовании нового для них языка программирования они должны правильно писать переменные для того чтобы текст был понятен всему коллективу.
Они пишут для 1с. Главное чтобы правильно понимала платформа. Тогда и ошибок будет меньше.
Попробуйте код прочитать вслух.
Сейчас венгерскую нотацию практически не используют, по крайней мере - в чистом виде. Потому что современные IDE в таких языках умеют подсказывать тип.
В 7.7 я еще использовал элементы венгерской нотации. Типа "тз", "сз" и так далее. Но в 8-ке стиль работы с коллекциями изменился в лучшую сторону плюс, хочется верить, мой стиль кодирования тоже улучшился. И венгерская нотация лично мне стала неприятна. Без нее код можно сделать более читабельным. Сейчас я использую разве что "м" для переменных модуля, но переменные модуля я тоже практически не использую. Можно сказать, что сейчас я использую элементы венгерской нотации для уточнения смысла в названии переменных ("СтрокаБлаБла", "ЭлементБлаБла", "ТаблицаБлаБла" и так далее). Но это читается естественно и не имеет недостатков венгерской нотации в ее чистом виде.
Если не размазывать контекст, хорошо структурировать код и давать хорошие смысловые имена переменным - в венгерской нотации в чистом виде нет необходимости. Такое мое мнение, к которому я эволюционно пришел :)
А как 1С:8 подсказывает тип , если Вы её причисляете к современным IDE ?
Это точку надо поставить после переменной ?
Интересно взглянуть на Ваш стиль программирования на примерах, где применяются таблицы значений, массивы, списки значений, ссылки (справочники, документы) и объекты (справочники, документы).
Правильно говорят : лучше один раз увидеть, чем сто раз услышать.
Это точку надо поставить после переменной ?
Это было не про 1С. Это было про причины появления венгерской нотации и причины снижения ее востребованности.
В 1С и большинстве других скриптовых языков все гораздо проще с основными типами. Это часть их концепции (упрощение). Указателей и прочей низкоуровневой шняги тоже нет. Поэтому проблема, для решения которой использовали венгерскую нотацию, изначально остро в них не стояла.
(67)
Да стандартный стиль. В таком духе:
&НаКлиенте
Процедура ОтобразитьИнформациюОбАкциях(Команда)
ТекущиеДанные = Элементы.ТаблицаПлана.ТекущиеДанные;
НоменклатураОтбора = Неопределено;
Если ТекущиеДанные <> Неопределено Тогда
НоменклатураОтбора = ТекущиеДанные.Номенклатура;
КонецЕсли;
ФормаСпискаАкций = ПолучитьФорму("Справочник.Акции.ФормаСписка", Новый Структура("ЗакрыватьПриЗакрытииВладельца", Истина), ЭтаФорма, , ВариантОткрытияОкна.ОтдельноеОкно);
ФормаСпискаАкций.РежимОткрытияОкна = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца;
СписокВлияющихАкций = Новый СписокЗначений;
СписокВлияющихАкций.ЗагрузитьЗначения(ПолучитьМассивВлияющихАкций(НоменклатураОтбора));
ЭлементОтбора = ФормаСпискаАкций.Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
ЭлементОтбора.ПравоеЗначение = СписокВлияющихАкций;
ЭлементОтбора.Использование = Истина;
ФормаСпискаАкций.Открыть();
КонецПроцедуры
&НаСервере
Процедура РассчитатьИтогиПлана()
МассивДнейПланирования = ПолучитьМассивДнейПланирования(Объект.НеделяПланирования);
КоличествоДнейПланирования = МассивДнейПланирования.Количество();
// рассчитаем итоги по строкам
Для Каждого СтрокаПлана Из ТаблицаПлана Цикл
КвоРасчетИтог = 0; КвоПланИтог = 0;
Для НомерДня = 1 По КоличествоДнейПланирования Цикл
КвоРасчетИтог = КвоРасчетИтог + СтрокаПлана["КвоРасчет"+НомерДня];
КвоПланИтог = КвоПланИтог + СтрокаПлана["КвоПлан"+НомерДня];
КонецЦикла;
СтрокаПлана.КвоРасчетИтого = КвоРасчетИтог;
СтрокаПлана.КвоПланИтого = КвоПланИтог;
КонецЦикла;
// рассчитаем итоги по колонкам
ОтмеченныеСтроки = ТаблицаПлана.Выгрузить().Скопировать(Новый Структура("Пометка", Истина));
Для НомерДня = 1 По КоличествоДнейПланирования Цикл
Элементы["ТаблицаПланаКвоРасчет"+НомерДня].ТекстПодвала = Формат(ОтмеченныеСтроки.Итог("КвоРасчет"+НомерДня),"ЧЦ=14; ЧДЦ=0");
ЭтаФорма["КвоПланИтого" + НомерДня] = ОтмеченныеСтроки.Итог("КвоПлан"+НомерДня);
КонецЦикла;
Элементы["ТаблицаПланаКвоРасчетИтого"].ТекстПодвала = Формат(ОтмеченныеСтроки.Итог("КвоРасчетИтого"),"ЧЦ=14; ЧДЦ=0");
КвоПланИтого = ОтмеченныеСтроки.Итог("КвоПланИтого");
КонецПроцедуры
&НаСервере
Функция ЗаписатьЗаказНаСервере(СтруктураОтчета)
Подразделение = УправлениеОтчетамиКлиентСервер.ПолучитьПредопределенныйПользовательскийОтбор("Подразделение", Отчет.КомпоновщикНастроек).ПравоеЗначение;
Если НЕ ЗначениеЗаполнено(Подразделение) Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Необходимо указать подразделение");
Возврат Ложь;
КонецЕсли;
Дата = УправлениеОтчетамиКлиентСервер.ПолучитьПользовательскийПараметр("ДатаПоставки", Отчет.КомпоновщикНастроек).Значение.Дата;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗаказФилиала.Ссылка,
| ЗаказФилиала.Утвержден
|ИЗ
| Документ.ЗаказФилиала КАК ЗаказФилиала
|ГДЕ
| ЗаказФилиала.Дата = &Дата
| И ЗаказФилиала.Подразделение = &Подразделение";
Запрос.УстановитьПараметр("Дата", Дата);
Запрос.УстановитьПараметр("Подразделение", Подразделение);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Заказ = Выборка.Ссылка.ПолучитьОбъект();
Если Выборка.Утвержден Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Заказ филиала уже утвержден. Необходимо отменить утверждение перед изменением заказа");
Возврат Ложь;
КонецЕсли;
Иначе
Заказ = Документы.ЗаказФилиала.СоздатьДокумент();
Заказ.Дата = Дата;
Заказ.Подразделение = Подразделение;
КонецЕсли;
ДанныеРасшифровкиОтчета = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
Заказ.Заказ.Очистить();
Для Каждого СтрокаНоменклатуры Из СтруктураОтчета.СтрокиНоменклатуры Цикл
Если СтрокаНоменклатуры.Значение = 0 Тогда
Продолжить;
КонецЕсли;
Если СтрокаНоменклатуры.Значение.Заказ = 0 Тогда
Продолжить;
КонецЕсли;
Номенклатура = УправлениеОтчетами.ПолучитьСтруктуруПолейРасшифровки(ДанныеРасшифровкиОтчета.Элементы[СтрокаНоменклатуры.Ключ]).НоменклатурнаяГруппа;
СтрокаЗаказа = Заказ.Заказ.Добавить();
СтрокаЗаказа.Номенклатура = Номенклатура;
СтрокаЗаказа.Заказано = СтрокаНоменклатуры.Значение.Заказ;
КонецЦикла;
Заказ.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
Возврат Истина;
КонецФункции Показать(68)
Речь о читабельности кода, а не о поиске ошибки в компайл-тайме. Притом ведь использовалось и явное приведение типов и другие хитрые ситуации были позволяющие легко отстрелить себе ногу, когда компилятор не поможет. И без понимания исходного типа разбираться было сложно. А в 1С чтобы промазать с типом нужно весьма постараться. Их же минимум-миниморум. Не, если вы даете имена переменным в стиле "сА1" и "дтА2" - тогда конечно, явное указание типов весьма пригодится.
Насколько я помню, в Си просто компилятор выдал бы ошибку. Пришлось бы потратить время на исправление выражения в исходном тексте.
В 1С нет статической типизации и поэтому свой промах с типом переменной требует значительного времени, чтобы найти эту ошибку.
(67)
Откройте современную типовую(УТ11, ЗУП3 и тд), соглашения по написанию кода с ИТС и смотрите как там код пишут и не забывайте про "здравомыслие" что бы не впадать в крайности. Типа "вот тут 1Сники отошли от стандарта" значит можно весь код писать как попало.
Как то взяли разработчика, первым делом дали ему стандарты и соглашения по написанию кода, мы же всё таки в команде работаем. Так вместо того что бы учится писать по правилам принятым 1С и в той компании где мы все работали он(как и вы с примером из УПП) искал отклонения от стандартов в типовых и всем кругом говорил смотрите 1Сники не соблюдают стандарты по этому и он не обязан.
А свой говнокод называл "собственным стилем и виденьем художника".... через месяц был уволен...
Нужно отличать системное программирование (в т.ч. близкое к железу) от программирования бизнес-логики.
В программировании бизнес-логики с переменными красота - они почти всегда отражают конкретные аспекты бизнес-области. В итоге им можно давать "говорящие" имена, которые автоматически закрывают многие вопросы. В системном программировании не так. Там больше на математику с физикой похоже. Это еще одна причина, почему вопрос понимания типов в С/С++ стоял более остро (сами же win api упоминали в первую очередь).
но вы своими неудобными префиксами всё извратили в худшую сторону.
Префикс - это необязательно 1-2 буквы.
Префикс "Массив" - это тоже префикс.
Префиксы:
"мс" - надо "Массив"
"тз" - надо "ТЗ"
и др.
"Казахская нотация" ито намного лучше ваших префиксов, но устарел
Для всего будет тяжело использовать, но для примитивных типов самое то. Чаще всего конечно стараюсь чтобы название несло в том числе и смысловую нагрузку. Самый простой пример, это когда мы получаем например по ссылке объект, я всегда пишу например "ДокОбъект = ДокСсылка.ПолучитьОбъект()", чтобы в дальнейшем понимать что ссылка, а что объект. Всегда всё зависит от контекста задачи, конфигурации. В своё время очень помогли стандарты разработки представленные на сайте its. Всегда придерживаюсь этих стандартов)
1. Имена переменных следует образовывать от терминов предметной области таким образом, чтобы из имени переменной было понятно ее назначение.
2. Имена следует образовывать путем удаления пробелов между словами. При этом, каждое слово в имени пишется с прописной буквы. Предлоги и местоимения из одной буквы также пишутся прописными буквами.
Пример:
Перем ДиалогРаботыСКаталогом; // Диалог работы с каталогом
Перем КоличествоПачекВКоробке; // Количество пачек в коробке
Примеры некорректных имен переменных:
масРеквизитов, соотвВидИмя, новСтр
Вводить же полноценную венгерскую нотацию - это жесть жестяная. Она нифига не улучшает читабельность, она ее ухудшает. В 1С этих несчастных типов данных, которые часто используются - полторы штуки. При грамотных именах переменных в 99% случаев из имени и контекста и так все понятно, при этом код читается как проза, без спотыканий на этих тз, сп, бпвмф и так далее.
Когда-то на 7.7 я по-молодости использовал элементы венгерской нотации. Тогда многие так делали. Возвращаться не хочется :)
А факты таковы - венгерская нотация была популярна для Си, в те времена когда легко и просто типы переменных было понять сложно (не было хороших IDE, помогающих в этом), а видов примитивных типов данных там была куча мала. В 1С не сказать что конфигуратор сильно помогает с типами данных, но и проблема такая остро вовсе не стоит. Вот если бы "КоличествоТовара" могло иметь 20 разных типов и различать их было бы критично важно - тогда был бы другой коленкор.
Ну а по теме... Такие префиксы вроде бы не пропустятся на 1С-Совместимость. И если есть прямо реальная польза от таких префиксов, то это говорит об излишней когнитивной сложности кода.
префиксы переменным и функциям (да-да, функциям тоже, в зависимости от того, какой тип данных эти функции возвращают) я придумывал свои.
естественно, на языке 1С я стал писать, тоже используя свои префиксы.
например:
- спрслк - СправочникСсылка;
- спробк - СправочникОбъект;
- докслк - ДокументСсылка;
- докобк - ДокументОбъект;
- перслк - ПеречислениеСсылка;
- пвхслк - ПланВидовХарактеристикСсылка;
- пвхобк - ПланВидовХарактеристикОбъект;
- плнобслк - ПланОбменаСсылка;
- плнсчслк - ПланСчетовСсылка;
- мсв - Массив;
- ств - Соответствие;
- стт - Структура;
- элмсв - Элемент массива;
- клзнств - КлючЗначение соответствия;
- клзнстт - КлючЗначение структуры;
- ч - Число
- стр - Строка;
- фл - Булево (от слова Флаг - это из «мира» Ассемблера);
- дт - Дата;
- тз - Таблица значений;
- сз - Список значений;
- стртз - Строка таблицы значений;
- элсз - Элемент списка значений;
- т - Тип;
- от - Описание типов;
- оо - Описание оповещения;
- зпр - Запрос;
- реззпр - Результат запроса;
- выбзпр - Выборка запроса;
- мкт - Макет;
- тблдок - Табличный документ;
- обл - Область табличного документа;
- длг - Диалог выбора файла или чего-нибудь другого;
- тктдок - Текстовый документ;
- зпxml - ЗаписьXML;
- чтxml - ЧтениеXML;
- зпjsn - ЗаписьJSON;
- чтjsn - ЧтениеJSON;
- xdto - различные XDTO объекты;
- дд - Двоичные данные;
- хз - Хранилище значения;
и многие другие.
Рейтинг: 460
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 1054929
Создание 06.05.19 12:20
Обновление 06.05.19 12:20
Просмотры 18943
Загрузки 0
Рейтинг
15
Комментарии 94
Код открыт Да
Рубрики Рефакторинг и качество кода
Кому
Разработчик
,
Стажер
Тип файла Внешняя обработка (ert,epf)
Платформа 1С:Предприятие 8
Конфигурация Универсальные
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)