Многопоточная обработка данных на примере перепроведения документов

Публикация № 1123772 17.09.19

Пользовательские инструменты - Обработка документов

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

Дальнейшее развитие темы фоновой обработки данных - проведение документов в потоках. Настройка параметров и запуск основного процесса (менеджера потоков). Разбивка документов для проведения на не связанные друг с другом наборы и запуск дополнительных фоновых заданий для отдельных потоков. Отслеживание выполнения каждого потока в родительском сеансе.

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

 

Общее описание механизма

Процесс начинается с запуска основного фонового задания (такой упрощенный менеджер потоков), в которое передаются все необходимые параметры. Далее формируется выборка объектов для обработки (документов). Выполняется обход выборки и выбирается первая порция документов (согласно переданному параметру «КоличествоДокументовВПорции»).

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

Далее выполняется запуск необходимого количества потоков для обработки каждого набора документов (согласно переданному параметру «КоличествоПотоков»).

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

После завершения выполнения всех фоновых заданий выбирается следующая порция документов, и так далее, пока не будут обработаны все документы.   

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

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

 

Сразу о минусах моей разбивки

  1. Разбивка выполняется по данным регистра «Товары организаций», следовательно, она актуальна только для конфигураций из семейства ЕРП (ЕРП, КА, УТ).
  2. В моем примере документы обязательно должны быть проведены, так как выборка формируется по данным регистра «Товары организаций» и используются элементы справочника «КлючиАналитикиУчетаНоменклатуры». Если исходные документы не проведены, выборку необходимо формировать другим способом.
  3. Учитываются только возможное пересечение товарного состава. Можно учитывать еще и пересечения по партнерам и договорам для документов закупки и реализации.
  4. Для определения зависимостей я использую элементы справочника «КлючиАналитикиУчетаНоменклатуры». В моем примере не ведется учет по сериям и обособленный учет товаров. Поэтому ключи аналитики как раз и являются объектами разделения по указанным выше измерениям. Если учет по сериям или обособленный учет присутствуют, ключи аналитики получаются с более детальной разбивкой, и опираться на них не совсем правильно. Регистр накопления «Свободные остатки», имеет среди измерений только: номенклатура, характеристика и склад. Если в разные наборы попадут документы с разными ключами аналитики, но с одинаковыми наборами измерений: номенклатура, характеристика и склад, будут возможны пересечения.

 

Реализация

Код модуля формы я приводить не будут, концептуально он не отличается от кода модуля формы из предыдущей статьи. В форме задается период и значения параметров: КоличествоДокументовВПорции, КоличествоПотоков. Также динамически создаются прогрессы выполнения отдельных потоков согласно параметру «КоличествоПотоков», для более удобного отслеживания выполнения. Прогрессы отображают состояния выполнения потоков и обрабатываемый документ в текущей порции. По состоянию общего (первого) прогресса можно судить об общем проценте выполнения задачи:

 

Процедуры модуля обработки

Не буду приводить код процедур: «СведенияОВнешнейОбработке»и «ВыполнитьКоманду». В них ничего особенного нет. Отмечу только, что относительно предыдущего варианта появилась дополнительная команда «ВыполнениеПотокаВФоне». Она необходимо для запуска отдельных потоков из основного фонового задания (менеджера потоков).

 

Точка входа основного фонового задания, это процедура «ВыполнитьПерепроведениеВПотоках»

Процедура ВыполнитьПерепроведениеВПотоках(ДатаНачала, ДатаОкончания, КоличествоПотоков, КоличествоДокументовВПорции)
	
    Запрос = новый Запрос("ВЫБРАТЬ
	|	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ТоварыОрганизаций.Регистратор) КАК ВсегоДокументов
	|ИЗ
	|	РегистрНакопления.ТоварыОрганизаций КАК ТоварыОрганизаций
	|ГДЕ
	|	ТоварыОрганизаций.Период >= &ДатаНачала
	|	И ТоварыОрганизаций.Период <= &ДатаОкончания
	|	И НЕ ТоварыОрганизаций.Регистратор ССЫЛКА Документ.ПередачаТоваровМеждуОрганизациями
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ТоварыОрганизаций.АналитикаУчетаНоменклатуры КАК Аналитика,
	|	ТоварыОрганизаций.Регистратор КАК Документ,
	|	ТоварыОрганизаций.Период КАК Период
	|ИЗ
	|	РегистрНакопления.ТоварыОрганизаций КАК ТоварыОрганизаций
	|ГДЕ
	|	ТоварыОрганизаций.Период >= &ДатаНачала
	|	И ТоварыОрганизаций.Период <= &ДатаОкончания
	|	И НЕ ТоварыОрганизаций.Регистратор ССЫЛКА Документ.ПередачаТоваровМеждуОрганизациями
	|
	|СГРУППИРОВАТЬ ПО
	|	ТоварыОрганизаций.АналитикаУчетаНоменклатуры,
	|	ТоварыОрганизаций.Регистратор,
	|	ТоварыОрганизаций.Период
	| УПОРЯДОЧИТЬ ПО
	|  Период,
	|  Документ");
	
    Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(ДатаНачала));
    Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ДатаОкончания));

    Результат = Запрос.ВыполнитьПакет();
    Выборка = Результат[0].Выбрать();
    Выборка.Следующий();
    ВсегоДокументов = Выборка.ВсегоДокументов;
	
    ТЗСвязи = Результат[1].Выгрузить();

    //Новая таблица для данных текущей порции	
    ТЗСвязиВПорции = новый ТаблицаЗначений;
    ТЗСвязиВПорции.Колонки.Добавить("Аналитика", новый ОписаниеТипов("СправочникСсылка.КлючиАналитикиУчетаНоменклатуры"));
    ТЗСвязиВПорции.Колонки.Добавить("Документ");	
    ТЗСвязиВПорции.Колонки.Добавить("Период", новый ОписаниеТипов("Дата"));	
    ТЗСвязиВПорции.Колонки.Добавить("ЭтоПриход", новый ОписаниеТипов("ВидДвиженияНакопления"));	

    ДокументовВТекПорции = 0;
    ТекущийДокумент = Неопределено;
    НомерПорции = 0;

    Для каждого СтрокаСвязи Из ТЗСвязи Цикл
        
        Если ТекущийДокумент <> СтрокаСвязи.Документ Тогда
           
            //Если количество документов равно размеру порции, выполняем обработку данных
            Если ДокументовВТекПорции = КоличествоДокументовВПорции Тогда
                НомерПорции = НомерПорции + 1;
                ОбработатьПорциюДокументов(ТЗСвязиВПорции, КоличествоПотоков, ДокументовВТекПорции);
                ДлительныеОперации.СообщитьПрогресс(Формат(КоличествоДокументовВПорции*НомерПорции/ВсегоДокументов*100, "ЧЦ=3; ЧДЦ="), "Выполняется проведение документов, порция: "+Строка(НомерПорции+1));
                ТЗСвязиВПорции.Очистить();
                ДокументовВТекПорции = 0;
                ТекущийДокумент = Неопределено;
            КонецЕсли;
				
            ТекущийДокумент = СтрокаСвязи.Документ;
            ДокументовВТекПорции = ДокументовВТекПорции + 1;
        КонецЕсли;	
        
        НоваяСтрока = ТЗСвязиВПорции.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаСвязи);

    КонецЦикла;

    //Обработка последней порции документов
    ОбработатьПорциюДокументов(ТЗСвязиВПорции, КоличествоПотоков, ДокументовВТекПорции);
	
