Вернуть структуру из функции 1с

Обновлено: 07.07.2024

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

Структура: Структура1.Ключ1

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

Хоть и в ключ и значение соответствия можно записать переменные любого типа, использование типов в этом случае очень сильно зависит от контекста и от вида клиента: мы не можем в клиентском задать в ключ или значение, тип которого работает только в серверном контексте (например, ДокументОбъект.<>).

Новое соответствие создается при помощи конструктора Новый.

Соответствие1 = Новый Соответствие;

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

Вставить(<Ключ>, <Значение>)

Параметр «Ключ» может иметь любой тип! Это очень важное свойство, таким образом, с помощью коллекции Соответствие можно в процессе работы устанавливать соответствие любых объектов с любыми объектами.

Простой пример работы с соответствием:

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

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

Обход соответствия 1С

Обходить соответствие можно с помощью цикла Для каждого…Цикл.

Результат обхода соответствия 1С

Безошибочное получении значения соответствия 1С

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

Рассмотрим работу данного метода на соответствии с датами в качестве ключей.

Результат использования метода Получить

Статьи о других универсальных коллекциях значений в 1С


Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным


Если Вам помог этот урок решить какую-нибудь проблему, понравился или оказался полезен, то Вы можете поддержать мой проект, перечислив любую сумму:

можно оплатить вручную:

Вступайте в мои группы:

One thought on “ Учимся работать с соответствием в 1С 8.3 ”

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

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

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

(9) Всё так, но вместо функций тут правильнее юзать процедуры. Идеологическая мешанина процедур и функций - тяжкое наследия языка Си)
(7) Ну вот пример - функция должна вернуть несколько значений, которые потом будут использовать как фильтрующие параметры. Можно вернуть список значений, а можно передать менеджер и сделать временную таблицу
(11) В целом да, но я бы не стал это возводить в абсолют.
(15) В рамках модуля объекта еще туда-сюда.
Более глобальные - не стоит, имхо.
Возврат какого-нибудь списка значений тоже не ахти вариант. Сложней в разборе результата функции. Нет подсказки по возвращаемому значению. Легко перепутать "имена" возвращаемых значений. Было бы понятие типа "структуры" - вопросов бы не возникало.
(18) 1. Это кто с 7.7 не работал в которых структур не было.
2. Обращаться можно по [0],[1]
(19) И что, через полгодика вы вспомните, что функция возвращает в [0]? А тем более, если кто-то другой читать код будет. Варианты типа [0] крайне не рекомендуются во всех приличных местах/языках. Варианты типа ["НомерСтелажа"] тоже, слишком велика вероятность опечатки.
(22) Где написано? В коде вы видите что-то типа:
Ну и как этот код читать? За такое в приличных местах уволить нафиг могут.
Идеологически правильнее наверное структурой, но параметрами так удобно))
(21) Список значений с представлениями позволяет обращаться по имени представления. По сути имитация структуры, которой в семерке нет.
(23) 7.7 - Парам.Получить("Количество")*Парам.Получить("Цена").. как-то так.
(25) (26) Ага-ага. А когда-нибудь потом, через полгодика, вы узнаете, что в каком-то нечасто выполняющемся куске кода вместо "Количество" вы написали "Клоичество". И хорошо еще если эта ошибка будет быстро замечена, а не приведёт к постоянным косякам за большой период.
По моему, функции, изменяющие свои параметры, это плохо, но возврат списка или структуры - еще хуже.
Если бы в языке был соответствующий тип вроде сишного union - тогда метод возврата структуры был бы хорош.
(27) а чем структура плоха? опечатка приведет к исключению

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

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

(29) про это и говорю, что благо, и проблемы здесь нет с опечатками
winapi стаил. Функция возвращает истина/ложь (удачно/не удачно). А в параметры кладем значения возврата. В 1с аналог свойство() для структуры.

