.Net в 1С. Асинхронные HTTP запросы, отправка Post нескольких файлов multipart/form-data, сжатие трафика с использованием gzip, deflate, удобный парсинг сайтов и т.д.

Публикация № 466052 09.03.16

Приемы и методы разработки - Запросы

.Net HTTPClient multipart/form-data C#

Очень часто нужно при работе с HTTP сервисами или сайтами использовать Асинхронные HTTP запросы, отправку на сервер нескольких файлов, использование сжатия трафика.  Эта статья про то, как этого легко добиться.

Это продолжение статей

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

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

1C Messenger для отправки сообщений, файлов и обмена данными между пользователями 1С, вэб страницы, мобильными приложениями а ля Skype, WhatsApp

.NET(C#) для 1С. Динамическая компиляция класса обертки для использования .Net событий в 1С через ДобавитьОбработчик или ОбработкаВнешнегоСобытия

 

Продолжение статьи лежит здесь .Net в 1С. На примере использования HTTPClient,AngleSharp.Удобный парсинг сайтов с помощью библиотеки AngleSharp в том числе с авторизацией аля JQuery с использованием CSS селекторов. Динамическая компиляция

Это статья будет полезна не только 7-кам, но и 8-кам. Да, многое умеет HTTPСоединение и HTTPзапрос. Но многого нет.

Например, нет асинхронных запросов, сжатия трафика, отправки составного содержимого и т.д.

В том числе часто можно найти примеры на C# и иногда быстрее их адаптировать с использованием в 1С HTTPClient.

Про HTTPClient можно почитать здесь

https://msdn.microsoft.com/ru-ru/library/windows/apps/xaml/dn440594.aspx

https://msdn.microsoft.com/ru-ru/library/system.net.http.httpclient(v=vs.118).aspx

Итак, начнем.

Клиент=Врап.СоздатьОбъект(HttpClient);
ДанныеРесурса=Клиент.GetStringAsync("https://msdn.microsoft.com/ru-ru/library/hh551745(v=vs.118).aspx").Result;

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

Все очень просто. Но это умеет и HTTPСоединение.

Для начала объявим используемые типы при открытии.

врап=новый COMОбъект("NetObjectToIDispatch45");
	HttpClient=Врап.ПолучитьТипИзСборки("System.Net.Http.HttpClient","System.Net.Http.dll");
	HttpClientHandler = врап.ПолучитьТип("System.Net.Http.HttpClientHandler");

	// Контенты для Post
	
	MultipartFormDataContent=Врап.ПолучитьТип("System.Net.Http.MultipartFormDataContent");
	StreamContent  =Врап.ПолучитьТип("System.Net.Http.StreamContent");
	StringContent  =Врап.ПолучитьТип("System.Net.Http.StringContent");
	ByteArrayContent=Врап.ПолучитьТип("System.Net.Http.ByteArrayContent");
	FormUrlEncodedContent =Врап.ПолучитьТип("System.Net.Http.FormUrlEncodedContent");

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

    ServicePointManager=врап.ПолучитьТип("System.Net.ServicePointManager");
	Dictionary=Врап.ПолучитьТип("System.Collections.Generic.Dictionary`2[System.String,System.String]");
	StringBuilder=Врап.ПолучитьТип("System.Text.StringBuilder");
    String=Врап.ПолучитьТип("System.String");	
	HttpUtility=Врап.ПолучитьТипИзСборки("System.Web.HttpUtility","System.Web.dll");
	
	
	// Сборку AngleSharp.dll поместить в каталог программы
	//Для использования Scripting Api
    КатаогПрограммы=Врап.ПолучитьТип("System.AppDomain").CurrentDomain.BaseDirectory;
	ИмяСборкиAngleSharp=Врап.ПолучитьТип("System.IO.Path").Combine(КатаогПрограммы,"AngleSharp.dll");
	AngleSharp_Configuration=Врап.ПолучитьТипИзСборки("AngleSharp.Configuration",ИмяСборкиAngleSharp);
	
	IO_File =Врап.ПолучитьТип("System.IO.File");
	Encoding=Врап.ПолучитьТип("System.Text.Encoding");

// В релизе нужно отлавливать ошибки	
//	врап.ВыводитьСообщениеОбОшибке=ложь;

По мере использования я буду пояснять, для чего тот или иной тип.

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

Выполнитель=Врап.ПолучитьАсинхронныйВыполнитель();
ДобавитьОбработчик Выполнитель.ПриОкончанииВыполненияЗадачи, ПриОкончанииВыполнения;

//Обработчик события выглядит так
Процедура ПриОкончанииВыполнения(Задача,ДанныеКЗадаче)

    // Обязательно нужно отлавливать ошибку в 1С
    // Иначе она передается в .Net где обрабатывается там
    Попытка
Так как задача может завершиться с ошибкой
Мы должны проверить, и если ошибка нужно предпринять какие то действия
        Если (Задача.IsFaulted) Тогда  // Ошибка выполнения

            Сообщить("Ошибка "+Врап.ВСтроку(Задача.Exception));
            Сообщить("Данные к задаче "+Врап.ВСтроку(ДанныеКЗадаче));

        иначе
            Сообщить("=====Выполнена задача ====");
            Сообщить("Данные к задаче "+Врап.ВСтроку(ДанныеКЗадаче));
            Сообщить(Врап.ВСтроку(Задача.Result));


        КонецЕсли;

    Исключение
        Сообщить("Ошибка в процедуре");
        Сообщить(ОписаниеОшибки());
    КонецПопытки

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

Вызываем задачу так

    Клиент=Врап.СоздатьОбъект(HttpClient);
    Задача=Клиент.GetStringAsync("https://msdn.microsoft.com/ru-ru/library/hh551745(v=vs.118).aspx");
    Выполнитель.Выполнить(задача,ТекущаяДата());

 

 Для тестов я сделал тестовый Вэб сервис на ASP.Net

 

Для теста  множества асинхронных запросов сделал функцию

       [HttpGet]
        public async Task<string> GetIdAsync(string id)
        {
            await Task.Delay(1000);
            return id;
 

        }

Имитируем задержку в 1 секунду. Например, нам нужно выполнить 100 запросов.

Процедура TestAsyncНажатие(Элемент)
	// Вставить содержимое обработчика.

    handler = врап.СоздатьОбъект(HttpClientHandler);

    Сообщить(ServicePointManager.DefaultConnectionLimit);
    ServicePointManager.DefaultConnectionLimit=100;


	        Клиент = Врап.СоздатьОбъект(HttpClient,handler);
// Использование заголовков не обязательно
// В данном случае это пример их использования
	        Клиент.DefaultRequestHeaders.Connection.Add("keep-alive");
			CacheControl=Врап.СоздатьОбъект("System.Net.Http.Headers.CacheControlHeaderValue");
			CacheControl.MaxAge = Врап.ПолучитьТип("System.TimeSpan").Zero;
            Клиент.DefaultRequestHeaders.CacheControl = CacheControl;
            Клиент.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml,*/*");
            Клиент.DefaultRequestHeaders.Add("Accept-Language", "ru-Ru");
            Клиент.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko");
			
		    uriSources =ПолучитьСтрокуЗапроса("http://localhost.fiddler:40320/api/values/GetIdAsync/");
	
           Клиент.BaseAddress =Врап.СоздатьОбъект("System.Uri",uriSources); 
		   
		   Выполнитель=Врап.ПолучитьАсинхронныйВыполнитель();
	ДобавитьОбработчик Выполнитель.ПриОкончанииВыполненияЗадачи, ПриОкончанииВыполнения;
	
	ВыполненоЗадач=0;
    МассивОтветов=новый массив;
	
	stopWatch = Врап.СоздатьОбъект("System.Diagnostics.Stopwatch");
	stopWatch.Start();
			Для сч=1 По 100 Цикл
			
				Задача=Клиент.GetStringAsync(СокрЛП(сч));

	             Выполнитель.Выполнить(задача,ТекущаяДата());

			
			 КонецЦикла; 
			 
КонецПроцедуры

Процедура ВывестиВремя(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);
	Если толькоВремя Тогда
		возврат
	КонецЕсли;
	Для каждого стр  Из МассивОтветов Цикл
	
		   сообщить(стр);
	
	КонецЦикла; 
КонецПроцедуры	

Процедура ПриОкончанииВыполнения(Задача,ДанныеКЗадаче)
	
	// Обязательно нужно отлавливать ошибку в 1С
	// Иначе она передается в .Net где обрабатывается там
	ВыполненоЗадач=ВыполненоЗадач+1;
	
	
	
	Попытка
		
		Если (Задача.IsFaulted) Тогда  // Ошибка выполнения
			
			Сообщить("Ошибка "+Врап.ВСтроку(Задача.Exception));
			Сообщить("Данные к задаче "+Врап.ВСтроку(ДанныеКЗадаче));
			
		иначе
			//Сообщить("=====Выполнена задача ====");
			//Сообщить("Данные к задаче "+Врап.ВСтроку(ДанныеКЗадаче));
			//Сообщить(Врап.ВСтроку(Задача.Result));
			МассивОтветов.Добавить(Задача.Result);
                          Если ВыполненоЗадач=100 Тогда
		
		             ВывестиВремя(stopWatch)	
		
	                  КонецЕсли; 
		КонецЕсли; 
		
	Исключение
		Сообщить("Ошибка в процедуре");
		Сообщить(ОписаниеОшибки());
	КонецПопытки	
	
КонецПроцедуры

Если бы при синхронном выполнении нам понадобилось бы минимум 100 сек, то при асинхронном уходит порядка 1,5 сек.

Отдельно нужно отметить использование ServicePointManager. Более подробно можно посмотреть здесь

Почему одновременно происходит только два соединения с сайтом

Тест сетевой нагрузки


Есть еще вариант дождаться всех запросов

 

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

      Task=Врап.ПолучитьТип("System.Threading.Tasks.Task");
      массив=лист.ToArray(); 
      Task.WaitAll(массив);
      Для каждого задача из лист Цикл 
         Сообщить(задача.Result); 
      КонецЦикла


Но здесь нужно учитывать, что например в выполнитель испольует контекс синхронизации, что может приводить к блокировкам  https://habrahabr.ru/post/257221/

Проверил асинхронные методы HttpClient не зависят от контекста синхронизации.


Перед тем как перейти к использованию multipart/form-data, покажу примеры отправки Post запросов.

Процедура ЗакрытьРесурс(Ресурс) 
	Врап.ПолучитьИнтерфейс(Ресурс,"IDisposable").Dispose();
КонецПроцедуры

Функция ПолучитьСтрокуОтвета(стрОриг)

Стр=СтрЗаменить(стрОриг,"""","");
возврат СтрЗаменить(стр,"\r\n",Символы.ПС);
	

КонецФункции // ПолучитьСтрокуОтвета()

Функция ПолучитьСтрокуЗапроса(uriSources)
	Если не ФлИспользоватьФиддлер Тогда
		возврат СтрЗаменить(uriSources,".fiddler","");
	КонецЕсли;
	
	Возврат uriSources
	КонецФункции
Функция ВыполнитьПост(uriSources,Клиент)

  //  Контент=Врап.СоздатьОбъект("System.Net.Http.StringContent","Тестовая Строка",Encoding.UTF8,"text/plain");
    Контент=Врап.СоздатьОбъект("System.Net.Http.StringContent","Тестовая Строка "+uriSources);
	резулт=Клиент.PostAsync(uriSources,Контент).Result;
	 
	
	Сообщить("===================================");
	
	Сообщить(резулт.IsSuccessStatusCode);
	Сообщить(Врап.Встроку(резулт.StatusCode));

	стр=резулт.Content.ReadAsStringAsync().Result;
   Сообщить(ПолучитьСтрокуОтвета(стр));
	

КонецФункции // ВыполнитьПост()
 
Процедура TestGetНажатие(Элемент)
	// Вставить содержимое обработчика.
	 HttpClient=Врап.ПолучитьТипИзСборки("System.Net.Http.HttpClient","System.Net.Http.dll");
	
	HttpUtility=Врап.ПолучитьТипИзСборки("System.Web.HttpUtility","System.Web.dll");

	
	Попытка

	uriSources =ПолучитьСтрокуЗапроса("http://localhost.fiddler:40320/api/values/");
   	handler = врап.СоздатьОбъект(HttpClientHandler);
	
    cookieContainer = Врап.СоздатьОбъект("System.Net.CookieContainer");
  
   handler.AutomaticDecompression=Врап.OR(DecompressionMethods.GZip,DecompressionMethods.Deflate);
// Используем cookieContainer для задания куков со стороны клиента. Куки со стороны сервера автоматически сохраняются.
cookieContainer.Add(Врап.СоздатьОбъект("System.Net.Cookie","TestCookie", "TruLyaLya", "/", "localhost"));
   handler.CookieContainer=cookieContainer;
   handler.UseCookies=истина;

	    Клиент = Врап.СоздатьОбъект(HttpClient,handler);
	    DefaultRequestHeaders=Клиент.DefaultRequestHeaders;
	    DefaultRequestHeaders.Connection.Add("keep-alive");
			CacheControl=Врап.СоздатьОбъект("System.Net.Http.Headers.CacheControlHeaderValue");
			CacheControl.MaxAge = Врап.ПолучитьТип("System.TimeSpan").Zero;
            DefaultRequestHeaders.CacheControl = CacheControl;
			
            DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml,*/*");
            DefaultRequestHeaders.Add("Accept-Language", "ru-Ru");
            DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko");


        //Использум BaseAddress, что бы в дальнейшем задавать адрес только ресурса
	Клиент.BaseAddress =Врап.СоздатьОбъект("System.Uri",uriSources);
        Стр=Клиент.GetStringAsync("GetHeaders").Result;
// В данном случае запрос отправится
//
	Сообщить(ПолучитьСтрокуОтвета(стр));
	
	ВыполнитьПост("SendStr",Клиент);
	ВыполнитьПост("SendStr2",Клиент);
	
	 ЗакрытьРесурс(Клиент);
	 
 Исключение
	 Сообщить(ОписаниеОшибки());
	 
	 Если Врап.ПоследняяОшибка<>Неопределено Тогда
	 
	 	ПоказатьПредупреждение(,Врап.ПоследняяОшибка.Message);

	 
	 КонецЕсли; 
			Врап.ВывестиПоследнююОшибку();

 КонецПопытки
 

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

Процедура ПослатьStreamНажатие(Элемент)
	// Вставить содержимое обработчика.
	uriSources =ПолучитьСтрокуЗапроса("http://localhost.fiddler:40320/api/values/SendStream");
	
	

	Клиент=Врап.СоздатьОбъект(HttpClient);

	// Создаем поток в памяти и записываем в него данные строки в кодировке UTF8
        поток=врап.СоздатьОбъект(MemoryStream,Encoding.UTF8.GetBytes("Отсылаемая строка"));


	
	Контент=Врап.СоздатьОбъект(StreamContent,поток);
	резулт=Клиент.PostAsync(uriSources,Контент).Result;
	 
	
	Сообщить("===================================");
	
	Сообщить(резулт.IsSuccessStatusCode);
	Сообщить(Врап.Встроку(резулт.StatusCode));

	стр=резулт.Content.ReadAsStringAsync().Result;
        Сообщить(ПолучитьСтрокуОтвета(стр));
   
       ЗакрытьРесурс(Клиент);

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

Иногда нужно не только отправить но и получить куки


 

	// Вставить содержимое обработчика.
	cookieContainer = Врап.СоздатьОбъект("System.Net.CookieContainer");
	
  handler=Врап.СоздатьОбъект(HttpClientHandler);
  handler.AutomaticDecompression=Врап.OR(DecompressionMethods.GZip,DecompressionMethods.Deflate) ;
  handler.CookieContainer=cookieContainer;
  
  

	Клиент = Врап.СоздатьОбъект(HttpClient,handler);
    uriSources ="http://www.telerik.com";
    Ури=Врап.СоздатьОбъект("System.Uri",uriSources);
	Клиент.BaseAddress =Ури;
	
   Стр=Клиент.GetStringAsync("/UpdateCheck.aspx?isBeta=False").Result;
   
   // Пострим все куки присоединенные по этому аресу
    Куки = cookieContainer.GetCookies(Ури);
	Для  каждого кук  из Куки Цикл
		Сообщить(кук.Name + ": " + кук.Value);
	КонецЦикла;

	// Можем получить конкретное значение
	кук=Куки.get_Item("sid");
	Сообщить(кук.Name + ": " + кук.Value);


Отправляемый контекст можно задавать пятью способами

  • MultipartFormDataContent,
  • StreamContent,
  • StringContent,
  • ByteArrayContent,
  • FormUrlEncodedContent

Выбирайте тот, который удобен. FormUrlEncodedContent это аналог отправики данных Form при Post Submit.

Теперь перейдем к отправке multipart/form-data. 

Процедура Multi_PartНажатие(Элемент)
	// Вставить содержимое обработчика.
	uriSources =ПолучитьСтрокуЗапроса("http://localhost.fiddler:40320");
	//uriSources ="http://localhost:40320";
	HttpClient=Врап.ПолучитьТипИзСборки("System.Net.Http.HttpClient","System.Net.Http.dll");
	MultipartFormDataContent=Врап.ПолучитьТип("System.Net.Http.MultipartFormDataContent");

	
	Клиент = Врап.СоздатьОбъект(HttpClient);
    Контент = Врап.СоздатьОбъект(MultipartFormDataContent);
    Клиент.BaseAddress =Врап.СоздатьОбъект("System.Uri",uriSources);
	
	
	// Вариант отправки Ключ-Значение
    Значения = Врап.СоздатьОбъект("System.Collections.Generic.Dictionary`2[System.String,System.String]");
 
     Значения.Add("Name", "name");
     Значения.Add("id", "id");
  

                //      content.Add(new FormUrlEncodedContent(values));
                Для каждого КлючЗначение из Значения Цикл

                    Контент.Add(Врап.СоздатьОбъект("System.Net.Http.StringContent",КлючЗначение.Value),КлючЗначение.Key);
				КонецЦикла;
				
				
				// Вариант отправки двоичных данных из массива
				Encoding=Врап.ПолучитьТип("System.Text.Encoding");
				
                СтроковыйКонтент =Врап.СоздатьОбъект("System.Net.Http.ByteArrayContent",Encoding.UTF8.GetBytes("Тестовая строка"));

				ContentDisposition=Врап.СоздатьОбъект("System.Net.Http.Headers.ContentDispositionHeaderValue","form-data");
				ContentDisposition.FileName ="ПростоСтрока";
				ContentDisposition.Name ="attachment";


                СтроковыйКонтент.Headers.ContentDisposition = ContentDisposition;
				СтроковыйКонтент.Headers.ContentType = Врап.СоздатьОбъект("System.Net.Http.Headers.MediaTypeHeaderValue","text/plain");
                Контент.Add(СтроковыйКонтент);

				
				// Вариант отправки двоичных данных из файла
                ИмяФайла ="C:/ТестXML";
			
				ПотокФайла =Врап.ПолучитьТип("System.IO.File").OpenRead(ИмяФайла);
                ФайловыйКонтент =Врап.СоздатьОбъект("System.Net.Http.StreamContent",ПотокФайла);
				ContentDisposition=Врап.СоздатьОбъект("System.Net.Http.Headers.ContentDispositionHeaderValue","form-data");
				ContentDisposition.FileName = Врап.ПолучитьТип("System.IO.Path").GetFileName(ИмяФайла);
				
                ФайловыйКонтент.Headers.ContentDisposition = ContentDisposition;
				ФайловыйКонтент.Headers.ContentType = Врап.СоздатьОбъект("System.Net.Http.Headers.MediaTypeHeaderValue","application/octet-stream");
                Контент.Add(ФайловыйКонтент);

                 // Вариант отправки двоичных данных из файла но более краткий
				 ПотокФайла2 =Врап.ПолучитьТип("System.IO.File").OpenRead(ИмяФайла);
                 ФайловыйКонтент2 =Врап.СоздатьОбъект("System.Net.Http.StreamContent",ПотокФайла2);
				 Контент.Add(ФайловыйКонтент2,"attachment","TestXml");

                requestUri = "api/values/SendFiles";

                Результат = Клиент.PostAsync(requestUri, Контент).Result;
                стр = Результат.Content.ReadAsStringAsync().Result;
				
				Сообщить(стр);
				ЗакрытьРесурс(Клиент);
				ЗакрытьРесурс(Контент);
				ЗакрытьРесурс(ПотокФайла);
// Вот как выглядит отправляемый запрос				
//POST http://localhost:40320/api/values/SendFiles HTTP/1.1
//Content-Type: multipart/form-data; boundary="9f2d525a-7383-46ab-8fc7-419d73486c02"
//Host: localhost:40320
//Content-Length: 811
//Expect: 100-continue
//Connection: Keep-Alive

//--9f2d525a-7383-46ab-8fc7-419d73486c02
//Content-Type: text/plain; charset=utf-8
//Content-Disposition: form-data; name=Name

//name
//--9f2d525a-7383-46ab-8fc7-419d73486c02
//Content-Type: text/plain; charset=utf-8
//Content-Disposition: form-data; name=id

//id
//--9f2d525a-7383-46ab-8fc7-419d73486c02
//Content-Disposition: form-data; filename="=?utf-8?B?0J/RgNC+0YHRgtC+0KHRgtGA0L7QutCw?="; name=attachment
//Content-Type: text/plain

//Тестовая строка
//--9f2d525a-7383-46ab-8fc7-419d73486c02
//Content-Disposition: form-data; filename="=?utf-8?B?0KLQtdGB0YJYTUw=?="
//Content-Type: application/octet-stream

//12345
//--9f2d525a-7383-46ab-8fc7-419d73486c02
//Content-Disposition: form-data; name=attachment; filename=TestXml; filename*=utf-8''TestXml

//12345
//--9f2d525a-7383-46ab-8fc7-419d73486c02--

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


Запрос достаточно просто отправить. Вот как это приходится делать на чистом 1С Передача файлов и данных на веб-сервер средствами 1С:Предприятие 8.X методом POST

multipart/form-data

Стоит отметить использование 

handler.AutomaticDecompression=Врап.OR(DecompressionMethods.GZip,DecompressionMethods.Deflate);
который позволяет хорошо сжимать HTML странцы. Например
uriSources ="https://msdn.microsoft.com/en-us/library/system.net.decompressionmethods(v=vs.110).aspx";

    handler = врап.СоздатьОбъект(HttpClientHandler);
    handler.AutomaticDecompression=Врап.OR(DecompressionMethods.GZip,DecompressionMethods.Deflate) ;
  
 Клиент=Врап.СоздатьОбъект(HttpClient,handler);
Стр=Клиент.GetStringAsync(uriSources).Result;
 

Сжимает трафик в 5 раз.

Content-Length: 17129 упакованной, против 87 624 неупакованной

К сожалению, объем получился большим. Поэтому  продолжение использования HTTPClient и парсинг сайтов выделю в отдельную статью. Так будет проще разбираться.

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Жолтокнижниг 254 10.03.16 19:10 Сейчас в теме
(0) Я не нашел, какие требования к Framework?
2. Serginio 900 10.03.16 22:53 Сейчас в теме
16. Serginio 900 28.08.17 15:31 Сейчас в теме
(1) Ты можешь смотреть IsFaulted в ПриОкончанииВыполнения к которой подключаешься

Выполнитель=Врап.ПолучитьАсинхронныйВыполнитель();
ДобавитьОбработчик Выполнитель.ПриОкончанииВыполненияЗадачи, ПриОкончанииВыполнения;




Процедура ПриОкончанииВыполнения(Задача,ДанныеКЗадаче)

    // Обязательно нужно отлавливать ошибку в 1С
    // Иначе она передается в .Net где обрабатывается там
    Попытка
Так как задача может завершиться с ошибкой
Мы должны проверить, и если ошибка нужно предпринять какие то действия
        Если (Задача.IsFaulted) Тогда  // Ошибка выполнения
3. bonv 1311 07.04.16 09:28 Сейчас в теме
(0) Перед публикацией могли хотя бы отформатировать код (Alt+Shift+F)
It-developer; +1 Ответить
4. Serginio 900 07.04.16 12:15 Сейчас в теме
(3) bonv,
Форматировал. Только вот вставка в редактор и редактирование на этом сайте не совсем тривиальная задача
5. Гость 04.07.16 22:19
Спасибо за труды, о великий!
6. Serginio 900 04.07.16 22:28 Сейчас в теме
Спасибо за оценку трудов моих скромных.
7. Serginio 900 25.11.16 12:34 Сейчас в теме
Добавлю удобную объектную надстройку к Retst Api Refit: The automatic type-safe REST library for .NET Core, Xamarin and .NET

Вкратце можно описать интерфейс

public interface IGitHubApi
{
    [Get("/users/{user}")]
    Task<User> GetUser(string user);
}


И использовать

var gitHubApi = RestService.For<IGitHubApi>("https://api.github.com");

var octocat = await gitHubApi.GetUser("octocat");
8. Arxxximed 9 23.08.17 12:28 Сейчас в теме
У меня не получилось провести тест асинхронных httpзапросов на сервере. Это работать будет только на клиенте?
Прикрепленные файлы:
9. Serginio 900 23.08.17 19:13 Сейчас в теме
Это работает только на клиенте, так как идет привязка к событиям, а на сервере нужно ждать когда событие придет

Вся беда в том, что на сервере нельзя сделать
ДобавитьОбработчик Выполнитель.ПриОкончанииВыполненияЗадачи, ПриОкончанииВыполнения

И ОбработкаВнешнегоСобытия.
Поэтому асинхронные только на клиенте.
Arxxximed; +1 Ответить
10. Arxxximed 9 27.08.17 02:08 Сейчас в теме
Извините, возможно плохо искал. А как получить изображение через Стр=Клиент.GetStringAsync("GetHeaders").Result; как двоичные данные?
Допустим во втроенном HTTPОтвет Если метод ПолучитьТелоКакДвоичныеДанные

Или есть другой метод получения?

Это в идеале,
Ну или хотябы как записывать
11. Arxxximed 9 27.08.17 11:34 Сейчас в теме
Спасибо, методом проб и ошибок нашел одно из решений которое в вдругой ветке предоставили

UTF8=Врап.ПолучитьТип("System.Text.Encoding").GetEncoding(1251);
Данные=Клиент.GetByteArrayAsync("http://oursite.ru/data/2016/08/14/1237073852/7427903.jpg").Result;
output = UTF8.GetString(Данные);
двДанные  = ПолучитьДвоичныеДанныеИзСтроки(output,КодировкаТекста.ANSI,);
двДанные.Записать("B:\ПробаУдалить\ТестовоеИзображение.jpg"); ///Можно и записать если нужно
12. Arxxximed 9 27.08.17 11:37 Сейчас в теме
Если есть Другие более "правильные" варианты подскажите пожалуйста. Вообще не дотнет разработчик
13. Serginio 900 28.08.17 13:20 Сейчас в теме
Ну в Данные ты получаешь массив байтов.
Просто
File=Врап.ПолучитьТип("System.IO.File");
File.WriteAllBytes("B:\ПробаУдалить\ТестовоеИзображение.jpg",Данные);
14. Arxxximed 9 28.08.17 15:10 Сейчас в теме
Сергей, спасибо за ответ. Только я имел ввиду Как из запроса получить двоичные данные как объект 1С , вот нашел такое решение. Можно конечно попробовать и по другому
15. Arxxximed 9 28.08.17 15:16 Сейчас в теме
Так же все таки интересуют вопрос ошибок. У меня сложилась ситуация, что когда запрос возвращает ошибку 404 возникает исключительная ситуация в .Net.
Т.е. я не могу обработать task через wait() или waitall(). Не знаю как правильно решить данный момент. Пока сделал что жду в цикле возвращение True хотя бы одного из свойств;
Задача.IsCompleted;
Задача.IsCanceled;
Задача.IsFaulted;

Хотя это немного наверное не правильно...
17. Arxxximed 9 28.08.17 16:17 Сейчас в теме
Нет, я тут не пользуюсь Асинхронным выполнителем, посмотрел что для моей задачи это немного "Неудобно". я просто создаю массив заданий. Причем массив как объект 1С. И когда нужно прохожусь по этому массиву.
Все равно процедура ПриОкончанииВыполнения начнет выполнятся только после завершения формирующей процедуры. Насколько я правильно понимаю
18. Serginio 900 28.08.17 19:11 Сейчас в теме
Ну можно по аналогии с https://habrahabr.ru/post/307360/
Вызывать Task.WaitAny(массивЗадач);



ПриОкончанииВыполнения будет вызываться после завершения Задачи.

 Клиент=Врап.СоздатьОбъект(HttpClient);
    Задача=Клиент.GetStringAsync("https://msdn.microsoft.com/ru-ru/library/hh551745(v=vs.118).aspx");
    Выполнитель.Выполнить(задача,ТекущаяДата());

// Вот после этого кода, после завершении Задача
19. Arxxximed 9 29.08.17 12:47 Сейчас в теме
Немного проверил работу асинхронного выполнителя. Немного не вижу в нем смысла.
Дело в том, что если мы в Процедуре А() создаем выполнителю множество задач, то результат задач в процедуре-Обработчике мы сможем получить Только!!! После выполнения всей процедуры А. Кроме случаев Когда 1С сама не вызывает "асинхорнные" процедуры , например Вопрос().

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

Единственное что дает Выполнитель - это гарантированное выполнение задачи (task), но существенно ухудшает читаемость кода.

Но на выполнение можно сделать проверку в коде 1С циклом как я писал выше
функция ожидания выполнения


По поводу WaitAny , не проверил, но думаю дело будет обстоять так же: Если задача из массива задач будет выполнена с ошибкой ( например возврват 404) , то будет вызвано исключение .Net , которое в 1С не отловишь

Тема очень хороша, спасибо.
20. Serginio 900 29.08.17 14:46 Сейчас в теме
Ну а ты создавай в Процедуре А только задачи, на это уходит миллисекунды.
А вот время для получения результата уже могут быть секунды.

Нет в данном случае возвращается Task и у него можно проверить IsFaulted
21. mar82 15.07.19 10:50 Сейчас в теме
Извиняюсь за вопрос, но на Win 10 x64 получаю стабильно ошибку "Неверное имя объекта" на первой строке Врап = Новый COMОбъект

Нужно ли что-то особенное сделать для Win x64?

Спасибо
22. Serginio 900 15.07.19 12:26 Сейчас в теме
Оставьте свое сообщение

См. также

Аналог PIVOT в запросе 1С (как выполнить транспонирование таблицы в запросе 1С) Промо

Запросы v8 Бесплатно (free)

В статье показывается простой метод реализации аналога оператора PIVOT в запросе 1С без использования соединений.

12.12.2020    6705    Eugen-S    24    

Порядковый номер в запросе. Нумерация строк в системе 1С

Запросы v8 1cv8.cf Бесплатно (free)

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

02.08.2022    533    Koder_Line    10    

Экспертный взгляд на оптимизацию производительности на примере исправления и декомпозиции запроса

HighLoad оптимизация Технологический журнал Мониторинг Запросы v8 ERP2 УТ11 КА2 Бесплатно (free)

Еще один интересный пример оптимизации производительности ERP. Описываем решение проблемы подробно по шагам.

20.07.2022    2599    ivanov660    17    

Обход по группировкам в запросе, соединение таблиц, параметры в запросе, выгрузка прайс-листа в Excel, PDF, Docx, TXT

Запросы Файловые протоколы обмена (TXT, XML, DBF), FTP v8 1cv8.cf Россия Бесплатно (free)

В помощь начинающим программистам. Использую обработку из предыдущей моей публикации для разработки выгрузки Прайс-листа в Excel, PDF, Docx, TXT. Рассмотрю, как работает обход результата запроса ПоГруппировкам (релиз платформы 1С:Предприятие 8.3 (8.3.20.1674), самописная конфигурация).

18.07.2022    776    Pproksima    2    

Как сделать запрос на изменение данных Промо

Запросы v8 v8::Запросы 1cv8.cf Бесплатно (free)

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    40340    m-rv    23    

Экспертный кейс. История расследования одного небыстрого закрытия месяца в 1C:ERP. Пример неочевидных путей расследования в виде детективной истории

HighLoad оптимизация Механизмы платформы 1С Запросы v8 ERP2 Бесплатно (free)

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

11.07.2022    3726    it-expertise    27    

Кратность в Юанях (CNY) 10 и 1

Запросы v8 1cv8.cf Бесплатно (free)

Обратите внимание на обмены данными с Юанями. Кратность там меняется между 10 и 1, в зависимости от значения курса > 10 или < 10. Т.е. НЕ ВСЕГДА равна 1. А многие разработчики (в том числе и я) грешат, ставя Кратность = 1 по умолчанию в обменах и выгрузках. P.S. Идём на Восток, становимся хитрее.

10.06.2022    4083    sapervodichka    12    

Экспертный кейс. Расследование фатального замедления времени расчета себестоимости в 1С:ERP 2

HighLoad оптимизация Механизмы типовых конфигураций Запросы v8 ERP2 Бесплатно (free)

При выполнении нагрузочного тестирования информационной системы на базе 1С:ERP для одного из клиентов с целью оценки возможности миграции системы на PostgreSQL и Astra Linux мы столкнулись с неприемлемым увеличением времени выполнения расчета себестоимости. Строго говоря, сценарий тестирования закрытия месяца не был выполнен вообще – он не укладывался в таймаут выполнения теста, 24 часа. По прошествии 18 часов всё ещё шло выполнение операции «Распределение затрат и расчет себестоимости». Более 16 часов выполнялся подэтап “Расчет партий и себестоимости. Этап. Расчет себестоимости: РассчитатьСтоимость”. Всё это время выполнялся запрос, который в текущей инфраструктуре клиента (СУБД MS SQL Server) выполняется чуть более 3 минут на аналогичных данных.

25.03.2022    3829    it-expertise    92    

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

Разработка внешних компонент v7.7 v8 1cv8.cf 1cv7.md Абонемент ($m)

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

1 стартмани

28.11.2013    99424    307    Serginio    80    

Экспертный кейс. Расследование деградации производительности системы. Проведение документа “Поступление товаров и услуг” (1С:ERP 2)

Механизмы платформы 1С Запросы HighLoad оптимизация v8 ERP2 Бесплатно (free)

В ходе проведения нагрузочного тестирования одним из наших клиентов была выявлена сильная деградация производительности системы в целом и, в частности, выполнения ключевой операции “Проведение документа поступление товаров и услуг” в течение выполнения теста. Согласно данным подсистемы БСП “Оценка производительности”, время выполнения ключевой операции “Проведение документа поступление товаров и услуг” возрастало в процессе тестирования с 15-20 секунд в начале тестирования до 150-200 секунд в его финале.

02.03.2022    3160    it-expertise    47    

Задача по 1С - в базе данных есть таблица движения товара, пишем запрос для определения среднего значения остатка товара

Запросы v8 v8::Запросы Бесплатно (free)

В базе данных есть таблица движения товара, плюс означает, что товар пришел на склад, минус означает, что товар выбыл со склада: Необходимо написать запрос на 1С или SQL (по желанию), который вернет среднее значение остатка товара за январь 2021 (с 1 по 31). В результате должно получиться ProdID 1 = 1.58 ProdID 2 = 0.77

01.03.2022    1160    Greamdevil    0    

Исправляем ошибку расчета дней компенсации при увольнении в ЗУП 2.1 для Украины

Запросы Адаптация типовых решений v8 v8::СПР 1cv8.cf Украина БУ Бесплатно (free)

При определенных обстоятельствах стандартный механизм расчета дней компенсации отпускных при увольнении не срабатывает. Рассмотрим, почему и как исправить.

14.02.2022    468    SnorkL1    0    

.Net в 1С. На примере использования HTTPClient, AngleSharp. Удобный парсинг сайтов с помощью библиотеки AngleSharp, в том числе с авторизацией аля JQuery с использованием CSS селекторов. Динамическая компиляция Промо

WEB v7.7 v8 Бесплатно (free)

Часто приходится парсить сайты, в том числе с авторизацией, перескакивая со страницы на страницу по ссылкам. Тот, кто занимался вэб программированием, знает, как удобно использовать JQuery и CSS селекторы. На .Net написана очень удобная библиотека AngleSharp. Я покажу, как с её помощью можно значительно облегчить себе труд.

10.03.2016    66061    Serginio    33    

Генерация простых чисел в запросе (SQL) и сравнение производительности

Запросы v8 Бесплатно (free)

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

09.01.2022    950    AtamanovYS    0    

Заметки по SQL 4: Преобразование в запросе строки в дату одним выражением

Запросы v8 Россия Бесплатно (free)

На "Инфостарте" есть несколько статей, описывающих преобразование строки в дату. Описанное в них преобразование осуществляется в несколько запросов и имеет сложные для понимания выражения. В статье описано относительно простое выражение в запросе, преобразующее строку в дату.

10.12.2021    1125    IVC_goal    17    

Готовые механизмы 1С: ЗУП, представления

Механизмы типовых конфигураций Запросы v8 v8::СПР ЗУП3.x БУ Бесплатно (free)

Здесь будет храниться архив запросов, которые могут помочь разработчику правильно строить отчеты и получать данные в 1С: ЗУП. Статью буду периодически дополнять.

03.11.2021    4070    Margo462    19    

Выразить число как строку и дату как строку в запросе Промо

Запросы v8 1cv8.cf Бесплатно (free)

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

22.02.2015    140831    ildarovich    77    

Работа с SQL. Шаблон общего модуля

Запросы v8 Бесплатно (free)

Шаблон общего модуля для работы с MS/PG SQL из 1С.

21.10.2021    3032    mrChOP93    3    

Как читать чужой код? Часть 3. Разбор и доработка запросов

Запросы v8 1cv8.cf Бесплатно (free)

Во всех вакансиях есть требование - умение читать чужой код. Но ни на одних курсах специально этому не учат. Чтобы устранить это противоречие, пишу данную статью. Рассмотрю случаи, в которых нам необходимо разбирать чужой код, поймём, чей код мы пытаемся разобрать, зачем и, главное, как. В статье описан личный опыт длиною в 18 лет начиная с версии платформы 7.7. Статья будет большой, набираемся терпения). Статья содержит в себе описание сценариев разбора кода, т.е. набор шагов. В статье не получится показать это на практике. Для этого планирую сделать онлайн или оффлайн курс, где на примерах будет показан разбор незнакомого кода. Статья разбита на 4 публикации для удобства изучения.