КонецПроцедуры

В процедуре формируется выборка из регистра «Товары организаций» в разрезе регистраторов и ключей аналитики номенклатуры. Выполняется сортировка выборки по периоду и регистратору.  Далее происходит обход выборки и формирование новой таблицы значений «ТЗСвязиВПорции», в которую помещаются данные для текущей порции. Когда количество документов равняется параметру «КоличествоДокументовВПорции», вызывается процедура «ОбработатьПорциюДокументов». Затем обход продолжается и формируется следующая порция и так далее для всей исходной выборки.

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

Для каждого потока выполняется вызов функции «ПолучитьДокументыДляПотока». Полученные данные помещаются в структуру. Формируется массив структур данных для выполнения в потоках. В информационных целях формируется строка распределения документов по потокам и отправляется основному сеансу. После того, как сформированы все данные вызывается процедура «ЗапуститьВыполнениеВПотоках» для запуска фоновых заданий.

Функция ПолучитьДокументыДляПотока(ТЗСвязи, ЭтоПоследнийПоток, КоличествоДокументовВПотоке)
	
    СписокДокументов = новый ТаблицаЗначений;
    СписокДокументов.Колонки.Добавить("Документ");	
    СписокДокументов.Колонки.Добавить("Период", новый ОписаниеТипов("Дата"));

    //Для последнего потока выбираются все оставщиеся документы	
    Если ЭтоПоследнийПоток Тогда
        СписокДокументов = ТЗСвязи.Скопировать();
        СписокДокументов.Свернуть("Документ,Период");
        Возврат СписокДокументов;
    КонецЕсли;	
	         	
    НомерЦепочкиДокументв = 0;
	
    Пока ИСТИНА Цикл
        Если СписокДокументов.Количество() > КоличествоДокументовВПотоке 
                 ИЛИ НомерЦепочкиДокументв = 1 И СписокДокументов.Количество()/КоличествоДокументовВПотоке > 0.7 
                 ИЛИ НомерЦепочкиДокументв = 2 И СписокДокументов.Количество()/КоличествоДокументовВПотоке > 0.80
                 ИЛИ НомерЦепочкиДокументв = 3 И СписокДокументов.Количество()/КоличествоДокументовВПотоке > 0.85 
                 ИЛИ НомерЦепочкиДокументв = 4 И СписокДокументов.Количество()/КоличествоДокументовВПотоке > 0.90 
                 ИЛИ НомерЦепочкиДокументв >= 5 И СписокДокументов.Количество()/КоличествоДокументовВПотоке > 0.95 Тогда
            Прервать;
        КонецЕсли;
		
        Если ТЗСвязи.Количество() > 0 Тогда
            
            //Выборка первого документа
            ПервыйДокумент = ТЗСвязи[0].Документ;
            НоваяСтрока = СписокДокументов.Добавить();
            НоваяСтрока.Документ = ТЗСвязи[0].Документ;
            НоваяСтрока.Период = ТЗСвязи[0].Период;
            ТЗСвязи.Удалить(ТЗСвязи[0]);
            
            //Поиск аналитик по документу 
            СтрокиДокумента = ТЗСвязи.НайтиСтроки(новый Структура("Документ", ПервыйДокумент));
            РекурсивныйПоискДокументов(СтрокиДокумента, СписокДокументов, ТЗСвязи);
        Иначе
            Прервать;
        КонецЕсли;	
		
        НомерЦепочкиДокументв = НомерЦепочкиДокументв + 1;
    КонецЦикла;

    Возврат СписокДокументов;
	
КонецФункции	


Процедура РекурсивныйПоискДокументов(СтрокиДокумента, СписокДокументов, ТЗСвязи)

    МассивАналитик = новый СписокЗначений;
    
    Для Каждого СтрокаДокумента Из СтрокиДокумента Цикл
        МассивАналитик.Добавить(СтрокаДокумента.Аналитика, СтрокаДокумента.ЭтоПриход);
        ТЗСвязи.Удалить(СтрокаДокумента);
    КонецЦикла;

    //Обход всех аналитик и поиск документов с этими аналитиками	
    Для Каждого Аналитика Из МассивАналитик Цикл

        ДокументыПоАналитики = ТЗСвязи.НайтиСтроки(новый Структура("Аналитика", Аналитика.Значение));
        Если ДокументыПоАналитики.Количество() = 0 Тогда
            Продолжить;
        КонецЕсли;	
		
        НайденныйСписокДокументов = новый Массив;
        
        //Обход всех документов и добавление их в набор	
        Для Каждого ДокументПоАналитике Из ДокументыПоАналитики Цикл
            Если  СписокДокументов.Найти(ДокументПоАналитике.Документ, "Документ") = Неопределено Тогда
                НайденныйСписокДокументов.Добавить(ДокументПоАналитике.Документ); 
                НоваяСтрока = СписокДокументов.Добавить();
                ЗаполнитьЗначенияСвойств(НоваяСтрока, ДокументПоАналитике); 
            КонецЕсли;
            ТЗСвязи.Удалить(ДокументПоАналитике);
        КонецЦикла;	
	
        //Рекурсивный вызов поиска для каждого найденного документа	
        Для Каждого ДокументПоАналитике Из НайденныйСписокДокументов Цикл
            СтрокиДокумента = ТЗСвязи.НайтиСтроки(новый Структура("Документ", ДокументПоАналитике));
            Если СтрокиДокумента.Количество() > 0 Тогда 
                РекурсивныйПоискДокументов(СтрокиДокумента, СписокДокументов, ТЗСвязи);
            КонецЕсли;
        КонецЦикла;
	
    КонецЦикла;

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

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

Выбирается первый документ:

Документ записывается в список набора документов, строка удаляется из порции.

Выбираются аналитики учета по номенклатуре для выбранного документа:

Строки удаляются из порции.

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

Документы записываются в список набора документов, найденные строки удаляются из порции.

Для каждого документа опять выбираются все аналитики учета по номенклатуре:

Происходит рекурсивный вызов процедуры «РекурсивныйПоискДокументов», и так далее. В итоге из порции выбираются все связанные друг с другом документы.

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

Для последнего потока выбираются все оставшиеся документы.

