Функциональное программирование на 1С - миф или реальность?

25.02.17

Разработка - Рефакторинг и качество кода

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

Скачать исходный код

Наименование Файл Версия Размер
Donat (1) 1Cv8_OOP_FuncProgramming.rar
.rar 13,89Kb
103
.rar 13,89Kb 103 Скачать бесплатно

Идея реализовать подобную возможность пришла ко мне в ходе освоения замечательного языка Pythоn.. и изначально я думал написать транслятор 1С <=> Python, но бесшовного способа вызывать код Python'а из 1С и получать результаты вычислений обратно - никак не находилось (кстати, если кто видел удачную интеграцию 1С и Python - поделитесь наработками или ссылками, может быть тоже получится что интересное)..

Несколько позже я поближе познакомился на githab'е  1C_Script и его расширениями языка - что позволяло импортировать внешние библиотеки.. и вроде бы всё замечательно, но всё же меня никак не покидала мысль - что 1С'у всё же было-бы гораздо больше пользы, если добавить в язык "удобностей", дабы писать в ООП- и функциональной парадигме .. 

Я стал экспериментировать и искать способ, как бы приспособить то, что есть в платформе под ООП подход и обнаружил, что в качестве классов удобнее всего использовать обычные формы (не открывая их). Через некоторое время обнаруженные приёмы помогли мне отрефакторить сложную обработку.. Потом заказчик захотел запускать алгоритм в фоновом задании - а формы в таком контексте недоступны :((

Замена нашлась в лице модуля Обработок.. все было переделано и запущенно (в фоновых заданиях) - код практически без переделок был перенесен из модулей форм в модули "пустых" обработок (у них, кроме, соответственно, модуля, ничего и нет). 

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

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

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

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

PS  Конечно, написанное за 2 дня приложение с такими извращениями - глюкавый прототип.. но он работает, судя по примерам..

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

Жду отзывов и надеюсь на интерес. Что думаете, коллеги?

В общем, прошу доната ;) если будет отклик - попробую добавить возможность писать вызовы функций в параметрах функций и подумать над (1) возможностью описания функций внутри функций и (2) как добавить возможности эмуляции "замыканий"... возможно, поработать над синтаксическим сахаром - после python создание массивов / хешированных списков так, как это сделано в 1С - кажется в некотором роде мазохизмом, знаете :)

ООП функциональное программирование парадигма

См. также

Результаты ревью кода 1500+ решений каталога Инфостарт: наиболее частые ошибки разработчиков в коде

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Поделюсь своим опытом аудита кода авторских продуктов с Infostart.ru как одним из элементов применения DevOps-практик внутри Инфостарт. Будет настоящий код, боевые скриншоты, внутренние мемы от команды ИТ-лаборатории Инфостарт и прочее мясо – все, что любят разработчики.

10.04.2024    5415    artbear    77    

75

Ниндзя-код

Рефакторинг и качество кода Платформа 1С v8.3 Россия Бесплатно (free)

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

01.04.2024    2310    DrAku1a    15    

33

Практическое программирование: когда скорость важнее совершенства

Рефакторинг и качество кода Бесплатно (free)

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

01.04.2024    596    Prepod2003    6    

2

Когда понадобился новый оператор

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

Когда понадобился новый оператор, но его нет в синтакс-помощнике, что делать?

18.03.2024    1352    ZhokhovM    4    

4

Когда разработчик платформы не добавил проверку препроцессоров

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

Когда разработчик платформы решил пойти на кухню за кофе, а проверку препроцессоров не добавил, и вот тут-то и началось: "Что, опять все сломалось? Ну и кофе же я забыл сделать!".😅

18.03.2024    3004    ZhokhovM    4    

9

Реструктуризация - бесконечная история

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

При разработке программ требуемый функционал ставят на первое место, но есть еще и архитектура программы. На горизонте 5-10 лет она становится важнее функционала, который должен работать при масштабировании и росте данных. Реструктуризация 5 терабайтной базы 1С 8.2 в формат 1С 8.3, складывает весь пазл архитектурных просчетов, которые сделали ради функционала. Как это исправить? - для разработки правильной архитектуры, нужно всего лишь сместить фокус с функционала и подумать о «вечном».

29.09.2023    2078    1CUnlimited    15    

23
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
99. starik-2005 3036 05.03.17 15:50 Сейчас в теме
(97)
Так, если бы вы обратили внимание на ошибку, то там ясно говорится, что переменной i не объявлено вообще в области видимости std::cout, а не переменная не инициализирована.
Гы... Если бы Вы сами обратили внимание на код, то не говорили бы сейчас такое. А то, что инфостарт грохает пробелы в цитатах - это отдельная песня. std::cout - это не область видимости, а объект потока вывода, std - пространство имен.
Прикрепленные файлы:
+
102. Brawler 455 05.03.17 16:12 Сейчас в теме
(99) все я прекрасно там в коде прочитал, ваш код еще вот так записать можно

Код
if (1) 
{
   int i=10;
}

std::cout << i;
Показать полностью


И вот видим, что переменная i объявлена в ветке Тогда, что располагается между фигурными скобками. И именно там её область видимости не выходящая за эти скобки, а в строке

std::cout << i;

её области видимости заканчивается и ее нельзя применять

Заметьте я не говорю, что std::cout это область видимости, а в момент обращения к std::cout, сама std::cout находится уровнем области видимости выше чем объявлена переменная i, тут та и ошибка возникает, так как нет объявленной переменной.
+
103. starik-2005 3036 05.03.17 16:27 Сейчас в теме
(102)
все я прекрасно там в коде прочитал
Тогда как понять Вашу фразу?
переменной i не объявлено вообще в области видимости std::cout
Я ее понял буквально как написано. а написано именно так.
+
104. Brawler 455 05.03.17 17:02 Сейчас в теме
(103)
Я ее понял буквально как написано. а написано именно так.

Теперь та поняли?
+
94. Brawler 455 05.03.17 14:38 Сейчас в теме
(91)
Так какого лешего 1С-нику должен быть понятен лаконичный код питона? Пусть такой 1С-ник идет и курит бамбук до полного просветления.

Ну приехали...
Я понимаю Паскаль, я понимаю Бейсик, я худо бедно но могу попробовать разобраться в С++ и Java, я понимаю С#, даже на FoxPro и то доводилось программировать, а теперь на меня налепили клеймо 1С программиста и меня можно списать в утиль.

СПАСИБО!!!

Думаю пусть идет нервно курит в сторонке свой бамбук именно программист питона, если он придя ко мне начнет мне сдавать код на своем великом и могучем, я его пошлю подальше, так как после него, как он свалит, а свалит он в любом случае рано или поздно, так вот после него еще людям работать нужно будет со старым кодом, и он должен быть понятен даже новичку!
Vitaly1C8; +1
95. starik-2005 3036 05.03.17 14:43 Сейчас в теме
(94)
СПАСИБО!!!
Да всегда пожалуйста!
Python[6] (МФА: [ˈpʌɪθ(ə)n]; в русском языке распространено название пито́н[7]) — высокоуровневый язык программирования общего назначения, ориентированный на повышение производительности разработчика и читаемости кода. Синтаксис ядра Python минималистичен. В то же время стандартная библиотека включает большой объём полезных функций.

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

Эталонной реализацией Python является интерпретатор CPython, поддерживающий большинство активно используемых платформ[8]. Он распространяется под свободной лицензией Python Software Foundation License, позволяющей использовать его без ограничений в любых приложениях, включая проприетарные[9]. Есть реализации интерпретаторов для JVM (с возможностью компиляции), MSIL (с возможностью компиляции), LLVM и других. Проект PyPy предлагает реализацию Python с использованием JIT-компиляции, которая значительно увеличивает скорость выполнения Python-программ.

Python — активно развивающийся язык программирования, новые версии (с добавлением/изменением языковых свойств) выходят примерно раз в два с половиной года. Вследствие этого и некоторых других причин на Python отсутствуют стандарт ANSI, ISO или другие официальные стандарты, их роль выполняет CPython.
V.S.
Встроенный язык

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

Встроенный язык имеет много общих черт с другими языками, такими как Pascal, Java Script, Basic, что облегчает его освоение начинающими разработчиками. Однако он не является прямым аналогом какого-либо из перечисленных языков.

Вот лишь некоторые, наиболее значимые особенности встроенного языка:

предварительная компиляция - перед исполнением модули, содержащие текст на встроенном языке, преобразуются во внутренний код;
кэширование скомпилированных модулей в памяти;
мягкая типизация - тип переменной определяется типом значения, которое она содержит, и может изменяться в процессе работы;
отсутствие программного описания объектов конфигурации - разработчик может использовать либо встроенные в платформу объекты, либо объекты, созданные системой в результате визуального конструирования прикладного решения.
Показать
+
96. kote 536 05.03.17 15:16 Сейчас в теме
(94)
так вот после него еще людям работать нужно будет со старым кодом, и он должен быть понятен даже новичку


.. если бы код был всегда понятен новичку - то не было бы деления на новичков и профи.

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

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

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

И это было большое разочарование. Для меня. Где то с тех пор - я не пишу в техподдержку.. и как правило ошибки исправляю сам - быстрее и надёжнее.

Где-то так.
+
100. Brawler 455 05.03.17 16:02 Сейчас в теме
(96) Готов вас разочаровать, но на языках высокого уровня да на том же Delphi можно такую шляпу на программировать, что код будет настолько сложен, что проще избавится от всего проекта и начать с нуля (уже даже и не на Delphi), так как когда язык дает море вольностей, тогда там получается такой дикий код, что вам уже и в помине никто ничего не расскажет, так как такие практики программирования не применяет никто, и там такие дикие завязки начинаются на всякого рода левых библиотеках компонентов, что уже и среду разработки не обновить, пока не перепишешь чужие библиотеки говнокода.
Все познается в сравнении. Проходили, имеем опыт общения с кодом имеющим возможности ООП. Прогеры высокоуровневой херни понапишут и сваливают, а потом огребай за них...
+
101. Euroset1 11 05.03.17 16:06 Сейчас в теме
В конечном счете, всем все равно, где вы храните одежду и в каком виде. Вас оценят все равно по самой одежде в момент ее использования. Также, как и оценивать ваш код будут явно по результату, а не по тому, как красиво или уродливо он написан. Если ваш код хорошо отвечает требованиям быстродействия, не содержит багов, отрабатывает предсказуемо - вы на коне. Если нет, то нет. Так что право на извращение вы имеете и с этим никто не спорит.

Разработчики 1С сами делают классы, которые они считают нужными. Если этих классов не хватает, то это повод сменить 1С на другую платформу, которая это позволяет. В конце концов, заюзать С++ билдер. Как вместо 1С, так и для построения COM объектов, в которых можно прекрасно отработать ООП, не насилуя 1С. И исполняться это будет в сотни раз шустрее, чем интерпретируемый код 1С.

Я пришел к выводу, что эта статья очень похожа на те статьи: "Как на камазе припарковаться между двумя внедорожниками", "Уроки перевозки стройматериалов на малолитражке", "Вождение мотоцикла в арктике", "Как не испортить гвоздь при забивании топором", "Как из гаечного ключа сделать открывашку))". Я тоже очень не доволен, что моим молотком плохо получается сверлить дырки. Как раз пишу статью о том, как доработать молоток для сверления отверстий, кипячения воды и разделки мяса.
Vitaly1C8; CyberCerber; dj_serega; kote; +4
105. kote 536 05.03.17 20:19 Сейчас в теме
(101)
Как вместо 1С, так и для построения COM объектов, в которых можно прекрасно отработать ООП, не насилуя 1С.


