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

Публикация № 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
70
.epf 14,01Kb 70 Скачать

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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


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

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

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

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


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

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

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

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

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

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

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

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

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

Супер просто!!!
41. ids79 7666 25.12.19 11:05 Сейчас в теме
(40)Интересное наблюдение, спасибо.
А все-таки можно ли как-то выбрать документы из последовательности для ее восстановления именно с первичной их сортировкой?
42. DarkAn 1045 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 1045 25.12.19 11:16 Сейчас в теме
(42) Думаю (мои домыслы), что последовательность четко фиксирует события при первом возникновении (тогда выборка без сортировки), но не при перемещении во времени возникает вопрос (см. выше). Опять же надо тестировать.
44. ids79 7666 25.12.19 15:00 Сейчас в теме
(43)На сколько я помню, перемещенный документ встает последним в секунде, куда он перемещен.
45. DarkAn 1045 25.12.19 15:29 Сейчас в теме
(44)
олько я помню, перемещенный документ встает последним в секунде, куда он перемещен.

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

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

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

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

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

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

См. также

Пустая форма объекта в расширении

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Создание пустой формы объекта в расширении для добавления элементов формы программно или для изменения процедур формы объекта.

1 стартмани

16.02.2023    1000    Mx00    10    

17

Гонка конфигураторов с помощью экзекутора

Инструментарий разработчика DevOps и автоматизация разработки Механизмы платформы 1С Платформа 1С v8.3 Абонемент ($m)

Выгружать конфигурацию в файлы в последнее время стало супер модно. Контроль версий, Git, CI/CD и вот это вот все. Исходники как тексты сегодня нужны всем. Но возникают вопросы: а каким методом лучше и быстрее выгружать конфигурацию в файлы, а какая версия платформы справляется с этой задачей оперативнее? Моя статья постарается ответить на эти вопросы. Как говорится, заставим попотеть ваши конфигураторы. С помощью 1С Исполнителя 2.0 мы выгрузим конфигурацию ЗУП, используя платформу пяти версий, от 8.3.18 до 8.3.22.

1 стартмани

16.11.2022    3257    infosoft-v    40    

44

[ЕХТ] Фреймворк для Расширений 1С: Обработка событий: описание, примеры и демобаза.

Инструментарий разработчика Платформа 1С v8.3 Абонемент ($m)

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

21.10.2022    1645    mszsuz    3    

17

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

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

07.08.2020    9470    BuriyLesha    20    

148

Видеокурс-практикум: как подготовить и написать ТЗ, ЗНР, ЧТЗ. Промо

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

3 500 рублей

Запуск фонового задания во внешней обработке без регистрации в справочнике "Дополнительные отчеты и обработки"

Инструментарий разработчика Управляемые формы 1С:Зарплата и Управление Персоналом 3.x Россия Абонемент ($m)

Описал, как показать прогресс выполнения длительной операции во внешней обработке, и при этом не регистрировать обработку в справочнике "ДополнительныеОтчетыИОбработки". Проверял на БСП версии "3.1.2.264".

1 стартмани

09.03.2020    13298    VinnieThePOOH    7    

62

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

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Абонемент ($m)

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

2 стартмани

31.01.2020    25345    burni4    16    

66

Таблица значений - синтаксический сахар

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Ещё одна идея добавления "синтаксического сахара" в язык 1С для работы с коллекцией значения: Таблица значений.

1 стартмани

05.01.2020    3177    a45    12    

6

Централизованное управление кластером 1С Предприятия, состоящим из нескольких рабочих серверов, работающих на платформе GNU/Linux

Инструментарий разработчика Платформа 1С v8.3 Абонемент ($m)

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

1 стартмани

26.08.2019    4886    Sloth    0    

18

Отслеживание выполнения фонового задания

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

17.08.2019    54413    ids79    23    

224

Программы для исполнения 488-ФЗ: Маркировка товаров Промо

1 января 2019 года вступил в силу ФЗ от 25.12.2018 № 488-ФЗ о единой информационной системе маркировки товаров с использованием контрольных (идентификационных) знаков, который позволяет проследить движение товара от производителя до конечного потребителя. Инфостарт предлагает подборку программ, связанных с применением 488-ФЗ и маркировкой товаров.

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

HighLoad оптимизация Платформа 1С v8.3 Бесплатно (free)

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

01.08.2019    13166    DarkAn    7    

62

Просто комбо, два в одном, или как напечатать два макета (стандартный и измененный) одной печатной формы

Инструментарий разработчика Платформа 1С v8.3 1С:Бухгалтерия 3.0 Бухгалтерский учет Абонемент ($m)

Алгоритм и расширение (как пример) демонстрируют механизм одновременного использования двух макетов (стандартного и измененного), принадлежащих одной записи регистра «Макеты печатных форм» («ПользовательскиеМакетыПечати») в конфигурации «1С:Бухгалтерия предприятия, редакция 3.0».

1 стартмани