Процедура ЗапуститьВыполнениеВПотоках(ДанныеДляПотоков)
	
    МассивИДЗаданий = новый Массив;
	
    //Запуск потоков на выполнение и формирование массива идентификаторов запущенных потоков
    Для Каждого ДанныеДляПотока ИЗ ДанныеДляПотоков Цикл
        ПараметрыПроцедуры = Новый Структура("ДополнительнаяОбработкаСсылка, ИдентификаторКоманды, СтруктураДанных");
        ПараметрыПроцедуры.ДополнительнаяОбработкаСсылка = ДополнительнаяОбработкаСсылка;
        ПараметрыПроцедуры.ИдентификаторКоманды          = "ВыполнениеПотокаВФоне";
        ПараметрыПроцедуры.СтруктураДанных               = ДанныеДляПотока;
		
        НастройкиЗапуска = ДлительныеОперации.ПараметрыВыполненияВФоне(Новый УникальныйИдентификатор);
        НастройкиЗапуска.НаименованиеФоновогоЗадания = ДанныеДляПотока.ИмяПотока;
        НастройкиЗапуска.ОжидатьЗавершение = 0;
        Поток = ДлительныеОперации.ВыполнитьВФоне("ДополнительныеОтчетыИОбработки.ВыполнитьКоманду", ПараметрыПроцедуры, НастройкиЗапуска);
        МассивИДЗаданий.Добавить(Поток.ИдентификаторЗадания);
    КонецЦикла;
	
    //Проверка выполнения созданных фоновых заданий и перенаправление сообщений из потоков основному сеансу
    Пока Истина Цикл
        ВсеЗаданияВыполнены = Истина;
        ТекущийПоток = 0;
        
        Для Каждого ИдентификаторЗадания ИЗ МассивИДЗаданий Цикл
            ТекущийПоток = ТекущийПоток + 1;
            СостояниеЗадания = ДлительныеОперации.ОперацияВыполнена(ИдентификаторЗадания,, Истина, Истина);
            ЗавершитьЗадание = Ложь;
            
            //Проверка и перенаправление сообщений
            Если ТипЗнч(СостояниеЗадания.Сообщения) = Тип("ФиксированныйМассив") Тогда
                Для Каждого СтрокаСообщения Из СостояниеЗадания.Сообщения Цикл 
                    Если СтрНачинаетсяС(СтрокаСообщения.Текст, "{") Тогда
                    Иначе			
                        Сообщить("Поток "+ТекущийПоток+": "+СтрокаСообщения.Текст);
                        Если Лев(СтрокаСообщения.Текст, 6) = "Ошибка" Тогда
                            ЗавершитьЗадание = Истина;
                        КонецЕсли;	
                    КонецЕсли;
                КонецЦикла;
            КонецЕсли;
	
            //Проверка и перенаправление прогресса				
            Если ТипЗнч(СостояниеЗадания.Прогресс) = Тип("Структура") Тогда
                Если СостояниеЗадания.Прогресс.Свойство("Процент") ИЛИ СостояниеЗадания.Прогресс.Свойство("Текст") Тогда
                    ПроцентВыполнения = 0;
                    ТекстВыполнения = "";
                    Если СостояниеЗадания.Прогресс.Свойство("Процент") Тогда
                        ПроцентВыполнения = СостояниеЗадания.Прогресс.Процент;
                    КонецЕсли;
                    Если СостояниеЗадания.Прогресс.Свойство("Текст") Тогда
                        ТекстВыполнения = СостояниеЗадания.Прогресс.Текст;
                    КонецЕсли;	
                    Сообщить("["+ТекущийПоток+"]"+ПроцентВыполнения+"_"+ТекстВыполнения);
                КонецЕсли;
            КонецЕсли;

            Если СостояниеЗадания.Статус = "Выполняется" Тогда
                ВсеЗаданияВыполнены = Ложь;
            КонецЕсли;
			
            Если ЗавершитьЗадание Тогда
                ДлительныеОперации.ОтменитьВыполнениеЗадания(ИдентификаторЗадания);
            КонецЕсли;
        КонецЦикла;	
		
        Если ВсеЗаданияВыполнены Тогда
            Прервать;
        КонецЕсли;	
    КонецЦикла;	
	
КонецПроцедуры

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

Далее в цикле выполняется обход всех сформированных фоновых заданий. Проверяется состояние задания, выбираются сформированные сообщения и прогресс выполнения. Все данные передаются в основной сеанс. После завершения работы всех фоновых заданий, процедура завершает работу и происходит выборка новой порции документов.

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

Функция ПерепровестиДокументы(ДокументыДляПроведения)
	
    ТекущийДокумент = 0;
    ВсегоДокументов = ДокументыДляПроведения.Количество();
    ДлительныеОперации.СообщитьПрогресс(0, "");
    
    Для каждого СтрокаТЗ Из ДокументыДляПроведения Цикл
        ДокументОбъект = СтрокаТЗ.Документ.ПолучитьОбъект();
        Попытка
            ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
        Исключение
            Сообщить("Ошибка проведения документа: " + СтрокаТЗ.Документ);
            Возврат Истина;
        КонецПопытки;
        ТекущийДокумент = ТекущийДокумент + 1;

        Если НЕ (ТекущийДокумент % 5) Тогда
            ДлительныеОперации.СообщитьПрогресс(Формат(ТекущийДокумент/ВсегоДокументов*100, "ЧЦ=3; ЧДЦ="), "Выполняется проведение документа: " + СтрокаТЗ.Документ);
        КонецЕсли;			
		
    КонецЦикла;
    
    ДлительныеОперации.СообщитьПрогресс(Формат(ТекущийДокумент/ВсегоДокументов*100, "ЧЦ=3; ЧДЦ="), "Выполняется проведение документа: " + СтрокаТЗ.Документ);
    Возврат Ложь;
	
КонецФункции  

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

Вот, собственно, и все основные механизмы. Обработка тестировалась на различных конфигурациях УТ 11.4 и ЕРП 2.4 на версии платформы 8.3.14.1630. В прикрепленных файлах внешняя обработка со всеми описанными механизмами.

Параметры: КоличествоПотоков и КоличествоДокументовВПорции необходимо подбирать экспериментально в зависимости от каждой конкретной базы и производительности сервера. Чем меньше порция, тем более ровную разбивку можно получить, но больше дополнительных затрат на создание фоновых заданий. Если в первый набор порции попадает больше трети всех документов, нет смысла разбивать порцию более, чем на три потока (все равно система будет ожидать выполнение первого потока).

Мне удавалось ускорить проведение в 2,5 раза при значении параметров:

  • КоличествоПотоков = 3
  • КоличествоДокументовВПорции = 50

 

Пишу на всякий случай. На файловых базах ничего работать не будет! Так как можно запустить одновременно только один дополнительный поток. Ну это наверно всем известно)).   

Ссылка на первую статью.

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

Спасибо за внимание, если есть вопросы или комментарии, пишите.

Всем, кто едет на конференцию INFOSTART EVENT 2019, желаю вынести как можно больше полезной информации. Ну и до встречи на конференции ))

Скачать файлы

Наименование Файл Версия Размер
Перепроведение документов в потоках

.epf 14,01Kb
38
.epf 14,01Kb 38 Скачать

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. VmvLer 17.09.19 17:16 Сейчас в теме
визуализация идей фоновых порций из закрытия месяца?

