Функция и возврат 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С автоматически прописывает список параметров.

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

Функция и возврат 1с

Действия, заданные в диалоге, оформляются в модуле как процедуры . Процедурой является некоторый отдельный алгоритм, имеющий имя — имя процедуры . Процедура оформляется строкой начала процедуры и строкой конца процедуры [11].

Процедура МояПроцедура()

Между этими строками располагается тело процедуры — алгоритм, описывающий действия, которые процедура будет выполнять. В процедуре можно определить список передаваемых параметров, значения которым передаются при вызове процедуры и используются в теле процедуры. По умолчанию параметру процедуры всегда передается ссылка на значение. Для передачи самого значения используется ключевое слово Знач.

Читайте так же:  Судья вправе принять встречный иск если

Пример 24.2. Передача параметров по ссылке

В конце процедуры А1 переменная «б» равна 12, потому что и переменная «б», и параметр процедуры Моя «а» идентифицируют один и тот же адрес.

Пример 24.3. Передача параметров по значению

В конце процедуры А1 переменная «б» равна 10 , потому что при вызове процедуры Моя передавалась не ссылка, а значение.

Функция отличается тем, что возвращает значение, используя, оператор «Возврат».

Пример 24.4. Функция в 1С

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

Функция и возврат 1с

Войдите как ученик, чтобы получить доступ к материалам школы

Внутренний язык программирования 1С 8.3 для начинающих программистов: функции и процедуры в 1С часть 1

Автор уроков и преподаватель школы: Владимир Милькин

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

Функции и процедуры в языке 1С 8.3

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

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

В данном случае формула вычисления результата достаточно проста, но она могла бы быть гораздо сложнее. А что если нам нужно вычислять её не один раз, а несколько? Причем в разных местах программы.

Неужели нам снова и снова придётся писать код для её вычисления:

Это никуда не годится. Нам придётся повторять один и тот же код, что приведёт к раздутости программы. И кроме того, переписывая его очередной раз мы можем допустить ошибку по невнимательности.

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

Пусть этим именем будет ПроизведениеСуммыИРазности.

Получается теперь мы можем написать:

И всё? Нет, конечно! Ведь непонятно произведение суммы и разности каких именно чисел нужно считать. Гораздо лучше будет передать эти числа нашему имени в качестве параметров, как мы обычно делаем при вызове команды:

Это, так называемый, вызов функции. Он выглядит точно также как и вызов многих других команд компьютера, которые мы уже неоднократно делали. Только это наша собственная команда, работу которой определяем мы, а не компьютер.

Давайте, наконец, определим нашу функцию, чтобы компьютер, встретив её вызов, не растерялся, а выполнил то, что мы хотим:

Что включает в себя определение этой функции?

Прежде всего ключевое слово Функция следом за которым идёт имя, которое мы придумали сами.

Затем следуют имена параметров, заключенные в круглые скобки. Параметры — это данные, которые мы передадим в нашу функцию при её вызове. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Она с ними что-то сделает и возвратит результат. Каждый параметр имеет своё имя, которое мы также придумываем сами. Это имя можно использовать только внутри функции.

Дальше идёт тело. Это команды компьютеру, которые будут выполняться в тот момент, когда мы сделаем вызов нашей функции. Тело заканчивается ключевым словом КонецФункции.

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

Где вместо Результат может быть любое выражение, которое вернётся из функции в качестве её результата.

Мы можем вызывать функцию столько раз в программе сколько нам потребуется.

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

Но функции и процедуры не следует писать лишь бы где! Для определения наших функций мы будем использовать новый модуль. Чтобы его добавить следуйте инструкциям ниже.

Читайте так же:  Договор займа должников

1. Раскройте список «Общие» в дереве конфигурации.

2. Найдите в нём пункт «Общие модули» и нажмите на нём правой кнопкой мыши. Выберите «Добавить».

3. Добавился модуль. В правой части окна конфигуратора задайте его имя и свойства, как показано ниже.

Внимание! Пожалуйста, ещё раз убедитесь, что вы поставили галки (Клиент, Сервер, Внешнее соединение) также, как на рисунке выше.

4. Перейдите в этот модуль. Всё! Здесь можно писать наши функции и процедуры. Напишите процедуру с именем Привет, без параметров, после вызова которой компьютер просто здоровается с нами.

Обратите внимание на ключевое слово Экспорт, которое идёт следом за круглыми скобками. Его наличие обязательно, так как мы определяем функцию в одном модуле (Уроки), а использовать будем совсем в другом (модуль управляемого приложения).

5. Теперь вернитесь в модуль управляемого приложения.

6. И сделайте вызов нашей процедуры. Так как она находится в другом модуле к её имени добавляется «Уроки.«.

7. Запустите 1С и убедитесь, что всё работает!

Процедура или Функция?

Со временем почему-то перестают устраивать вещи, написанные лишь для того, чтобы они работали. Хочется красоты, стиля.
В тоже время хочется простых и понятных правил для поддержки этой красоты и этого стиля.
Данный вопрос относится к категории «Размышления над стилем».

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

Исходя из этих соображений и возникает желание определить чёткие критерии того, в каком случае стоит использовать Процедуры, а в каком случае Функции.

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

Подход 1. Исходя из определения Процедуры и Функции
Тут всё просто, читаешь документацию и, помня, что процедура отличается от функции только возвращаемым значением, решаешь — если возврат значения не нужен, то Процедура, если нужен, то Функция. Тем не менее, процедура может изменять значения параметров, переданных по Ссылке.