2. Возврат одного значения и изменение параметров Если структура не класс (семантически), лучше разбить ф-ию.
(33)ни о чём не говорит типовые сейчас достаточно странные люди пишут.
(32) не получиться разбить в связанных значениях
например возвращается также ТекстОшибки
(28) Структура плоха тем что:
1. Нельзя использовать автодополнение, выше вероятность опечатки
2. Что бы при чтении кода понять, какие параметры могут возвращаться, приходится переходить к определению функции и читать комментарии к ней. Если они еще есть.
3. На опечатки нельзя проверить формально, надеемся на то, что упомянутое вами исключение выскочит при тестировании у разработчика, а не повалит у пользователей в том куске, который разработчик недостаточно протестировал.
3.1. А бывают еще любители избыточного использование Попытка Исключение. Получается вообще взрывоопасная смесь.
4. При рефакторинге могут возникнуть большие проблемы по переделке кучи мест в коде. Не решаемые полуинтеллектуальным поиском с заменой и прочими подобными инструментами.
. можно еще продолжать про недостатки, но юзверя звонят.
Если нужно вернуть все перестановки какого -либо множества, то лучше сделать так, чтобы следующая перестановка возвращалась на основании предыдущей без изменения каких либо параметров.
Если нужно вернуть линейный размеры объект - тогда лучше структура (а еще лучше - сам объект)
А если нужно вернуть сто случайных значений от 0 до 1, то лучше всего возвращать массив.
Т.е. что лучше зависит от контекста вопроса больше, чем от самого вопроса.

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

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

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

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

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

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

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

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

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

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

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

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

Возврат одного значения и изменение нужных глобальных переменных
(53) не нужно пересказывать, просто аргументируйте своими словами
(58) См(55). Если не убедил - просто посмотри как работает типовая Справочник.XXX.НайтиПоКоду() и аналогичные. Ни одна функция в здравом уме не возвращает текст ошибки и т.п.
(59) а если речь идет о взаимодействии между системами?
1с - драйвер оборудования
1с - 1с по веб-сервсису
и т.п.
Чаще всего использую возврат структуры, но бывает, что в параметрах возвращал значение, а сама функция возвращала статус успешное завершения функции.
(61) Тогда Попытка + ВызватьИсключение особенно часто используются.

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

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

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

(65) это все хорошо, но вопрос был: какими способами вы пользуетесь
Структура/Неопределено.
Т.к считать параметры в каждом вызове - напрягает.
при желании и процедурой можно значения возвращать ))) (вернее получать в переменную)
(8) Математически операция А = А + 1 недопустима. Так что не стоит математику переносить на программирование.
(10) В Си процедур не бывает. Только функции с возвратом типа void. Так что и мешанины быть просто не может.
(27) Ну создавай структуру с нужными строками в общем модуле отдельной функцией. Тогда очепятка или будет везде, или нигде.

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

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

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

(76) из всех примеров возврат значения в параметре только там где "отказ" (отстойная конструкция этот отказ). В остальных случаях это изменение состояния существующего объекта, которое в отсутствие ООП приходится выполнять именно так.
(76) это ты описываешь, больше процедуры чем функции, по логике
(72) Я знаю. Именно это и создает мешанину в мозгах, когда сишник садится писать на более структурированных языках. У него уже в прошивке отложилось что функция может и должна менять параметры.
(79) В Си как раз все замечательно. Объявил параметр const - значит менять нельзя. Не объявил - значит он может быть изменен. Потому что с учетом требований с скорости работы может потребоваться и результат вернуть, и параметры поменять.

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

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

(81) Суть не в механизме передачи параметров, а именно в том что в Си нет процедур, и для изменения параметров приходится использовать функцию. Именно поэтому пришедшие из Си и создают функции, меняющие параметры. Паскалисты бы так поступать не стали, а написали бы процедуру.
(83) Дык а если надо и параметры изменить, и значение вернуть? Что использовать? А если надо вернуть значение, параметры не менять, но поменять не параметры (например, добавить записи в базу)? Деление на процедуры и функции чисто условное, иначе сам ЯП не давал бы менять параметры в функции.
но мне кажется структура отбирает больше памяти, чем просто переменные.
А лучше бы не давал. С точки зрения парадигмы функционального программирования изменение формальных параметров - жуткая ересь)
(88) А ты с многопоточным программированием и реентрантностью работал? Когда один и тот же код и одни и те же переменные могут использоваться одновременно несколькими потоками? И тогда единственный способ не конфликтовать потокам - это передавать указатель на некую структуру со всем контекстом потока в качестве параметра функции? И, соответственно, параметр там в процессе работы меняется.
(89) А с распределёнными вычислениями?
Процедуре передавать аргументы по ссылке можно.
В Джаве например вообще нельзя передаваемые параметры менять, только возвращать
(90) В том-то и дело, что как только начинается реальная жизнь - вся академичность летит к чертям. Так зачем все усложнять? В процедуре априори должен выполняться код, который не может сгенерировать ошибку (возврат результата через перереданные параметры - это же неакадемично, для возврата результата предназначена функция). Много такого кода в реальных задачах?
(91) Это помогло ей завоевать звание тормозящей и памятежрущей.

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

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

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

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

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

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

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

