Использование классов .Net в 1С для новичков

14.02.16

Разработка - Механизмы платформы 1С

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

В  .Net есть классы, структуры(Value типы), перечисления. С точки зрения 1С их можно рассматривать как классы. Каждый класс характеризуется типом.

По аналогии с 1С классы это справочники, документы и т.д.

У классов могут быть статические методы и свойства  и методы и свойства объекта. По аналогии с 1С статические методы это методы менеджера (НайтиПоКоду,НайтиПоНомеру), а методы объекта аналогичны методам объекта (Модифицированность, Удалить, Номер,Дата)

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

Каждый класс характеризуется именем класса, пространством имен и сборкой (размещение Dll, Exe).

Рассмотрим класс String https://msdn.microsoft.com/ru-ru/library/system.string(v=vs.110).aspx

Представляет текст как последовательность знаков Юникода.

Исходный код .NET Framework для этого типа см. в указанном источнике.

Пространство имен:   System
Сборка:  mscorlib (в mscorlib.dll)

Начнем сразу на примерах. Итак, для начала создадим объект, который будет обертывать объекты .Net в COM объекты.

врап=новый COMОбъект("NetObjectToIDispatch45");

Теперь получим тип System

String=Врап.ПолучитьТип("System.String");

Для понимания правильнее будет так

ПространствоИмен="System.";
String=Врап.ПолучитьТип(ПространствоИмен+"String");

Кто работал с ФабрикаXDTO, то там тоже есть простанство имен и типы.

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

КлассНеГак=Врап.ПолучитьТипИзСборки(ПолноеИмяКласса,ПолноеИмяФайла)

Теперь мы можем вызвать статические методы.

Например, аналог  1С функции ПустаяСтрока

Сообщить(String.IsNullOrWhiteSpace(неопределено));
Сообщить(String.IsNullOrWhiteSpace("  "));

Вернет Истина.

 

Статические методы в справке https://msdn.microsoft.com/ru-ru/library/system.string(v=vs.110).aspx

Помечаются  символом S.

К сожалению, есть проблемы с функциями, которые принимают параметры как массив params.

Например, у класса String  есть статическая функция Format

У неё есть множество перегрузок.

https://msdn.microsoft.com/ru-ru/library/b1csw23d(v=vs.110).aspx

public static string Format(

               string format,

               params object[] args

)

Которая вызывается, когда параметров больше 3

При объявлении  параметра как params object[] мы можем задавать параметры через запятую.

Сообщить(String.Format("загружено {0} из {1} байт. {2}  % complete...", 
        e.BytesReceived, 
        e.TotalBytesToReceive,
		e.ProgressPercentage,
        0));

Я добвил еще один неиспользуемый параметр 0, иначе последний параметр вывелся бы как System.Object[]

Для того, что бы исправлять такие ошибки я добавил  метод ВыполнитьМетод

Который принимает первым параметром тип или строковое представление типа ("System.String");

Вторым параметром имя метода, а дальше параметры для запрашиваемого метода

 

Сообщить(Врап.ВыполнитьМетод(String,"Format","загружено {0} из {1} байт. {2}  % complete...", 
        e.BytesReceived, 
        e.TotalBytesToReceive,
		e.ProgressPercentage));

Теперь перейдем с созданию объекта и вызову методов объекта.

Объект можно получить двумя способами

DateTime= Врап.ПолучитьТип("System.DateTime ");
Дата=Врап.СоздатьОбъект(DateTime,2015,1,2);

или

Дата=Врап.СоздатьОбъект("System.DateTime",2015,1,2);

Следует учесть, что в 1С числовые типы, дата строки, булево, массивы этих типов и Com объекты возвращаются как родные.

Поэтому если использовать объектные методы, например, String нужно обернуть его.

Например

ОбернутаяСтрока=Врап.ОбернутьЛюбойОбъект("Тестовая строка");

Теперь можно применить к ней объектные методы

Найдем первое вхождение строки "ст" начиная с 6 символа (Возвращает индекс с отсчетом от нуля первого вхождения значения указанной строки в данном экземпляре. Поиск начинается с указанной позиции знака.)

Сообщить(ОбернутаяСтрока.IndexOf("ст",5));

