Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Передача параметров функции по копии а не по ссылке
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.1 (8.0)
Dmitriy-CoDy
Помогите плиз с азами встроенного языка программирования.


Вот есть такой код:

перем1 = Новый Структура(
    "Ключ",
    "значение1"
);

перем2 = перем1;

перем1.Ключ = "sdfsdfsdfsdffsdfsdfsdsdfsddfsdffsdf";


Тут получается что переменной парам2 присваивается ссылка на парам1 и любые манипуляции с парам2 отражаются на парам1.



Или вот еще такое:

парам1 = Новый Структура(
    "Ключ1",
    "aadsd"
);                          
Функция1(парам1);

Функция Функция1(Параметр)
    Результат = Параметр;
    
    Результат.Вставить("Ключ2", "фывфыв");
    
    Возврат Истина;
КонецФункции


В этом примере все манипуляции с переменной, переданной в качестве параметра в функцию, тоже сохраняются.



Есть ли возможность работать с копией переменных?
Во всех языках, с которыми я работал это называется передача параметра по ссылке или копии.
Dmitriy-CoDy
Все вопрос снят.
Vofka
Можно ж было озвучить ответы
Dmitriy-CoDy
Цитата(Vofka @ 07.02.11, 15:05) необходимо зарегистрироваться для просмотра ссылки
Можно ж было озвучить ответы


Если верить синтаксис помощнику(он же справочник), то решение простое, элементарное и даже предсказуемое:

в определении функции перед нужным параметром указать ключевое слово Знач - "...Необязательное ключевое слово, которое указывает на то, что следующий за ним параметр передается по значению, т.е. изменение значения формального параметра при выполнении функции никак не повлияет на фактический параметр, переданный при вызове функции...".

Я на радостях и отписался что решение найдено.

Но на самом деле никакого эффекта от присутствия этого ключевого слова Знач НЕТУ, что наталкивает на мысль что либо я бестолочь, либо 1с -это один большой баг. icon_cuss.gif icon_cuss.gif
Vofka
Цитата
Но на самом деле никакого эффекта от присутствия этого ключевого слова Знач НЕТУ, что наталкивает на мысль что либо я бестолочь, либо 1с -это один большой баг

Не хочу вас обидеть, но 1с это не "один большой баг". Пример кода покажите.
Dmitriy-CoDy
Цитата(Vofka @ 07.02.11, 15:46) необходимо зарегистрироваться для просмотра ссылки
Не хочу вас обидеть, но 1с это не "один большой баг". Пример кода покажите.




Вот это модуль формы обработки:

Функция ПараметрыОбъекта(Объект)
    Результат = Новый Массив();
    
    Попытка
        Если Тип("Массив") = ТипЗнч(Объект)Тогда
            ВерхнийИндекс = Объект.ВГраница();
            Для Счетчик = 0 По ВерхнийИндекс Цикл
                Результат.Добавить(Счетчик);    
            КонецЦикла;
        Иначе    
            Для Каждого Элемент Из Объект Цикл
                Результат.Добавить(Элемент.Ключ);
            КонецЦикла;    
        КонецЕсли;                  
    Исключение    
        ВызватьИсключение "
        |Ошибка: неподдерживаемый тип данных """+ ТипЗнч(Объект) +""".";
    КонецПопытки;
    
    Возврат Результат;
КонецФункции
Функция ПечатьОбъекта(Объект, Параметры = Неопределено)
    Результат = Строка(ТипЗнч(Объект)) +":";;

    Если Неопределено = Параметры Тогда
        Параметры = ПараметрыОбъекта(Объект);
    КонецЕсли;
    
    Если Параметры.Количество() Тогда        
        Для Каждого Элемент Из Параметры Цикл
            Результат = Результат +"["+ Элемент +"]=>'"+ Объект[Элемент] +"',";
        КонецЦикла;;
    Иначе
            Результат = Результат +"пустой ";
    КонецЕсли;    
    
    Возврат Лев(Результат, СтрДлина(Результат) - 1) + ";";
КонецФункции




// Вот эта функция не работает так, как должна работать.
Функция Функция1(Знач Парам)
    Парам.Вставить("фывфы", "фывфыв");
    
    Возврат Истина;