(9) Всё так, но вместо функций тут правильнее юзать процедуры. Идеологическая мешанина процедур и функций - тяжкое наследия языка Си)
(7) Ну вот пример - функция должна вернуть несколько значений, которые потом будут использовать как фильтрующие параметры. Можно вернуть список значений, а можно передать менеджер и сделать временную таблицу
(11) В целом да, но я бы не стал это возводить в абсолют.
(15) В рамках модуля объекта еще туда-сюда.
Более глобальные - не стоит, имхо.
Возврат какого-нибудь списка значений тоже не ахти вариант. Сложней в разборе результата функции. Нет подсказки по возвращаемому значению. Легко перепутать "имена" возвращаемых значений. Было бы понятие типа "структуры" - вопросов бы не возникало.
(18) 1. Это кто с 7.7 не работал в которых структур не было.
2. Обращаться можно по [0],[1]
(19) И что, через полгодика вы вспомните, что функция возвращает в [0]? А тем более, если кто-то другой читать код будет. Варианты типа [0] крайне не рекомендуются во всех приличных местах/языках. Варианты типа ["НомерСтелажа"] тоже, слишком велика вероятность опечатки.
(22) Где написано? В коде вы видите что-то типа:
Ну и как этот код читать? За такое в приличных местах уволить нафиг могут.
Идеологически правильнее наверное структурой, но параметрами так удобно))
(21) Список значений с представлениями позволяет обращаться по имени представления. По сути имитация структуры, которой в семерке нет.
(23) 7.7 - Парам.Получить("Количество")*Парам.Получить("Цена").. как-то так.
(25) (26) Ага-ага. А когда-нибудь потом, через полгодика, вы узнаете, что в каком-то нечасто выполняющемся куске кода вместо "Количество" вы написали "Клоичество". И хорошо еще если эта ошибка будет быстро замечена, а не приведёт к постоянным косякам за большой период.
По моему, функции, изменяющие свои параметры, это плохо, но возврат списка или структуры - еще хуже.
Если бы в языке был соответствующий тип вроде сишного union - тогда метод возврата структуры был бы хорош.
(27) а чем структура плоха? опечатка приведет к исключению

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

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

(29) про это и говорю, что благо, и проблемы здесь нет с опечатками
winapi стаил. Функция возвращает истина/ложь (удачно/не удачно). А в параметры кладем значения возврата. В 1с аналог свойство() для структуры.

2. Возврат одного значения и изменение параметров Если структура не класс (семантически), лучше разбить ф-ию.
(33)ни о чём не говорит типовые сейчас достаточно странные люди пишут.
(32) не получиться разбить в связанных значениях
например возвращается также ТекстОшибки
(28) Структура плоха тем что:
1. Нельзя использовать автодополнение, выше вероятность опечатки
2. Что бы при чтении кода понять, какие параметры могут возвращаться, приходится переходить к определению функции и читать комментарии к ней. Если они еще есть.
3. На опечатки нельзя проверить формально, надеемся на то, что упомянутое вами исключение выскочит при тестировании у разработчика, а не повалит у пользователей в том куске, который разработчик недостаточно протестировал.
3.1. А бывают еще любители избыточного использование Попытка Исключение. Получается вообще взрывоопасная смесь.
4. При рефакторинге могут возникнуть большие проблемы по переделке кучи мест в коде. Не решаемые полуинтеллектуальным поиском с заменой и прочими подобными инструментами.
. можно еще продолжать про недостатки, но юзверя звонят.
Если нужно вернуть все перестановки какого -либо множества, то лучше сделать так, чтобы следующая перестановка возвращалась на основании предыдущей без изменения каких либо параметров.
Если нужно вернуть линейный размеры объект - тогда лучше структура (а еще лучше - сам объект)
А если нужно вернуть сто случайных значений от 0 до 1, то лучше всего возвращать массив.
Т.е. что лучше зависит от контекста вопроса больше, чем от самого вопроса.

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

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

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

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

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

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

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

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

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

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

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

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