да, разбиение на "не связанные по движениям" порции самая важная идея.
думаю, на больших базах стабильное, хотя бы на 90%, решение найти не реально.
фоновые будут падать по блокировкам и пр.
dimkakopylow001; +1 Ответить
12. ids79 6856 19.09.19 17:31 Сейчас в теме
(1)Тут важен не размер базы, а разброс по номенклатуре и складам. Если в большинстве случаев используются разные товары или склады в разных документах, то и на большой базе будет нормальное распределение
2. nomad_irk 58 17.09.19 17:20 Сейчас в теме
Лично я пока не понимаю, зачем вообще заниматься ананперепроведением документов в свете использования РАУ различных вариаций или как оно сейчас там называется.......
Использование многопоточности - нужная штука, сам лично сделал формирование пакетов обмена таким способом, иначе очень уж медленно обмены происходили, особенно, если свершилось какое-то пакетное изменение данных, а сейчас - прям красота. :) Ессно прогрессов мне никаких отображать никому не надо.....
13. ids79 6856 19.09.19 17:34 Сейчас в теме
(2)Да, для обменов многопоточность - актуальная тема. Сейчас сам как раз занимаюсь реализацией обмена ED в многопоточном режиме. В данной статье перепроведение приведено просто как пример.
3. vik070777 271 17.09.19 17:57 Сейчас в теме
А можно прерывать выполнение отдельных потоков
4. nomad_irk 58 17.09.19 18:00 Сейчас в теме
(3)чисто теоретически можно. Для этого нужно знать GUID фонового процесса.
14. ids79 6856 19.09.19 17:37 Сейчас в теме
(3)Я ссылку привел в статье на менеджер потоков, там это реализовано. Как вариант можно передавать все идентификаторы отдельных потоков в родительский сеанс. Тогда можно будет отслеживать выполнение и закрывать.
vik070777; +1 Ответить
20. vik070777 271 19.09.19 22:29 Сейчас в теме
5. Rustig 1292 17.09.19 18:29 Сейчас в теме
(0)
Суть моей разбивки следующая. Не допускается попадание в разные наборы документов, которые создают движения по одним и тем же комбинациям измерений: номенклатура + характеристика + склад.


Есть объект метаданных Последовательность, для которой можно задать измерения Номенклатура, Харак-ка, Склад.
Платформа сама разобьет документы на непересекающиеся наборы.
15. ids79 6856 19.09.19 17:47 Сейчас в теме
(5)Да можно, но придется вносить изменения в типовую конфигурацию. Причем, если это разовая вещь, нужно будет убирать потом эти изменения. Это не удобно. Я использовал данный механизм для перепроведения документов с перезаполнением видов запасов. Для формирования корректных резервов по товарам организаций (необходимо для закрытия месяца, если часто отключается контроль остатков товаров организаций в течение работы). Вносить изменения в конфигурацию было нельзя.
6. aximo 1814 18.09.19 10:20 Сейчас в теме
Дмитрий, спасибо за статью! но как бороться с блокировками?

В большинстве случаев - используются документы "реализация, поступление, возвраты, формирование опзс, требования накладные" - они связаны мду собой....

и еще вопрос - почему использовалась 14-ая платформа? возможно ли реализовать что-то подобное на более низших версиях?
10. dimkakopylow001 7 18.09.19 14:55 Сейчас в теме
(6) Добавить измерения в последовательность
16. ids79 6856 19.09.19 17:51 Сейчас в теме
(6)По регистрам товаров как раз не должно быть блокировок с такой разбивкой. По регистрам расчетов, да могут быть, я писал об этом в статье.
Можно и на более ранних версиях, просто у маня 14-ая стоит )).
7. tolyan_ekb 196 18.09.19 10:36 Сейчас в теме
Можно этот механизм использовать при загрузке и проведении документов из сторонней БД?
17. ids79 6856 19.09.19 18:29 Сейчас в теме
(7)Можно конечно. Но в этом случае, механизм получения информации для проведения нужно изменить, так как документы не проведены будут.
8. maxx 945 18.09.19 11:23 Сейчас в теме
Идея интересная.

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

Что касается пула документов , то переводя на язык 1С:Бухгалтерии, то интересно в потоках проводить документы:
- отдельно по организациям
- отдельно по контрагентам

для этого больше используются журналы документов, критерии отбора, или запросы по этим признакам, и там нет необходимости искать рекурсивно, т.к. документ в журнале встречается один раз
ids79; dimkakopylow001; Fox-trot; +3 1 Ответить
18. ids79 6856 19.09.19 18:35 Сейчас в теме
(8)По первой части не понял, в каком случае может быть нарушена последовательность? Сортировка по дате и ссылке.

Для бухгалтерии удобнее всего по организациям разбивать, если их много. Если не менять конфигурацию.
21. aximo 1814 21.09.19 08:03 Сейчас в теме
(18) по опыту своему - интенсивные операции, даже непрерывное чтение - так же будут проблемой для возникновению блокировок, например расчет себестоимости в УПП (производство встанет) или даже расчет развернутого АВС анализа в УТ.

непонятно как можно избежать блокировок регистра "продажи", который подчинен куче разных документов, если честно
22. ids79 6856 21.09.19 11:06 Сейчас в теме
(21)Не знаю, возможно Вы используете автоматический режим блокировок.
Моя обработка для конфигураций семейства ЕРП. Никак не пойму в каких случаях может возникнуть блокировка по регистру "Выручка и себестоимость продаж"? Может быть я чего-то упустил, поясните.
23. aximo 1814 21.09.19 13:03 Сейчас в теме
(22) я не написал, что вы что-то упустили.

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

Блокировка(и) могут возникнуть в случае при расчете «себестоимости» (интенсивная запись в этот регистр) в остальные регистры будет проблемно сделать запись (даже «руками» - документом) - это мой практический опыт работы с упп 1.3 (порядка 800 гб база).

При запуске АВС анализа - УТ 11 (80 гб) так же идет интенсивное чтение по регистрам... так же «блокируется» на запись база.

Даже при банальном распроведении связанных по регистрам документов всегда возникает блокировки.... (удаление движений ут 10.3)

Для меня, если честно остается загадкой как избежать блокировок при запуске нескольких интернствных потоков...
25. ids79 6856 21.09.19 13:13 Сейчас в теме
(23)Ну с автоматическим режимом все понятно. В управляемом то не должно быть. Блокировка на чтение снимается после прочтения.

Я тестировал перепроведение. Не скажу, чтоб очень много, но блокировок не возникало. Попробуйте на большой базе прогнать. Только в управляемом режиме конечно.
30. DarkAn 998 17.12.19 11:50 Сейчас в теме
Дмитрий, спасибо за статью, но есть замечания...

Далее выполняется запуск необходимого количества потоков для обработки каждого набора документов (согласно переданному параметру «КоличествоПотоков»)

На перезапуск потоков уходит достаточно много времени (но это уже к оптимизации), но может быть существенно по ряду причин:
* при больших базах с большим составом ТЧ в документе, может получиться так, что в потоки будут отправляться по 1 документу

**************************************************************************
Кроме того, есть ошибка со сборкой документов для потоков, а именно в процедуре РекурсивныйПоискДокументов (т.к. используется поиск в глубину)
Приведу пример:

У нас есть последловательностьи такая:
Док1 с Аналитикой "А"
Док2 с Аналитикой "Б"
Док3 с Аналитикой "А" и с Аналитикой "Б"