20.09.2021    3216    biimmap    32    

Еще один способ вычисления медианы запросом 1С

Запросы v8 Платформа 1C v8.2 Бесплатно (free)

Вниманию сообщества предлагается еще один способ расчета медианы числового ряда одним пакетным запросом 1С.

09.08.2021    1770    direktorSan    0    

Программные перечисления, ч.2: приемы кэширования при разработке Промо

Универсальные функции Механизмы платформы 1С Запросы v8 Бесплатно (free)

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

30.10.2017    28825    unichkin    18    

Временные таблицы запроса

Запросы v8 8.3.14 1cv8.cf Бесплатно (free)

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

30.07.2021    1937    KonanSS    3    

Пример использования объекта "Схема запроса" в реальном проекте

Запросы v8 Бесплатно (free)

Разберём решение задачи реального проекта: контекст, логика решения, само решение. Рассмотрим возможности объекта СхемаЗапроса.

03.06.2021    4820    maraton1185    32    

Последний раз про срез последних (на каждую дату в запросе)

Запросы v8 v8::Запросы Бесплатно (free)

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

15.02.2021    20103    randomus    47    

Расчет хэш-функции в запросе Промо

Запросы v8 1cv8.cf Бесплатно (free)

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

20.03.2015    57243    ildarovich    39    

