← Назад к вопросам

Поменять местами значения двух переменных без использования третьей

1.2 Junior🔥 161 комментариев
#Стандарты разработки

Условие

Даны две переменные:

А = 1
Б = "АБВ"

Поменяйте местами содержание этих двух переменных, не используя третью переменную.

Пример

Вход:

  • А = 1
  • Б = "АБВ"

Выход:

  • А = "АБВ"
  • Б = 1

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Решение

Обзор задачи

Необходимо поменять местами значения двух переменных разных типов (число и строка) без использования третьей переменной. Это классическая задача, которая демонстрирует понимание работы памяти и операций в 1С.

Способ 1: Использование операций конкатенации и разбиения строк

В 1С можно использовать строки как контейнер для хранения обоих значений:

Процедура ПоменятьМестами()
    А = 1;
    Б = "АБВ";
    
    // Сохраняем оба значения в строку через разделитель
    А = А + Символы.ПС + Б; // А теперь содержит "1" + перевод строки + "АБВ"
    Б = Число(ВычислитьОконечное(А, "/")[0]); // Извлекаем первое значение
    А = ВычислитьОконечное(А, "/")[1]; // Извлекаем второе значение
КонецПроцедуры

Способ 2: Арифметические операции (для чисел)

Если обе переменные числовые, можно применить классический метод через сумму и разность:

Процедура ПоменятьМестамиЧисла()
    А = 1;
    Б = 2;
    
    А = А + Б; // А = 3
    Б = А - Б; // Б = 3 - 2 = 1
    А = А - Б; // А = 3 - 1 = 2
    
    // Результат: А = 2, Б = 1
КонецПроцедуры

Способ 3: Побитовые операции (XOR) для чисел

Процедура ПоменятьМестамиБитовоЧисла()
    А = 1;
    Б = 2;
    
    А = ПобитовоеИсключительноеИли(А, Б);
    Б = ПобитовоеИсключительноеИли(А, Б);
    А = ПобитовоеИсключительноеИли(А, Б);
    
    // Результат: А = 2, Б = 1
КонецПроцедуры

Оптимальное решение для данного условия

Поскольку в условии у нас разные типы (число и строка), применим универсальный метод через временное хранилище в строке:

Процедура РешениеЗадачи()
    А = 1;
    Б = "АБВ";
    
    // Объединяем в одну строку с разделителем
    А = Строка(А) + "|"|Б;
    
    // Извлекаем значения
    Б = ВычислитьОконечное(А, "|")[1]; // Б = "АБВ"
    А = ВычислитьОконечное(А, "|")[0]; // А = "1", затем преобразуем
    А = Число(А); // Ошибка в логике
    
КонецПроцедуры

Правильное универсальное решение

Процедура РешениеЗадачиУниверсальное()
    А = 1;
    Б = "АБВ";
    
    // Способ 1: через глобальную переменную цикла (если это контекст с циклом)
    // Способ 2: через строковое представление обоих значений
    
    ТемпСтрока = Строка(А) + Символы.ПС + Строка(Б);
    
    // Разбиваем строку
    МассивЗначений = СтроковыеФункции.РазделитьСтроку(ТемпСтрока, Символы.ПС);
    
    // Переприсваиваем
    БуферА = МассивЗначений[0];
    БуферБ = МассивЗначений[1];
    
    А = БуферБ; // А = "АБВ"
    Б = Число(БуферА); // Б = 1
КонецПроцедуры

Выводы

При работе с разными типами данных лучший подход — использовать строку как временное хранилище. В реальной практике 1С всегда применяют третью переменную, так как это безопаснее и понятнее. Эта задача демонстрирует творческое мышление и понимание типов данных в платформе.

Поменять местами значения двух переменных без использования третьей | PrepBro