РекурсивныйПоискДокументов соберет документы в такой последовательности:
Док1, Док3, Док2, что не соответствует действительности

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

**************************************************************************
И еще проблема с Процедурой "ОбработатьПорциюДокументов"

в цикле нет досрочного выхода если ТЗСвязиВПорции очистилась
"Для Поток = 1 По КоличествоПотоков Цикл"

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

**************************************************************************
В процедуре формируется выборка из регистра «Товары организаций» в разрезе регистраторов и ключей аналитики номенклатуры. Выполняется сортировка выборки по периоду и регистратору.
Об этом упомянул Максим Гончаров в (8)
Сортировку надо делать по МоментВремени. т.к. в конце месяца множество документов может находится на последней секунде
Прикрепленные файлы:
31. DarkAn 998 17.12.19 13:43 Сейчас в теме
(30)
В процедуре формируется выборка из регистра «Товары организаций» в разрезе регистраторов и ключей аналитики номенклатуры. Выполняется сортировка выборки по периоду и регистратору.
Об этом упомянул Максим Гончаров в (8)
Сортировку надо делать по МоментВремени. т.к. в конце месяца множество документов может находится на последней секунде


Тут я ошибся, Момент времени тут тоже не поможет, только последовательность
33. ids79 6856 23.12.19 08:36 Сейчас в теме
(31)А разве сортировка по периоду и документу не дает нам однозначную последовательность?
34. DarkAn 998 23.12.19 09:16 Сейчас в теме
(33) Нет, не даст, если документы будут в пределах 1 секунды.

При сортировке по дате + ссылка, если мне не изменяет память документы одного типа будут располагаться рядом друг с другом, например:
Пользователь вводит: Приход, Расход, Приход, Расход
При сортировке: будет Приход, Приход, Расход, Расход или Расход, Расход, Приход, Приход (но могу ошибаться, когда то при тестах - получал такую картину)

вот тут: Как формируется GUID? автор пишет:
Но у гуидов есть же последовательность? Что-то там про МоментВремени?
Да сколько можно? Нет у гуидов последовательности! Кто первый запросил - тому и выдается пул. А когда уж сеанс его исчерпает - зависит от него самого. Читаем подробнее про эксперимент с МоментомВремени.
//infostart.ru/public/84177/
36. ids79 6856 24.12.19 10:17 Сейчас в теме
(34) Все, что Вы пишете правильно. Я не проверял, но должно быть именно так.
Но это не отменяет того, о чем я говорю.
Последовательность в любом случае будет однозначной. То-есть, во всех выборках будет одной и той же. Не смотря на то, что она не будет соответствовать реальной последовательности ввода документов.
Не понимаю, чем в этом случае может помочь последовательность...
При первичном вводе, да, документы выстроятся правильно. Но при восстановлении последовательности они же опять будут отсортированы по моменту времени?
Или я что-то не до понимаю...
37. DarkAn 998 24.12.19 11:38 Сейчас в теме
(36)
При первичном вводе, да, документы выстроятся правильно. Но при восстановлении последовательности они же опять будут отсортированы по моменту времени?


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

Скрины результатов приложил.
При выполнении запроса к последовательности документы идут в перемешку (Требование, пермещение, Расчет себестоимости, списание, опять Требование)

А при выборке с сортировкой по моменту времени (тот же период, но взял только 2 вида документов) видно, что сначала идут Перемещения, потом Требования, внутри документы ни где друг с другом не перемешиваются.

Запрос на выборку из последовательности
ВЫБРАТЬ
	ПартионныйУчетБУ.Период,
	ПартионныйУчетБУ.МоментВремени,
	ПартионныйУчетБУ.Регистратор
ИЗ
	Последовательность.ПартионныйУчетБУ КАК ПартионныйУчетБУ
ГДЕ
	ПартионныйУчетБУ.Период МЕЖДУ &Период1 И &Период2
Показать


Запрос на выборку с сортировкой по моменту времени
ВЫБРАТЬ
	ТребованиеНакладная.Ссылка,
	ТребованиеНакладная.МоментВремени
ПОМЕСТИТЬ ВТ_Док
ИЗ
	Документ.ТребованиеНакладная КАК ТребованиеНакладная
ГДЕ
	ТребованиеНакладная.Проведен
	И ТребованиеНакладная.Дата МЕЖДУ &Период1 И &Период2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	ПеремещениеТоваров.Ссылка,
	ПеремещениеТоваров.МоментВремени
ИЗ
	Документ.ПеремещениеТоваров КАК ПеремещениеТоваров
ГДЕ
	ПеремещениеТоваров.Проведен
	И ПеремещениеТоваров.Дата МЕЖДУ &Период1 И &Период2
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_Док.Ссылка,
	ВТ_Док.МоментВремени КАК МоментВремени
ИЗ
	ВТ_Док КАК ВТ_Док

УПОРЯДОЧИТЬ ПО
	МоментВремени
Показать
Прикрепленные файлы:
38. ids79 6856 24.12.19 12:11 Сейчас в теме
(37)При восстановлении последовательности тоже в таком же порядке документы получается, проверяли?
Если так, то да, Вы правы. Значит в объекте Последовательность храниться дополнительная информация о начальной последовательности документов.
39. DarkAn 998 24.12.19 13:02 Сейчас в теме
Сегодня постараюсь проверить...
40. DarkAn 998 25.12.19 09:52 Сейчас в теме
(38) Посмотрел в УПП 1.3
При восстановлении последовательности партий хоть и используется последовательность, но выборка документов из нее происходит запросом (УправлениеЗапасамиПартионныйУчет.ПолучитьСписокДокументовПоПоследовательности) с сортировкой по
|УПОРЯДОЧИТЬ ПО
|	ТаблицаПоследовательности.Период,
|	ТаблицаПоследовательности.Регистратор";

Что в итоге приводит в выборке документов группами без перемешивания по типу (выборку тоже проверил).

PS. Видимо в данном случае "Последовательность" используется, как общая таблица для разных видов документов (для упрощения запроса, чтоб не делать через ОБЪЕДИНИТЬ с кучей таблиц), ну и так же для пользователя в рамках секунды он все равно не может управлять порядком документов.

Но думаю последовательность в своем истинном проявлении может иметь место в механизмах фиксации событий, где действительно важно строгое соблюдение порядка

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

Супер просто!!!
41. ids79 6856 25.12.19 11:05 Сейчас в теме
(40)Интересное наблюдение, спасибо.
А все-таки можно ли как-то выбрать документы из последовательности для ее восстановления именно с первичной их сортировкой?
42. DarkAn 998 25.12.19 11:14 Сейчас в теме
(41) Выборка без сортировки???
Опять же надо тестировать (Думаю как было показано в (37)).

Но тут тоже есть вопрос, как расположить документ если он не создан по порядку, а перемещен из другого времени.

23:59:58 Док 1
23:59:59 Док 2
23:59:59 Док 3
23:59:59 Док 4