Возврат одного значения и изменение нужных глобальных переменных
(53) не нужно пересказывать, просто аргументируйте своими словами
(58) См(55). Если не убедил - просто посмотри как работает типовая Справочник.XXX.НайтиПоКоду() и аналогичные. Ни одна функция в здравом уме не возвращает текст ошибки и т.п.
(59) а если речь идет о взаимодействии между системами?
1с - драйвер оборудования
1с - 1с по веб-сервсису
и т.п.
Чаще всего использую возврат структуры, но бывает, что в параметрах возвращал значение, а сама функция возвращала статус успешное завершения функции.
(61) Тогда Попытка + ВызватьИсключение особенно часто используются.

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

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

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

(65) это все хорошо, но вопрос был: какими способами вы пользуетесь
Структура/Неопределено.
Т.к считать параметры в каждом вызове - напрягает.
при желании и процедурой можно значения возвращать ))) (вернее получать в переменную)
(8) Математически операция А = А + 1 недопустима. Так что не стоит математику переносить на программирование.
(10) В Си процедур не бывает. Только функции с возвратом типа void. Так что и мешанины быть просто не может.
(27) Ну создавай структуру с нужными строками в общем модуле отдельной функцией. Тогда очепятка или будет везде, или нигде.

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

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

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

(76) из всех примеров возврат значения в параметре только там где "отказ" (отстойная конструкция этот отказ). В остальных случаях это изменение состояния существующего объекта, которое в отсутствие ООП приходится выполнять именно так.
(76) это ты описываешь, больше процедуры чем функции, по логике
(72) Я знаю. Именно это и создает мешанину в мозгах, когда сишник садится писать на более структурированных языках. У него уже в прошивке отложилось что функция может и должна менять параметры.
(79) В Си как раз все замечательно. Объявил параметр const - значит менять нельзя. Не объявил - значит он может быть изменен. Потому что с учетом требований с скорости работы может потребоваться и результат вернуть, и параметры поменять.

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

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

(81) Суть не в механизме передачи параметров, а именно в том что в Си нет процедур, и для изменения параметров приходится использовать функцию. Именно поэтому пришедшие из Си и создают функции, меняющие параметры. Паскалисты бы так поступать не стали, а написали бы процедуру.
(83) Дык а если надо и параметры изменить, и значение вернуть? Что использовать? А если надо вернуть значение, параметры не менять, но поменять не параметры (например, добавить записи в базу)? Деление на процедуры и функции чисто условное, иначе сам ЯП не давал бы менять параметры в функции.
но мне кажется структура отбирает больше памяти, чем просто переменные.
А лучше бы не давал. С точки зрения парадигмы функционального программирования изменение формальных параметров - жуткая ересь)
(88) А ты с многопоточным программированием и реентрантностью работал? Когда один и тот же код и одни и те же переменные могут использоваться одновременно несколькими потоками? И тогда единственный способ не конфликтовать потокам - это передавать указатель на некую структуру со всем контекстом потока в качестве параметра функции? И, соответственно, параметр там в процессе работы меняется.
(89) А с распределёнными вычислениями?
Процедуре передавать аргументы по ссылке можно.
В Джаве например вообще нельзя передаваемые параметры менять, только возвращать
(90) В том-то и дело, что как только начинается реальная жизнь - вся академичность летит к чертям. Так зачем все усложнять? В процедуре априори должен выполняться код, который не может сгенерировать ошибку (возврат результата через перереданные параметры - это же неакадемично, для возврата результата предназначена функция). Много такого кода в реальных задачах?
(91) Это помогло ей завоевать звание тормозящей и памятежрущей.

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

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

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

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

В итоге в функции printf("%d", my_struct.price); (стр.11) выводятся нули для всех полей типа int.

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

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь


Возврат структуры из функции
Здравствуйте. Допустим, есть следующий код, работающий успешно. typedef struct < int a; int.


Возврат структуры функцией через указатель
Здравствуй. После С++ никак не могу понять, как сделать. Нужно создать функцию struct A*.

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


Возврат структуры из функции
Всем доброго времени суток. awesome.h struct point < float x = 1; float y = 1; >; struct.

Решение