26.06.2019    5902    delta    0    

3

Использование фреймворка "Тестирование 3.0" (https://testingtool.ru) для тестирования веб-приложений

Инструментарий разработчика Платформа 1С v8.3 Абонемент ($m)

Рассматривается использование фреймворка "Тестирование 3.0" (https://testingtool.ru) для тестирования веб-приложений.

1 стартмани

24.12.2018    6036    AlexKo    9    

20

HTTP Сервисы: Путь к своему сервису. Часть 4

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Продолжение статьи «HTTP Сервисы: Путь к своему сервису. Часть 3». В предыдущих частях мы уже о многом поговорили. В этой части поговорим про размер сообщений, о файлах, о порциях и немножко, о регламентах.

1 стартмани

28.09.2018    39280    dsdred    18    

154

Сортировка метаданных с учетом объектов на замке

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

16.08.2018    4902    Olenevod    1    

11

1СПАРК РИСКИ. Сервис оценки благонадежности контрагентов. Промо

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

HTTP Сервисы: Путь к своему сервису. Часть 2

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Абонемент ($m)

Продолжение статьи «HTTP Сервисы: Путь к своему сервису. Часть 1». В этой части будет "Микс" из OData+HTTP-Сервис(Get)+СКД. Наш пример будет работать как в браузере, так и в написанной нами обработке. Работать будем с разными версиями платформ.

1 стартмани

13.08.2018    54357    dsdred    2    

166

Мониторинг журнала регистрации при помощи Powershell

Инструментарий разработчика Платформа 1С v8.3 Абонемент ($m)

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

1 стартмани

12.07.2018    14331    user768334    7    

30

Заполнение документа Word без ComОбъект

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Идея написать публикацию пришла после прочтения очередного рассказа о том, как файл Word заполнялся через COM-объект в клиент-серверном варианте. При этом падал Сервер 1С. Зачем в принципе использовать файлы Word как шаблоны? Ну, допустим, в организации используется некая внутренняя отчетность, выполнения в корпоративном стиле, и переделать ее на привычные табличные документы нет возможности.

1 стартмани

08.07.2018    21967    nbeliaev    39    

109

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

Инструментарий разработчика Платформа 1С v8.3 Запросы Абонемент ($m)

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

1 стартмани

24.04.2018    58270    kalyaka    40    

209

Использование регулярных выражений (RegExp) в Linux

Инструментарий разработчика Платформа 1С v8.3 Абонемент ($m)

Описывается способ использования регулярных выражений (RegExp) в Linux с использованием тех же компонентов, что и в Windows (COM-объекты VBScript.RegExp).

1 стартмани

20.04.2018    9981    vsbronnikov    12    

1

Распознавание и загрузка документов в 1С Промо

Универсальная программа-обработка для распознавания любых сканов или фото первичных документов в 1С (счета-фактуры, УПД, ТТН, акты и тд). Точность распознания до 98%.

от 11 рублей

Тестирование: пример создания сценарного UI теста для платформы 1С

Инструментарий разработчика Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Абонемент ($m)

В этой статье мы расскажем, как создать сценарный UI-тест. Опишем последовательность действий и покажем, как это сделать с использованием инструментария. Рассмотрим пример, максимально приближенный к боевому, покажем на примере конфигураций УТ11/ERP проверку бизнес-процесса "Продажа". Вы сможете убедиться, что создание сценарных тестов для платформы 1С на самом деле относительно быстрый и простой процесс.

1 стартмани

17.04.2018    25660    ivanov660    11    

99

Обработка печатной формы WORD клиент-сервер УФ

Инструментарий разработчика Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Это моя первая статья на данном портале, но попытаюсь изложить все понятно и подробно. Долгое время у меня заняло создание такой вот внешней обработки. Есть очень много примеров, как сделать подобное на неуправляемых формах (2.0) и очень мало информации касательно управляемых(3.0), по крайней мере я многого найти не смог в доступе. Создание подобное обработки выглядит вполне несложно, если производить все действия на сервере, как это было с 2.0, но в нашем случае необходимо инициализировать открытие документа на клиенте, чему сильно мешает отсутствие возможности передать макет Active Document с сервера на клиент.

2 стартмани

14.03.2018    31958    LeoKeyn    46    

43

Консоль запросов со встроенным Конструктором запросов для 1с8.3 (8.2) своими руками

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Запросы Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

21.12.2017    27023    jan-pechka    24    

16

Программы для исполнения 54-ФЗ Промо

С 01.02.2017 контрольно-кассовая техника должна отправлять электронные версии чеков оператору фискальных данных - правила установлены в 54-ФЗ ст.2 п.2. Инфостарт предлагает подборку программ, связанных с применением 54-ФЗ, ККТ и электронных чеков.

Практика доступа в базу 1С через протокол oData. Чтение данных

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Для чего нужен доступ в базу 1С через REST-интерфейс по протокол oData? Как его организовать? Как не будучи гуру в JavaScript и .NET получить быстрый визуальный доступ к данным базы 1С? Попробую дать ответ на эти вопросы и прокомментирую некоторые нюансы, с которыми я столкнулся.

1 стартмани

11.12.2017    139788    Dementor    74    

394

Полезный код для программистов 1С (часть 1). Управление свойствами элементов формы. Хранение копии данных реквизитов

Инструментарий разработчика Платформа 1С v8.3 Абонемент ($m)

У каждого программиста за время работы накапливается полезный инструментарий, которым он привык пользоваться. Естественно и у меня он тоже имеется. И вот решено было немного поделиться с сообществом. Возможно идеи не новые. Более того, допускаю, что реализованы они не самым оптимальным образом. Но ведь для этого сообщество и существует, чтобы делиться с ним, получая обратную связь.

1 стартмани

24.09.2017    47394    vandalsvq    80    

152

Интеграция сценарного тестирования в процесс разработки

Инструментарий разработчика Управляемые формы Абонемент ($m)

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

1 стартмани

04.07.2017    32813    grumagargler    30    

209

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

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

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

26.05.2017    53728    DarkAn    87    

195

Передача параметра из формы документа в форму выбора. 1С: 8.2, обычные формы

Инструментарий разработчика Платформа 1С v8.3 1С:Управление торговлей 10 Абонемент ($m)

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

1 стартмани

18.05.2017    9911    Sanek32    6    

1

Готовые переносы данных из различных конфигураций 1C Промо

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

Hello world на metadata.js

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Про браузерные offline-first приложения можно написать миллионы слов. Сэкономлю своё и ваше время и перейду сразу к делу. В статье не будет рекламы и агитации за новые технологии, не будет критики традиционных или попсовых решений. Рассмотрим по шагам разработку простейшей программы на metadata.js. Постараюсь сделать акцент не на том «как это сделано», а «почему сделано именно так»

1 стартмани

11.08.2016    77126    unpete    209    

268

Создание внешних печатных форм под управляемым приложением с нуля

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Когда мне пришлось создавать внешние печатные формы под приложения на БСП ("1С: Бухгалтерия предприятия 3.0", "1С: Управление торговлей 11"), я обнаружил, что нет грамотных инструкций. Те, что имелись, использовали так называемые шаблоны: готовые обработки, в которых необходимо выполнять определенные корректировки. Но как создать сам шаблон, конкретных мануалов не было, справочную информацию я нашел на сайте ИТС и, обработав ее, написал статью, где подробно и понятно объясняются все этапы создания внешней печатной формы для управляемого приложения на примере конфигурации "1С: Бухгалтерия предприятия 3.0"

1 стартмани

05.06.2014    365312    signum2009    135    

682

Как написать COM-объект для 1С на Visual Studio C# 2008

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Расширяем функционал 1С с помощью разработки подключаемого COM-объекта! Пишем код на Visual C# 2008 для открытия CD-ROM'а, получения списка процессов и использования возможностей системы text-to-speech.

5 стартмани

11.09.2012    87651    RainyAugust22    59    

206

Пример печатной формы "с выбором" без формы выбора

Взаиморасчеты Инструментарий разработчика Платформа 1С v8.3 1С:Бухгалтерия 2.0 Россия Бухгалтерский учет Абонемент ($m)

Пример реализации внешней печатной формы с выбором ответственного лица без формы выбора

1 стартмани

13.06.2012    14060    Dasty    8    

12

Подборка решений для взаимодействия со ФГИС «Меркурий» Промо

С 1 июля 2019 года все компании, участвующие в обороте товаров животного происхождения, должны перейти на электронную ветеринарную сертификацию (ЭВС) через ФГИС «Меркурий». Инфостарт предлагает подборку программ, связанных с этим изменением.

Подсветка синтаксиса 1C (в том числе языка запросов) в Notepad++

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

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

1 стартмани

27.03.2012    39147    CratosX    35    

87

Текстовые экспандеры - в помощь программисту 1С

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Каждый человек старается по возможности облегчить себе труд. Программисты не исключение. Каждый день мы сталкиваемся с необходимостью писать однотипные фрагменты программного кода. Для автоматизации этого процесса система 1С:Предприятие позволяет использовать шаблоны текста (как стандартные, так и созданные пользователем). Казалось бы, что еще нужно разработчику? Однако, в некоторых случаях, стандартных средств разработки все-таки бывает недостаточно. Например, разрабатывая правила обмена в конфигурации 1С:Конвертация данных, приходится писать довольно большие тексты, не имея при этом возможности воспользоваться ни автоподстановкой, ни шаблонами. Либо, приходя к очередному клиенту, Вы обнаруживаете, что нужно написать, допустим, самую обычную печатную форму, которую Вы писали тысячу раз, но процесс ее создания может занять продолжительное время. Как раз в этом случае и могут помочь программы для вставки часто используемых выражений – текстовые экспандеры.

1 стартмани

27.07.2011    27565    tomvlad    44    

119