И вот надо мне переместить документ Док 1 в 23:59:59 - куда он встанет???
43. DarkAn 998 25.12.19 11:16 Сейчас в теме
(42) Думаю (мои домыслы), что последовательность четко фиксирует события при первом возникновении (тогда выборка без сортировки), но не при перемещении во времени возникает вопрос (см. выше). Опять же надо тестировать.
44. ids79 6856 25.12.19 15:00 Сейчас в теме
(43)На сколько я помню, перемещенный документ встает последним в секунде, куда он перемещен.
45. DarkAn 998 25.12.19 15:29 Сейчас в теме
(44)
олько я помню, перемещенный документ встает последним в секунде, куда он перемещен.

Последним встает где? В списке документов? В последовательности? или везде?
А если документ переместить из текущего времени и вернуть туда же, он будет на том же месте? или будет уже в конце?
46. ids79 6856 25.12.19 19:04 Сейчас в теме
(45) Получается, что только в последовательности. В остальных случаях будет сортировка по типам документов.
Если вернуть обратно, должен последнем стать. Но нужно проверять.
32. ids79 6856 23.12.19 08:33 Сейчас в теме
(30)Спасибо за замечанию.
Я представил возможный вариант реализации (прототип). Конечно для рабочего варианта, он требует оптимизации и доработки различных нюансов.
9. maxx 945 18.09.19 13:27 Сейчас в теме
Еще вопрос можно ли как-то оценить время выполнения после запуска в потоках?

Когда идёт обычное проведение вычисляется среднее выполнение проведения документов и делается примерная оценка, когда всё закончит проводится, т.е. ждать 30 минут или 3 часа. А здесь как?
ids79; dimkakopylow001; +2 Ответить
11. dimkakopylow001 7 18.09.19 14:58 Сейчас в теме
(9) на разном железе разный результат будет
можно запустить 3 потока, они отработают быстрее чем 10.
19. ids79 6856 19.09.19 18:37 Сейчас в теме
(9)На счет предварительной оценки времени не думал. Тема интересная. Да, в данном случае оценить будет значительно сложнее.
От железа также будет сильно зависеть.
24. aximo 1814 21.09.19 13:08 Сейчас в теме
Здесь правильно написали, что сейчас эффективность зависит от железа... хорошее железо будет в разы эффективнее любой оптимизации, что и подтвердилось моим опытом, при срезе базы в 2014 и 2018 г!
26. ids79 6856 21.09.19 13:14 Сейчас в теме
(24)Да, от железа много зависит.
Особенно при многопоточной обработке.
29. DarkAn 998 17.12.19 11:45 Сейчас в теме
(24)
хорошее железо будет в разы эффективнее любой оптимизации

Что за бред?
А что делать если уже стоит ТОПОВОЕ железо? и быстрее на рынке ну просто ни чего нет? А добавление/удаление/исправление пары строк кода может ускорить работу в РАЗЫ

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

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

P.S. все выше сказанное конечно не отменяет того, что железо должно быть достойно, просто хотел сказать, что железо не все может решить.
27. acanta 25.09.19 14:08 Сейчас в теме
Была замужем замечена некоторая странность, когда при одновременном монопольном проведении в двух разных ИБ, проведение ускорялось в 4-10 раз в каждой базе. Но такие чудеса теоретически могут объясняться например недонастройками в биосе или кэшированием. Проводить в одной базе разные фирмы параллельно не успела попробовать.
28. PowerBoy 3126 09.10.19 13:55 Сейчас в теме
Для экспериментов с многопоточностью и распределению потоков для различных операций с данными, не только проведение, пока есть только одна внешняя обработка, других не нашел, это PowerTools.
35. acanta 23.12.19 09:23 Сейчас в теме
Это потому что в ссылке первыми символами идёт тип метаданного, а затем двоеточие и собственно гуид?
Оставьте свое сообщение

См. также

Безопасная работа с транзакциями во встроенном языке Промо

Практика программирования v8 1cv8.cf Абонемент ($m)

Разбираемся с опасностями использования транзакций во встроенном языке 1С. Познаем ошибку "В данной транзакции уже происходили ошибки". Учимся защищаться от них.

1 стартмани

25.03.2019    46593    tormozit    58    

Пример создания документа с движениями в ERP 2.5.7

БСП (Библиотека стандартных подсистем) Практика программирования v8 ERP2 Россия УУ Абонемент ($m)

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

1 стартмани

10.08.2021    2347    maraty    10    

Работа с абстрактным массивом

Математика и алгоритмы Практика программирования v8 Россия Абонемент ($m)

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

1 стартмани

07.07.2021    3935    kalyaka    56    

Семеро одного не ждут? Асинхронное исследование асинхронности

Работа с интерфейсом Практика программирования v8 1cv8.cf Абонемент ($m)

Все уже, наверное, знают о появлении в новых версиях платформы асинхронных функций и конструкций Асинх/Ждать. Многие, возможно, уже их используют. Но что будет, если создать свои асинхронные функции, запустить и не дожидаться окончания их выполнения? Неужели можно запустить несколько процессов параллельно?

1 стартмани

08.06.2021    5727    Alxby    47    

План подготовки к аттестации на 1С: Специалиста по платформе (+ Ссылки на материалы) Промо

Решение задач на 1С:Специалист v8 Россия Абонемент ($m)

Хочу поделиться собственным планом подготовки к аттестации на 1С: Специалист по платформе 8.3 со ссылками на материалы (и указанием стоимости).

1 стартмани

23.12.2017    25941    UtSpar    39    

БСП. Подключаемые команды. Команды заполнения

БСП (Библиотека стандартных подсистем) v8 ERP2 БП3.0 ЗУП3.x Россия Абонемент ($m)

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

1 стартмани

11.05.2021    7585    kondrp    7    

Модель запроса

Универсальные функции v8 v8::Запросы 1cv8.cf Россия Абонемент ($m)

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

1 стартмани

01.03.2021    3028    kalyaka    25    

Как сдать экзамен 1С:Специалист по платформе?

Решение задач на 1С:Специалист v8 Россия Абонемент ($m)

Не пора ли получить сертификат 1С:Специалист по платформе? Для этого ...

1 стартмани

18.01.2021    18397    vasilievil    10    

Как выполнить отчет на СКД через COM и получить данные отчета? Промо

Практика программирования v8 УПП1 Россия Абонемент ($m)

Для чего это нужно. Например, нужно в одной базе получить какой-либо показатель из другой базы. Этот показатель вычисляется в каком-либо сложном отчете, который написан на СКД. Можно, конечно, "скопипастить" текст запроса из другой базы, немного подправить его и выполнять в том же COM подключении. Но с этим теряется гибкость: если отчет изменился, то нужно помнить о том, что где-то есть его "немного модифицированная" копия. В статье будет рассмотрен пример получения данных из базы ЗУП.

2 стартмани

08.05.2018    33727    wowik    3    

Запрещаем администратору системы заходить в конфигуратор (внешнее управление сеансами)

DevOps Сервера v8 Абонемент ($m)

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

1 стартмани

08.01.2021    2908    ardn    5    

Devops на коленке, или Иногда стоит отказаться от gitsync

DevOps Скрипты автоматизации v8 Россия Абонемент ($m)

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