Разбиение запросом записей периодического регистра сведений по интервалам

Запросы v8 1cv8.cf Бесплатно (free)

Доброго времени суток, коллеги. У меня возникла задача - разбить запросом записи периодического регистра сведений по интервалам. Возможно, кому-то будет интересно решение подобной задачи. Покажу решение на примере регистра "История изменения уровней", в моем случае в нем можно для каждого элемента из справочника "Должности" задать уровень на любой период. Для примера использовал каркасную конфигурацию.   

22.12.2020    1546    Andrei_Ivanov    3    

Программное создание корректировочного счета-фактуры выданного в УПП 1.3

Математика и алгоритмы Механизмы типовых конфигураций Запросы v8 УПП1 Россия БУ НДС Бесплатно (free)

Данный функционал можно использовать, например, в процессе оформления возвратов от поставщика (корректировка реализации по согласованию сторон) при автоматическом создании корректировок реализации по документам поставщика, он позволяет массово создать корректировочные счета-фактуры в УПП 1.3. При создании документа из первичного счета-фактуры выданного в новый корректировочный счет-фактуру выданный копируются значения свойств.

17.12.2020    919    ksnik    0    

Имитация sql выражения LIMIT в запросе 1С

Запросы v8 Бесплатно (free)

Всем известно, что в SQL синтаксисе есть выражение LIMIT. Очень полезное выражение для постраничной навигации. Но его нет в запросах 1С. Кто-то может сказать, что есть ПЕРВЫЕ, но ПЕРВЫЕ не подходит для постраничной навигации. Рассмотрим в статье, как можно имитировать LIMIT в запросах 1С.

