В .Net сейчас во многих классах есть асинхронные методы. В 1С их можно применять например так
Стр=ъ(Клиент.GetStringAsync(uriSources)).Result;
И напомню про синонимы из предыдущей статьи/ Так добавив синоним
Врап.ДобавитьСиноним(HTTPClient.ПолучитьСсылку(),"ПолучитьСтроку","GetStringAsync");
Врап.ДобавитьСиноним(Task.ПолучитьСсылку(),"Результат","Result");
Я могу использовать все на русском
Стр=ъ(Клиент.ПолучитьСтроку(адрес)).Результат;
Но можно использовать асинхронные методы так.
Клиент = ъ(Врап.Новый(HttpClient.ПолучитьСсылку(),handler.ПолучитьСсылку()));
лист=ъНовый("System.Collections.Generic.List`1[System.Threading.Tasks.Task]");
Для каждого стр из ПолучитьСписокURL() Цикл
Задача=ъ(Клиент.GetStringAsync(стр));
лист.Add(задача.ПолучитьСсылку());
КонецЦикла;
Task=ъТип("System.Threading.Tasks.Task");
Пока лист.Count>0 Цикл
массив=ъ(лист.ToArray());
индекс = Task.WaitAny(массив.ПолучитьСсылку());
Сообщить(индекс);
результат = ъ(лист.get_Item(индекс)).Result;
Сообщить(СтрДлина(результат));
лист.RemoveAt(индекс);
КонецЦикла;
Это конечно не совсем асинхронное программирование, но все же лучше чем отдельно для каждого запроса вызывать синхронный метод.
Но нужно делать асинхронный вызов. Для этого создал простенький класс.
public class АсинхронныйВыполнитель
{// Данные связанные с задачей, что бы понять, что к чему при получении события
public object ДанныеДляЗадача;
// Сама задача
public Task Задача;
// Имя метода 1С обрабатывающего окончание задачи.
public String ИмяМетода;
public АсинхронныйВыполнитель(Task Задача, String ИмяМетода, Object ДанныеДляЗадача)
{
this.Задача = Задача;
this.ДанныеДляЗадача = ДанныеДляЗадача;
this.ИмяМетода = ИмяМетода;
Задача.ContinueWith((t) =>
{
var AW = new AutoWrap(this);
AutoWrap.ВызватьВнешнееСобытие1С("АсинхронныйВыполнитель", ИмяМетода, AW.ПолучитьСсылку());
});
}
}
А на стороне 1С:
Функция ПолучитьДанныеДляЗадачи(адрес,Номер)
объект=ъНовый(ExpandoObject.ПолучитьСсылку());
объект.Адрес=адрес;
объект.Номер=Номер;
возврат объект;
КонецФункции // ПолучитьДанныеДляЗадачи()
Процедура ТестАсинхронногоВыполнителяНажатие(Элемент)
Клиент = ъ(Врап.Новый(HttpClient.ПолучитьСсылку(),handler.ПолучитьСсылку()));
лист=ъНовый("System.Collections.Generic.List`1[System.Threading.Tasks.Task]");
сч=0;
Для каждого стр из ПолучитьСписокURL() Цикл
// Получаем задачу
Задача=ъ(Клиент.GetStringAsync(стр));
// Получаем данные привязанные к данной задаче
объект=ПолучитьДанныеДляЗадачи(стр,сч);
//public static void ВыполнитьЗадачу(System.Threading.Tasks.Task Задача, String ИмяМетода, Object ДанныеДляЗадача)
Врап.ВыполнитьЗадачу(Задача.ПолучитьСсылку(),"ПолученаСтраница",объект.ПолучитьСсылку());
сч=сч+1;
КонецЦикла;
// Добавим тест на ошибку
Тестовый=ъТип("TestDllForCoreClr.Тестовый","TestDllForCoreClr");
Тест=ъ(Врап.Новый(Тестовый.ПолучитьСсылку()," Свойство из Конструктора"));
Thread=ъТип("System.Threading.Thread");
// При передаче 2 вызывается ошибка
Задача=ъ(Тест.ЗадачаСОшибкойAsync(2));
объект=ПолучитьДанныеДляЗадачи("ЗадачаСОшибкойAsync",2);
Врап.ВыполнитьЗадачу(Задача.ПолучитьСсылку(),"ПолученаСтраница",объект.ПолучитьСсылку());
Задача2=ъ(Тест.ЗадачаСОшибкойAsync(0));
объект=ПолучитьДанныеДляЗадачи("ЗадачаСОшибкойAsync",0);
Врап.ВыполнитьЗадачу(Задача2.ПолучитьСсылку(),"ПолученаСтраница",объект.ПолучитьСсылку());
КонецПроцедуры
Процедура ПолученаСтраница(знач данные)
Задача=ъ(данные.Задача);
ДанныеДляЗадача=ъ(данные.ДанныеДляЗадача);
Сообщить("Адрес="+ДанныеДляЗадача.Адрес);
Сообщить("Номер="+ДанныеДляЗадача.Номер);
// При возникновении ошибки при выполнении задачи
// IsFaulted будет истина, а в Exception будет ошибка
Если (Задача.IsFaulted) Тогда // Ошибка выполнения
ошибка=Задача.Exception;
Сообщить("Ошибка "+Врап.ВСтроку(ошибка));
// Если сделать как ниже 1С хочет присвоить Задача.Exception новое значение
// Даже если оно не было изменено
// Так как считает, что параметр передан по ссылке
// Сообщить("Ошибка "+Врап.ВСтроку(Задача.Exception));
возврат;
КонецЕсли;
результат=Задача.Result;
Сообщить(СтрДлина(результат));
КонецПроцедуры
Процедура ВнешнееСобытие(Источник, Событие, Данные)
// Вставить содержимое обработчика.
Сообщить("Источник="+Источник);
Сообщить("Событие="+Событие);
Сообщить("Данные="+Данные);
Если Источник="АсинхронныйВыполнитель" Тогда
Данные=ъ(Данные);
Выполнить(Событие+"(Данные)");
КонецЕсли;
КонецПроцедуры
Немного поясню по коду.
Так как в Native ВК нельзя использовать ДобавитьОбработчик то сделаем его эмуляцию передав в АсинхронныйВыполнитель имя метода, который нужно вызвать в 1С
Врап.ВыполнитьЗадачу(Задача.ПолучитьСсылку(),"ПолученаСтраница",объект.ПолучитьСсылку());
Который будет вызываться при срабатывании внешнего события.
Если Источник="АсинхронныйВыполнитель" Тогда
Данные=ъ(Данные);
Выполнить(Событие+"(ПолученаСтраница)");
КонецЕсли;
В данном в переменной Событие хранится ПолученаСтраница и будет вызван метод
ПолученаСтраница(ПолученаСтраница)
Теперь про использование Внешнего события в .Net сборке
Для этого нужно определить поле
public Action<string, string, string> ВнешнееСобытие1С;
И установить его из 1С.
Тестовый=ъТип("TestDllForCoreClr.Тестовый, TestDllForCoreClr, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
Тест=ъ(Врап.Новый(Тестовый.ПолучитьСсылку()," Свойство из Конструктора"));
Делегат=Ъ(Врап.ПолучитьДелегатВнешнегоСобытия1C());
Тест.ВнешнееСобытие1С=Делегат.ПолучитьСсылку();
Тест.TestВнешнегоСобытия();
Внутри .Net класса вызвать метод
this?.ВнешнееСобытие1С("Тестовый", "ТестовоеСообщение", значение);
При этом в 1С вызовется процедура
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Сообщить("Источник="+Источник);
Сообщить("Событие="+Событие);
Сообщить("Данные="+Данные);
КонецПроцедуры
Я постарался максимально приблизить синтаксис C# в 1С. И по мне, так даже в таком виде проще писать ВК на C#, чем использовать Native API на C++. При этом можно интегрировать использование .Net классов в 1С. Добавляя синонимы можно писать все на кириллице. Можно добавить поддержку итераторов итд.
Сейчас на Windows много всяких ActiveX, кроме того не сложно и самим написать COM компонент на любом языке.
Но это не кроссплатформенно.
Используя .Net Core и данную обертку над объектами .Net в 1С можно значительно расширить возможности 1С используя огромное количество библиотек и классов в них находящихся. И сосредоточиться на разработку языка, наконец добавив замыкания, Linq, указание типа для intellisense (по аналогии с TypeScript). Разбиение модальных диалогов по аналогии с yeld и await в C#. А так же аналоги await для серверных вызовов с замыканиями.
Я понимаю, что данная разработка мало кому интересна. Но мне было интересно её разрабатывать. Кроме того будет интересна кто пробует .Net Core и использут Reflection
Примеры и исходники можно скачать Здесь
Комментарии (52)
Evgeny42
08.08.2016 15:54+14Очень helpful статья, и ъЯзык замечательный. Thanks вам, за то что продвигаете его в массы КонецСпасибо
Serginio1
08.08.2016 16:06-6Эта статья для 1С ников. Там пишут все по русски. И я 1С овец. Мне проще давать имена переменным и методам осмыленные русские. А не искать аналоги в переводчиках. Кроме того с добавлением синонимов можно использовать любые классы .Net на русском.
acedened
08.08.2016 16:20+5искать аналоги в переводчиках
При знании языка это делать не приходится
Serginio1
08.08.2016 16:22-10Еще раз я 1С ник. Мне не зачем англицкий.
Evgeny42
08.08.2016 16:40+3Таблицу умножения предлагаю тоже забыть. Компьютер умножать умеет сам.
Serginio1
08.08.2016 16:45+1Понимаешь, я пишу основной код на 1С. Там все по русски. И этот код предназначен для 1С. Мне писать на русском и английском нет проблем. И я выбираю, то что мне удобно. Но вот мне интересно, что всех так коробит от латиницы? Вы русский забыли? А в школе я учил немецкий, в институте английский. Но удобнее мне русский.
А, что по существу? И кстати здесь код на 1С в основном.ds_pro
08.08.2016 17:25+1А по существу: Стр=ъ(Клиент.GetStringAsync(uriSources)).Result; в данной строки какая-то каша из кириллицы и латиницы, а зачем?
Serginio1
08.08.2016 17:28По существу это код 1С.
ъ это из других статей
//1С при передаче по ссылке свойства ВК Список.Current // при выходе из метода присваивает Список.Current значение переданное изначально // Поэтому помечаем входной параметр как Знач //Или же делать так, если методы изменить нельзя // То нужно присвоить значение переменной и вызвать метод передав в параметрах эту переменную //Стр=Список.Current; //Зазача=ъ(Стр); Функция Ъ(знач Ссылка) // Создаем объект по ссылке полученной из методов .Net классов //Физически это строка ёЁ<Ьъ>№_%)Э?&2 содержащее 12 символов для отделения их от других строк //и индекс в спике исполуемых объектов на стороне .Net рез = Новый("AddIn.NetObjectToNative.NetObjectToNative"); // И установим ссылку рез.УстановитьСсылку(Ссылка); возврат рез КонецФункции // СоздатьОбъектПоСсылке()
Serginio1
08.08.2016 17:34-2По существу это код 1С. А там принято писать на кириллице
ъ это из других статей
//1С при передаче по ссылке свойства ВК Список.Current // при выходе из метода присваивает Список.Current значение переданное изначально // Поэтому помечаем входной параметр как Знач //Или же делать так, если методы изменить нельзя // То нужно присвоить значение переменной и вызвать метод передав в параметрах эту переменную //Стр=Список.Current; //Зазача=ъ(Стр); Функция Ъ(знач Ссылка) // Создаем объект по ссылке полученной из методов .Net классов //Физически это строка ёЁ<Ьъ>№_%)Э?&2 содержащее 12 символов для отделения их от других строк //и индекс в спике исполуемых объектов на стороне .Net рез = Новый("AddIn.NetObjectToNative.NetObjectToNative"); // И установим ссылку рез.УстановитьСсылку(Ссылка); возврат рез КонецФункции // СоздатьОбъектПоСсылке()
В статье я как раз упоминал про синонимы.
Так добавив Синонми
Врап.ДобавитьСиноним(HTTPClient.ПолучитьСсылку(),"ПолучитьСтроку","GetStringAsync"); Врап.ДобавитьСиноним(Task.ПолучитьСсылку(),"Результат","Result");
Я могу использовать все на русском
Стр=ъ(Клиент.ПолучитьСтроку(адрес)).Результат;
VasilioRuzanni
08.08.2016 16:24+2Вы, простите, 1С кого? :)
Serginio1
08.08.2016 17:54Я программирую на разных языках. Чему подтверждение мои статьи. Но основной мой язык программирования 1С.
geakstr
10.08.2016 11:16«АсинхронныйВыполнитель», ору, простите
Serginio1
10.08.2016 12:01-1И что должно приводить тебя в экстаз? AsyncRuner?
Еще раз вы с гор спустились? Кириллицу ни разу не видели? Зачем ввели возможность использовать Юникод?Negor
10.08.2016 12:52Кирилицу видел, код программы видел, код на кирилице не видел) Это как дом из спичек и желудей. По отдельности это обычные вещи, но вместе вывзывают когнитивный диссонанс
Serginio1
10.08.2016 12:58-1Вы кроме кириллицы ничего не видите? Это как красная тряпка для быка?
На 1С уже лет 20 как пишут. И у всех кто программирует на 1С вызывает только восторги. У них как раз на латиницу отторжение.
Хотя по мне так смешение языков это нормально. Даже на МКС разговаривают на РусЛише
yevstafyev
10.08.2016 12:43+2Даже если для 1С норма писать вот так — это все равно выглядит ужасно, что бы автор не говорил
Serginio1
10.08.2016 12:48-1Еще раз можно добавлять синонимы. Вы хоть почитайте. При чем в самом начале статьи.
Стр=ъ(Клиент.GetStringAsync(uriSources)).Result;
И напомню про синонимы из предыдущей статьи/ Так добавив синоним
Врап.ДобавитьСиноним(HTTPClient.ПолучитьСсылку(),"ПолучитьСтроку","GetStringAsync"); Врап.ДобавитьСиноним(Task.ПолучитьСсылку(),"Результат","Result");
Я могу использовать все на русском
Стр=ъ(Клиент.ПолучитьСтроку(адрес)).Результат;
Если кого то раздражает смешение языков то может писать чисто на русском или английском.
Меня это не раздражает и я выбираю тот который мне нравится.
Например в 1С для
Get синоним ОтправитьДляОбработки
Я выбираю первый вариант, а все остальное мне удобнее писать на русском.
Вы кроме кириллицы больше ничего не видите?boombick
10.08.2016 14:14Мы видим DSL, который по недоразумению стали считать языком программирования обещго назначения и строгать на нем всякое вот подобное
Error1024
10.08.2016 14:28Количество нетерпимости зашкаливает, а казалось бы, умные люди собрались на специализированном сайте…
Каждый инструмент создан для своих задач, и раз люди пользуются 1С, им это нравится, значит инструмент нашёл свою нишу и своих пользователей.Serginio1
10.08.2016 14:53Спасибо. Самый смех, что большинству кто здесь отписался не интересны не 1С, не возможность использования кроссплатформенного использования .Net классов из натива. Но все таки, данная разработка привлекла их внимание. И это тоже неплохо.
pragmader
10.08.2016 17:15Каждый инструмент создан для своих задач, и раз люди пользуются 1С, им это нравится, значит инструмент нашёл свою нишу и своих пользователей.
Я возможно что-то пропустил, но разве у 1С продуктов есть активные конкуренты? Я видел несколько продуктов, даже включая бесплатные, но они и рядом не стояли по кол-ву маркетинга и усилий, который 1С вкладывает в то, чтобы подсадить всю индустрию на свои продукты. Программы сертификаций, хайп, продвижение, семинары, школы – чего только 1С не делает, чтобы показать предприятиям что существует только их мир и в нем не место альтернативам.
Я всегда считал и считаю, что это явная монополия на рынке, у них ведь нет серьезных конкурентов.
А с точки зрения технической реализации у продуктов 1С всегда была дурная слава по моему опыту. Знаю истории когда организации просто теряли всю свою базу за несколько лет из-за того, что 1С транзакционно не умела обновляться до новой версии и если ты руками файлики не забэкапил – ничего не восстановить.
Код на кириллице конечно дело вкуса, но когда вся работа программиста/инженера ограничивается только кодом, который он может писать для специфичного для одной страны продукта мне кажется сложно сказать, что ты программист/инженер/разработчик в широком смысле. Особенно после таких слов как:
Еще раз я 1С ник. Мне не зачем англицкий.
Это как владеть молотком, который может забивать гвозди только произведенные в России и говорить всем, что ты первоклассный плотник. А если еще после этого взять универсальный молоток и модифицировать его, чтобы он забивал только русские гвозди, говоря другим плотникам, что это правильнее – вполне логично что это вызовет недовольство у плотников, которые владеют универсальными молотками. Если ты хочешь что-то сделать полезное для универсальных плотников, то я считаю надо уважать их инструмент, а не говорить что-то вроде «добавьте сами синонимы, если вам не нравится».
Но и с другой стороны, недовольные универсальные плотники могли бы просто пройти мимо, а не пытаться убедить что уметь забивать только русские гвозди непрофессионально и переделывать универсальные молодки в работающие только с русскими гвоздями плохо. Но мир так устроен, что мы имеем право делиться своим мнением и (здесь в частности) голосовать за чужие точки зрения.
Serginio1
10.08.2016 17:25+1А я и мне подобные имеем право писать на Руслише. Суть то не в этом. Ни одного комментария по сути статьи. А именно кроссплатформенного использования классов .Net в нативе. Суть в том, что возможности 1С можно расширить за счет классов .Net и синтаксис использования максимально приблизить к синтаксису C#. Вот об этом ни слова.
pragmader
10.08.2016 17:32-1Так я вроде не говорил, что кто чего-то не умеет право делать. Я просто выразил взгляд с моей перспективы. А про то, что нет комментариев по сути – может быть прозвучит банально, но далеко не всегда получается заинтересовать людей статьей, мне кажется у вас были слегка завышенные ожидания.
Serginio1
10.08.2016 17:37Возможно. Просто когда я писал про использование .Net классов в 1С через Ireflect все кричали не кроссплатформенно и все на латинице.
Ввел кроссплатформенность и ведение синонимов. Можно писать все на русском, максимально довел синтаксис до C#. И молчание.
Sane4i4ek
10.08.2016 16:021С это не язык программирования, это среда программирования бизнесс-алгогритмов.
Я тоже зарабатываю на жизнь автоматизируя бизнесс-процессы, используя 1С.
Пишу код только на русском, т.к. этот код имеет не только алгоритмическую, но и смысловую нагрузку.
Читая код, можно быстро (без толмача) понять, чего хотел добиться программист и какие результаты работы обработки или документа должны получиться.
Это специфическая среда разработки и создана она российскими разработчиками.
Пы.Сы. При создании 1С предполагалось, что бухгалтер сам сможет вносить изменения в код обработок и документов. Из-за этого было принято решение команды и процедуры, описывающие внутренние механизмы взаимодействия объектов конфигурации, писать кириллицей.
У бухгалтеров как-то не сложилось, а программисты 1С так и пишут, используя кириллическое написание команд.Serginio1
10.08.2016 16:05Ну насчет бухгалтеров это скорее в 5 и 6. Помню одну которая делала шаблоны для печати документов. А вот начиная с сырой 7.0 уже требовало навыков программирования.
Sane4i4ek
10.08.2016 16:12Скажу больше. До сих пор нерадивые директора малых и средних предприятий (некоторые из них, были моими клиентами) говорят бухгалтеру: «Я же купил вам бухгалтерию предприятия? Я же заплатил деньги? Зачем ещё звать программиста, ведь там всё должно быть?! А если этого нет, делайте сами!» :)
В общем жесть жестяная :)
qrKot
11.08.2016 09:35-1Статья про 1С на хабре приравнивается к хабрасуициду.
Впрочем, вполне обоснованно.
Serginio1
11.08.2016 09:37А почему обоснованно? Я не считаю себя камикадзе. Привлек внимание кому это интересно. Кто то впервый раз увидел кириллицу в коде, и пришел в шок от этого. Это нормально.
Плохо, когда статья не вызывает никаких эмоций.qrKot
11.08.2016 13:24-1Ради всех цифровых богов, не подумайте, что хотел обидеть или задеть. Попробую объяснить свою, возможно, сугубо субъективную точку зрения.
Начнем с предпосылок, с чего все начинается.
Начинается все с человека, искренне увлеченного 1С. Собственно, это только хорошо, и, даже более того, вызывает уважение. Увлеченность вообще штука редкая и склонная вызывать уважение (причем не только среди 1С-ников, но и в любой другой сфере в принципе). Вот этот самый человек пишет статью на хабр. Увлеченно пишет, в восторженных тонах, ведь он нашел очень интересный материал (в вашем случае прямо честно скажу, материал интересный, да и подход мне лично понравился). Естественно, человек ожидает некоторой отдачи, причем положительного толка, на то, что он написал. И вот тут, как правило, закопана собака. Эта собака закопана в той части, которая Хабрахабр.
Кто здесь собирается и комментирует? Правильно, технические специалисты совершенно различного толка, но, как правило, с некоторым опытом за спиной. Взгляните на вашу статью глазами «не 1С-ника» (смею уверить, таких тут подавляющее большинство).
Вы показываете некоторую «прорывную фичу», которая для любого разработчика (не 1С) кажется нормой и вообще «ничем удивительным». При этом выглядит решение, мягко говоря, «странно».
Коммент «Очень helpful статья, и ъЯзык замечательный. Thanks вам, за то что продвигаете его в массы КонецСпасибо» — он, конечно, может показаться излишне язвительным, но, суть в том, что он «по теме» (при этом выдержано идеально в стилистике и корректно ровно в той мере, каковая необходима для сохранения смысла шутки-с-долей-правды, респект автору).
К сожалению, человеку свойственно рефлексировать. И вы, как и все прошлые авторы «в тематике», не избежали этой участи. Я вас не виню, это действительно очень сложно — не отреагировать на подкол, а рассмотреть за ним вполне конструктивную критику. А она есть, и она действительно указывает на существенный недостаток. Вы же «срефлексировали». Вот это: «Понимаешь, я пишу основной код на 1С. Там все по русски. И этот код предназначен для 1С...» — больше похоже на детскую обиду и что-то вроде «а ты ваще вали отсюда, я тут пишу».
Вот тут — самый опасный капкан.
Если вы чувствуете в себе силы «отшутиться», подколоть в ответ, либо разумно по полочкам разложить «конструктивную часть вопроса» и проигнорировать все «неконструктивные выпады», тогда да — вопросов нет, вы специалист, который, в окружении неразумных детей разъясняет суть вопроса. Если вы хоть раз ответили обидой или «неконструктивом» со своей стороны, вся ваша идея с публикацией неизбежно превращается в балаган в комментариях и корм для троллей, когда сурово-адекватные пользователи минусуют вас за неконструктив, а «кормящиеся» участники продолжают вас троллить.
Собственно, вот так и получается хабрасуицид. Что с этим делать — решать вам. Вы можете больше не писать на эту тему, либо подготовиться к реакции многоуважаемой публики. Можете попробовать написать на профильные ресурсы по 1С, но, боюсь, там это будет неинтересно (специфика специализации на 1С).
Если хотите конструктивной и выдержанной критики и полемики — милости прошу, можно пообсуждать конкретно вашу статью. Попробуем потренироваться в сдержанности, мне это тоже не повредит)Serginio1
11.08.2016 14:40Спасибо. Я уже понял здешние нравы. Я просто новичок. на данном форуме.
Я пишу на разные площадки. Суть то в том, что с помощью данной разработки можно расширить возможности 1С, при этом приблизить синтаксис вызова методов и свойств .Net классов из нативного 1С, до синтаксиса C#. Я давно уже пишу обертки над .Net классами.
Вот все разработки
Смысл использовать существующие .Net библиотеки в 1С, так и адаптация кода под 1С.Serginio1
11.08.2016 14:48И добавлю что на ресурсах 1С согласны пользоваться этой разработкой, если она будет интегрирована 1С.
Пока моя задача просто показать возможности и довести по максимуму удобство использования. Что я и показал в статьях.
qrKot
11.08.2016 20:10Нравы, как раз, нормальные. Даже образцовые, я бы сказал. Хоть и не без перегибов. Вон, и я минусов нахватал).
Просто в вашей же статье немного спорная подача. Взять хотя бы заголовок: «Асинхронное программирование в 1С через .Net Native ВК».
Дело в том, что непосредственно сама механика RPC в кроссплатформе в .Net Core к 1С отношение имеет постольку-поскольку. Ну, т.е., практически никакого. Да и представление об «асинхронном программировании» может варьироваться. Вы же сами, несмотря на громкий заголовок, пишете «Это конечно не совсем асинхронное программирование». Признаться, из заголовка можно было ожидать большего, но, чуда не случилось.
Впрочем, пора, наверное, завязывать с речами «адвоката Хабра». Чисто по сути, язык 1С — это DSL, возможно, неплохой, но при этом достаточно ограниченный, замкнутый, обреченный на отставание и завязанный на своей вполне себе проприетарной экосистеме, причем от единственного вендора, практически не встречаемого за пределами СНГ (если надобно, могу привести обоснования по каждому пункту из перечня).
По статье конкретно из критики:
лист=ъНовый(«System.Collections.Generic.List`1[System.Threading.Tasks.Task]»);
Вот это действительно страшно выглядит. Тут остается только искренне сочувствовать тем, кто вынужден это писать. И, таки да, по моему мнению кириллица в программировании — зло. Ну хотя бы из-за таких вот языковых конструкций. Вдумайтесь. Давайте на примере попробуем:
Sheet = xNew(«System.Collections.Generic.List`1[System.Threading.Tasks.Task]») — ну реально же лучше. Даже не потому, что смотрится более «нативно». Просто есть такая штука — контекст. В данном случае я говорю о мыслительном контексте. И вот его «переключение» — штука достаточно накладная. Да, в данном случае его не избежать при любом раскладе. Мы имеем строку на C#, обернутую в строку 1С. Т.е. нам надо с 1С-контекста переключиться на контекст C#, что уже неприятно. Вы предлагаете в процессе переключиться еще и с русского языка на английский. Вот чисто по мне — это недостаток.
Ну а по поводу «если она будет интегрирована 1С» из вашего следующего коммента. Не уверен, что это нужно самой 1С. Даже ваша статья — это попытка «побега» из текущих реалий 1С. Много просто нет, а хочется. В случае «бесшовной интеграции» с .Net, имхо, миграция конфигураций с 1С на .Net — вопрос исключительно временный. Не уверен, что 1С в этом хоть сколько-нибудь заинтересовано. Впрочем, тут могу ошибаться. Некоторое достаточно продолжительное уже время с 1С не пересекался, потому за «курсом компании» не слежу.Serginio1
12.08.2016 10:37Вот ниже есть метод
Клиент = ъ(Врап.Новый(HttpClient.ПолучитьСсылку(),handler.ПолучитьСсылку())); лист=ъНовый("System.Collections.Generic.List`1[System.Threading.Tasks.Task]"); сч=0; Для каждого стр из ПолучитьСписокURL() Цикл // Получаем задачу Задача=ъ(Клиент.GetStringAsync(стр)); // Получаем данные привязанные к данной задаче объект=ПолучитьДанныеДляЗадачи(стр,сч); //public static void ВыполнитьЗадачу(System.Threading.Tasks.Task Задача, String ИмяМетода, Object ДанныеДляЗадача) Врап.ВыполнитьЗадачу(Задача.ПолучитьСсылку(),"ПолученаСтраница",объект.ПолучитьСсылку()); сч=сч+1; КонецЦикла;
В данном случае создается объект с задачей, после выполнения задачи вызвается метод в 1С ВнешнееСобытие, котрый по переданным данным вызывает метод связанный с эти событием.
Процедура ПолученаСтраница(знач данные) Задача=ъ(данные.Задача); ДанныеДляЗадача=ъ(данные.ДанныеДляЗадача); Сообщить("Адрес="+ДанныеДляЗадача.Адрес); Сообщить("Номер="+ДанныеДляЗадача.Номер); // При возникновении ошибки при выполнении задачи // IsFaulted будет истина, а в Exception будет ошибка Если (Задача.IsFaulted) Тогда // Ошибка выполнения ошибка=Задача.Exception; Сообщить("Ошибка "+Врап.ВСтроку(ошибка)); // Если сделать как ниже 1С хочет присвоить Задача.Exception новое значение // Даже если оно не было изменено // Так как считает, что параметр передан по ссылке // Сообщить("Ошибка "+Врап.ВСтроку(Задача.Exception)); возврат; КонецЕсли; результат=Задача.Result; Сообщить(СтрДлина(результат)); КонецПроцедуры Процедура ВнешнееСобытие(Источник, Событие, Данные) // Вставить содержимое обработчика. Сообщить("Источник="+Источник); Сообщить("Событие="+Событие); Сообщить("Данные="+Данные); Если Источник="АсинхронныйВыполнитель" Тогда Данные=ъ(Данные); Выполнить(Событие+"(Данные)"); КонецЕсли; КонецПроцедуры
Что касается руслиша, то я пишу на нем лет 20 и он мне нравится. Писать приходится много и давать осмысленные имена на русском проще. Кроме того в свойства документов справочников они русские. 1С как раз неудобна латиница. Поэтому я ввел синонимы. Теперь можно писать только на одном языке.
По поводу интеграции, то в 1С есть ComОбъект, который не отличается от предлженного мной NetОбъект или JavaОбъект.
1С это не только DSL. Это совмещение клиентского и серверного кода, удобные генераторы отчетов (Система компоновки данных СКД)
Готовые конфигурации, которые можно расширять. 1С заинтересована выходить за пределы СНГ. Чем больше функционал, тем проще решать проблемы.qrKot
12.08.2016 11:48>> 1С это не только DSL.
Все же DSL. Все же, язык не поворачивается назвать 1С языком общего назначения. Ну вот хоть режьте.
Более того, ваша статья — прямое подтверждение моих слов. Вы пишете обертку для использования в коде 1С конструкций C#, высокоуровневого языка общего назначения. Зачем вы это делаете? Очевидно, компенсируете недостающие в 1С механизмы.
Насчет поддержки со стороны компании 1С. Ну, в бытность мою штатным программистом 1С 7.7 такие вещи как «1С++» и «прямые запросы» были не только «глотком воздуха», но и шикарнейшим подспорьем. Насколько я в курсе, каких-то попыток интегрировать (хотя бы на уровне идей) или поддержать со стороны вендора замечено не было. Оно и логично. Дайте возможность «бесшовной интеграции» 1С с Net или Java, и возникновение мысли «А зачем в этой конструкции 1С?» станет исключительно вопросом времени. В конечном итоге, фирма 1С заинтересована не только и не столько в количестве возможностей для разработчика, сколько в удержании разработчика «внутри себя», в пределах строго своего технологического стека (очень похоже на ранний Microsoft). В конечном итоге, 1С раскачивается что-то сделать тогда, когда разработчики уже буквально бьются головой о стену, завывая «ну дайте уже фичу, ну интегрируйте продукт». На выходе мы получаем, как правило, узкоприменимое местечковое решение от самой 1С без интеграции с чем-то уже имеющимся. Возьмите хоть пресловутый контроль версий и «выгружаемую конфигурацию».
>>> 1С заинтересована выходить за пределы СНГ.
Ну, это все хотят. Но именно с этим у 1С проблемы. Без глобальной смены политики — не получится. Короче, не верю.
Ну а по поводу «руслиша»… Ну, может оно и моя личная неприязнь. Но даже вот по клавиатуре посмотрите. Есть такие символы, как <>…
Если Переменная1(тут переключение раскладки) > (переключение раскладки) Переменная2 Тогда…
Ну неудобно…Serginio1
12.08.2016 12:03Я пишу на руслише 20 лет. У меня это не вызывает проблем. Кроме того 1С сама дает названия
ComОбъект, ЧтениеXML, ОбъектXDTO итд. Что касается 7 ки, то С++ это более продвинутый инструмент 8 ки. Он конкурент. Поэтому и нет смысла его внедрять. Что касается моей разраьотки, то она направлена прежде всего на кросссплатформенность. На Windows есть COM через который можно все интегрировать. С Линуксом значительно сложнее. В любом случае я сделал всё, что мог. Найду другое приложение своих сил. Просто в данную разработку я вложил много времени. Как на получение новых знаний, так и на саму разработку. И аналог через IReflect позволяет решать кучу задач. Начиная от неподдерживаемых 1С вэб сервисов, Regex закачинвая месенджерами например на основе SignalR парсерами типа AngleSharp итд.
Мою разработку можно использовать из любого языка на нативе если нужно использовать какуюлибо сборку на .Net.qrKot
14.08.2016 06:13Не то, чтобы ComОбъект и прочее было проблемой. Но неудобство оно вызывает, тут вы, наверное, со мной согласитесь.
>> В любом случае я сделал всё, что мог. Найду другое приложение своих сил.
А отчаиваетесь вы зря. Инструмент вы создали, при этом достаточно неплохой, и он, вероятно, будет востребован. Просто с аудиторией промахнулись.
Вот лично мне интероп с 1С интересен в обратную сторону. Когда, условно, COM-сервером выступает сама 1С-ка. Т.е. интерфейс, который позволяет, скажем, из .Net-кода или из Java замутить конструкцию вида:
List GoodsListFrom1S = Com1SInterface.getInstanceByQuery(«Справочник.Номенклатура»)
.getByParent(«001245»);
for(Inst1SItem item: GoodsListFrom1S) {
System.out.println(item.Name());
}Serginio1
14.08.2016 10:25В 1С есть
http://infostart.ru/public/192374/
http://www.sql.ru/forum/1078706/integraciya-c-i-1s
Можно интегрировать через Linq to ODATA
Можно и напрямую Code First и Linq to EF на примере 1С версии 7.7 и 8.3 часть I
Code First и Linq to EF на примере 1С версии 8.3 часть II
Linq to EF. Практика использования. Часть III
Serginio1
14.08.2016 09:44Ну сейчас это возможно через COM. Кстати в статье Быстрое создание Внешних Компонент на C#. Примеры использования Глобального Контекста, IAsyncEvent, IExtWndsSupport, WinForms и WPF
Можно в ВК использовать глобальный Контекст и создавать любые объекты 1С. Но это COM.
Для Native ВК это тоже возможно, но…
Suvitruf
Мои глаза кровоточат.
И я даже не про то, что тут адская помесь ру/eng в коде, и даже не про то, что методы имеют ошибки в наименовании (eg. ТестАсинхрнногоВыполнителяНажатие, ПолучитьСписоуURL), а в целом про статью.
Несерьёзный подход к написанию статьи (да и кода тоже).
Serginio1
Спасибо подправлю.
Nogotkov_Andrew
Полностью с вами соглашусь.
Хотелось бы высказать своё мнение по-поводу этого «замечательного языка», а может быть и просто замечательного языка — если честно я не незнаю, но всё-таки тревожит меня здесь содержание русского языка, т.к зачем он(мои глаза просто читают его как китайский язык — т.к просто не привычно читать и тем более писать программы на своём оттечественном языке), думаю что Инностранные программисты также воспринимают языки программирования, которые содержат оттечественный язык.
Всё же лучше писать программы на каком-нибудь другом языке, ежели на своём оттечественном языке.
Error1024
Сидят значит где-нибудь в Microsoft, кровоточат от английского, и только мечтают перейти на 1C.
Впрочем против 1C ничего не имею)