При изучении основ программирования в среде 1С начинающие разработчики часто сталкиваются с конструкциями, которые кажутся избыточными или непонятными. Один из таких примеров — предварительное присвоение значения переменной перед тем, как она будет фактически использована. Разберем на примере простой задачи по созданию калькулятора, как работают строковые функции, почему важна правильная логика работы с позициями символов и как сделать код более современным и эффективным.
Рассмотрим ситуацию, когда в коде встречается строка ПозицияОперации = 0;, а сразу за ней следует вызов функции Найти(). На первый взгляд это кажется обязательным действием, но давайте проанализируем ситуацию подробнее. В языке 1С используется динамическая типизация. Это означает, что тип переменной определяется в момент присвоения ей значения. Когда мы пишем:
ПозицияОперации = 0;
ПозицияОперации = Найти(ИсходныеДанные, ТекущаяОперация);
Первая строка является явной инициализацией. Она сообщает системе (и другому программисту), что мы планируем использовать эту переменную как число. Однако, поскольку во второй строке функция Найти() в любом случае вернет числовое значение (позицию символа или 0, если символ не найден), первая строка становится избыточной. Как отметили участники обсуждения, это часто является «атавизмом» — привычкой программистов, пришедших из языков со строгой типизацией (например, Pascal или C++), где переменную нельзя использовать без предварительного объявления типа и значения.
Важный момент: такая инициализация может быть полезна только в том случае, если дальнейшее присвоение значения происходит внутри какого-либо условия (Если... Тогда), и существует вероятность, что код присвоения не выполнится. В данном же примере значение перезаписывается сразу, поэтому предварительный ноль не влияет на работу программы.
Выясним причину, по которой функция Найти() возвращает те или иные числа. В 1С нумерация символов в строке начинается с 1. Это критически важное отличие от многих других языков программирования, где индексация начинается с нуля.
Найти() вернет 1.Именно поэтому проверка Если ПозицияОперации = 0 Тогда является стандартным и правильным способом убедиться, что пользователь ввел корректное выражение со знаком операции.
После того как мы нашли позицию знака операции, нам нужно выделить левое число (первый операнд) и правое число (второй операнд). Посмотрим на пример кода:
Операнд1 = Лев(ИсходныеДанные, ПозицияОперации - 1);
Операнд2 = Сред(ИсходныеДанные, ПозицияОперации + 1);
Проанализируем эти функции:
Функция Лев(Строка, Количество) берет указанное количество символов с начала строки. Если позиция знака «^» равна 5, то нам нужно взять 4 символа слева (5 - 1), чтобы получить первое число.
Функция Сред(Строка, НачальныйНомер) без третьего параметра работает очень удобно: она берет все символы, начиная с указанной позиции и до самого конца строки. В нашем случае мы начинаем со следующего символа после знака операции (ПозицияОперации + 1).
Обратите внимание: такой подход корректно работает только в том случае, если в строке присутствует ровно один знак операции. Если их будет больше, логика усложнится.
Программирование в 1С постоянно развивается, и для решения задачи разделения строки на части теперь существует более элегантный метод — СтрРазделить(). Рассмотрим, как можно упростить код, предложенный опытными разработчиками:
МассивЧастей = СтрРазделить(ИсходныеДанные, "^", Ложь);
Если МассивЧастей.Количество() = 2 Тогда
Операнд1 = МассивЧастей[0];
Операнд2 = МассивЧастей[1];
КонецЕсли;
Этот метод автоматически «разрезает» строку в тех местах, где встречается указанный разделитель, и помещает результат в массив. Нам не нужно вручную высчитывать позиции и использовать Лев() или Сред(). Индексация в массивах (в отличие от строк!) в 1С начинается с 0.
При написании калькулятора важно не только правильно найти числа, но и убедиться, что это действительно числа. Функции Лев() и Сред() возвращают тип Строка. Несмотря на то что 1С может автоматически преобразовать строку в число при выполнении операции Pow() (возведение в степень), хорошим тоном считается явное преобразование.
Рассмотрим рекомендации по улучшению кода:
СокрЛП() для удаления случайных пробелов вокруг чисел, которые мог ввести пользователь.Число(), чтобы избежать ошибок при расчетах.В современных версиях платформы (8.3.6 и выше) также рекомендуется использовать функцию СтрНайти() вместо устаревшей Найти(). Она предоставляет больше возможностей, например, поиск с конца строки или указание конкретного вхождения символа, что делает ваш код более гибким и соответствующим актуальным стандартам разработки 1С.