08.12.2020    2469    opx    50    

Сложные запросы в динамическом списке или как не надо писать запросы для них Промо

Запросы v8 Бесплатно (free)

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

24.07.2015    78911    Aleksey.Bochkov    39    

Итоги по объединенной совокупности группировок в запросе

Запросы v8 Бесплатно (free)

Способ формирования итогов в запросе по совокупности группировок, объединенных в единый набор, при помощи функции АВТОНОМЕРЗАПИСИ.

18.11.2020    7804    antonivan    21    

Определение количества лет между двумя датами в запросе

Запросы v8 v8::Запросы ERP2 БП3.0 УТ11 ЗУП3.x Бесплатно (free)

Фрагмент запроса для определения количества лет между двумя датами для решения задачи простых процентов.

29.10.2020    1807    antonivan    5    

Кадровые данные сотрудников ЗУП 3.1 в запросе

Запросы v8 v8::СПР ЗУП3.x Россия БУ Бесплатно (free)

Получение кадровый данных сотрудников в запросе при помощи функции КадровыйУчет.СоздатьНаДатуВТКадровыеДанныеСотрудников().

26.10.2020    5278    Danila7Zz    4    

Распределение оплаты по товарам Промо

Запросы v8 1cv8.cf Бесплатно (free)

Учебная задача. Оплата приходит по заказу. Требуется запросом распределить её по товарам. Практическая задача была сложнее. Упростил специально для иллюстрации. Сначала собираем в одну таблицу заказы и товары. Затем ОБЪЕДИНИТЬ ВСЕ с оплатами. Потом намазываем оплату на товар.

04.08.2014    19846    Трактор    4    

Вычислить РАЗНОСТЬДАТ в рабочих днях

Запросы v8::Запросы v8::СКД ERP2 БП3.0 УТ11 ЗУП3.x Бесплатно (free)

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

20.10.2020    5063    antonivan    18    

Учимся создавать http сервис (часть четвертая). Изучение метода POST http запроса (передача текстовых данных)

Запросы v8 Бесплатно (free)

Пошаговое руководство по созданию http сервисов (часть четвертая). Изучение метода POST http запроса.

11.10.2020    23174    hpi    25    

Улучшенный конструктор запроса тонкого клиента (Infostart Toolkit)

Запросы v8 1cv8.cf Бесплатно (free)

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

07.09.2020    7517    Evg-Lylyk    19    

Объектная модель запроса "Схема запроса" - теория и примеры использования Промо

Запросы v8 1cv8.cf Бесплатно (free)

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

12.10.2014    92002    ekaruk    85    

Меры центральной тенденции (вычисление среднего) в запросе 1С

Запросы v8 Бесплатно (free)

Меры центральной тенденции (вычисление среднего) в запросе 1С: * Среднее арифметическое * Среднее гармоническое * Среднее квадратическое * Среднее усеченное * Среднее винсоризованное * Медиана * Мода

31.08.2020    1564    parcan    6    

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

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

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

12.05.2020    13522    YPermitin    30    

Поблочная обработка таблицы. Обзор решений

Универсальные функции Запросы СКД v8 Бесплатно (free)

8 способов реализации повседневной актуальной задачи, готовый код

25.02.2020    2869    Yashazz    21    

Самоучитель языка запросов 1С. Промо

Запросы v8 v8::Запросы Бесплатно (free)

Сервис для изучения запросов 1С: "Консоль изучения запросов 1С:Предприятие 8". Теперь и с конструктором запросов!

07.05.2013    119133    bpc222    327    

Нечёткий поиск "ПОДОБНО". Нюансы

Запросы v8 Бесплатно (free)

Заметки о "ПОДОБНО" в языке запросов

23.02.2020    42075    Yashazz    31    

[Шпаргалка] Запрос остатков по LIFO FIFO партиям приобретения поступления товаров

Запросы v8 v8::Запросы 1cv8.cf Бесплатно (free)

Запросом получаем остатки по партиям LIFO или FIFO.

31.01.2020    9133    rpgshnik    14    

Нумерация строк в запросе методами платформы

Запросы v8::Запросы 1cv8.cf Казахстан Бесплатно (free)

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

09.01.2020    36408    user602678_maxipunchik    47    