Вернет 9

В .Net есть дженерик типы, у которых используемые типы заданы неявно.

http://professorweb.ru/my/csharp/charp_theory/level11/11_1.php

 

Возьмем для примера System.Collections.Generic.List<T>

https://msdn.microsoft.com/ru-ru/library/6sh2ey19(v=vs.110).aspx

 

В C# Для того, чтобы создать список строк

var список = new List<String>();
Можно посмотреть строковое представление класса
Список.GetType().ToString()
Или
typeof(List<String>).ToString();

 

он выдаст System.Collections.Generic.List`1[System.String]

Теперь мы можем использовать его

Список=Врап.СоздатьОбъект("System.Collections.Generic.List`1[System.String]");
Для сч=1 По 10 Цикл
Список.Add(строка(сч));	
КонецЦикла; 

Для каждого стр Из Список Цикл
	 Сообщить(стр)
КонецЦикла;

Но тоже можно добиться другим способом

Узнав строковое представление typeof(List<>).ToString()

System.Collections.Generic.List`1[T]

Оно совпадает с названием класса, только добавляется `1 это говорит, что дженерик поддерживает 1 неопределенный тип.

ListT=Врап.ПолучитьТип("System.Collections.Generic.List`1");
ListT=Врап.ТипКакОбъект(ListT); 
Список=Врап.СоздатьОбъект(ListT.MakeGenericType(String));

Нужно отметить, для того, что бы у объекта полученного как  ПолучитьТип был доступ к методам класса Type нужно его преобразовать через метод ListT=Врап.ТипКакОбъект(ListT);

Так как в реализации обертки он отвечает за статические методы класса.

Аналогично можно создать и словарь Dyctionary, это типизированный аналог 1С Соответствие

Dictionary<String,int>

Словарь= Врап.СоздатьОбъект("System.Collections.Generic.Dictionary`2[System.String,System.Int32]");

Для сч=1 По 10 Цикл

Словарь.Add(строка(сч),сч);	

КонецЦикла; 

Для каждого стр Из Словарь Цикл
	 Сообщить(стр.Key+"="+стр.Value)
КонецЦикла; 

//Аналогично это можно достигнуть через
СловарьT=Врап.ПолучитьТип("System.Collections.Generic.Dictionary`2");
Int32=Врап.ПолучитьТип("System.Int32");
СловарьT=Врап.ТипКакОбъект(СловарьT);
Словарь=Врап.СоздатьОбъект(СловарьT.MakeGenericType(String,Int32));

Еще одна особенность работы с C# реализацией this[]

Например, в 1С мы не можем вызвать Список[0]. Доступ осуществляется через

get_Itemи set_Item

Список.set_Item(0,"1С+Net");
Сообщить(Список.get_Item(0));

Вот полный список классовSystem.Collections.Generic

https://msdn.microsoft.com/ru-ru/library/system.collections.generic(v=vs.110).aspx

Регулярные выражения тоже часто применяются для поиска замены.

http://professorweb.ru/my/csharp/charp_theory/level4/4_10.php

Я покажу, как их использовать на примерах

input = "Добро пожаловать в наш магазин, вот наши цены: 
 |1 кг. яблок - 20 руб. 
 |2 кг. апельсинов - 30 руб.
 |0.5 кг. орехов - 50 руб.";
 
 pattern = "\b(\d+\W?руб)";
 regex = Врап.СоздатьОбъект("System.Text.RegularExpressions.Regex",pattern);
  // Получаем совпадения в экземпляре класса Match
 matches = regex.Matches(input);
// отображаем все совпадения
Для Каждого match in matches Цикл
	 // Т.к. мы выделили в шаблоне одну группу (одни круглые скобки),
	 // ссылаемся на найденное значение через свойство Groups класса Match
	 Сообщить(match.Groups.get_Item(1).Value);
КонецЦикла

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

В 1С нет явного аналога StringBuilder Предоставляет изменяемую строку символов.

В этом тесте нужно собрать строку из маленьких фрагментов строк. В 1С для соединения строк есть неявный аналог ЗаписьXML ЗаписатьБезОбработки.

Для  замера времени используем Stopwatch который замеряет время до миллисекунды