1 стартмани

08.12.2020    1475    ardn    2    

СКД: все, что вы хотели знать о подмене схемы компоновки данных в отчетах и обработках

Практика программирования v8 v8::СКД 1cv8.cf Абонемент ($m)

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

1 стартмани

07.12.2020    5393    user1502278    18    

Как нарисовать граф на 1С Промо

Практика программирования v8 Абонемент ($m)

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

1 стартмани

09.08.2013    73732    ildarovich    117    

Cбор и анализ ошибок при помощи Sentry, или как упростить жизнь себе и пользователям

Интеграция с сервисами Практика программирования v8 Абонемент ($m)

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

1 стартмани

09.10.2020    7902    hexhoc    12    

Программная корректировка при выводе отчета СКД

Практика программирования v8 v8::СКД 1cv8.cf Абонемент ($m)

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

1 стартмани

08.10.2020    11618    dabu-dabu    16    

Библиотека программного изменения формы (УФ)

Инструментарий разработчика Работа с интерфейсом Универсальные функции v8 1cv8.cf Абонемент ($m)

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

1 стартмани

07.08.2020    7126    BuriyLesha    20    

Простой способ индексирования интервалов Промо

Практика программирования v8 Абонемент ($m)

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

1 стартмани

28.09.2016    42249    ildarovich    22    

Загрузка, скачивание, удаление файлов с помощью НачатьПомещениеФайлаНаСервер() и НачатьПолучениеФайлаССервера()

Практика программирования v8 1cv8.cf Абонемент ($m)

В платформе 8.3.15 появились новые методы НачатьПомещениеФайлаНаСервер() и НачатьПолучениеФайлаССервера(). В данной статье рассмотрено готовое решение проверенное и прекрасно работающее на тонком и веб-клиенте.

1 стартмани

25.07.2020    12598    Flashill    15    

Работа с хранилищем конфигурации из режима 1С: Предприятие минуя конфигуратор

Хранилище v8 1cv8.cf Абонемент ($m)

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

3 стартмани

11.06.2020    7462    MaxxG    19    

История данных и БСП

БСП (Библиотека стандартных подсистем) v8 1cv8.cf Абонемент ($m)

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

1 стартмани

09.06.2020    5322    zeegin    17    

Бесплатная проверка контрагентов в ФНС (общий модуль с алгоритмом). На примере выводим статус в список справочника контрагентов Промо

Практика программирования v8 1cv8.cf Абонемент ($m)

Если вам интересно проверить контрагенте в ФНС, вам поможет данная публикация. Весь алгоритм работы строится на основе данных, полученных с сервиса http://npchk.nalog.ru совершенно бесплатно.

1 стартмани

01.02.2018    38673    rpgshnik    59    

Управление состоянием для шаблона MVC и работы с данными объекта

Работа с интерфейсом v8 1cv8.cf Абонемент ($m)

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

1 стартмани

18.03.2020    4309    kalyaka    35    

Методика обновления формы объекта данных при изменении объекта

Практика программирования v8 v8::УФ 1cv8.cf Абонемент ($m)

В формах объектов данных часто встречаются элементы, косвенно связанные с объектом. Логику обновления этих элементов при изменении объекта обычно вызывают из обработчиков ПриСозданнииНаСервере и ПриОткрытии, забывая про наличие других способов изменения объекта. В статье предложена методика для обычных и управляемых форм, учитывающая все способы.

1 стартмани

09.03.2020    21891    tormozit    16    

БСП: Дополнительная обработка (Регламенты), примеры от простого к сложному Промо

БСП (Библиотека стандартных подсистем) Практика программирования v8 1cv8.cf Абонемент ($m)

Очень много попадается странных решений, которые можно решить через БСП:Дополнительные отчеты и обработки. Я бы вообще БСП из-за этой подсистемы переименовал в «Большое Спасибо Программистам». Поработаем с подсистемой в части написания регламентных заданий.

1 стартмани

10.05.2018    55281    dsdred    46    

Отправка уведомлений с помощью командной строки, Оповещения с сервера на клиент с помощью командной строки

Практика программирования v8 1cv8.cf Россия Абонемент ($m)

Отправка уведомлений с помощью команды командной строки msg. Оповестить пользователей из серверного модуля или регламентного задания, с помощью командной строки msg.

1 стартмани

05.03.2020    8305    user5300    3    

Вывод сообщений в HTML поле средствами 1С

Практика программирования v8 v8::УФ Абонемент ($m)

Пример использования вывода большого количества сообщений в поле HTML. С возможностью открывать ссылочные объекты и создавать новые объекты передавая параметры прямо из HTML поля. Протестировано на релизах 8.3.12 и 8.3.15+

2 стартмани

31.01.2020    12150    burni4    16    

Краткое руководство по внесению изменений в конфигурацию

Практика программирования v8 1cv8.cf Абонемент ($m)

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

1 стартмани

13.01.2020    23268    sapervodichka    41    

Некоторая работа с данными через COM Промо

Практика программирования v8 Абонемент ($m)

В статье приведены примеры работы с Платформой 8.X через COM (точнее, через объект COMConnector). Примеры кода были использованы при реализации прикладных задач в процессе трудовой деятельности.

2 стартмани

05.12.2012    60209    wowik    32    

Интеграция 1С и Active Directory на сервере

Скрипты автоматизации v8 v8::УФ Россия Абонемент ($m)

Получить информацию Active Directory на управляемых формах со стороны сервера, под любым пользователем домена.

1 стартмани

21.12.2019    15182    DrZombi    16    

Разбираемся с web-kit в 1С, на примере интеграции TinyMCE в управляемую форму в УТ 11.4. Допиливаем обмен с сайтом в УТ 11.4

Обмен данными и распределенная БД Интеграция с сервисами Адаптация типовых решений v8 v8::УФ УТ11 Абонемент ($m)

Многие уже знают, что в релизе платформы 8.3.14.1565, браузер Internet Explorer был заменен на Web-Kit, это на самом деле большой шаг вперед, но я уверен, многим, как и мне, пока не совсем понятно, что к чему. Возник опыт использования web-kit в 1С, вызова JS из 1С и вызова 1С из JS. Давайте вместе попробуем понять, чем одно отличается от другого, и заодно сделаем, что-нибудь полезное. Да и наверняка многим придется переписывать свои подобные поделки после обновления на новую платформу, так что надеюсь мой опыт окажется полезным.

2 стартмани

08.12.2019    9773    Бэнни    25    

Генерация управляемой формы на основе обычной (proof of concept)

Работа с интерфейсом v8 v8::УФ 1cv8.cf Абонемент ($m)

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

1 стартмани

06.11.2019    9423    user700211_a.straltsou    28    

Работа со схемой запроса Промо

Инструментарий разработчика v8 v8::Запросы Абонемент ($m)

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

1 стартмани

24.04.2018    52577    kalyaka    41    

Массовое изменение режима поддержки объектов конфигурации

Структура метаданных v8 1cv8.cf Абонемент ($m)

