1с возврат нескольких значений

Функции 1С и процедуры в 1С работают аналогично другим языкам — функция это именованная подпрограмма для вызова из других мест программного кода.

Далее подробнее про функции 1С и процедуры 1С.

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

Чтобы «выйти» из выполнения функции 1С и процедуры — используют команду «Возврат;». Функция (в отличии от процедуры) «возвращает» результат вычислений, то есть необходимо написать «Возврат ЗНАЧЕНИЕ;». Функции 1С не типизированы, значит могут возвращать значение разных типов, в зависимости от параметров или условий.

Функция отличается от процедуры возможностью вернуть результат вычислений, например:

Функция Функция1(Параметр)
Возврат Параметр * 2;
КонецФункции

Переменная1 = Функция1(10);
//Переменная1 будет равна 20

Параметры функции 1С и процедуры — это ссылки на переменные, существующие в месте вызова. «Ссылка» — значит при изменении значения параметра «внутри» функции 1С, он будет изменен и «снаружи». Чтобы такого не происходило — параметр передают со значением ПЕРЕМ. Однако это не работает со значениями-объектами (списками, таблицами, объектами базы данных), они все-равно будут переданы по ссылке.

При передаче параметра в процедуру/функцию, он передается «по ссылке». Это значит, что изменяя его внутри процедуры, Вы изменяете его значение, при доступе после окончания функции 1С. Таким образом, предыдущий пример можно написать так:

Процедура Процедура1(Параметр)
Параметр = Параметр * 2;
КонецПроцедуры

Переменная1 = 10;
Процедура1(Переменная1);
Сообщить(Переменная1);
//Результатом будет 20

Чтобы передать внутрь процедуры значение переменной, а не ее саму:

Процедура Процедура1(ЗНАЧ Параметр)
//действия..
КонецПроцедуры

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

Функция Функция1(Параметр1, Параметр2, Параметр3 = «Строковое значение»)
//Чтото делаем
КонецФункции

//Вызов функции без некоторых параметров
//параметр2 будет равен Неопределено
//параметр3 будет равен «Строковое значение»
Функция1(10);

//Вызов функции без второго параметра
Функция1(10, , «Значение»);

Как уже говорилось ранее, процедуры 1С используются в качестве обработчиков событий, возникающих при работе пользователя с формой (открытие, закрытие, нажатие кнопок и т.п.) или работе платформы (старт, завершение и т.п.). Возможные виды обработчиков формы или ее элементов можно увидеть в свойствах — щелкнув мышью на соответствующий элемент формы (и прокрутив окно свойств вниз). Виды обработчиков в модуле объекта можно увидеть с помощью выпадающего списка на панели в конфигураторе — где отображается список еще неопределенных и уже определенных событий. У разных событий различные параметры, при добавлении обработчика 1С автоматически прописывает список параметров.

В модуле формы, объекта располагаются обработчики событий. Обработчик можно добавить (назначить) следующими способами:

howknow1c.ru

С функциями возвращающими одно значение разобрался. Но как бы вернуть 2-а значения ?
В задании написано создать ф-ю, которая возвращает разность между наибольшим и наименьшим элементаим в массиве значений. Ну одно значение возвращенное это вроде как я сделал:
#include
#define Numer 7
int main(void)
int massiv( int * ogo , int ugu );
int res[Numer] = ;
int raz;
raz = massiv( res , Numer );
printf(«Вывод значений «);
>

int massiv( int * ogo , int ugu )
.
return Что_Либо_Только_Одно_Значение;
>
Помогите как в одной ф-ии вернуть сразу два разных значения, или все же придется делать две разные ф-ии ?

Извените в начале забыл отформатироваьт текст.

С функциями возвращающими одно значение разобрался. Но как бы вернуть 2-а значения ?
В задании написано создать ф-ю, которая возвращает разность между наибольшим и наименьшим элементаим в массиве значений. Ну одно значение возвращенное это вроде как я сделал:

Помогите как в одной ф-ии вернуть сразу два разных значения, или все же придется делать две разные ф-ии ?

Здравствуйте Mr-Twister, Вы писали:

MT>С функциями возвращающими одно значение разобрался. Но как бы вернуть 2-а значения ?
MT>В задании написано создать ф-ю, которая возвращает разность между наибольшим и наименьшим элементаим в массиве значений. Ну одно значение возвращенное это вроде как я сделал:

MT>Помогите как в одной ф-ии вернуть сразу два разных значения, или все же придется делать две разные ф-ии ?

Сначала о задании: нигде в нем (в том фрагменте, что ты привел) не сказано, что надо вернуть 2 значения. Сказано: «разность», что есть одно число. А именно, ArrMac — ArrMin = то, что тебе надо вернуть (первдарительно посчитав эти самые ArrMax && ArrMin).

По сути вопроса, оторвавшись от этого конкретного задания:

Есть такая штука в С++, как передача параметров по ссылке. Этот способ в числе прочих преимуществ, о которых здесь пока говорить не будем, дает и такое: появляется возможность изменения значения переменной, объявленной в программе, внутри некоторой функции. Таким образом, появляется возможность определить у функции СКОЛЬКО УГОДНО много возвращаемых значений. Единственное, что отличает этот способ от обычного возврата значения функцией, что это делается не обычной семантикой типа y=f(x), а подругому.

В приведенном примере функция делает некоторые вычисления, при этом меняя значения своих аргументов. По окончании функции значения аргументов изменятся, тогда как, если бы они передавались по значения (а не по ссылке), по изменения внутри функции делалиcь бы с локальной копией аргументов, и значения argi не изменились бы по выходе их функции.

rsdn.org

Совет: возврат нескольких значений из функции

Вообще говоря PHP не даёт нам возможности вернуть несколько значений из функции. В то же время мы можем вернуть массив данных и разобрать его различными способами.

В данном примере функция вернёт $var2:

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

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: http://stackoverflow.com/questions/3451906/multiple-returns-from-function
Перевел: Станислав Протасевич
Урок создан: 27 Апреля 2016
Просмотров: 7099
Правила перепечатки

5 последних уроков рубрики «PHP»

Фильтрация данных с помощью zend-filter

Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.

Контекстное экранирование с помощью zend-escaper

Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

Подключение Zend модулей к Expressive

Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

Совет: отправка информации в Google Analytics через API

Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

Подборка PHP песочниц

Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

ruseller.com

Как функции вернуть несколько значений

Всего мнений: 22

(8) > Вообще, считаю, идеологически правильнее не изменять формальные параметры функцией. Функция в математическом смысле однонаправлена. И у неё четко разделены вход и выход.

Простой пример: код модуля стал очень сложным, хочется раскидать разные части по отдельным функциям.

Вырезаешь куски в отдельные функции, запускаешь проверку синтаксиса смотришь каких переменных не хваттае и тупо кидаешь их в параметры.

По частоте использования:
1. Структура, например, если нужно получить что-то связанное с объектом (периодические значения), но получать сам объект не имеет смысла.
2. Функция с параметром, определяющим значение чего будет возвращено.
3. Несколько функций.

(28) Исключение в данном случае благо. Может привести к неверной работе алгоритма, без ошибок времени выплонения.

Если функции надо вернуть несколько РАЗНЫХ значений, не объединенных семантически в какое-то целое, значит у тебя косяк в архитектуре и это две функции, а не одна.

А, если эти значения — это атрибуты какого-то одного объекта, то возвращай структуру да и всё.

(38)
> 1. Нельзя использовать автодополнение, выше вероятность опечатки
Автодополнение в 1с много где нет? это вопрос тестирования

> 2. Что бы при чтении кода понять, какие параметры могут возвращаться, приходится переходить к определению функции и читать комментарии к ней. Если они еще есть.
Для этого можно в начале функции инициировать структуру, которая нужно вернуть независимо от успешности функции

> 3. На опечатки нельзя проверить формально, надеемся на то, что упомянутое вами исключение выскочит при тестировании у разработчика, а не повалит у пользователей в том куске, который разработчик недостаточно протестировал.
Это совсем другой вопрос — вопрос тестирования.

> 3.1. А бывают еще любители избыточного использование Попытка Исключение. Получается вообще взрывоопасная смесь.

> 4. При рефакторинге могут возникнуть большие проблемы по переделке кучи мест в коде. Не решаемые полуинтеллектуальным поиском с заменой и прочими подобными инструментами.
Например какие проблемы?

(48) А возвращать в параметрах ещё отстойней.

(52) Кратко пересказать книжки М.Фаулера и Р.Мартина ?

(47) Если функция не нашла значение потому что его нет — возвращается пустое значение, если возникла ошибка из-за неверных параметров, функция должна генерить исключение. Как это исключение будет обрабатывать вызывающая сторона — уже пофиг. Если вызывающая сторона подходит ответственно к параметрам вызова функции, она не должна париться над текстом в принципе.

(54) Там много опирается на то, что функция должна делать что-то одно. А если функция должна делать что-то одно, откуда взяться чему-то второму что можно вернуть?

В общем случае, возврат нескольких значений — это массив, соответственно, структура, список и т.п. это более упрощённое понимание массива.
Но, реального возврата нескольких значений из функции всё равно нет — вы возвращаете один объект. И, самое главное, что он создаётся, а потом разрушается, что медленнее, чем если передавать эти несколько параметров в функцию или процедуру по ссылке.

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

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

Вставлю своё имхо:
Когда нужно передавать по ссылке и там менять:
1. Когда меняешь движения, дописываешь данные в таблицу, список.
2. Когда у тебя есть большая структура, которая содержит несколько параметров, которые ты будешь использовать и тебе нужно дополнить её.
3. Когда передаёшь «Отказ» и там меняешь его на Ложь.
4. Когда передаёшь форму и добавляешь на неё свои элементы.
5. Когда передаёшь МенеджерВременных таблиц.

Это то, что смог вспомнить.

Во всех остальных случаях нужно возвращать.

(79) (80) В Си как раз всё просто — если параметр передан по значению (засунут в стек), то в функции будет его копия, а если по указателю, то в функции будет указатель на переменную, которую по указателю можно менять.
А вот в Си++ появились ссылки, когда передаётся как бы значение, но внутри это реализовано как указатель — то есть то, что мы имеем в 1С, если не написали Знач.

И не забываем, что написав Знач, мы получим копию строки — и, если она очень длинная, то можно получить существенное замедление работы.

(91) Но, в той же java прекрасно как параметры передаются объекты-контейнеры (BOX) в которых можно менять содержимое, не меняя самого контейнера, то есть так они реализовали указатели.

Что касается передачи параметра в функцию по указателю, то в том же Си всё остаётся на уровне функции — указатель, как бы мы его не меняли, обратно не возвращается, то если является обычным входным параметром, а вот про то, на что он указывает, никто не говорил — его можно менять, получая доступ к ячейке памяти по указателю.

(88) Начнём с того, что во многих языках деление на процедуры и функции чисто условно, так как и те и другие могут иметь как выходные так и выходные параметры.
Просто у функции есть основной параметр, который только выходной.
А если смотреть на низком уровне, то все высокоуровневые процедуры и функции — это вызов кода, возвращающего код ошибки исполнения, а все параметры и результаты хранятся в отдельной области памяти.

(93) Там просто сборка мусора работает тогда, когда памяти стало очень мало — в результате — если память есть, то её будут жрать, пока не надоест. Но, есть ключи запуска, где всё это можно ограничить. И ваша java побыстрее 1С будет.

www.forum.mista.ru