Антон, проблема в том, что в компоненте будет ООП, но не будет объектной модели 1С со всеми её классами в нормальном (удобном) виде - в конечном итоге данные придётся качать много раз туда-сюда.. и мы приходим уже к тому, что в сотни раз увеличенное быстродействие С++ не играет роли. Это мои соображения и причина, почему не хочется заморачиваться с этими технологиями.
+
106. starik-2005 3036 06.03.17 10:47 Сейчас в теме
(105)
проблема в том, что в компоненте будет ООП, но не будет объектной модели 1С со всеми её классами в нормальном (удобном) виде - в конечном итоге данные придётся качать много раз туда-сюда..
Вот поэтому в мировой практике фреймворки для доступа к объектам СУБД используют ORM, а для изменения структуры СУБД - миграции. 1С тут опять отстает - ORM у нее без возможности изменения, ибо - Боже мой, 1С-ник напишет запрос к базе! - не доверяет 1С разработчикам, да еще и пункт в лицензионное соглашение добавили о прекращении поддержки при самовольном обращении к SQL. Ну а уж о миграциях даже говорить не буду - 1С сделала кривой костыль реструктуризации по типу "запрос в цикле", который иногда реструктуризирует-реструктуризирует, и не выреструктуризирует... Часами молотит то, что SELECT INSERT делает за минуту.И для чего? Чтобы отсталому программисту показать прогресс, который при переключении окошек или в терминальном сеансе все-равно перестает отображаться. Ну нахрена?
zfilin; kote; +2
107. pbazeliuk 1959 07.03.17 10:18 Сейчас в теме
(105) Возможно, вы не много работали с ООП. Года 3 назад я считал что ООП, то что не достает 1С:Предприятие, но время бежит и коммерческий опыт в других языках программирования у меня вырос значительно. Как оказалось, ООП без знания и применения паттернов ничего не стоит.
Все задачи связанные с 1С:Предприятие можно решить красиво и элегантно без ООП. Единственное, что недостает это описание этих архитектурных паттернов, конечно есть стандарты разработки, но они локальные.

P.S. Если вы работали с ERP 2.0, применение там некоторого подобия ООП привело к тому, что отлаживать это очень затруднительно.
zfilin; Vitaly1C8; +2
108. starik-2005 3036 07.03.17 12:47 Сейчас в теме
(107)
ак оказалось, ООП без знания и применения паттернов ничего не стоит.
Это утверждение можно применить к чему угодно. Программирование без владения основными алгоритмами и паттернами в принципе ведет к запутанному спагетти-коду. И это касается любого стиля. Но при ограничении языка в любом случае приходится писать тот самый бич-код )))
kote; +1
109. kote 536 07.03.17 14:37 Сейчас в теме
(107)
Как оказалось, ООП без знания и применения паттернов ничего не стоит.


Не спорю. Паттерны - как кулинарная книга.. пока опыта нет, лучше готовить для клиентов по проверенным рецептам..
Но и книгу рецептов тоже кто-то написал.

К тому же, один и тот же паттерн выглядит по разному в разных языках - в зависимости от предоставляемого языком функционала..
Например, а знаете ли Вы, что паттерн "декоратор" практически встроен в поставку python?

.. потом, т.н. классы - регистры сведений, расчетов да и др. сущности в 1С - по сути, тоже паттерны, но более высококуровневые - разве нет?

И я бы поспорил с этим утверждением:

Все задачи связанные с 1С:Предприятие можно решить красиво и элегантно без ООП.


.. потому, что
Если вы работали с ERP 2.0, применение там некоторого подобия ООП
говорит о том, что таки нет, похоже, что не все..

===

Даже более того - вот этой своей простой разработкой (именно - простой, а не абсолютно правильно спроектированной**) я попытался показать, что ООП подход гораздо проще решает, например, задачу псевдо-расширения синтаксиса языка..

Кстати, Вы видели где нибудь еще консоль, в которой можно определять функции так, как тут - просто описав код? Посмею утверждать, что если такое реализовать не используя ООП - получится гораааааааздо более длинный (=> запутанный и трудный для понимания) код..
========

** для этого надо писать полноценный интерпретатор на эмуляции стека вызовов, IMHO
+
110. adam26 42 07.03.17 14:47 Сейчас в теме
Подскажите
RegExp = Новый COMОбъект("VBScript.RegExp"); 
не является использование внешней компоненты?
+
111. kote 536 07.03.17 15:06 Сейчас в теме
(110) ха :) точно, является.. поправлю.

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