Работаем с датами в запросе Промо

Запросы v8 1cv8.cf Россия Бесплатно (free)

Понадобилось в запросе выполнить некоторые операции с датами: - посчитать дату оплаты в банковских днях; - собирать строки, в которые должны были входить даты, точнее строковые представления дат в формате "ДФ=dd.MM.yyyy". Вот что из этого получилось.

30.03.2010    65522    alexk-is    39    

Оптимизатор запроса. Часть первая

Запросы v8 1cv8.cf Бесплатно (free)

Работа оптимизатора запроса является ключевой для обработки данных. Знание того, как оптимизатор выстраивает свою стратегию, отлично помогает при построении запросов.

23.12.2019    12663    darkdan77    21    

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

Запросы v8 Бесплатно (free)

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

22.11.2019    12244    relines    7    

Как передать IP адрес, который вызвал HTTP запрос в 1C (для веб-сервера Apache)

Запросы v8 Бесплатно (free)

Столкнулся с задачей получения IP адреса, который вызывает http сервис 1С. Итак, решение:

22.11.2019    15382    Sibars    19    

Как удалить из выборки дубли по двум полям. Промо

Запросы v8 Россия Бесплатно (free)

Как удалить из выборки дубли по двум полям. Искал ответ в сети, ничего найти не смог, пришлось делать самому, возможно кому – то это пригодится.

15.11.2013    21041    Petr54-ru    22    

Группировка данных в запросе (СГРУППИРОВАТЬ ПО [ГРУППИРУЮЩИМ НАБОРАМ], ИТОГИ ПО [ОБЩИЕ])

Запросы v8 v8::Запросы 1cv8.cf Бесплатно (free)

Для группировки данных в языке запросов 1С существуют конструкции СГРУППИРОВАТЬ ПО [ГРУППИРУЮЩИМ НАБОРАМ], ИТОГИ ПО [ОБЩИЕ]. Для новичков назначение этих конструкций не всегда очевидно, попробуем разобраться на примерах, для чего предназначена каждая из них и в чем отличие от аналогичных конструкций в языке SQL.

19.09.2019    53286    sertak    17    

Количество NULL в запросе

Запросы v8 v8::Запросы Россия Бесплатно (free)

При определении количества элементов в виде "NULL" в результирующей таблице запроса нам возвращается значение "0".

17.09.2019    4761    toxilamer    18    

Срез на даты за период. Шаблон запроса

Запросы v8 1cv8.cf Бесплатно (free)

Один запрос, который довольно часто пригождался.

05.09.2019    13180    json    42