◄ 1 2 |
1С:Предприятие
:: 1С:Предприятие 8 общая
|
|
| ||
pechkin 20.04.20 - 16:07 | Скоро случится чудо и в 1с завезут Async - Await https://wonderland.v8.1c.ru/blog/uluchsheniya-v-sintaksise-yazyka-1s-dlya-raboty-s-asinkhronnymi-funktsiyami/ | ||
Вафель 101 - 23.04.20 - 22:23 | Ну собственно про что я и говорил
О каких замыканиях идёт речь пока нет функций параметров | ||
Serginio1 102 - 23.04.20 - 22:30 | (100) Меня Вафель спаривал зачем мне замыкания. Я ему привел пример. В качестве делегата может выступать замыкание и как правило оно и будет выступать.
В примере как раз не лямда, а функция (делегат). Лямбда выражение это немного другое, это локальная функция которая может захватывать контекст https://ru.wikipedia.org/wiki/Лямбда-выражение x => x * 5 | ||
Вафель 103 - 23.04.20 - 22:40 | Ты видно совсем не понимаешь о чем я говорю | ||
Serginio1 104 - 23.04.20 - 22:40 | (101) Вот пример использования без параметров
Можно внутри функции создавать и использовать замыкание Процетура ТестЗамыканий(); delegates = новый Массив; outside = 0;// #1 Создает экземпляр переменной только однажды Пока (i<2) { inside = 0;// #2 Создает экземпляр переменной многократно массив.Добавить(() => delegate// #3 Захват переменной анонимным методом { Сообщить(""+ outside+"," inside); outside=outside+1; inside=inside+1; };} first=массив[0]; second=массив[0]; first(); first(); first(); second(); second(); first(); second(); КонецПроцедуры Сначала нужны переменные типа замыкания | ||
Вафель 105 - 23.04.20 - 22:41 | Я не спрашивал тзачем нужны замыкания Я спрашивал (101) | ||
Serginio1 106 - 23.04.20 - 22:42 | Или переменные функции. Суть переменных функций без замыканий мало. Так или иначе замыкания нужны и уже давно. | ||
Serginio1 107 - 23.04.20 - 22:45 | (105) Так назовем нужен тип Функция. Так тебя устроит?
То что нет типа функция поэтому нет и параметров функция и замыканий. Или так нужен тип параметра функция! Так тебя устроит? | ||
Вафель 108 - 23.04.20 - 22:50 | Ну вот другое дело | ||
Serginio1 109 - 23.04.20 - 23:05 | Так какой смысл замыкания без типа функция? Понятно, что должен быть и тип это помему и … понятно? | ||
Cthulhu 110 - 23.04.20 - 23:08 | еще замыкание - и можно переименовывать в 1с# ?....... | ||
Serginio1 111 - 23.04.20 - 23:21 | (110) Так они ввеели async awaite из JS так что 1С_JS | ||
Serginio1 112 - 23.04.20 - 23:23 | Кстати метод "Выполнить" захватывает локальный контекст. | ||
DTX 4th 113 - 24.04.20 - 00:43 | Я ржу Асинки без замыканий и стрелочных функций, огоньПздц, бафните язык уже, а то кодить большой. | ||
DTX 4th 114 - 24.04.20 - 00:45 | больно* | ||
Asmody 115 - 24.04.20 - 01:17 | |||
Cthulhu 116 - 24.04.20 - 01:54 | на самом деле вот про 1с... так, на всякий случай - взгляните на рукописное начертание буквы "алеф"... | ||
APXi 117 - 24.04.20 - 08:27 | (19) А разве у процедуры ЗаполнитьТовары(Команда) не должно быть впереди Асинк? | ||
Сияющий в темноте 118 - 24.04.20 - 17:05 | (100) скорее даже,указатель на функцию,который,кстати в 1с реализовали через обработкаоповещения.
(113) у них в общих модулях только локальные переменные,так что до замыканий им очень далеко. хотя,через ту же обработку оповещения это все реализуется. а собственно,как и сама обработка через структуру. хочешь указатель на функцию-все просто: новый Структура("Имя,Модуль,Параметры,КонтекстЗамыкания") и в путь ^_^ | ||
Serginio1 119 - 24.04.20 - 17:16 | (118) Замыкание кстати может изменять контекст. Придется вручную восстанавливать контекст | ||
ptiz 120 - 24.04.20 - 17:21 | Навеяло вашими диалогами.
Может когда-нибудь в 1С 8 сделают и такую вещь как "Контекст"? В 7.7 ведь было! | ||
Serginio1 121 - 24.04.20 - 17:28 | (120) Здесь под контекстом понимаются переменные функции и родительских замыканий. Замыкание может быть вложено в замыкание | ||
Сергиус 122 - 24.04.20 - 17:29 | (120)В чем суть 7-ного контекста? | ||
Eiffil123 123 - 24.04.20 - 17:34 | Особо обрадуются разработчики, которые использовали переменные с именами новых ключевых слов. | ||
Serginio1 124 - 24.04.20 - 17:53 | (123) Ну наверное нужно сделать рефакторинг. | ||
Djelf 125 - 24.04.20 - 18:19 | (115) Да, "Обещание" как то не очень.
Оно может что-то вернуть, или не вернуть, и вообще обмануть... Нужно было бы использовать слово "Клятва", чтобы гарантировать возврат. | ||
Сияющий в темноте 126 - 24.04.20 - 18:32 | (125)обещание результата.
вполне нормально. (119) ну,если контекст это структура,то вполне нормально-ссылок много,а структура одна. просто,переопределить работу со структурой,и все будет работать. (123) они это уже проходиди,у них в БСП были функции,которые потом стали встроенными,но с другим набором параметров,так что им по граблям не привыкать ходить,и другим предлагают. | ||
Сияющий в темноте 127 - 24.04.20 - 18:35 | потом,в 1с просто нет статических переменных,а время жизни переменной-вопрос открытый,боюсь,что компилятор их выкидывает из памяти еще до выхода из функции. | ||
Сияющий в темноте 128 - 24.04.20 - 18:47 | В 7.7 контекст работал очень похоже на значение контекста,а в 8 его заменили обьектом,где также экспортные функции доступны. | ||
Serginio1 129 - 24.04.20 - 18:56 | (126) Прелесть лямбда выражений, что они создаются по месту. В .Net в начале не было замыканий, можно было использовать только методы.
Было очень неудобно. Затем появились анонимные делегаты, а затем и лябда выражения и те и другие замыкали контекст, но с лямбда выражениями запись была более лаконичной. Но хотя бы можно было передать метод класса. В 1С и этого нет. Ну как я уже писал Функция НайтиПоУсловию(Тз,Условие) Экспорт Массив = новый массив; Для каждого Стр из Тз Цикл Если Условие(стр) Тогда массив.Добавить(стр) КонецЕсли КонецЦикла; возврат Тз.Скопировать(массив) КонецФункции нужно передать не только контекс, но и метод отбора. Пока это вызывается так Функция НайтиПоУсловию(Тз,Условие,Список="",Модуль="") Экспорт Массив = новый массив; Для каждого Стр из Тз Цикл Если Вычислить(Условие) Тогда массив.Добавить(стр) КонецЕсли КонецЦикла; возврат Тз.Скопировать(массив) КонецФункции // Примеры использования //тз=НайтиПоУсловию(тз,"Стр.Колонка1<20 и Стр.Колонка2>500"); // или //Список=ОбщегоНазначение.РазложитьСтрокуВМассивПодстрок("Иванов,Сидоров,Петров"); //Рез=НайтиПоУсловию(тз,"Список.Найти(стр.ФизЛицо)<>Неопределено"); //Или //Рез=НайтиПоУсловию(тз,"Найти(Врег(стр.Значение),Врег(""акф""))>0"); //Рез=НайтиПоУсловию(тз,"Модуль.ФункцияСравнения(Стр,Список)",МассивСтруктур,ЭтотОбъект); //То есть в модуле обработки должна быть функция // Функция ФункцияСравнения(стр,МассивСтруктур) Экспорт | ||
Serginio1 130 - 24.04.20 - 18:57 | Рекламное место пустует | ||
Злопчинский 131 - 24.04.20 - 19:14 | (128) "а в 8 его заменили объектом," - а что тут есть "объект"..? | ||
Злопчинский 132 - 24.04.20 - 19:16 | (122) в точто тебе через "контест" - доступны переменные, процедуры и функции этого контекста.
например из открытой формы обработки можно вызвать другую обработку - и передать в нее "контекст" родительской обработки. Дочерняя обработка может обновить например форму родительской обработки, стукнуться и выполнить ее процедуры... | ||
Djelf 133 - 24.04.20 - 19:23 | (126) А кто тебе обязан отдать "обещание"? Это флирт, и по факту флирта, никто, никому, ничему, ничего не обязан. | ||
Garykom 134 - 24.04.20 - 19:27 | (133) Он ждал, ждал - а она не дала... результат функция | ||
Djelf 135 - 24.04.20 - 19:30 | (134) А если вообще не дала и упала в колодец? Или зависла на 100 дней над наблюданием прохождения Юпитера над Сатурном? | ||
Djelf 136 - 24.04.20 - 19:33 | Я не говорю что это не правильно, нужно посмотреть это на реальных примерах. | ||
Serginio1 137 - 24.04.20 - 19:40 | (136) Для этого есть
awaite Task.WhenAny(ВыполняемаяЗадача, Task.Delay(сколько нужно миллисекунд)
Правда нужно предусмотреть и прекратить задачу | ||
Djelf 138 - 24.04.20 - 20:16 | (137) Отсутствие этого в 1С, меня и ввело в ступор непонимания, как оно должно и будет работать.
Волноваться и внедрять пока незачем, посмотрим как оно будет в бсп внедрено и какие костыли к этому решению они там придумают. | ||
mikecool 139 - 24.04.20 - 21:22 | читаю холивар про замыкания и не пойму их прикладного примера ) | ||
Serginio1 140 - 24.04.20 - 21:54 | |||
Serginio1 141 - 24.04.20 - 21:58 | Список=ОбщегоНазначение.РазложитьСтрокуВМассивПодстрок("Иванов,Сидоров,Петров"); Рез=НайтиПоУсловию(тз,стр=>Список.Найти(стр.ФизЛицо)<>Неопределено); Рез=НайтиПоУсловию(тз,стр=>Найти(Врег(стр.Значение),Врег("акф"))>0"); Рез=НайтиПоУсловию(тз,Модуль.ФункцияСравнения); где Фун Модуль.ФункцияСравнения(Стр) функция модуля | ||
DTX 4th 142 - 24.04.20 - 21:59 | (115) Я сначала тоже.. Но потом вспомнил, что мы на русском кодим, и как-то отлегло)
(118) От указателя на функцию без возможности динамического создания функций (локальных функций, ну или как это называется) толку особо нет (139) Удобно доработки группировать. Если скинуть все таблицы обработки клиент банка к себе модуль, модуль превратиться в помойку. На клиенте могут помочь формы, а вот на сервере туго (140) +++ Давно о такой штуке мечтаю. Думал даже общий модуль запилить, но потом понял, что нельзя нормально вернуть объект с процедурами... | ||
Serginio1 143 - 24.04.20 - 22:02 | |||
Serginio1 144 - 24.04.20 - 22:06 | Функция НайтиПоУсловию(Тз,Условие,Список="",Модуль="") Экспорт Массив = новый массив; Для каждого Стр из Тз Цикл Если Вычислить(Условие) Тогда массив.Добавить(стр) КонецЕсли КонецЦикла; возврат Тз.Скопировать(массив) КонецФункции Например ФункцияСравнения определена в этом же модуле (ЭтотОбъект) МассивСтруктур определен в функции Рез=НайтиПоУсловию(тз,"Модуль.ФункцияСравнения(Стр,Список)",МассивСтруктур,ЭтотОбъект); тогда Список и Модуль будут подставляться из параметров | ||
DTX 4th 145 - 24.04.20 - 22:14 | (143) Интересная идея, запомню)
У меня из таких хаков самая часто используемая -
Функция Выполнить2(Выражение, Контекст)
Выполнить(Выражение);
Возврат Истина;
КонецФункции
И можно во время пазу процедуры выполнять :) Сейчас не вспомню, но что-то типа Выполнить2("Контекст.Сортировать(""Колонка1""), Таблица):) | ||
DTX 4th 146 - 24.04.20 - 22:14 | *во время паузы в отладчике | ||
_KaA 147 - 24.04.20 - 22:23 | (39)
Вы очень сильно "округлили". А как же пользователей сервисов 1cFresh? А как же мобильные клиенты? И даже если сейчас пользователи ВЕБа и Мобилки это, навскидку, от 10 до 20%, то в будущем этот процент будет только увеличится... И незабываем, что очень много процессов между собой связаны, поэтому вполне можно допустить что это новшество является частью другого проекта на развитие... | ||
Serginio1 148 - 24.04.20 - 22:30 | (145) Вот поэтому и хочется нормальных замыканий как во всех языках.
Хотя и Выполнить очень удобная функция, особенно когда внутри вызываются ёмкие функции | ||
Сияющий в темноте 149 - 24.04.20 - 22:33 | На самом деле,все растет от интерпретатора.
в начале программы писали в бинарных кодах и был придуман ассемблер там можно было код рассматртвать как данные,но потом из-за сложности отдадки это посчитали плохим тоном и было принято,что код в процессе исполнения не меняется. и это,на самом деле,до сих пор так-иначе никакой антивирус не сможет определить,что делает программа,если ее код будет меняться. но,потом появились интерпретаторы,когда код программы для самого интерпретатора является данными. и в интерпретаторах почти всегда есть возможность выполнить динамически созданный код,так как это ге требует какой то большой сложности. но,не все интерпретаторы позволяют через выполнение создавать новые функции. а новые функции-это отложенные вычисления,как бы там их не называли лямбда и т.п.это всего лишь способ отложить ввполнение каких-то аычислентй на потом. да,в 1с есть вычислить и выполнить,но через эти операторы функцию определить нельзя,можно определить только тело функции. просто,в некоторых языках есть возможность использования указателя на функцию,ну,на самом деле,указатель на функцию есть везде,только в компилируемвх языках это адрес в памяти,и текстовое соответствие теряется в процессе компиляции,а в интерпретируемвх,наоборот,есть строка,а адрес часто недоступен. но,если мы хотим использовать передачу динамически созданной функции,то нам нужен адрес и по нескольким причинам: во-первых,если замыкание,то мы каждый раз определяем новую функцию,и нам нужно как-то их различать,чтобы ввхвать по месту то,что нужно во-вторых,в заиыкание попадают переменные со значениями,и они должнв жить,пока они нужны,а если ыункция определяется по имени,то ее нужно удалять вручную,что тоже отдельная и сложная история. и самоый главный момент-динамически сохдавать функцию имеет смысл только если мы собираем ее тело динамтчески,а емли оно всегда одинаеово,то проще контекст делать параметром в 1с оператор выполнить позаоляет получить динамический код без создания функции. если хочется,то уеазателем на уже существующую функцию можно считать строку с ее именем. опять же,замыкания нужны там,где мы передаем функцию как указатель для ввзова с заранее заданнвм набором параметров,как это бывает,например,в javascript при обработке событий,куда параметр контекст забыли добавить. если рассмотреть,например,работу с собвтиями WMI,то таи для обработчиков отдельно задана переменная контекста,куда можно запихать значение,и никакие замыкания не нужны. на самом деле,замыкание-это из пушки по воробьям-для передачи одного значения мы пихаем в контекст весь стек,и он живет,пока не закончится аыполнение функции,а в случае событий-до завершения программы. ну и для этого же есть глобальные переменные и область видимости,когда статическая глобальная переменная нкжна только в тех местах,где ее явно указали,но в 1с нет и этого. зато,есть ОписаниеОповещения,где есть параметр,который можно рассматривать как контекст. асинхронное исполнение,кстати,страдает тем же дефектом-все переменные функции будут жить до ее завершения. ну и,можно было реализовать что-то типа DoEvents,как это бвло в VbScript для обработки асинхронных событий,когда мы в коде разрешаем их выполнить,а потом проверяем результаты,но нет,было решено изобретать велосипед с квадратными колесами. соответственно,ждем возможность ожидать заданный интервал времени и возможность ожидать несколько зааершений сразу с аозможностью обработки завершенного-тогда весь код формы можно будет реализовать в одном цикле. собственно говоря DoEvents делает именно это-отдать управление системе и сохранить контекст. просто,вместо выхода из функции,можно вызывать другую функцию,которая реально делает ввход с сохранением еонтекста и потом вход обратно. | ||
Сияющий в темноте 150 - 24.04.20 - 22:41 | еще одно очень полезное применение указателя на функцию-это итераторы.
например,обход дерева-это вложенные рекурсивные вызовы,но не хочется об этом думать каждый раз-пишкм один раз алгоритм обхода,а потом передаем ему функцию,которую он ввзовет для каждого элемента,и все. | ||
Вафель 151 - 24.04.20 - 22:48 | (150) это называется функциональное программирование | ||
Вафель 152 - 24.04.20 - 22:51 | (149) вообще-то этот велосипед уже давно был изобретен и не 1с а в жаваскрипте | ||
Serginio1 153 - 24.04.20 - 23:08 | (149) Одна из проблем 1С это то, что отсутствует сборка мусора. Жизненный цикл ссылки построен на подсчете ссылок. Но и в этом тоже не проблема.
По сути при использовании замыкания нужно заниматься кодогенерацией. Но это не проблема при компиляции в БайтКод. Все давным давно придумано | ||
Serginio1 154 - 24.04.20 - 23:16 | Уще когда в JS не было async awaite TS генерил код плохочитаемый
https://stackoverflow.com/questions/56306701/typescript-generates-awaiter-generator-when-using-promises Вот здессь хоть с ошибками но попонятнее https://stackoverflow.com/questions/42412145/what-is-a-state-machine-in-terms-of-javascript-promises-and-c-sharp-asyc-await | ||
Сияющий в темноте 155 - 25.04.20 - 14:11 | в 1с уже есть сборщик мусора не только на подсчете ссылок.
но граф с клиента на сервер или обратно она так передавать и не научилась. и по вложенности тоже двоит обьекты. а обещание,это еще и шаг в многопоточность потом могут сделать ВыполнитьВНовомПотоке и в ответе тоже обещание,тем более,что новые браузеры фоновое исполнение уже умеют. | ||
Сияющий в темноте 156 - 25.04.20 - 14:17 | и важна сборка мусора на клиенте,так как на сервере можно после завершения исполнения кода все,чтотон себе выделил,просто осаободить и нн бояться. | ||
ДенисЧ 157 - 25.04.20 - 14:38 | (156) @сервере можно после завершения исполнения кода все,чтотон себе выделил@
Память не ресурс (с)
У меня тут где-то метла завалялась... Пойду, испоганю... | ||
Serginio1 158 - 25.04.20 - 16:24 | (156) На сервер передаются сериализованные данные (можно конечно держать серверную ссылку на клиенте, но это не для 1С). Никто не держит ссылки на сервере или клиенте. Там своя кухня.
Хотя это и возможно https://habr.com/ru/post/323096/ При финализации объекта. Единственно, что можно присвоить результат сервера клиенту. А вот про сборщик мусора в 1С поподробнее пожалуйста? В .Net головная боль сочетать COM с подсчетом ссылок и сборка мусора | ||
Garykom 159 - 25.04.20 - 16:35 | (149) Интересно когда в 1С можно будет новые расширения писать и добавлять программно )) | ||
Сияющий в темноте 160 - 25.04.20 - 20:05 | Рекламное место пустует | ||
Garykom 161 - 25.04.20 - 20:43 | (160) Подразумевал когда конфа (точнее расширение) саму себя "дописывает" ))
Новые расширения делает и подключает. | ||
Вафель 162 - 25.04.20 - 22:01 | (161) уже сейчас можно | ||
Сияющий в темноте 163 - 26.04.20 - 11:53 | расширение можно загрузить из xml в отдельный конфигуратор
потов выгрузить в cfe и программно подключить в конфу | ||
Сияющий в темноте 164 - 26.04.20 - 11:54 | на самом деле,программно и конфигурацию редактировать уже можно без особых проблем
просто исполнителя запустить на другой временно созданной конфигурации | ||
Bro 165 - 26.04.20 - 13:03 | (158) Кстати тоже интересно про сборку мусора. Потому как та же Java только к 11-й версии выкатила что-то более удобоваримое в виде G1. Потому как тот же CMS приводил к фрагментации и периодически (особенно при нагрузке) уходил в STW сборку мусора (причем в однопоточную (!) так как Oracle решил похоронить CMS уже очень давно). Причем даже G1 достаточно сложный неочевидный сборщик мусора (и там по дефолту в Java очень странная есть настройка, которая уже на среднем highload'е может приводить к жестким STW паузам).
ЗЫ: Самое главное в сборщике мусора это работа с цикличными ссылками если что (без цикличных ссылок, обычный подсчет ссылок работает на ура). | ||
Fragster 166 - 27.04.20 - 21:24 | У кого есть доступ, поддержите тупых 1сников, которые считают, что асинхронность в текущем виде должна быть невидимой со стороны прикладного кода https://partners.v8.1c.ru/forum/topic/1906773 | ||
DTX 4th 167 - 28.04.20 - 20:08 | (142) Вспомнил, чего мне не хватает Хочу иметь возможность чейнить такие методы. Типа ТЗ.Выбрать(Строка => Строка.Колонка3).Сортировать().ВыбратьПервые(10) | ||
DTX 4th 168 - 28.04.20 - 20:09 | Мб кто что подскажет | ||
Cyberhawk 169 - 28.04.20 - 20:27 | (166) Как предлагается поддержать? Удали ту ссылку и дай нормальную с номером сообщения, которое надо плюсануть, и не позорься | ||
trdm 170 - 28.04.20 - 20:43 | |||
Serginio1 171 - 28.04.20 - 20:50 | (167) Это Linq называется. Опять же нужны замыкания https://metanit.com/sharp/tutorial/15.1.php
Но на том же C# есть методы расширения https://docs.microsoft.com/ru-ru/dotnet/csharp/programming-guide/classes-and-structs/extension-methods для расширения Linq | ||
Ненавижу 1С 172 - 29.04.20 - 07:58 | |||
Serginio1 173 - 29.04.20 - 10:01 | (172) ТЗ.Выбрать(Строка => Строка.Колонка3). а это что? | ||
Fragster 174 - 29.04.20 - 11:14 | (173) вероятно оставить от таблицы только колонку 3 | ||
Serginio1 175 - 29.04.20 - 11:28 | (174) Это понятно, разговор про то, что в данном примере замыкания (лямбда выражения) не нужны Строка => Строка.Колонка3 | ||
Fragster 176 - 29.04.20 - 11:34 | (175) ну, то, что возврат копии объекта (или самого объекта) из методов не требует лямбд - правда. а вот для сортировки, фильтрации, сворачивания и преобразования - очень даже нужны, упрощают код для написания и понимания в разы. | ||
Serginio1 177 - 29.04.20 - 12:02 | (176) Пойми я этим линком пользуюсь каждый день и прекрасно понимаю, что и зачем. Мало того, что линк используется для коллекций, но еще и для БД с формированием запросов.
Тут даже на С++ прикручивают. А 1С плетется в хвосте. Надеюсь async awaite это первая ласточка | ||
DTX 4th 178 - 29.04.20 - 13:56 | (171) Да, да, у меня шарп входит в тройку основных языков помимо js и 1С)
Только вчера приложение под мак на netCore собрал, которое дергает скрипт питона, чтобы получить активное окно :D | ||
jbond 179 - 29.04.20 - 15:41 | После короны в России останутся живые Java и Salesforce программисты? | ||
sitex 180 - 29.04.20 - 15:48 | (179) Если только будут удаленно работать на запад. | ||
Fragster 181 - 29.04.20 - 15:50 | все в 1с уйдут |
◄ 1 2 |
Список тем форума
|