Извиняюсь.
adam26; +1
112. starik-2005 3036 07.03.17 16:09 Сейчас в теме
(111)
быстро стало ясно, что надо переходит на регулярные выражения
Что, опять же, говорит о том, что используя регулярки получается реализовать функционал проще. Т.е. добавляя возможность мы упрощаем код. Возможность - это встроенный механизм, позволяющий скрыть сложность, запечатать ее в контейнер. ООП как раз и позволяет скрывать сложность. Например, объектно-реляционная модель, запиленная в 1С "искаропки" без возможности ее расширения скрывает сложность доступа к объектам и обеспечивает целостность объектов. Но же порождает сложность на уровне последующего анализа производительности. При этом закрытая ОРМ не позволяет влиять на производительность изменением объекта доступа к данным. Неуправляемая скрытая сложность ведет к проблемам. В ТРИЗ это как раз называется логическим противоречием, когда улучшение одной характеристики (снижение сложность доступа к объектам ИБ) ухудшает другую характеристику (невозможность влияния на производительность). И разрешением этого противоречия может быть только возможность изменять базовые объекты ОРМ, что в 1С невозможно.
dj_serega; kote; +2
113. tango 540 24.03.17 22:59 Сейчас в теме
возможно, это интересно

но 1снег - это НЕ программист
+
114. starik-2005 3036 25.03.17 17:00 Сейчас в теме
(113) Ага, "курица - не птица" и так далее...
+
115. tango 540 03.04.17 20:26 Сейчас в теме
причем здесь курица

1снег - это прокладка между бестолковками юзерофф и информационной системой
программирование на 1с-скрипте - это последнее, чем 1снег должен заниматься
+
117. nicxxx 254 30.06.17 14:23 Сейчас в теме
и вообще, можно пример реального использования?
+
119. pvlunegov 157 15.04.20 07:59 Сейчас в теме
Автору зачет! Шикарно!
В обработке вывел сформировал следующий код:

Функция КтоЯ(Имя)
	Сообщить("я "+Имя);
КонецФункции

Функция ПрименитьФункциюКМассиву(ОбъектФункция, Массив)
	МассивРезультат = Новый Массив;
	Для Каждого ЭлементМассива Из Массив Цикл
		Отображение = ОбъектФункция(ЭлементМассива); 
		МассивРезультат.Добавить(Отображение);
	КонецЦикла;
	Возврат МассивРезультат;
КонецФункции

мМассив = Новый Массив;

мМассив.Добавить("мужчина");
мМассив.Добавить("женщина");
мМассив.Добавить("ребенок");


// .. а тут нам возвращается новый массив, после возведения каждого его элемента в степень..
мРезультаты = ПрименитьФункциюКМассиву(КтоЯ, мМассив);
Показать



-------------------------------

В результате выполнения кода вывелось:
я мужчина
я женщина
я ребенок
Прикрепленные файлы:
+
120. pvlunegov 157 15.04.20 10:47 Сейчас в теме
Выполнил следующий код в консоли:
Функция Получить_имя_Члена_Семьи_По_Семейному_Статусу(ТаблицаСемьи, семейныйСтатус)
	НайденныеСтроки = ТаблицаСемьи.НайтиСтроки(Новый Структура("СемейныйСтатус",семейныйСтатус));
	Если НайденныеСтроки<>неопределено и НайденныеСтроки.Количество()<>0 Тогда 
		Возврат НайденныеСтроки[0].Имя;
	КонецЕсли;
	Возврат "";
КонецФункции

Функция Получить_статус_партнера_Члена_Семьи_По_Семейному_Статусу(ТаблицаСемейныхСвязей, семейныйСтатус)
	НайденныеСтроки = ТаблицаСемейныхСвязей.НайтиСтроки(Новый Структура("СемейныйСтатус",семейныйСтатус));
	Если НайденныеСтроки<>неопределено Тогда 
		Возврат НайденныеСтроки[0].Семейный_статус_партнера;
	КонецЕсли;
	Возврат "";
КонецФункции

Функция ДобавитьСтрокуВТаблицу(Таблица, СтруктураЗначений)
	НоваяСтрока = Таблица.Добавить();
	
	Для каждого элементКоллекции Из СтруктураЗначений Цикл
		Если Таблица.Колонки.Найти(элементКоллекции.Ключ)=неопределено Тогда
			Таблица.Колонки.Добавить(элементКоллекции.Ключ);
		КонецЕсли;
		НоваяСтрока[элементКоллекции.Ключ] = элементКоллекции.Значение;
	КонецЦикла;         