chaosfall, почитайте про то, что в си параметры передаются по значению chaosfall, да вообще почитайте про функции в си, и передачу параметров в функции, а так же их возвращение. alex_x_x, illuminati, Спасибо за советы. Если не сложно, подскажите, пожалуйста, книги\статьи, где хорошо и подробно описаны темы указателей и функций. По этим темам в сети много информации, но мне пока попадается только поверхностное описание основной сути, которого, видимо, недостаточно.

Решение

Добавлено через 6 минут
Ну а что б работать с массивом нужно сделать следующее :
1. передать сам массив( имя массива является указателем на первый элемент массива )
2. передать длинну массива

Добавлено через 2 минуты
На счет книг, посмотри в Г.Шилдт, у него довольно доступное изложение специфики языка Си

illuminati, спасибо!

Не подскажешь еще, как правильно в этой функции заполнять поля значениями, вводимыми с клавиатуры?

Пробую это делать так:

после ввода значения вылетает ошибка "Необработанное исключение в "0x5b2a6af2 (msvcr90d.dll)" в "w.exe": 0xC0000005: Нарушение прав доступа при записи "0x0000001c".
и подсвечивается желтым строчка В VS2008, да и 10ой тоже, если к структуре можно обратится, то после нажатия на точку вываливается менюшка с полями этой структуры.
Оператор -> , это обращение по указателю( если не прав, поправьте )
Вообщем, если в функции объявлена структура, то к её полям обращаться через точку. Ошибка 3 error C2228: выражение слева от ".price" должно представлять класс, структуру или объединение

Решение

Добавлено через 6 минут
во-первых, структура - тип данных, который определяется программистом
во-вторых, лучше использовать typedef, т.е. переопределение типа
в-третьих, в функции не нужно выделять память под структуру, когда ты передаешь переменную, ты передаешь указатель, т.е. адрес на ячейку памяти, а начиная с той ячейки память УЖЕ выделена.
в-четвертых, в параметрах функции не нужно писать struct компилятор понимает с первого раза.

т.е. в твое случае :
scan_info - это тип данных, такой же как и int, float, char и т.п., соответственно обїявлять переменніе ты можешь точно так же

Inkognito --> Inkognito



Просмотр профиля

Оптимизирую код обработки, управляемая форма, Бухгалтерия 2.0
Есть табличная часть, по которой проходимся в цикле (по документам). Для каждого документа нужно получить структуру и обработать на клиенте. Сейчас весь код в "МодулеФормы", и хорошо работает. Но вот беда - приходится копировать часть функций с "МодуляФормы" в "МодульОбъекта" (и наоборот). Код становится запутанней, поддерживать все сложнее.
Вопрос: как вызывать функцию получения структуры, если она находится в "МодулеОбъекта", которая должна вернуть структуру?

Petre --> Petre



Просмотр профиля
А почему бы не переместить содержимое модуля объекта в модуль формы? Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія". Inkognito --> Inkognito



Просмотр профиля Petre
1) Не удается полноценно отлаживать код, который написан в модуле формы. Ставлю точку останова, а результат нет. Код выполняется без каких-либо отладочных остановок. Очень неудобно, по сравнению с "обычными формами" (где ставить точку останова можно где угодно).
2) Использую "Нетленку" для шифрования обработки, так вот модуль формы обфусцирует так, что он начинает очень медленно работать у пользователей. Код, зашифрованный в модуле объекта, работает быстро. По рекоендации техподдержки Нетленки, желательно выносить код в МодульОбъекта для быстроты работы зашифрованного кода.
Вот эти две проблемы и вынуждают переписывать код. Gazulo --> Gazulo



Просмотр профиля Inkognito @ Сегодня, 14:20 ,
1) база на клиент-серверная?? [необходимо зарегистрироваться для просмотра ссылки] Inkognito --> Inkognito



Просмотр профиля Нет, обычная локальная 1С. Интересно. Спасибо, попробую.
Попробовал "Отладка - ТолстыйКлиент". Запустил обработку, установил точку останова ПриОткрытии(), обработка открылась но в отладчике остановки не было. Gazulo --> Gazulo



Просмотр профиля

Inkognito @ Сегодня, 14:41 ,
[необходимо зарегистрироваться для просмотра ссылки]

[необходимо зарегистрироваться для просмотра ссылки]

Inkognito --> Inkognito



Просмотр профиля

Читайте также: