Использование структур для передачи параметров функций

06.12.11

Разработка - Математика и алгоритмы

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

Использование структур для передачи параметров функций

Описана полезная технология для передачи контекста через структуры.

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

На входе у нас есть некоторые параметры - П1, П2, ... ПN.

Далее по мере продвижения выполнения кода на основе этих параметров вычисляются другие значения - З1, 32, ... ЗM.

Функциональный блок сделан в виде набора функций Ф1 ... ФK, которые вызываются друг из друга.

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

Как добиться, чтоб значения П и З были доступны во всех нужных функциях, или в каждой из функций?

Можно завести глобальные переменные П1, П2, ... ПN и З1, 32, ... ЗM. Тогда проблема решена.

Но это плохое решение, т.к.:

  1. Глобальные переменные используются только на момент работы функции, в остальное время просто занимают память.
  2. Нарушается принцип изолированности функции, т.е. функция использует внешние данные.
  3. На сервере нельзя использовать глобальные переменные.

Второй вариант - во всех функциях передавать все необходимые значения П1, П2, ... ПN и З1, 32, ... ЗM.

Но это тоже плохое решение, т.к.:

  1. Нужно очень четко контролировать, какие переменные где нужны. Если что-то забыли, придется добавлять нужные переменные.
  2. Очень сильно растет стек, т.к. используется большое число параметров.
  3. Сложно добавить новый параметр, т.к. придется править все вызовы по передаче параметров.

Поэтому идеальное решение - использовать структуру для передачи контекста.

Обычно в своих решениях я даю ей наименование П.

При входе в блок я создаю структуру, в которой заполняю все исходные данные:

П = Новый Структура("П1, П2, ... ПN", П1, П2, ... ПN);

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

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

П.Вставить("ЗI", ЗI);

Таким образом, практически все функции блока имеют только один параметр - П.

Но не стоит увлекаться одной переменной контекста для всех участков кода. Вот пример, когда на участке лучше использовать отдельную переменную.

Пример с единой переменной:

Функция ОбойтиУровень(П)

  Если П.Уровень = 0 Тогда

    Возврат Неопределено;

  КонецЕсли;

  ТекУровень = П.Уровень;

  П.Уровень = П.Уровень - 1;

  ТекУровень = П.Уровень;

  ОбойтиУровень(П);

  П.Уровень = ТекУровень;

  ОбработатьУровень(П.Уровень);

КонецФункции

Пример с дополнительной переменной выглядит красивее:

Функция ОбойтиУровень(П, Уровень)

  Если Уровень = 0 Тогда

    Возврат Неопределено;

  КонецЕсли;

  ОбойтиУровень(П, Уровень - 1);

  ОбработатьУровень(П, Уровень);

КонецФункции

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

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

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

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

 

См. также

Математика и алгоритмы Программист Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    3315    stopa85    12    

38

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    7771    user1959478    52    

36

Математика и алгоритмы Разное Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Расширение (+ обработка) представляют собою математический тренажер. Ваш ребенок сможет проверить свои знание на математические вычисление до 100.

2 стартмани

29.09.2023    3253    maksa2005    8    

26

Математика и алгоритмы Инструментарий разработчика Программист Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    11029    7    SpaceOfMyHead    18    

61

Математика и алгоритмы Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Три задачи - три идеи - три решения. Мало кода, много смысла. Мини-статья.

03.04.2023    4513    RustIG    9    

25

Механизмы платформы 1С Математика и алгоритмы Программист Платформа 1С v8.3 Россия Бесплатно (free)

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

23.11.2022    3669    gzharkoj    14    

25

Математика и алгоритмы Программист Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    9069    7    kalyaka    11    

44
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. mrd_84 07.12.11 01:10 Сейчас в теме
2. Поручик 4692 07.12.11 01:30 Сейчас в теме
(0) 1С: Бухгалтерский учет 7.7; 1С: Оперативный учет 7.7; 1С: Расчет 7.7; 1C: OpenConf 7.7
В клюшках есть структуры? Или это глюк сайта, эти разделы сами добавляются?
4. fixin 4273 07.12.11 01:38 Сейчас в теме
(2) В клюшках есть списки, которыми можно моделировать структуры, подход от этого не меняется, не буквоедствуйте.
(3) Ну вот пусть и читают. ;-)
3. Поручик 4692 07.12.11 01:34 Сейчас в теме
Статья полезная новичкам, хотя идея использовать структуру для передачи параметров или контекста не нова. Сам использовал структуры ещё года три назад.
5. Angeros 07.12.11 05:11 Сейчас в теме
Коллега вам в журнализты надо было податься, столько воды из пальца высосать это надо уметь. Ну и как бы структуры для передачи параметров используются во всех типовых.
DrAku1a; Yashazz; larisab; Dolly_EV; +4 Ответить
7. fixin 4273 07.12.11 08:33 Сейчас в теме
(5) но не регулярно. Типовые вообще отличаются в этом плане лоскутностью. Где-то используются, где-то тащат хвост из 10 параметров... ;-) К тому же у меня есть еще вложенные структуры для рекурсивных функций, это самоценный по себе материал.
(6) Вы о чем? Речь идет о минимизации количества таскаемых из функции в функцию параметров.
6. TrinitronOTV 16 07.12.11 06:36 Сейчас в теме
да уж, дискуссия....
а передача параметров по ссылке?
8. dusha0020 1117 07.12.11 10:21 Сейчас в теме
И все-таки создание списков значений в клюшке весьма трудоемкий процесс. И как быть с передачей по ссылке?
10. Арчибальд 2709 07.12.11 11:02 Сейчас в теме
(8)
создание списков значений в клюшке весьма трудоемкий процесс

СоздатьОбъект("СписокЗначений") - 31 символ
Новый Структура - 15 символов
Т.е. трудоемкость в семерке вдвое превышает восьмерочную.
Установить - 10 символов
Вставить - 8 символов
И здесь 25% выигрыша.
Получить - 8 символов
Свойство - тоже 8. тут трудоескость совпадает :(
13. dusha0020 1117 07.12.11 11:29 Сейчас в теме
(10) Арчибальд, А как насчет этого:
П = Новый Структура("П1, П2, ... ПN", П1, П2, ... ПN);

И этого:
П = СоздатьОбъект("СписокЗначений");
П.ДобавитьЗначение(П1,"П1");
П.ДобавитьЗначение(П2,"П2");

... до N ?
15. Арчибальд 2709 07.12.11 14:59 Сейчас в теме
(13) Про "ДобавитьЗначение" в моем посте ни слова нет. А в контексте статьи, если начальные значения (параметры) вычисляются, и вовсе не о чем говорить.
Новые (по сравнению с семеркой) Структура и Соответствие - это просто излишние "сущности", не имеющие никаких оснований для своего появления. Понятно, коненчно, что в плане Запросов (специально выделил восьмерочную морковку) они отличаются от (семерочного) списка значений возможностью индексирования по ключу. Однако до восьмерочного списка значений они не дотягивают по функционалу.
25. DrAku1a 1745 01.08.20 08:01 Сейчас в теме
(10) LOL :-) Трудоёмкость мерить количеством символов или строк кода.
А я то всегда оценивал по читабельности кода и скорости его выполнения.
11. zfilin 2353 07.12.11 11:08 Сейчас в теме
(8) Ну, не такой уж и трудоемкий.

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

И, кстати, я бы сказал, что лучше было бы передавать несколько структур, сообразно сущностям, которые объединяют параметры. Например, если в некую функцию передается "Город", "Улица", "Дом", "ФИО", "ДатаРождения", "ИНН", то возможно это логично разбить на две структуры: "Адрес" ("Город", "Улица", "Дом") и "Контрагент" ("ФИО", "ДатаРождения", "ИНН"). А вообще, читайте Мартина у него хорошо об этом написано.
9. alex_bob 248 07.12.11 11:01 Сейчас в теме
У описанной технологии есть отрицательные стороны - за всё надо платить.
1. Функция не знает, есть ли в переданной структуре нужные элементы структуры и какие они имеют типы. Следовательно всё нужно проверять внутри функции, что может влиять на производительность.
2. На извлечение элементов из структуры тратится определенное время. Если функция будет внутри цикла, то это может быть ощутимо.
Возможно именно поэтому такой подход и применяется не повсеместно, а лишь в некоторых местах.
12. zfilin 2353 07.12.11 11:18 Сейчас в теме
(9) Ну. В 1С типы и в описании параметров не проверяются. =)
И насчет проверки... Если вы обратитесь к параметру, который в функцию не передавали, так как не описывали в списке передаваемых параметров, то получите ошибку, так же как при обращении к несуществующему элементу структуры.
Хотя, в целом согласен, что структуры могут усложнить отладку, так как скрывают детали описания "интерфейса функции".
14. Ёпрст 1065 07.12.11 14:44 Сейчас в теме
Если че, в клюшках Структура есть сто лет в обед, и Вектор и АссоциативныйВектор..
Арчибальд; +1 Ответить
16. Арчибальд 2709 07.12.11 15:00 Сейчас в теме
(14) В клюшках есть все, кроме дурацких восьмерочных заморочек :))
17. zfilin 2353 07.12.11 17:25 Сейчас в теме
(16) Эге! Это не заморочки, это передача параметров в конструктор объекта! =)
18. Ёпрст 1065 07.12.11 17:38 Сейчас в теме
Кстати, Фиксин, ты прям восставший из ада!
Тебя вроде как изгнали отовсюду ?, ан нет, живой чертяка..
19. Поручик 4692 10.12.11 18:41 Сейчас в теме
(18) Подтверждение теории Кащея Бессмертного.
(16) Список заморочек в студию или вы не понимаете матчасти, это две совершенно разных среды.
20. luns 21.12.11 13:27 Сейчас в теме
(18) так если человек себя ведет прилично в обществе. делиться наработками, то это же всегда хорошо.
наверное прошел подростковый период.
21. fixin 4273 21.12.11 13:58 Сейчас в теме
(20) я каким был таким и осталя. Обработками делился всегда. В обществе веду себя соответственно этому обществу. Что-то я не понял вашей мысли.
22. luns 21.12.11 14:33 Сейчас в теме
(21) насчет обработок верно.
просто ранее высказывался порой не лицеприятно в адрес оппонентов и агрессивно реагировал на критику в свой адрес.
общество за это время кардинально не изменилось, а стиль общения с тобой теперь совсем иной.
вот я и сделал вывод что изменился ты, что очень хорошо.
вот такая мысль.
23. fixin 4273 21.12.11 14:48 Сейчас в теме
(22) возможно, возможно. Но когда ты Гений, постепенно перестаешь реагировать на Мосек, видимо поэтому я меньше огрызаюсь.
24. luns 21.12.11 15:27 Сейчас в теме
fixin пишет:

перестаешь реагировать на Мосек


Вот именно про такой стиль общения я и говорил.
Возможно я поспешил с выводами о взрослении :)
26. CratosX 114 10.02.22 20:28 Сейчас в теме
Стандарт #std641
Особенности использования структур в качестве параметров процедур и функций
https://its.1c.ru/db/v8std/content/641/hdoc
Оставьте свое сообщение