В контексте данного подхода, есть два разветвления на тему, как Фукнция должна возвращать параметры:

Подход 1.1 Функция возвращает один параметр через возврат, остальные через переменные, переданные по ссылке. На выходе процедуры мы включаем некую обработку ошибок, зависящую от возвращаемого значения.

Подход 1.2 Функция не может возвращать значения через свои параметры и должна это делать только через значение возврата. Если необходимо вернуть более одного значения, то эти значения необходимо упаковать в массив, список значений, прочее.
Если в ходе работы появилась ошибка, то будет возвращено значение Неопределено.

Подход 2. Процедуры — они как МАКРОСЫ
При этом подходе Процедура используется всего лишь для того, чтобы объединить несколько вызовов однотипных действий.
В этом подходе использование Процедуры носит локальный характер — просто для того, чтобы сократить код.

Подход 3. Всё на свете — Функции, но без идиотизма
1. Всегда используются функции, процедуры не используются.
2. Функция возвращает либо «», либо строковое описание ошибки, все изменения данных идут по ссылке через выходные параметры
3. Для исключения идиотизма в применении правила 2, для функций, возвращающих гарантировано одно значение, без ошибок внутри функции, используется передача значения через возврат функции. Например, ЭтоКорректнаяДата(вхДата)

Вот пока что получилось. А какие есть подходы у вас?

Программирование в 1С для всех

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

Читайте так же:  Avast premier 2018 лицензия торрент

И так, процедура или функция называются рекурсивными, когда они вызывают самих себя. Например, рекурсивная процедура будет выглядеть так:

Процедура прРекурсивная ()
//какой-то код
прРекурсивная ();
КонецПроцедуры

А рекурсивная функция будет выглядеть следующим образом:

Функция фРекурсивная ( ПеремА , ПеремБ ,…)
//какой-то код
фП = фРекурсивная ( ПеремС , ПеремД ,…);
// какой-то код
КонецФункции

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

Ещё важно помнить о таком не очень приятном событии, как бесконечная рекурсия

Есть разные способы борьбы с бесконечной рекурсией. Как вариант, передавать в рекурсивную процедуру или функцию счетчик, который при каждой рекурсии увеличиваем на 1. И в случае, когда счетчик достигает какого-нибудь значения, останавливаем рекурсию.

ПеремР = фРекурсивная ( 1 , 2 , Счетчик );

Функция фРекурсивная ( ПеремА , ПеремБ , Счетчик )

Счетчик = Счетчик + 1 ;

Если Счетчик = 100 Тогда

Возврат Новый Структура ( «ПеремА,ПеремБ» , ПеремА , ПеремБ );

Возврат фРекурсивная ( ПеремА + 1 , ПеремБ + 2 , Счетчик );

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

Посмотрите, как отрабатывает наша рекурсивная функция

И рассмотрим один прикладной пример: узнаем с помощью рекурсивного вызова функции самую верхнюю группу какого-нибудь справочника. Пример я буду делать на демонстрационной конфигурации «Управляемое приложение 1С»

&НаСервереБезКонтекста
Функция ВернутьРодителя ( Товар )

Если Товар . Уровень () = 0 Тогда
Возврат Товар ;
КонецЕсли;

Возврат ВернутьРодителя ( Товар . Родитель );

&НаСервере
Процедура УзнатьГлавногоРодителяНаСервере ()

Если Товар . Уровень () = 0 Тогда
Сообщить ( «Товар (группа) верхнего уровня» );
КонецЕсли;

ГлавныйРодитель = ВернутьРодителя ( Товар );

&НаКлиенте
Процедура УзнатьГлавногоРодителя ( Команда )

Если Не ЗначениеЗаполнено ( Товар ) Тогда
Сообщить ( «ЗаполнитеТовар» );
Возврат;
КонецЕсли;

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

Я стараюсь как можно чаще выпускать различные интересные бесплатные статьи и видеоуроки. Поэтому буду очень рад, если Вы поддержите мой проект перечислив любую сумму:

Изучите программирование в 1С с помощью моей книги «Программировать в 1С за 9 шагов»

  1. Без сложных технических терминов.
  2. Более 500 страниц практического материала.
  3. Каждое задание сопровождается рисунком (скриншот).
  4. Сборник задач для домашней проработки.
  5. Книга написана понятным и простым языком — для новичка.
  6. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!

Промо-код на скидку в 16%: vCph8bW3rE

Функция возврат два значения

Доброго дня
подскажите можно ли возвращать два значения функции( платформа 8.3 под бухгалтерию 2)

и как это сделать

Ошибка. Возврат значения функции
Функцию вызываю из общего модуля. Ошибка возникает при присваивании. Общий.

Функция IIF возврат значения, содержащего Or, < и др
Добрый день. Пытаюсь прописать условие в конструкторе запросов с применением.

Функция: возврат индекса найденного значения в массиве
Реализовать функцию, которая принимает массив, а также число n и возвращает.

Функция имеющая два значения
Здравствуйте, я создал функцию которая принимает два значения, с помощью неё.

Функция, выдающая два значения
Как правильно написать функцию, которая будет выдавать сразу два значения.

Принудительный выход из процедуры 1с

Принудительный выход из процедуры 1с 8 можно осуществить при помощи ключевого слова Возврат. Оно используется на случай возникновения ошибок внутри процедуры, либо если какую-то часть процедуры не нужно обрабатывать при соблюдении определенных условий.

Выход из процедуры 1с пример использования

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

Хотите узнать больше об использовании процедур в 1С 8? Тогда прочитайте статью Вызвать процедуру из общего модуля.