КонецФункции
Процедура КнопкаВыполнитьНажатие(Кнопка)            
    парам1 = Новый Структура(
        "Ключ1",
        "aadsd"
    );
                              
    Сообщить("До вызова функции; "+ ПечатьОбъекта(парам1));
    
    Функция1(парам1);
    
    Сообщить("После вызова функции; "+ ПечатьОбъекта(парам1));
КонецПроцедуры
Vofka
Ещё бы озвучить, что вы хотите получить.

У меня это:

Функция Тест(б)
    б = б+1;
КонецФункции

Процедура КнопкаВыполнитьНажатие(Кнопка)

    а = 0;
    Сообщить(а);
    Тест(а);
    Сообщить(а);
    
КонецПроцедуры


И это:

Функция Тест(Знач б)
    б = б+1;
КонецФункции

Процедура КнопкаВыполнитьНажатие(Кнопка)

    а = 0;
    Сообщить(а);
    Тест(а);
    Сообщить(а);
    
КонецПроцедуры


отрабатывает как надо. Впервом случае значение переменной а увеличивается на 1, во втором нет.
Dmitriy-CoDy
Я хочу, чтобы переданная в качестве параметра структура, передавалась по значению, а не по ссылке.

В контексте вышеприведенного примера, я хочу, чтобы структура в переменной "парам1" не менялась после вызова функции.


Вот что я получаю когда выполняю обработку:
До вызова функции; Структура:[Ключ1]=>'aadsd';
После вызова функции; Структура:[Ключ1]=>'aadsd',[фывфы]=>'фывфыв';

А должно быть;
До вызова функции; Структура:[Ключ1]=>'aadsd';
После вызова функции; Структура:[Ключ1]=>'aadsd';
Dmitriy-CoDy
Цитата(Vofka @ 07.02.11, 16:02) необходимо зарегистрироваться для просмотра ссылки
Ещё бы озвучить, что вы хотите получить.

У меня это:

Функция Тест(б)
    б = б+1;
КонецФункции

Процедура КнопкаВыполнитьНажатие(Кнопка)

    а = 0;
    Сообщить(а);
    Тест(а);
    Сообщить(а);
    
КонецПроцедуры


И это:

Функция Тест(Знач б)
    б = б+1;
КонецФункции

Процедура КнопкаВыполнитьНажатие(Кнопка)

    а = 0;
    Сообщить(а);
    Тест(а);
    Сообщить(а);
    
КонецПроцедуры


отрабатывает как надо. Впервом случае значение переменной а увеличивается на 1, во втором нет.


Vofka Вы тут в качестве параметра используете скалярное значение, а попробуйте структуру или массив, как в моем примере.

Функция Тест(Знач б)
    б.Вставить("Ключ2", "значение2");
КонецФункции

Процедура КнопкаВыполнитьНажатие(Кнопка)

    а = Новый Структура(
        "Ключ1",
        "значение1"
    );
    
    Сообщить(а.Ключ1);
    Тест(а);
    // тут должна выскочить ошибка чтения ключа
    Сообщить(а.Ключ2);
    
КонецПроцедуры
Vofka
Dmitriy-CoDy, со структурой вы правы. Подробно с этим в документацию не залазил, но может это "фича" wink.gif
Batchir
Знаемс "фишку", попрбуйте следующий метод для копирования структуры:

Структура1 = Новый Структура();
Структура1.Вставить("Ключ1","Значение1");
Структура2 = ЗначениеИзСтрокиВнутр(ЗначениеВСтрокуВнутр(Структура1));
Сообщить(Структура1.Ключ1);
Структура2.Вставить("Ключ1", "Значение2");
Сообщить(Структура1.Ключ1);    // теперь выводит что Ключ1 = Значение1
Сообщить(Структура2.Ключ1);    // а здесь выводит что Ключ1 = Значение2


Но этот способ опасен тем что если в структуре будет вложенная структура, то она не скопируется. Самым верным способом будет написание функции которая создаст новую структуру на основании данных исходной, путем рекурсивного перебора ключей, учитывая возможную вложенность (структура в структуре)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.