КонецФункции

// Объявляем структуры Таблиц
ТаблицаСемьи = Новый ТаблицаЗначений;
ТаблицаСемейныхСвязей = Новый ТаблицаЗначений;

// Добавляем строки в таблицы                    

Структура = Новый Структура("СемейныйСтатус,Семейный_статус_партнера","муж","жена");
ДобавитьСтрокуВТаблицу(ТаблицаСемейныхСвязей,Структура);
Структура = Новый Структура("СемейныйСтатус,Семейный_статус_партнера","жена","муж");
ДобавитьСтрокуВТаблицу(ТаблицаСемейныхСвязей,Структура);

Структура = Новый Структура("Пол,Имя,СемейныйСтатус","мужчина","Артур","муж");
ДобавитьСтрокуВТаблицу(ТаблицаСемьи,Структура);
Структура = Новый Структура("Пол,Имя,СемейныйСтатус","женщина","Лиза","жена");
ДобавитьСтрокуВТаблицу(ТаблицаСемьи,Структура);

// Обрабатываем данные таблиц
Для каждого Строка Из ТаблицаСемьи Цикл
	Статус_семейного_Партнера = Получить_статус_партнера_Члена_Семьи_По_Семейному_Статусу(ТаблицаСемейныхСвязей,Строка.СемейныйСтатус); 
	
	Сообщить("Меня зовут "+Строка.Имя+". я "+Строка.Пол+". В семье я "+Строка.СемейныйСтатус+
	". Мой семейный партнер "+Статус_семейного_Партнера+
	". Имя моего семейного партнера = "+Получить_имя_Члена_Семьи_По_Семейному_Статусу(ТаблицаСемьи, Статус_семейного_Партнера));		
КонецЦикла;
Показать


Получил результат в виде сообщений:

Меня зовут Артур. я мужчина. В семье я муж. Мой семейный партнер жена. Имя моего семейного партнера = Лиза
Меня зовут Лиза. я женщина. В семье я жена. Мой семейный партнер муж. Имя моего семейного партнера = Артур

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


ПРОБЛЕМА.
Консоль не понимает код вида:
ДобавитьСтрокуВТаблицу(ТаблицаСемейныхСвязей,Новый Структура("СемейныйСтатус,Семейный_статус_партнера","муж","жена"));

Чтобы такой кусок кода отрабатывал (как он работает в приложенной обработке), пришлось его модифицировать для выполнения в консоли:
Структура = Новый Структура("СемейныйСтатус,Семейный_статус_партнера","муж","жена");
ДобавитьСтрокуВТаблицу(ТаблицаСемейныхСвязей,Структура);


Таким образом, добавление строки в таблицу значений, вместо 1 строки кода приходиться расписывать в 2 строки кода.
Прикрепленные файлы:
Тест.epf
+
121. kote 536 16.04.20 10:53 Сейчас в теме
(120) Спасибо.
Да, есть такая проблема - парсер на регулярках
вложенные выражения со словом Новый не разбирает..
+
122. pvlunegov 157 17.04.20 07:04 Сейчас в теме
(121) Спасибо огромное разработка очень классная. Я разобрал много примеров выполнения кода, все работает.
Практическая польза есть. С помощью вашей разработки можно выполнять скрипты которые будут записаны в текстовых файлах.
Проблема в том, что скрипты которые будут работать в данной конфигурации должны учитывать конфигурацию в которой они выполняются.
Либо они будут написаны в универсальном формате.

Большая просьба подумать, как можно в существующей технологии добавить КЛАССЫ как в других языках программирования.
Классы нужны с минимальным функционалом (определение переменных, функций в классе, создание экземпляра класса, вызов методов класса экземпляра класса ).
+
123. kote 536 20.04.20 15:09 Сейчас в теме
(122) Это можно сделать.. все составляющие для этого уже работают в реальных базах.
Займусь в отпуске, если придется проводить его взаперти ))

