Заказы на доработку 1С (сервис удаленной работы)

Хранилище

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

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Передача параметров функции по копии а не по ссылке          
Dmitriy-CoDy Подменю пользователя
сообщение 07.02.11, 13:34
Сообщение #1

Общительный
**
Группа: Пользователи
Сообщений: 29
Спасибо сказали: 0 раз
Рейтинг: 0

Помогите плиз с азами встроенного языка программирования.


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

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

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

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


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



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

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

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


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



Есть ли возможность работать с копией переменных?
Во всех языках, с которыми я работал это называется передача параметра по ссылке или копии.

Dmitriy-CoDy Подменю пользователя
сообщение 07.02.11, 13:40
Сообщение #2

Общительный
**
Группа: Пользователи
Сообщений: 29
Спасибо сказали: 0 раз
Рейтинг: 0

Все вопрос снят.

Vofka Подменю пользователя
сообщение 07.02.11, 14:05
Сообщение #3

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 14052
Из: Киев
Спасибо сказали: 4613 раз
Рейтинг: 3750.1

Можно ж было озвучить ответы

Dmitriy-CoDy Подменю пользователя
сообщение 07.02.11, 14:21
Сообщение #4

Общительный
**
Группа: Пользователи
Сообщений: 29
Спасибо сказали: 0 раз
Рейтинг: 0

Цитата(Vofka @ 07.02.11, 15:05) *
Можно ж было озвучить ответы


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

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

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

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

Vofka Подменю пользователя
сообщение 07.02.11, 14:46
Сообщение #5

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 14052
Из: Киев
Спасибо сказали: 4613 раз
Рейтинг: 3750.1

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

Не хочу вас обидеть, но 1с это не "один большой баг". Пример кода покажите.

Dmitriy-CoDy Подменю пользователя
сообщение 07.02.11, 14:57
Сообщение #6

Общительный
**
Группа: Пользователи
Сообщений: 29
Спасибо сказали: 0 раз
Рейтинг: 0

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




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

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

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




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

Vofka Подменю пользователя
сообщение 07.02.11, 15:02
Сообщение #7

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 14052
Из: Киев
Спасибо сказали: 4613 раз
Рейтинг: 3750.1

Ещё бы озвучить, что вы хотите получить.

У меня это:

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

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

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


И это:

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

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

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


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

Dmitriy-CoDy Подменю пользователя
сообщение 07.02.11, 15:11
Сообщение #8

Общительный
**
Группа: Пользователи
Сообщений: 29
Спасибо сказали: 0 раз
Рейтинг: 0

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

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


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

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

Dmitriy-CoDy Подменю пользователя
сообщение 07.02.11, 15:17
Сообщение #9

Общительный
**
Группа: Пользователи
Сообщений: 29
Спасибо сказали: 0 раз
Рейтинг: 0

Цитата(Vofka @ 07.02.11, 16:02) *
Ещё бы озвучить, что вы хотите получить.

У меня это:

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

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

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


И это:

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

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

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


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


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

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

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

    а = Новый Структура(
        "Ключ1",
        "значение1"
    );
    
    Сообщить(а.Ключ1);
    Тест(а);
    // тут должна выскочить ошибка чтения ключа
    Сообщить(а.Ключ2);
    
КонецПроцедуры

Vofka Подменю пользователя
сообщение 07.02.11, 15:47
Сообщение #10

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 14052
Из: Киев
Спасибо сказали: 4613 раз
Рейтинг: 3750.1

Dmitriy-CoDy, со структурой вы правы. Подробно с этим в документацию не залазил, но может это "фича" wink.gif

Спасибо сказали: Dmitriy-CoDy,

Batchir Подменю пользователя
сообщение 07.02.11, 17:20
Сообщение #11

Живет на форуме
Иконка группы
Группа: Команда
Сообщений: 3568
Из: Киев
Спасибо сказали: 1443 раз
Рейтинг: 0

Знаемс "фишку", попрбуйте следующий метод для копирования структуры:

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


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

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 04.07.25, 10:30
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!