Например - при загрузке некоего файла, в зависимости от статуса загружаемой абстрактной заявки надо выполнить некое действие:
// Чтение файла Excell, получение и обработка статуса заявки текущей строки
СтатусЗаявки = СокрЛП(Excel.Cells(1, Сч).Text);
Если СтатусЗаявки = "На утверждении" Тогда
//...
ИначеЕсли СтатусЗаявки = "Товар в пути" Тогда
//...
ИначеЕсли СтатусЗаявки = "К отгрузке" Тогда
//...
КонецЕсли;
Здесь пока все очень просто, и вроде бы на виду. Но вот поступает дополнительно пожелание от клиента, и где-нибудь на 100 строк ниже понадобилось добавить:
Если СтатусЗаявки = "к отгрузке" Тогда
//...
ИначеЕсли СтатусЗаявки = "Отказ" Тогда
//...
КонецЕсли;
Наметанный глаз сразу увидит будущий косяк. Строка "к отгрузке" не равна "К отгрузке" - налицо ошибка программиста (буква "К" <> "к"). Можно лечить это приведением переменной к нижнему регистру. Посмотрите какой код мы после этого получим:
СтатусЗаявки = нРег(СокрЛП(Excel.Cells(1, Сч).Text));
Если СтатусЗаявки = "на утверждении" Тогда
//...
ИначеЕсли СтатусЗаявки = "товар в пути" Тогда
//...
ИначеЕсли СтатусЗаявки = "к отгрузке" Тогда
//...
КонецЕсли;
//...
// Еще любят делать вот так, тысячи раз вызывая функцию при обработке данных:
Если СтатусЗаявки = нРег("К отгрузке") Тогда
//...
ИначеЕсли СтатусЗаявки = нРег("Отказ") Тогда
//...
КонецЕсли;
При таком подходе код теряет в читабельности. Плюс непонятно - каким же был исходный текст. Сравнение на строку всегда связано с грязным кодом - это потеря читабельности, и высокая вероятность ошибки. Можно банально опечататься, набрать английскую "с" вместо русской, поставить лишний пробел и т.п.
Еще один неочевидный, но на самом деле очень неудобный момент - мы не можем видеть всех возможных значений переменной. Т.е. в примере значение поля "СтатусЗаявки" уже может иметь четыре значения. А вдруг, где-то в коде есть и пятое, и шестое?.. Зачем нужно их видеть - затем, чтобы убедиться, что все возможные значения учтены. К примеру возникли какие-то ошибки в вновь пришедшем на загрузку файле - добавилось еще одно значение статуса заявки - "в наборе". Чтобы убедиться что это действительно новое значение - при таком подходе понадобится прошерстить весь имеющийся код.
А что если не сравнивать тупо на строку? Что если загнать все возможные значения входящих статусов в структуру?
СтруктураСтатусыЗаявок = Новый Структура;
СтруктураСтатусыЗаявок.Вставить("НаУтверждении" , "На утверждении");
СтруктураСтатусыЗаявок.Вставить("ТоварВПути" , "Товар в пути");
СтруктураСтатусыЗаявок.Вставить("КОтгрузке" , "К отгрузке");
СтруктураСтатусыЗаявок.Вставить("Отказ" , "Отказ");
//... Цикл по строкам
СтатусЗаявки = СокрЛП(Excel.Cells(1, Сч).Text);
Если СтатусЗаявки = СтруктураСтатусыЗаявок.НаУтверждении Тогда
//...
ИначеЕсли СтатусЗаявки = СтруктураСтатусыЗаявок.ТоварВПути Тогда
//...
ИначеЕсли СтатусЗаявки = СтруктураСтатусыЗаявок.КОтгрузке Тогда
//...
КонецЕсли;
Уже все становится интереснее, не правда ли? Но пойдемте дальше. К примеру код по загрузке очень большой, разделен на пять разных методов, и объявлять в каждом структуру - это дублирование кода. Можно сделать ее глобальной переменной, но сколько может быть таких структур? И ведь каждая может состоять из большого количества элементов, все это будет в теле основной программы (разделе инициализации). Гораздо логичнее объявить метод "СтатусыЗаявок()". Этот метод будет возвращать структуру, и в коде пишем уже СтатусыЗаявок().НаУтверждении и т.п. Но это означает, что каждое обращение к методу создает новую структуру. Выход - кэширование.
Если работа ведется в обработке - то можно объявить глобальную переменную, я ее привык называть "мСтруктураКэшДанных" (префикс "м" - флаг глобальной переменной). И кэшировать в нее все программные перечисления. Кроме того, по рекомендации коллеги BUDIVAL, которую он отправил в ЛС - лучше возвращать фиксированную структуру. Тогда можно быть 100% уверенным что коллекция заполняется именно в отвечающем за это методе. Вот как в итоге может выглядеть результирующий код:
Модуль объекта обработки для загрузки заявок
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ВнешняяОбработка.ЗагрузкаЗаявок.МодульОбъекта
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Перем мСтруктураКэшДанных;
#Область ПрограммныйИнтерфейс
Функция ДанныеФайлаУспешноСчитаны() Экспорт
//...
СтатусЗаявки = СокрЛП(Excel.Cells(1, Сч).Text);
Если СтатусЗаявки = СтатусыЗаявок().НаУтверждении Тогда
//...
ИначеЕсли СтатусЗаявки = СтатусыЗаявок().ТоварВПути Тогда
//...
ИначеЕсли СтатусЗаявки = СтатусыЗаявок().КОтгрузке Тогда
//...
КонецЕсли;
Возврат Истина;
КонецФункции
Функция КонтрагентыОтказныхЗаявок() Экспорт
//...
Если СтатусЗаявки = СтатусыЗаявок().Отказ Тогда
//...
КонецЕсли;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#Область ПрограммныеПеречисления
Функция СтатусыЗаявок()
Если НЕ мСтруктураКэшДанных.Свойство("СтатусыЗаявок") Тогда
СтруктураСтатусыЗаявок = Новый Структура;
СтруктураСтатусыЗаявок.Вставить("НаУтверждении" , "На утверждении");
СтруктураСтатусыЗаявок.Вставить("ТоварвПути" , "Товар в пути");
СтруктураСтатусыЗаявок.Вставить("КОтгрузке" , "К отгрузке");
СтруктураСтатусыЗаявок.Вставить("Отказ" , "Отказ");
мСтруктураКэшДанных.Вставить("СтатусыЗаявок", Новый ФиксированнаяСтруктура(СтруктураСтатусыЗаявок));
КонецЕсли;
Возврат мСтруктураКэшДанных.СтатусыЗаявок;
КонецФункции
#КонецОбласти
#КонецОбласти
мСтруктураКэшДанных = Новый Структура;