Если будете делать сами, то нужно соединить вместе вот эти вещи:

1) Выделение из кода в консоли кода всех классов.

2) Сборка обработки из xml с подменой модуля обьекта на код Вашего класса. По сути - обработка и будет классом, т.е. шаблоном объекта, где можно
описать поля и методы...

3) Написать инициатор объекта из класса - т.е. спец. функцию, которая отработает в обработке и вернет НОВЫЙ экземпляр той обработки, в которой она отработала. (напрмер фукнция будет называться НовыйОбъект() Экспорт)

4) В коде консоли вместо определений класса - вставить инициализацию вышеописанных обработок в переменные с именем класса.

5) В коде консоли вместо кода инициализации объектов (инстансов) класса - вставить код Объект = Класс.НовыйОбъект();

===

На выходе получится то, что Вы просите.
Это все 100% работает по отдельности под большими нагрузками..
+
124. pvlunegov 157 21.04.20 08:11 Сейчас в теме
Добрый день! Посмотрел разработки других товарищей, программистов 1с.
У них реализовано ООП но не средствами платформы 1с, а на других платформах (C.Net, FoxPro) но с русскоязычным синтаксисом, 1с подобными языками.
Эти идеи я считаю более здравыми, потому что если уж делать ООП, то полноценный а не кастрированный, как это получится на платформе 1с.
Предлагаю вам ознакомиться с трудами товарищей, подумать, может быть ваши усилия разработческие направить в эти русла, списаться с разработчиками и попробовать посотрудничать.
Ищите на Инфостарт разработки - язык программирования "Перфолента", язык программирования "Русский Фокс".
Ссылки:
1. Перфолента
https://infostart.ru/public/1095329/
https://infostart.ru/public/1101638/
http://promcod.com.ua/cat.asp?cat=perfolenta-programmig-language
2. Русский фокс
https://infostart.ru/public/1128834/
https://www.youtube.com/watch?v=4QQ5ba1NyAk&list=PLo4sldcUomOrKAPb_0A5Kv-nILQG3I7Dd
https://github.com/UfaScript/RusFox
https://open-budget.ru/public/1128834/

Русский фокс, что уже реализовано:
большинство функций низкого уровня:
ООП, все операции с типами данными
автоматическое создание сайтов на движках Joomla, Bootstrap
автоматическая сборка и изменение веб-сервисов для сайтов

Перфолента, что уже реализовано:
большинство функций низкого уровня, создание dll.
Перфолента создает dll которые можно интегрировать для работы в язык Русский фокс
+
125. kote 536 21.04.20 09:30 Сейчас в теме
(124) Спасибо. Это видел.

Вы пропустили https://github.com/EvilBeaver/OneScript

Идею 1С-подобных языков я не поддерживаю совсем.
(Только полный аналог - как стараются сделать разработчики OneScript - мне по душе)

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

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

Пока же я пробую использовать разработки типа этой:
https://infostart.ru/public/186206/

.. и тогда вы получаете полный ООП и кучу батареек с наработками.

К тому же своих программистов я прогоняю по курсу python на Степике -
это расширяет кругозор, поднимает скилы и позволяет ориентироваться
в коде написанном в ООП стиле для товарищей, которые застряли в 1С.
+
126. AntonProgma 46 28.06.21 22:41 Сейчас в теме
Небольшая конфигурация с демонстрацией возможности писать код в _функциональном_стиле_ в среде 1С, - без использования каких бы то ни было внешних компонент или инструментов.. только 1С.


Только 1С и
RegExp = Новый COMОбъект("VBScript.RegExp");
+
127. kote 536 30.06.21 14:08 Сейчас в теме
(126) Да, формально - есть грешок
С другой стороны - это наиболее используемый в 1С способ получения регулярок.
Но работает это только в Windows, конечно..

Надеюсь, 1С когда-нибудь разродятся и добавят в платформу полноценную работу с регулярными выражениями.
+
128. AntonProgma 46 30.06.21 14:13 Сейчас в теме
(127)регулярные выражения ещё не понимают вложенность, лучше разобрать перебором символов. Я уже начал)
+
Оставьте свое сообщение