Что делать, если при сравнении/объединении конфигураций нужно изменить режим поддержки для большого количества объектов? Штатного механизма для выполнения подобной задачи в Платформе нет. Изменять режим для всей конфигурации? Описывается способ, позволяющий выполнить изменение режима только для нужных объектов.

05.11.2019    5052    VKislitsin    12    

"Живые" картинки со Snap.SVG

WEB Работа с интерфейсом Практика программирования v8 Абонемент ($m)

В статье рассмотрен пример использования http-сервисов для визуализации данных

1 стартмани

24.10.2019    15272    blackhole321    7    

Полное копирование одной формы в другую

Универсальные обработки Работа с интерфейсом Практика программирования v8 1cv8.cf Абонемент ($m)

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

1 стартмани

03.10.2019    8318    nekit_rdx    25    

Многопоточность. Универсальный «Менеджер потоков» (фреймворк) с отслеживанием зависимости объектов Промо

Математика и алгоритмы Универсальные функции HighLoad оптимизация Практика программирования v8 1cv8.cf Россия Абонемент ($m)

Восстановление партий, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

26.05.2017    51628    DarkAn    87    

Описание формата внутреннего представления данных 1С в контексте обмена данными

Внешние источники данных Практика программирования v8 v8::УФ 1cv8.cf Абонемент ($m)

Фирма 1С не рекомендует использовать внутреннее представление данных для любых целей, которые отличны от обмена с 1С:Предприятием 7.7. Но сама возможность заглянуть на "внутреннюю кухню" платформы с помощью функций ЗначениеВСтрокуВнутр(), ЗначениеВФайл(), ЗначениеИзСтрокиВнутр() и ЗначениеИзФайла(), дала возможность сообществу программистов 1С разработать новые приемы разработки и анализа. Так, именно на использовании внутреннего представления был построен алгоритм "быстрого массива", который позволяет практически мгновенно создать массив в памяти на основании строки с разделителями. С помощью разбора внутреннего представления можно "на лету" программным кодом выполнить анализ обычной формы и даже сделать редактор графической схемы. Во внутреннем формате сохраняют свои данные между сеансами различные популярные внешние обработки. А еще это возможность сделать быстрый обмен с внешними системами.

1 стартмани

06.09.2019    21965    Dementor    31    

Удобный просмотр результата запроса с большим количеством временных таблиц

Практика программирования v8 Абонемент ($m)

Если Вам часто приходится просматривать в отладчике сложные пакетные запросы с большим количеством временных таблиц, то эта статья для Вас.

1 стартмани

27.08.2019    13086    ids79    22    

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

Практика программирования v8 1cv8.cf Абонемент ($m)

Как запустить фоновое задание из модуля внешней обработки используя БСП. Как отключить безопасный режим и сообщения защиты от опасных действий независимо от профиля безопасности пользователя в фоновом задании во внешней обработке.

2 стартмани

24.08.2019    17680    BenGunn    26    

Агрегатное суммирование строк в запросе – сложно, но не невозможно Промо

Математика и алгоритмы v8 Абонемент ($m)

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

1 стартмани

09.09.2013    85479    ildarovich    57    

Изменяющееся контекстное меню в 1С 8.3

Работа с интерфейсом Инструментарий разработчика Практика программирования v8 v8::УФ Абонемент ($m)

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

1 стартмани

06.08.2019    23067    signum2009    16    

Менеджер потоков: реализация "любой" задачи в потоках

HighLoad оптимизация Инструментарий разработчика v8 Абонемент ($m)

Менеджер потоков – один их новых инструментов, который упрощает работу разработчиков. Насколько легко с ним, на конференции Infostart Event 2018 Education показал начальник отдела автоматизации 1С Иван Филимонов компании «Трансстроймеханизация».

01.08.2019    11548    DarkAn    7    

Процедура ПриКомпоновкеРезультата

Практика программирования v8 1cv8.cf Абонемент ($m)

Коллекция кода

1 стартмани

26.07.2019    60727    vasilev2015    67    

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

Практика программирования v8 Абонемент ($m)

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

1 стартмани

27.11.2012    46597    ildarovich    49    

10 способов получить модуль числа (а может, и больше)

Инструментарий разработчика Практика программирования v8 1cv8.cf Абонемент ($m)

Пишем функцию вычисления модуля числа. Сколько способов существует? Давайте посчитаем!

1 стартмани

11.07.2019    15259    sam441    34    

Мониторинг производительности и искусственный интеллект

HighLoad оптимизация Искусственный интеллект (AI) Практика программирования v8 Абонемент ($m)

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

1 стартмани

01.07.2019    10457    ivanov660    28    

Шифрование текста и файлов с помощью 1С. Используется хеш-код SHA256, Без Capicom, Архиваторов и сторонних служб

Защита и шифрование v8 1cv8.cf Абонемент ($m)

Данная статья описывает простейший собственный алгоритм шифрования средствами 1С. Без Capicom, Архиваторов и сторонних служб. Данный метод работает на Платформе 8.3 и т.п. 09.07.19 Добавлена обработка шифрования файлов

1 стартмани

26.06.2019    12523    Indgo    46    

Уровни, глубина, прародители, циклы и аналоги запросом Промо

Практика программирования v8 1cv8.cf Абонемент ($m)

В продолжение публикации «Транзитивное замыкание запросом» [http://infostart.ru/public/158512/] добавлены другие варианты использования того же приема. Приведены запросы для быстрого определения уровней всех элементов справочника, максимальной глубины справочника, прародителей произвольных элементов справочника, запрос для быстрого определения циклов (на примере справочника спецификаций «1С:Управление производственным предприятием») и определения множеств аналогов номенклатуры (также на примере конфигурации «1С:Управление производственным предприятием»).

1 стартмани

13.11.2012    120918    ildarovich    102    

"Убер на складе": динамический расчет маршрутов с учетом реальных расстояний

Учет ТМЦ Учет ТМЦ Практика программирования v8 УУ Абонемент ($m)

Представляю методику и инструмент для динамического расчета маршрутов отбора на высоконагруженных складах для максимального повышения эффективности склада, ускорения проходимости и, как следствие, экономии денег. Это методика и обработка для интеграции в WMS решения. Тестировалось на 1С 8.3.14.1565.

3 стартмани

24.06.2019    19874    informa1555    17    

1С:Ассемблер. Немного летнего веселья!

Инструментарий разработчика Практика программирования v8 1cv8.cf Абонемент ($m)

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

1 стартмани

21.06.2019    34369    Evil Beaver    147    

Простые примеры сложных отчетов на СКД

Практика программирования v8 v8::СКД 1cv8.cf Абонемент ($m)

Подписи в отчете. Особенности соединения наборов: как соединить несоединяемое. Остатки на дату и обороты по месяцам в одном отчете. Курс валюты на каждую дату без группировок и соединений в запросе. Отчет с произвольными колонками и с произвольной последовательностью. "Неадекватный отчет".

1 стартмани

12.06.2019    37390    Hatson    32    

Работа с графической схемой в объектной модели DOM

Универсальные функции v8 v8::УФ Абонемент ($m)

Пример кода для работы с графической схемой в объектной модели DOM, платформа 8.3.12.

1 стартмани

04.06.2019    8455    botokash    19