https://msdn.microsoft.com/ru-ru/library/system.diagnostics.stopwatch(v=vs.110).aspx

Процедура ВывестиВремя(врап,stopWatch)
	ts = stopWatch.Elapsed;
	String=Врап.ПолучитьТип("System.String");
	// Format and display the TimeSpan value.
	elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
	ts.Hours, ts.Minutes, ts.Seconds,
	ts.Milliseconds / 10,0);
	Сообщить(elapsedTime);
КонецПроцедуры	
Процедура StringBuilderНажатие(Элемент)
	// Вставить содержимое обработчика.
	врап=новый COMОбъект("NetObjectToIDispatch45");

	КоличествоИтераций=200000;
	stopWatch = Врап.СоздатьОбъект("System.Diagnostics.Stopwatch");
	
	стр="";
	
	НачВремя=ТекущаяДата();
	stopWatch.Start();
	
	Для сч=1 по КоличествоИтераций Цикл
		стр=стр+Строка(сч);
	КонецЦикла;
	stopWatch.Stop();
	
	ВремяВыполнения=ТекущаяДата()-НачВремя;
	Сообщить("Конкатенация ="+ВремяВыполнения+" сек. ДлинаСтр="+СтрДлина(Стр));
	
	ВывестиВремя(врап,stopWatch);
	стр="";
	НачВремя=ТекущаяДата();
	stopWatch.Restart();
	SB =  врап.СоздатьОбъект("System.Text.StringBuilder");
	Для сч=1 по КоличествоИтераций Цикл
		SB.Append(Строка(сч));
	КонецЦикла;
	
	стр=SB.ToString();
	stopWatch.Stop();
	
	ВремяВыполнения=ТекущаяДата()-НачВремя;
	Сообщить("StringBuilder ="+ВремяВыполнения+" сек. ДлинаСтр="+СтрДлина(Стр));
	ВывестиВремя(врап,stopWatch);
	
	НачВремя=ТекущаяДата();
	stopWatch.Restart();
	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.УстановитьСтроку();
	
	Для сч = 1 по КоличествоИтераций Цикл
		ЗаписьXML.ЗаписатьБезОбработки(Строка(сч));
	КонецЦикла;
	Стр = ЗаписьXML.Закрыть();
	stopWatch.Stop();
	
	ВремяВыполнения=ТекущаяДата()-НачВремя;
	Сообщить("ЗаписьXML ="+ВремяВыполнения+" сек. ДлинаСтр="+СтрДлина(Стр));
	ВывестиВремя(врап,stopWatch);
	
//Конкатенация =96 сек. ДлинаСтр=1 287 896
//00:01:36.22
//StringBuilder =10 сек. ДлинаСтр=1 287 896
//00:00:09.91
//ЗаписьXML =4 сек. ДлинаСтр=1 287 896
//00:00:04.40



КонецПроцедуры

Как видно, скорость вызова .Net класса в 2.25 раза медленнее обычного метода. Это нужно учитывать при обработке больших массивов данных.

Используем информацию о культуре .

https://msdn.microsoft.com/ru-ru/library/system.globalization.cultureinfo(v=vs.110).aspx

Но часто нужно получать с данных без учета культуры

Целое   = 55333;
Дробное   = 66333.44;
Строка   = "абвгд";
Дата=ТекущаяДата();

CultureInfo=Врап.ПолучитьТип("System.Globalization.CultureInfo");
SB.AppendFormat(CultureInfo.InvariantCulture,"{0} {1} {2} {3}",Целое,Дробное,Строка,Дата,0);
Сообщить(SB.ToString());

Получаем

55333 66333.44 абвгд 01/26/2016 17:10:05

Стоит еще добавить приведение типа к Интерфейсу. На примере прохода по коллекции. Если в 1С можно пройтись через Для Каждого то для 7 ки этого сделать нельзя. Заодно понять как приводить к интерфейсу.

Так из документации мы знаем что List<T> поддерживает интерфейс IEnumerable

https://msdn.microsoft.com/ru-ru/library/system.collections.ienumerable(v=vs.100).aspx

 Перечислимый=Врап.ПолучитьИнтерфейс(Список,"IEnumerable");
 Перечислитель=Перечислимый.GetEnumerator();
 // На всякий случай приведем к Интерфейсу IEnumerator
 Перечислитель=Врап.ПолучитьИнтерфейс(Перечислитель,"IEnumerator");
 // Теперь можем пройтись по коллекции
 
Пока Перечислитель.MoveNext() Цикл
//  Врап.ВСтроку вывоит строковое представление всех типов в том числе числовые, строки, неопределено
	Сообщить(Врап.ВСтроку(Перечислитель.Current));

КонецЦикла; 
// Для того что бы получить методы объекта реализующего интерфейс можно
// спомощью метода  ОбновитьДанныеОметодахИСвойствах(object objOrig)


// Для того что бы получить массив String[] можно вызвать
Массив=Список.ToArray();
 Сообщить(Массив);

 // В 1С он будет определен как COMSafeArray VT_BSTR
 // Доступ к элементам массива также как и в COMSafeArray через  GetValue и SetValue
//https://msdn.microsoft.com/library/system.array(v=vs.100).aspx
// Создать массив можно через метод врапера СоздатьМассив(object type, int length)

Еще в .Net для асинхронного программирования используют await и методы возвращающие Task<>

Для того, чтобы получить результат, нужно обратиться к свойству Result, если нужно подождать, то вызвать метод Wait()

https://msdn.microsoft.com/ru-ru/library/dd321424(v=vs.118).aspx

// Следует отметить, что не все типы из GAC модно подгрузить
// Например  System.Net.Http.HttpClient который находится с System.Net.Http.dll
//Получить тип можно двумя способами
// По полному имени 
//Клиент=Врап.СоздатьОбъект("System.Net.Http.HttpClient, System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
//Либо просто указать имя библиотеку в котором находится класс без полного пути
//Тогда  ПолучитьТипИзСборки будет искать в катаорге GAC
HttpClient=Врап.ПолучитьТипИзСборки("System.Net.Http.HttpClient","System.Net.Http.dll");
Клиент=Врап.СоздатьОбъект(HttpClient);
ДанныеРесурса=Клиент.GetStringAsync("https://msdn.microsoft.com/ru-ru/library/hh551745(v=vs.118).aspx").Result;

Сообщить(Врап.ВСтроку(ДанныеРесурса));

Стоит вспомнить про вложенные типы на примере System.Environment.SpecialFolder 

Так для получения типа нужно разделять вложенный тип знаком плюс, а не точкой

 

Environment=Врап.ПолучитьТип("System.Environment");
	SpecialFolder=Врап.ПолучитьТип("System.Environment+SpecialFolder");
	Сообщить(Environment.GetFolderPath(SpecialFolder.CommonProgramFilesX86));
	Сообщить(Environment.GetFolderPath(SpecialFolder.Desktop));
	Сообщить(Environment.GetFolderPath(SpecialFolder.MyDocuments));
 

Используя System.IO.Path можно получить доступ к Temp директории

Path=Врап.ПолучитьТип("System.IO.Path");
Сообщить(Path.GetTempPath());

Там же много методов для манимулирования с наименованием файла, получение каталога, расширения, объединять строки в путь итд

Очень часто приходится использовать битовую операци OR

например 

 AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
 
или
 watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
           | NotifyFilters.FileName | NotifyFilters.DirectoryName;
 
Поэтому добавил метод OR. Теперь те же операции можно вызвать
 
DecompressionMethods= Врап.ПолучитьТип("System.Net.DecompressionMethods");
  handler.AutomaticDecompression=Врап.OR(DecompressionMethods.GZip,DecompressionMethods.Deflate) ;

или

NotifyFilters=врап.ПолучитьТип("System.IO.NotifyFilters");
    рез=Врап.OR(NotifyFilters.LastAccess,NotifyFilters.LastWrite,NotifyFilters.FileName,NotifyFilters.DirectoryName);
 

Надеюсь, данная статья поможет использовать классы .Net даже тем, кто не знает C#. Ничего сложного нет, но поможет сильно увеличить возможности 1С без написания COM объектов или ВК

.Net C#

См. также

"Виртуальный" работник на платформе 1C v7.7

Механизмы платформы 1С Платформа 1С v7.7 Конфигурации 1cv7 Бесплатно (free)

В статье расписаны примеры из жизни использования "Виртуального" работника. Разобраны вопросы, возникающие при работе с ним.

28.11.2021    1577    user707242_Gold_karas    18    

5

Работа с журналом регистрации. Выходим за границы платформы

Журнал регистрации Бесплатно (free)

Работа с журналом регистрации нестандартными средствами. А также немного про использование платформы .NET в экосистеме 1С.

12.05.2020    18638    Infostart    32    

92

Асинхронное программирование в 1с77 без внешних компонент. Обратные вызовы.

Механизмы платформы 1С Платформа 1С v7.7 Абонемент ($m)

Пример построения программного кода для достижения функционала обратных вызовов (call back) во внешних обработках исключительно штатными средствами. Тестировалось на платформе 1с77 релиз 027. Конфигурация значения не имеет.

1 стартмани

06.10.2018    7486    Vortigaunt    5    

11

Особенности разделения объектной модели документа и базы данных в 1С 7.7. Забавный глюк

Механизмы платформы 1С Оперативный учет 7.7 Абонемент ($m)

Когда занимаешься разработкой в среде 1С, редко задумываешься о том, что программным кодом ты работаешь с объектной моделью базы данных, а не с самой базой данных. И что это вообще разные вещи. Ты создаешь объекты: документы и справочники, записываешь их - и в базе данных появляются соответствующие записи. Это настолько привычно, что когда сталкиваешься с нетипичным поведением платформы, первым делом думаешь: надо протестировать базу, она битая. В этой статье я хочу разобрать одну интересную ситуацию, которая как раз демонстрирует такое поведение. Описанная ниже ситуация воспроизводится как в файловом, так и в клиент-серверном (SQL) варианте. Тестировалось на версии платформы 1с77 релиз 027.

1 стартмани

16.05.2018    10154    Vortigaunt    26    

5

Все про картинки в 1С 7.7, ну или почти все...

Механизмы платформы 1С Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

В 1С 8 наличие картинок товаров предусмотрено изначально, а в 7.7 такого нет. Проблема существует и ее исправляют, но это, как правило, частные случаи, касающиеся, например, печати прайса http://infostart.ru/public/289876/ , показу картинок в справочнике номенклатура http://infostart.ru/public/17125/, файловый менеджер картинок товара http://infostart.ru/public/15239/ или просто конфигурации работы с картинками http://infostart.ru/public/21142/ (не стремился дать полный обзор, поэтому не попавшие не обижайтесь :). Что не устроило – информация разбросана по статьям, необходимость дополнительно напрягаться, чтобы это заработало. Здесь я попытался собрать все «до кучи», а так же дать необходимые ссылки для желающих «копнуть вглубь».

1 стартмани

18.11.2014    44065    95    kitminsk    18    

20

ЗаполнитьЗначенияСвойств - заставляем работать в 7.7

Механизмы платформы 1С Платформа 1С v7.7 Конфигурации 1cv7 Бесплатно (free)

Если вы используете в работе 1С:Предприятие 8.х, то наверняка знакомы и с замечательной системной процедурой, как ЗаполнитьЗначенияСвойств(). Ее использование помогает значительно упростить написание программного кода в ряде случае, делает его (код) более наглядным и простым. Но что же делать тем, кто до сих пор использует (постоянно или иногда) 1С:Предприятие 7.7?

24.07.2014    23781    tomvlad    5    

14

Использование сборок .NET в 1С 7. и 8.x. Создание внешних Компонент.

Разработка внешних компонент Платформа 1С v7.7 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv7 Абонемент ($m)

Данная разработка создана для использования сборок .Net в 1С через преобразование объектов и классов в COM-объекты, которые можно использовать в 1С. Достигается это путем создания класса, реализующего методы интерфейса IReflect public class AutoWrap: IReflect.

1 стартмани

28.11.2013    108696    335    Serginio    80    

141
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
95. Detache 17.07.18 17:04 Сейчас в теме
(93) Метод "Decode" есть, куда дальше копать? Проблема в передаваемом в метод параметре?
96. Serginio 938 18.07.18 12:07 Сейчас в теме
Да проблема в передаваемом параметре (выяснили, что это не метод расширения)

Можешь через отладчик если что посмотреть. Исходники то у тебя есть.
101. ZSS2014 31.10.18 12:54 Сейчас в теме
А что необходимо сделать чтобы 1с распознала данный com объект ("NetObjectToIDispatch45")?
102. Serginio 938 14.12.18 11:29 Сейчас в теме
(101) Нужно скачать и зарегистрировать NetObjectToIDispatch45.dll
https://www.forum.mista.ru/topic.php?id=763810&page=1
103. Denanhel 28.12.18 15:48 Сейчас в теме
Еще пример. Изменениеразмера изображения
все изображения к размеру 500 на 500 где-то срежем, гдето добавим белого фона

destWidth = 500;
destHeight = 500; 		
	
Врап = новый COMОбъект("NetObjectToIDispatch45");  		
			
src = Врап.СоздатьОбъект("System.Drawing.Bitmap", ИмяВходящегоФайлаКартинки;
dest = Врап.СоздатьОбъект("System.Drawing.Bitmap", destWidth, destHeight, 
                                          Врап.ПолучитьТип("System.Drawing.Imaging.PixelFormat").Format32bppArgb);		
			
srcRect = Врап.СоздатьОбъект("System.Drawing.Rectangle");
destRect = Врап.СоздатьОбъект("System.Drawing.Rectangle");
			
destRect.Width = destWidth;
destRect.Height = destHeight;
			
g = Врап.ПолучитьТип("System.Drawing.Graphics").FromImage(dest);
			
backgroundColor = Врап.ПолучитьТип("System.Drawing.Color").FromName("White");
			
b = Врап.СоздатьОбъект("System.Drawing.SolidBrush", backgroundColor);
			
g.FillRectangle(b, destRect);
srcRect.Width = src.Width;
srcRect.Height = src.Height;
			
sourceAspect = src.Width / src.Height;
destAspect = destWidth / destHeight;
			
Если sourceAspect > destAspect Тогда
        destRect.Width = destWidth;
        destRect.Height = Цел(destWidth / sourceAspect);
        destRect.X = 0;
	destRect.Y = Цел((dest.Height - destRect.Height) / 2);
Иначе
	destRect.Height = destHeight;
	destRect.Width = Цел(destHeight * sourceAspect);
	destRect.X = Цел((destWidth - destRect.Width) / 2);
	destRect.Y = 0;
КонецЕсли; 
			
g.DrawImage(src, destRect, srcRect, Врап.ПолучитьТип("System.Drawing.GraphicsUnit").Pixel);
			
src.Dispose();
dest.Save(ИмяИсходящегоФайлаКартинки); 
dest.Dispose();
Показать
105. MichiMaloy 04.03.19 17:21 Сейчас в теме
106. user643502_olapmail 09.05.20 18:41 Сейчас в теме
В своё время удалось успешно использовать компоненту под 77.
Сейчас, при попытке использования уже со стороны 83 - возникли проблемы с использованием:
На всякий случай: win 2016 (14353.3659), 1C 8.3.10.2252

Wrap = Новый COMОбъект("NetObjectToIDispatch"); // ОК

Wrap.ПолучитьТипИзСборки("Microsoft.AnalysisServices.Server", "c:\Program Files (x86)\Microsoft SQL Server\130\SDK\Assemblies\Microsoft.AnalysisServices.DLL"); //OK

OLAPServer = Wrap.СоздатьОбъект("Microsoft.AnalysisServices.Server");  //OK

AS_DatabaseID = "SSAS_DB_Name";
Если OLAPServer.Databases.Contains(AS_DatabaseID) Тогда // OK
	DB = OLAPServer.Databases.Item(AS_DatabaseID);    // Ошибка: 
КонецЕсли;

{ВнешняяОбработка.DWH.Форма.Форма.Форма(939)}: Метод объекта не обнаружен (Item)
		DB = OLAPServer.Databases.Item(AS_DatabaseID);
Показать


Попытка просмотреть объект OLAPServer.Databases по Ctrl+Alt+W - приводит к дополнительным ошибкам:

В чем может быть ошибка?
Заранее благодарен
Прикрепленные файлы:
107. user643502_olapmail 11.05.20 20:16 Сейчас в теме
Еще обратил внимание, вот, на что:
Простые системные типы - отрабаотывает "на ура":
	System_True			= Wrap.ChangeType("System.Boolean", "true");
	System_False			= Wrap.ChangeType("System.Boolean", "false"); 
	System_String			= Wrap.ПолучитьТип("System.String");
	System_DateTime		= Wrap.ПолучитьТип("System.DateTime");
	System_Byte			= Wrap.ПолучитьТип("System.Byte");
	System_Int16			= Wrap.ПолучитьТип("System.Int16");
	System_Int32			= Wrap.ПолучитьТип("System.Int32");
	System_Int64			= Wrap.ПолучитьТип("System.Int64");
	System_Decimal		= Wrap.ПолучитьТип("System.Decimal");
Показать


А вот с этим типом:
System_OleDbType = Wrap.ПолучитьТип("System.Data.OleDb.OleDbType");


Работает, "через раз".
Найти от чего зависит, т.е. зависимость, в каком случае работает, а в каком нет - пока не нашел.
108. user643502_olapmail 11.05.20 20:29 Сейчас в теме
Помогло введение второго объекта для

OleWrap.ПолучитьТипИзСборки("System.Data.OleDb.OleDbType", "c:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Data.dll");
System_OleDbType	= OleWrap.ПолучитьТип("System.Data.OleDb.OleDbType");

109. ehrmann 15.05.20 17:56 Сейчас в теме
Пытался использовать процедуру GZIPУпаковать(вхФайл, исхФайл)
Не отрабатывает строка: Типы = ПолучитьТипыДляФайлов();
Пробовал: Типы = Врап.ПолучитьТипыДляФайлов();
Может со временем что-то поменялось в библиотеке?
110. Zurfik 02.11.20 08:40 Сейчас в теме
Очень тяжелая для понимания статья, если честно почти ничего не понял. Если нужно понять как создавать внешние компоненты для 1с с нуля, где можно посмотреть?
111. Serginio 938 02.11.20 11:47 Сейчас в теме
Это статья не про ВК, а использование классов .Net в 1С.
Нужно знать .Net.
Про ВК другая статья
Быстрое создание Внешних Компонент на C#. Примеры использования Глобального Контекста, IAsyncEvent, IExtWndsSupport, WinForms и WPF

Но опять же нужно знать .Net.
112. Denanhel 09.02.21 17:54 Сейчас в теме
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri);
request.Method = WebRequestMethods.Ftp.GetDateTimestamp;

Сражаюсь с вот этим.

Не знаю почему, но такой код: Врап.ПолучитьТипИзСборки("System.Net.WebRequestMethods.Ftp", "System.Net.Requests.dll") не работает. Может кто что подскажет.
113. Serginio 938 10.02.21 00:17 Сейчас в теме
(112) Ну вообще то
https://docs.microsoft.com/ru-ru/dotnet/api/system.net.webrequestmethods.ftp?view=net-5.0
WebRequestMethods.Ftp Класс
Определение
Пространство имен:
System.Net
Сборка:
System.Net.Requests.dll

и скорее всего это вложенный класс а доступ к нему как сказано в этой статье
"System.Net.WebRequestMethods+Ftp"

Всегда можешь посмотреть строковое представление типа через typeof(WebRequestMethods.Ftp).ToString()
114. Denanhel 10.02.21 09:01 Сейчас в теме
(113) Благодарю. Помогло. Чего-то ступил читал же внимательно про вложеные классы, но как-то замылились глаза что-ли.
В итоге код:

Попытка
	Врап = новый COMОбъект("NetObjectToIDispatch45"); 
	Врап.ВыводитьСообщениеОбОшибке = ложь;
		
	Uri = Врап.СоздатьОбъект("System.Uri",ПутьКФайлу);  	
	WebRequestТип = Врап.ПолучитьТип("System.Net.WebRequest");		
	request = Врап.ПолучитьТип("System.Net.WebRequest").Create(Uri); 
	request.Method = Врап.ПолучитьТип("System.Net.WebRequestMethods+Ftp").GetDateTimestamp; 	
        request.Credentials = Врап.СоздатьОбъект("System.Net.NetworkCredential", Логин, Пароль);

	response = request.GetResponse();
	ДатаМодификации = response.LastModified;
Исключение
	Если Врап.ПоследняяОшибка <>  Неопределено  Тогда
             Сообщить(Врап.ПоследняяОшибка.InnerException.Message);
	КонецЕсли;
	ДатаМодификации = Дата(1,1,1,0,0,0);
КонецПопытки;
Показать
115. user643502_olapmail 13.10.21 08:51 Сейчас в теме
Использование методов параметрами которых есть <> - даймонды.

У объекта: "Microsoft.SharePoint.Client.ClientContext" есть метод "Load", унаследован : (class ClientContext : ClientRuntimeContext)
public void Load<T>(T clientObject, params Expression<Func<T, object>>[] retrievals) where T : ClientObject

При попытке запуска:

Ошибка при вызове метода контекста (Load): Не найден метод:
Microsoft.SharePoint.Client.ClientContext.Load

Сомневаюсь, что причина в том, что метод Load - унаследован.
Скорее всего - причина в том, что в качестве параметра - используется <T>

Хотелось бы знать точный ответ у Автора
116. user643502_olapmail 13.10.21 08:59 Сейчас в теме
(115) весь код:
Примечание: суть задачи: получение данных из SharePoint


Перем Wrap;

Функция ПолучитьТипИзСборки(НужныйТип, ПутьКСборке)
Перем Инфо;	
	Инфо = "<" + НужныйТип + ">  из: <" + ПутьКСборке + ">";
	Попытка
		Wrap.ПолучитьТипИзСборки(НужныйТип, ПутьКСборке);
		Возврат Истина;
	Исключение
		Сообщить("Ошибка получения типа: " + Инфо);
		Сообщить(ОписаниеОшибки());
		ЭтаФорма.Закрыть();
		Возврат Ложь;
	КонецПопытки;	
КонецФункции

Процедура КнопкаВыполнитьНажатие(Кнопка)
	ОчиститьСообщения();
	
	__NetObjectToIDispatch45 = "NetObjectToIDispatch45";
	Попытка
		Wrap = Новый COMОбъект(__NetObjectToIDispatch45);
	Исключение
		Сообщить("Ошибка создания объекта: " + __NetObjectToIDispatch45);
		Сообщить(ОписаниеОшибки());
		ЭтаФорма.Закрыть();
		Возврат;
	КонецПопытки;	
	
	Если      Не ПолучитьТипИзСборки("Microsoft.SharePoint.Client.ClientContext"				, "c:\Base1C\Instrument\DLL\Microsoft.SharePoint.Client.dll") 					Тогда Возврат;
	ИначеЕсли Не ПолучитьТипИзСборки("Microsoft.SharePoint.Client.SharePointOnlineCredentials"	, "c:\Base1C\Instrument\DLL\Microsoft.SharePoint.Client.Runtime.dll") 			Тогда Возврат;
	ИначеЕсли Не ПолучитьТипИзСборки("System.Net.NetworkCredential"								, "c:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Net.Primitives.dll")	Тогда Возврат;
	КонецЕсли;
	
	ClientContext = Wrap.СоздатьОбъект("Microsoft.SharePoint.Client.ClientContext", "https://МОЙСАЙТ");
	ClientContext.Credentials = Wrap.СоздатьОбъект("Microsoft.SharePoint.Client.SharePointOnlineCredentials", "МОЯУЧЕТКА", Wrap.СоздатьОбъект("System.Net.NetworkCredential", "", "МОЙПАРОЛЬ").SecurePassword);
	
	Lists = ClientContext.Web.Lists;
	Попытка
		ClientContext.Load(Lists);
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;

	ClientContext.ExecuteQuery();
	
КонецПроцедуры

Показать
117. dctvghbdtn 12.11.21 16:53 Сейчас в теме
Вырвал из контекста: Как видно, скорость вызова .Net класса в 2.25 раза медленнее обычного метода.

Я правильно понимаю, что в принципе при использовании .Net ожидать повышения производительности нет смысла?
Оставьте свое сообщение