Произвольный код в фоновом режиме

Публикация № 842660

Разработка - Практика программирования

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

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

Итак, прежде чем прикручивать педали, посмотрим что уже есть в БСП: ВыполнитьПроцедуруМодуляОбъектаОбработки(Параметры, АдресХранилища). Заполняем параметры:

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

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

&НаКлиенте
ДвоичныеДанные = новый ДвоичныеДанные(АдресФайлаОбработки());
ФайлОбработкиВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
&НаСервере
ДвоичныеДанныеНаСервере = ПолучитьИзВременногоХранилища(ФайлОбработкиВоВременномХранилище);
АдресФайлаНаСервере = КаталогВременныхФайлов()+ИмяФайла;
ДвоичныеДанныеНаСервере.Записать(АдресФайлаНаСервере);


&НаСервере
Функция АдресФайлаОбработки()
	Возврат РеквизитФормыВЗначение("Объект").ИспользуемоеИмяФайла;
КонецФункции

Итак, файл записали на сервере, запускаем фоновое задание, которому говорим запустить функцию из БСП, которая запустит наш метод из этого файла внешней обработки:

ДвоичныеДанныеНаСервере = ПолучитьИзВременногоХранилища(ФайлОбработкиВоВременномХранилище);
            АдресФайлаНаСервере = КаталогВременныхФайлов()+ИмяФайла;
            ДвоичныеДанныеНаСервере.Записать(АдресФайлаНаСервере);
            
            СтруктураПараметров = Новый Структура("РезультатЗапроса,Код,Параметры",Результат[Результат.ВГраница()],Код,ПараметрыЗапроса);    

            НаименованиеЗадания = НСтр("ru = 'Длительная операция внешней обработки'");
            
            ВыполняемыйМетод = "ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки";
            
            ПараметрыЗадания = Новый Структура;
            ПараметрыЗадания.Вставить("ИмяОбработки", АдресФайлаНаСервере);
            ПараметрыЗадания.Вставить("ИмяМетода", "ДлительнаяОперация");
            ПараметрыЗадания.Вставить("ПараметрыВыполнения", СтруктураПараметров);
            ПараметрыЗадания.Вставить("ЭтоВнешняяОбработка", Истина);
            ПараметрыЗадания.Вставить("ДополнительнаяОбработкаСсылка",Неопределено);
            //ПараметрыЗадания.Вставить("ДополнительнаяОбработкаСсылка", Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("Длительная операция"));
            
            ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
            ПараметрыВыполнения.НаименованиеФоновогоЗадания = НаименованиеЗадания;
            
            РезультатФоновогоЗадания = ДлительныеОперации.ЗапуститьВыполнениеВФоне(УникальныйИдентификатор,ВыполняемыйМетод, ПараметрыЗадания, ПараметрыВыполнения);
           
            ИдентификаторЗадания = РезультатФоновогоЗадания.ИдентификаторЗадания;

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

ПодключитьОбработчикОжидания("ПроверкаФоновогоЗадания",1,Ложь);

&НаКлиенте
Процедура ПроверкаФоновогоЗадания()
	
	Результат=ПроверкаФоновогоЗаданияНаСервере();
	Если Результат = Неопределено Тогда
		УбитьПроцесс(Неопределено);
	Иначе
		Если НЕ Результат.Состояние = "Задание выполняется" Тогда
			УбитьПроцесс(Неопределено);
		КонецЕсли;
	КонецЕсли;
	//Состояние("Выполняется алгоритм...",ПрогрессОбработки);
КонецПроцедуры

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

	Возврат Результат;
КонецФункции

&НаКлиенте
Процедура УбитьПроцесс(Команда)
	
	УбитьПроцессНаСервере();
	ОтключитьОбработчикОжидания("ПроверкаФоновогоЗадания");
	Сообщить(""+ТекущаяДата()+" задание выполнено");
	
КонецПроцедуры

&НаСервере
Процедура УбитьПроцессНаСервере()
	Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);
	Задание.Отменить();
	Элементы.ГруппаФоновоеЗадание.Видимость=Ложь;
КонецПроцедуры

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

Все описанные методы постоянно используются мной при создании обработок и периодически дорабатываются. Будут предложения как улучшить - пишите в комментариях, если сам допилю - обновлю статью. Всем Удачи!

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Infactum 290 03.09.18 17:26 Сейчас в теме
Чем типовые механизмы БСП не угодили? Там еще и контроль доступа для фонового задания задействовать можно будет.
DrAku1a; kiruha; +2 Ответить
2. zarankony 03.09.18 22:36 Сейчас в теме
(1) читал я про эти методы, к сожалению нет идентификатора задания, а хотелось бы получать прогресс и выводить сообщения из фонового задания. а то от обычного кружка или котика радости мало))
BigB; DrAku1a; Vlad33k; +3 Ответить
3. RocKeR_13 825 04.09.18 15:37 Сейчас в теме
4. zarankony 04.09.18 16:31 Сейчас в теме
(3) о да, она даже у меня в закладках есть) там есть привязка к "ИмяМодуля.ИмяЭкспортнойПроцедуры", ещё и замена общей формы, а задача - реализовать без изменения конфигурации.
5. Malfarion 200 04.09.18 18:52 Сейчас в теме
(4) Привет, не пробовал такой хак пройдет аудит на Fresh ? С учетом того что обработка во внешних, из файла понятно что не возьмет.
6. zarankony 04.09.18 21:46 Сейчас в теме
(5) Нет, не пробовал, попробуй - нам расскажешь.
7. Malfarion 200 05.09.18 01:05 Сейчас в теме
19. vadim1011985 79 03.11.18 01:04 Сейчас в теме
(2) Вот сегодня реализовал подобную хотелку
&НаКлиенте
//Процедура запускает загрузку и анализ файлов выгрузки 
// 
Процедура ЗагрузитьИЗаписать(Команда)
	
	Состояние("Начало загрузки",1,"Начало загрузки данных");
		
	ПараметрыКоманды = 
  ДополнительныеОтчетыИОбработкиКлиент.ПараметрыВыполненияКомандыВФоне(Параметры.ДополнительнаяОбработкаСсылка);
	
	ПараметрыКоманды.СопровождающийТекст = НСтр("ru = 'Подождите идет загрузка данных'");
	
	ПараметрыКоманды.ФормаВладелец = ЭтаФорма;
	
	ПараметрыКоманды.Вставить("Каталог", Объект.Каталог);
	//ПараметрыКоманды.Вставить("Объект",Объект);
	ПараметрыКоманды.Вставить("ТипЗагрузкиДокументов",Объект.ТипЗагрузкиДокументов);
	ПараметрыКоманды.Вставить("НачПериода",Объект.НачПериода);
	ПараметрыКоманды.вставить("КонПериода",Объект.КонПериода);
	
	Обработчик = Новый ОписаниеОповещения("ПослеЗавершенияДлительнойОперации", ЭтотОбъект, ПараметрыКоманды.СопровождающийТекст); 
	
	ОбработчикПрогресса =  Новый ОписаниеОповещения("ПрогрессВыполнения", ЭтотОбъект);
				
	ВыполнитьКомандуВФоне(Параметры.ИдентификаторКоманды, ПараметрыКоманды, Обработчик,ОбработчикПрогресса);

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

/// Процедура повторяет код общего модуля ДлительныеОперации.ВыпонитьвФоне . добавлен параметр оповещение о прогрессе выполнения. плюс изменены параметры структуры настройки ожидания

&НаКлиенте
Процедура ВыполнитьКомандуВФоне(Знач ИдентификаторКоманды, Знач ПараметрыКоманды, Знач Обработчик, Знач ОповещениеОПрогрессеВыполнения ) Экспорт
	
	ИмяПроцедуры = "ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне";
	ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(
		ИмяПроцедуры,
		"ИдентификаторКоманды",
		ИдентификаторКоманды,
		Тип("Строка"));
	ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(
		ИмяПроцедуры,
		"ПараметрыКоманды",
		ПараметрыКоманды,
		Тип("Структура"));
	ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(
		ИмяПроцедуры,
		"ПараметрыКоманды.ДополнительнаяОбработкаСсылка",
		ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыКоманды, "ДополнительнаяОбработкаСсылка"),
		Тип("СправочникСсылка.ДополнительныеОтчетыИОбработки"));
	ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(
		ИмяПроцедуры,
		"Обработчик",
		Обработчик,
		Новый ОписаниеТипов("ОписаниеОповещения, УправляемаяФорма"));
	
	ПараметрыКоманды.Вставить("ИдентификаторКоманды", ИдентификаторКоманды);
	ПолучатьРезультат = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыКоманды, "ПолучатьРезультат", Ложь);
	
	Форма = Неопределено;
	Если ПараметрыКоманды.Свойство("ФормаВладелец", Форма) Тогда
		ПараметрыКоманды.ФормаВладелец = Неопределено;
	КонецЕсли;
	Если ТипЗнч(Обработчик) = Тип("ОписаниеОповещения") Тогда
		ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(ИмяПроцедуры, "Обработчик.Модуль",
			Обработчик.Модуль,
			Тип("УправляемаяФорма"));
		Форма = ?(Форма <> Неопределено, Форма, Обработчик.Модуль);
	Иначе
		Форма = Обработчик;
		Обработчик = Неопределено;
		ПолучатьРезультат = Истина; // для обратной совместимости
	КонецЕсли;
	
	Задание = ДополнительныеОтчетыИОбработкиВызовСервера.ЗапуститьДлительнуюОперацию(Форма.УникальныйИдентификатор, ПараметрыКоманды);
	
	СопровождающийТекст = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыКоманды, "СопровождающийТекст", "");
	Заголовок = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыКоманды, "Заголовок");
	Если ЗначениеЗаполнено(Заголовок) Тогда
		СопровождающийТекст = СокрЛП(Заголовок + Символы.ПС + СопровождающийТекст);
	КонецЕсли;
	Если Не ЗначениеЗаполнено(СопровождающийТекст) Тогда
		СопровождающийТекст = НСтр("ru = 'Команда выполняется.'");
	КонецЕсли;
	
	//ОповещениеОПрогрессеВыполнения = Новый ОписаниеОповещения("ПрогрессВыполнения", ЭтотОбъект);
	
	НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтаФорма);
	НастройкиОжидания.ТекстСообщения       = СопровождающийТекст;
	НастройкиОжидания.ВыводитьОкноОжидания = Ложь; // Ставим ложь что бы убрать котика 
	НастройкиОжидания.ВыводитьПрогрессВыполнения = Истина;
	НастройкиОжидания.ПолучатьРезультат    = ПолучатьРезультат; // для обратной совместимости
	НастройкиОжидания.ВыводитьСообщения    = Истина;
	НастройкиОжидания.ОповещениеОПрогрессеВыполнения = ОповещениеОПрогрессеВыполнения;  // задаем наше оповещение о прогрессе выполнения  
	
	
	ДлительныеОперацииКлиент.ОжидатьЗавершение(Задание, Обработчик, НастройкиОжидания);
	
КонецПроцедуры


&НаКлиенте
Процедура ПрогрессВыполнения(Результат, ДополнительныеПараметры) Экспорт

		
	Если Результат.Статус = "Выполняется" Тогда
		Прогресс = Результат.Прогресс;
		Если Прогресс <> Неопределено Тогда
			
			Состояние (Прогресс.Текст, Прогресс.Процент,,);	
	     КонецЕсли;
	
	КонецЕсли;

КонецПроцедуры
Показать


Ну и соотвественно для сообщения прогресса использую ДлительныеОперации.СообщитьПроцесс
31. km_if 21.08.19 21:18 Сейчас в теме
(19) На БСП 3 также пытался сделать, не передаются некоторые параметры, пишет "Параметры не могут быть сериализованы".
Строки и числа передаются в ПараметрыКоманды, а что посложнее можно запихать в эти параметры, но выскакивает ошибка.
Кроме того, без БСП процедуры и функции в модуле объекта видят реквизиты объекта, а если запускать через длительную операцию, то ничего не видят - все значения пустые.
Непонятно как этим пользоватся, как сложные типы данных передавать для выполнения в длительную операцию на БСП 3?
8. asved.ru 35 05.09.18 09:25 Сейчас в теме
Необходимо понимать, что объект внешней обработки, вызов метода которого выполняется в фоне - не тот же самый объект, форма которого открыта на клиенте.
9. zarankony 05.09.18 12:01 Сейчас в теме
(8) Да, контекст в этом случае конечно отвалится. Я вообще вызываю процедуру из модуля объекта этой внешней обработки и туда передаю все что нужно. Рабочий пример если интересно здесь - https://infostart.ru/public/585055/ это по сути мой рабочий инструмент.
10. paybaseme 21 04.10.18 09:53 Сейчас в теме
11. Xershi 1018 07.10.18 15:08 Сейчас в теме
Разрозненные куски кода, почти не понятно что и откуда.
Я так понимаю тут речь идет о том как внешнюю не подключенную обработку, запущенную через файл выполнить в фоне.
В целом получилось.
Добавил на форму реквизит "ПрогрессОбработки", число. После того как убрал комент в
Состояние("Выполняется алгоритм...",ПрогрессОбработки);

Также добавил на форму реквизит "ИдентификаторЗадания", УникальныйИдентификатор.
Как сделать прогресс бар без состояния не понятно.
Если база файловая и запущена через конфигуратор в отладке, фоновое задание не стартует, но это уже вопрос к БСП.
Если подключить обработку во внешние вываливается ошибка при сохранении, я так понимаю для подключения не задумывалось.

Сделал вот такую команду:
&НаСервере
Процедура Команда1НаСервере(ФайлОбработкиВоВременномХранилище)
	
	ИмяФайла = "Загрузка курсов валют НБРБ 2.0.epf";
	
	ДвоичныеДанныеНаСервере = ПолучитьИзВременногоХранилища(ФайлОбработкиВоВременномХранилище);
	АдресФайлаНаСервере = КаталогВременныхФайлов() + ИмяФайла;
	ДвоичныеДанныеНаСервере.Записать(АдресФайлаНаСервере);
	
	//СтруктураПараметров = Новый Структура("РезультатЗапроса,Код,Параметры", Результат[Результат.ВГраница()],Код,ПараметрыЗапроса);    
	
	ОбъектВЗначении = РеквизитФормыВЗначение("Объект");
	ТекущийСписокВалют = ОбъектВЗначении.СписокВалют.Выгрузить();
	
	СтруктураПараметров = Новый Структура();
	СтруктураПараметров.Вставить("ДополнительнаяОбработкаСсылка",	Объект.ОбъектСсылка);
	//ПараметрыКоманды.Вставить("АдресРезультата",				ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор()));
	СтруктураПараметров.Вставить("СопровождающийТекст",				НСтр("ru = 'Выполняется загрузка курсов валют...'"));
	//СтруктураПараметров.Вставить("СписокВалют",						ПолучитьАдресТаблицыВалют());
	СтруктураПараметров.Вставить("СписокВалют",						ТекущийСписокВалют);
	СтруктураПараметров.Вставить("НачалоПериода",					Объект.НачалоПериода);
	СтруктураПараметров.Вставить("ОкончаниеПериода",				Объект.ОкончаниеПериода);
	
	
	НаименованиеЗадания = НСтр("ru = 'Длительная операция внешней обработки'");
	
	ВыполняемыйМетод = "ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки";
	
	ПараметрыЗадания = Новый Структура;
	ПараметрыЗадания.Вставить("ИмяОбработки", АдресФайлаНаСервере);
	ПараметрыЗадания.Вставить("ИмяМетода", "ВыполнитьКоманду");
	ПараметрыЗадания.Вставить("ПараметрыВыполнения", СтруктураПараметров);
	ПараметрыЗадания.Вставить("ЭтоВнешняяОбработка", Истина);
	ПараметрыЗадания.Вставить("ДополнительнаяОбработкаСсылка",Неопределено);
	//ПараметрыЗадания.Вставить("ДополнительнаяОбработкаСсылка", Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("Длительная операция"));
	
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = НаименованиеЗадания;
	
	РезультатФоновогоЗадания = ДлительныеОперации.ЗапуститьВыполнениеВФоне(УникальныйИдентификатор, ВыполняемыйМетод, ПараметрыЗадания, ПараметрыВыполнения);
	
	ИдентификаторЗадания = РезультатФоновогоЗадания.ИдентификаторЗадания;
	
КонецПроцедуры

&НаКлиенте
Процедура Команда1(Команда)
	
	ДвоичныеДанные = Новый ДвоичныеДанные(АдресФайлаОбработки());
	ФайлОбработкиВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
	
	Команда1НаСервере(ФайлОбработкиВоВременномХранилище);
	
	ПодключитьОбработчикОжидания("ПроверкаФоновогоЗадания", 1, Ложь);

КонецПроцедуры
Показать

Нужно еще назначить "имя файла" или на форме указывать, решил просто переменной записать.
ПараметрыЗадания.Вставить("ИмяМетода", 

Тут я так понял автор не сделал ремарку и не уточнил что это ваша процедура которая будет длительно выполняться. У меня в модуле обработки экспортная процедура в стиле БСП "ВыполнитьКоманду".
Также в "СтруктураПараметров" нужно указать ваши параметры, а не то что у автора. И вам нужно будет полностью под себя это сделать.
Плюс переписал
&НаСервере
Функция ПроверкаФоновогоЗаданияНаСервере()
	
	Результат = Новый Структура("Прогресс, Состояние");
		
	Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);
	Если Задание = Неопределено Тогда
		Возврат Неопределено;
	Иначе
		
		ЗаполнитьЗначенияСвойств(Результат, Задание);
		Результат.Состояние = Строка(Результат.Состояние);
		Сообщения=Задание.ПолучитьСообщенияПользователю(Ложь);
		Для Каждого Сообщение ИЗ Сообщения Цикл
			Если Лев(Сообщение.Текст,1) <> "{" Тогда
				Сообщить(Сообщение.Текст);
			КонецЕсли;
		КонецЦикла;
		Прогресс = ДлительныеОперации.ПрочитатьПрогресс(ИдентификаторЗадания);
		Если Прогресс <> Неопределено Тогда
			ПрогрессОбработки = Прогресс.Процент;//?(Прогресс.Процент<>0,Прогресс.Процент,ПрогрессОбработки);
		КонецЕсли;
		Результат.Вставить("Прогресс",Прогресс);
	КонецЕсли;

	Возврат Результат;
КонецФункции
Показать


В итоге что-то и вышло, но толку ноль.
По https://infostart.ru/public/525648/ уже писал обработку. Результат есть, но прогресса нет.
compaud; Franchiser; +2 Ответить
12. zarankony 08.10.18 09:35 Сейчас в теме
(11)Да, ПрогрессОбработки и ИдентификаторЗадания надо добавлять на форму, это стоило указать хотя мне и казалось чем-то само собой разумеющимся. Имя файла проще всего получить через функцию
РеквизитФормыВЗначение("Объект").ИспользуемоеИмяФайла;

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

и на самой форме
СтруктураПараметров = Новый Структура("Код",Код); //Код из реквизита формы

но это совсем упрощенно
13. Xershi 1018 21.10.18 00:24 Сейчас в теме
(12) выход вывод прогресса это не типовой функционал БСП, а нарисованная форма / элемент в обработке. Плюс как я понял нужно делать в логике длительной операции вызов процедуры:
ДлительныеОперации.СообщитьПрогресс(Окр(ПроцентВыполнения, 0), Описание);

В которую и передавать процент выполнения, а далее обработчик ожидания, его прочитает и вставит в наш реквизит.
16. Franchiser 47 31.10.18 12:31 Сейчас в теме
(11) для чего проверяется сообщение на фигурную скобку?
17. Xershi 1018 31.10.18 13:44 Сейчас в теме
(16) когда длительная операция возвращает результат, то он в хмл, вот автор это и проверяет!
14. Franchiser 47 31.10.18 12:13 Сейчас в теме
Если на форме обработки идёт прогресс, у тебя остаются кликабельными кнопки и остаётся возможность менять реквизиты у пользователя в процессе выполнения длительной операции, или ты это запрещаешь?
18. zarankony 03.11.18 00:41 Сейчас в теме
(14) менять реквизиты на ходу не получится, только перезапускать сеанс или мутить хранилище со значениями реквизитов и получать их в цикле. Тут надо понимать, что выполнение кода - это уже отдельный сеанс, основной сеанс о нем знает по идентификатору, а второй сеанс о первом не знает впринципе. Как я уже говорил пример где это работает здесь: https://infostart.ru/public/585055/ кода много в итоге, не уверен что Вам все нужно.
20. Franchiser 47 03.11.18 01:32 Сейчас в теме
(18) речь не об этом, я не понимаю почему выбраеа такая технология : размещать прогресс на той же форме, а не открывать отдельную как в бсп.
В этом случае же есть недостатки:
1. Нужно постоянно во все свои доработки вносить намыорму прогресс и код для фонового задания
2. Когда пользователь запустил длительный процесс, он может в форме продолжать что-то творить , т.к. она осталась не заблокированной.

Мне кажется удобнее когда форма прогресса открывактся отдельно с блокированием прогоесса.
P.s. Обработку посмотреть не могу, нет см.
21. zarankony 03.11.18 22:50 Сейчас в теме
(20) нет особых проблем с тем чтобы заблокировать форму, это уже по желанию Доступность = ложь; для всех элементов кроме кнопок управления внешним процессом. Вообще идея в том чтобы код можно было вписывать в текстовое поле или например хранить в файлах, то есть обработка одна, а вариантов запускаемого кода много.
15. Franchiser 47 31.10.18 12:15 Сейчас в теме
До конца не понятно какие процедуры используются, т.к. указаны части кода из процедур, можешь привести код всех процедур полностью?
22. compaud 08.11.18 16:44 Сейчас в теме
Что то я не понял что и как нужно сделать.

Я хочу сформировать табличный документ. Каждая строчка которого долго делается.

В одной обработке в модуле объекта я пишу

Процедура ДлительнаяОперация() ЭКСПОРТ
	
	Дата = ТекущаяДата();
	
	Пока Дата <= Дата+60000 Цикл
		Сообщить(ТекущаяДата());
	КонецЦикла;
	
	
КонецПроцедуры
Показать


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

Потом я делаю еще 1 обработку:

&НаКлиенте
Процедура Сформировать(Команда)
	СформироватьнаСервере();	
	
	ПодключитьОбработчикОжидания("ПроверкаФоновогоЗадания",1,Ложь);
	
	
	
КонецПроцедуры


Процедура СформироватьнаСервере()
	
	ПараметрыЗадания = Новый Структура;
	ПараметрыЗадания.Вставить("ИмяОбработки", Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("ПроверкаСтатусБар"));
	
	
	
	СтруктураПараметров = Новый Структура();//("РезультатЗапроса,Код,Параметры",Результат[Результат.ВГраница()],Код,ПараметрыЗапроса);    
	
	НаименованиеЗадания = НСтр("ru = 'Длительная операция внешней обработки'");
	
	ВыполняемыйМетод = "ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки";
	
	ПараметрыЗадания = Новый Структура;
	ПараметрыЗадания.Вставить("ИмяОбработки", Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("ПроверкаСтатусБар"));
	ПараметрыЗадания.Вставить("ИмяМетода", "ДлительнаяОперация");
	ПараметрыЗадания.Вставить("ПараметрыВыполнения", СтруктураПараметров);
	ПараметрыЗадания.Вставить("ЭтоВнешняяОбработка", Истина);
	ПараметрыЗадания.Вставить("ДополнительнаяОбработкаСсылка",Неопределено);
	//ПараметрыЗадания.Вставить("ДополнительнаяОбработкаСсылка", Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("Длительная операция"));
	
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = НаименованиеЗадания;
	
	РезультатФоновогоЗадания = ДлительныеОперации.ВыполнитьВФоне(ВыполняемыйМетод,ПараметрыЗадания,ПараметрыВыполнения);
	//ЗапуститьВыполнениеВФоне(УникальныйИдентификатор,ВыполняемыйМетод, ПараметрыЗадания, ПараметрыВыполнения);
	
	ИдентификаторЗадания = РезультатФоновогоЗадания.ИдентификаторЗадания;
	
	
	
	
КонецПроцедуры


&НаКлиенте
Процедура ПроверкаФоновогоЗадания()
	
	Результат=ПроверкаФоновогоЗаданияНаСервере();
	Если Результат = Неопределено Тогда
		УбитьПроцесс(Неопределено);
	Иначе
		Если НЕ Результат.Состояние = "Задание выполняется" Тогда
			УбитьПроцесс(Неопределено);
		КонецЕсли;
	КонецЕсли;
	//Состояние("Выполняется алгоритм...",ПрогрессОбработки);
КонецПроцедуры

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

	Возврат Рез;
КонецФункции

&НаСервере
Процедура УбитьПроцессНаСервере()
	Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);
	Задание.Отменить();
//	Элементы.ГруппаФоновоеЗадание.Видимость=Ложь;
КонецПроцедуры
Показать


На форме 2 обработки создал реквизит ИдентификаторЗадания типа УникальныйИдентификатор

Ну и ничего не работает.

Какой нибудь пример бы чистый.
И я не понимаю еще вот что, этот код опрашивает 1 раз фоновое задание. О каком статус баре идет речь не пойму. Сложно в общем что то
23. vadim1011985 79 08.11.18 17:03 Сейчас в теме
(22) У Вас дополнительная внешняя обработка ?
24. compaud 09.11.18 09:10 Сейчас в теме
(23) да, в этом и смысл. В одну все поместить так понимаю нельзя. Ну хоть в 2
25. vadim1011985 79 09.11.18 10:01 Сейчас в теме
Почему нельзя ? Все можно . Вам просто надо все сделать правильно.
1) добавить 2 ключевых параметра Идентификатор команды - тип строка и ДополнительнаяОбработкаСсылка с типом Справочник ссылка Дополительные внешние отчеты и обработки
2) в модуле формы создать команду которая будет запускать длительную операцию ( но это не сама длительная операция ) см мой 19 ответ в этой теме процедура ЗагрузитьИЗаписать только надо будет заменит ВыполнитьКомандуВФоне на ДлительныеОперацииКлиент.ВыполнитьКомандуВФоне

3) В модуле объекта пишешь функцию регистрации внешней обработки (сведения о внешней обработке )
И добавляешь процедуру ВыполнитьКоманду ( ИдентификаторКоманды,Параметрывыполнения) - тут могу ошибиться как звучит второй параметр , в которой реализуешь свою длительную операцию

Вот и все
RFP; Xershi; +2 Ответить
26. zarankony 09.11.18 12:32 Сейчас в теме
(25) Зачем регистрировать? то есть можно и регистрировать, но идея в том что БСП-шная процедура ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки открывает обработку просто как внешний файл и выполняет экспортную процедуру из её модуля. Команда здесь тоже не нужна, хотя наверное и через неё можно.
27. vadim1011985 79 09.11.18 12:39 Сейчас в теме
(26) я описал типовой механизм вызова длительной операции из внешней обработки как это рекомендует 1с.

Просто не понимаю зачем такие сложности получить обработку - передать на сервер и т.д. и т.п. Если есть внешняя обработка код которой нужно выполнить в фоне то это делается просто

Плюс вам писали про стандартные методы БСП и Вы сказали что Вам не нравится что нет идентификатора задания и котик вам не нравится и хотелось бы получать прогресс , но как я Вам уже отвечал это все решаемо , как раз Ваша статья на ряду с другими на эту тему натолкнула меня на мысль написать свою хотя она повторят то чт оо чем я писал тут выше
28. victor_k 30.01.19 02:37 Сейчас в теме
Спасибо! Разобрался, использую
29. EvgenS 22.06.19 17:34 Сейчас в теме
Я то то не так понял или фоновое задание которое будет выполняться должно располагаться в конфигурации, а не в обработке?
30. zarankony 24.06.19 09:19 Сейчас в теме
(29)в обратотке, в модуле объекта. В конфигурации должна быть БСП с методом ДлительныеОперации.ЗапуститьВыполнениеВФоне.
32. km_if 21.08.19 21:43 Сейчас в теме
(30)
...
ПараметрыКоманды.Вставить("Каталог", Объект.Каталог);
//ПараметрыКоманды.Вставить("Объект",Объект);
ПараметрыКоманды.Вставить("ТипЗагрузкиДокументов",Объект.ТипЗагрузкиДокументов);
ПараметрыКоманды.Вставить("НачПериода",Объект.НачПериода);
ПараметрыКоманды.вставить("КонПериода",Объект.КонПериода);
...
Можно ли в этих параметрах передавать что то сложнее чем число или сторку? Хотел бы передать ТЗ и КомпановщикНастроек.
33. vadim1011985 79 21.08.19 22:05 Сейчас в теме
(32) что мешает поместить тз во временное хранилище , и через параметры передать адрес
34. km_if 21.08.19 23:49 Сейчас в теме
(33)Насколько понял, создается другой сеанс для длительной операции. Поэтому переменная во временном хранилище, созданном в другом сеансе наверно видна не будет. А передать ее стандартным способом не получается, потому что она не сериализируется.
35. vadim1011985 79 22.08.19 01:47 Сейчас в теме
(34) не очень вас понял - посмотрите в стандартных конфигурациях - там сплошь и всюду так делается.
37. km_if 22.08.19 11:56 Сейчас в теме
(35)Попробывал даже вот так - https://forum.infostart.ru/forum9/topic118827/
В процедуре формы оборачивал нужную переменную в структуру, а потом помещал в хранилище.
При попытке получить переменные в "Процедура ВыполнитьКоманду" из временного хранилища по переданным адресам ничего нет.
38. vadim1011985 79 22.08.19 12:11 Сейчас в теме
(37) Смотрите - основная проблема у вас в том что вы хотите передать то , что не может быть передано с клиента на сервер, ТЗ например таким способом передать можно
39. km_if 22.08.19 16:54 Сейчас в теме
(38) ТЗ через временное хранилище тоже пустая.
Получается варианта два - либо я неправильно передаю, либо это вообще передавать не нужно.
Для чего все это. В модуле объекта внешней обработки я в цикле формирую отчеты (по времени долго), для которых и пытаюсь передать отборы любым способом, и все это пытаюсь передать на сервер для организации длительной обработки. Внешнюю обработку естественно помещаю в "Дополнительные отчеты и обработки".
Как можно обойтись без этого?
36. km_if 22.08.19 09:43 Сейчас в теме
(35) До передачи в ПараметрыКоманды попробывал поместить:

АдресВХранилищеОтборы = ПоместитьВоВременноеХранилище(Объект.Отборы, Новый УникальныйИдентификатор);


Отборы - реквизит объекта внешней обработки, тип "КомпоновщикНастроекКомпоновкиДанных"

"Ошибка при выполнении запроса POST к ресурсу /e1cib/files/9ead0971-78e9-4061-8983-34f3c58b5395:
Переданное значение не может быть помещено во временное хранилище".
40. user1095593 25.09.19 15:36 Сейчас в теме
nikita0832, ты можешь сбросить сам файл обработки? Уже два дня мучаюсь не могу толком разобраться... везде только обрывки кода или разные способы, которые не получается довести до ума... Очень хочу с этим разобраться.
41. zarankony 25.09.19 15:40 Сейчас в теме
42. cyborg55 31 23.10.19 16:22 Сейчас в теме
nikita0832, а можно мне тоже пример файла обработки, пжт
Оставьте свое сообщение

См. также

Использование программных перечислений, ч.1: строковые константы Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Часто ли у вас возникает необходимость в коде выполнять сравнение на строку?

10.12.2016    37241    unichkin    74    

Программная работа с настройками СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

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

27.01.2020    25578    ids79    26    

[СКД] Программное создание схемы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

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

15.01.2020    23046    John_d    22    

Последовательности событий. Шпаргалка

Практика программирования v8 Россия Бесплатно (free)

Собрал информацию о событиях/подписках/расширениях в одном месте.

30.12.2019    17605    kuzyara    33    

Вспомогательные инструкции в коде 1С Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

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

15.10.2018    30100    tormozit    100    

30 задач. Странных и не очень

Практика программирования v8 Бесплатно (free)

30 задач на знание языка программирования 1С и некоторого поведения платформы. Маленьких. Странных и не очень.

02.12.2019    16877    YPermitin    72    

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

Практика программирования v8 Бесплатно (free)

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

22.11.2019    8274    Sibars    19    

Таблица значений. Нюансы

Практика программирования v8 Бесплатно (free)

Обзор некоторых аспектов использования общеизвестного инструмента 1С.

01.10.2019    32550    Yashazz    50    

Оформление и рефакторинг сложных логических выражений Промо

Практика программирования v8 Россия Бесплатно (free)

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

20.09.2012    77861    tormozit    131    

О программе Postman для тестирования API и для чего она нужна 1С-нику

Практика программирования Программное обеспечение (software) v8 Бесплатно (free)

Для чего нужна программа Postman для тестирования API и какая от него польза для 1С-программиста.

24.09.2019    11615    budidich    28    

[Шпаргалка] Программное создание элементов формы

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

Программное создание практически всех популярных элементов формы.

06.09.2019    48568    rpgshnik    63    

Агрегатные функции СКД, о которых мало кто знает

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    48485    ids79    54    

Запись значения в поле ввода/формы со срабатыванием события ПриИзменении Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

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

11.07.2007    48205    tormozit    41    

Регистры бухгалтерии. Общая информация

Практика программирования Математика и алгоритмы v8 v8::БУ БУ Бесплатно (free)

Общая информация о внутреннем устройстве регистров бухгалтерии.

05.09.2019    27930    YPermitin    24    

Три костыля. Сказ про фокусы в коде

Практика программирования v8 Бесплатно (free)

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

03.09.2019    25336    YPermitin    80    

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

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

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

17.08.2019    31175    ids79    16    

Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Как сделать метод формы, доступный на клиенте и на сервере одновременно, и сохранить при этом удобство разработки

10.09.2017    44640    tormozit    74    

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    79853    ids79    49    

Фоновое выполнение кода в 1С - это просто

Практика программирования v8 1cv8.cf Бесплатно (free)

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

02.08.2019    34479    avalakh    22    

Разбираемся с параметрами редактирования СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Связь по типу, Параметры выбора, Связи параметров выбора

31.07.2019    23315    json    13    

Выгрузка документа по условию Промо

Практика программирования Разработка v8 Бесплатно (free)

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    16013    m-rv    2    

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    58322    ids79    11    

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ

Инструментарий разработчика Практика программирования v8 v8::СКД Бесплатно (free)

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    35436    ids79    27    

Регистры сведений. За кулисами

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Небольшие заметки по внутреннему устройству регистров сведений.

09.07.2019    25867    YPermitin    14    

Как прикрутить ГУИД к регистру сведений Промо

Практика программирования Перенос данных из 1C8 в 1C8 Разработка v8 Бесплатно (free)

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

16.04.2019    20143    m-rv    17    

"Меньше копипаста!", или как Вася универсальную процедуру писал

Практика программирования Разработка v8 v8::СКД 1cv8.cf Бесплатно (free)

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    19554    SeiOkami    50    

Работа с настройками системы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

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

02.07.2019    45564    ids79    17    

Создание отчетов с помощью СКД - основные понятия и элементы

Практика программирования Математика и алгоритмы v8 v8::СКД Бесплатно (free)

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    51764    ids79    25    

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

Практика программирования v8 v8::Запросы 1cv8.cf Бесплатно (free)

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

01.06.2018    30488    m-rv    21    

Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017

Практика программирования Производительность и оптимизация (HighLoad) v8 v8::Запросы Бесплатно (free)

Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.

11.06.2019    24840    dmurk    145    

Регистры накопления. Виртуальные таблицы. Часть №2: "Остатки" и "Остатки и обороты"

Практика программирования v8 1cv8.cf Бесплатно (free)

Описание работы платформы 1С:Предприятие 8.2 с виртуальными таблицами регистров накопления "Остатки" и "Остатки и обороты". Анализ SQL-запрос при работе с виртуальными таблицами

22.05.2019    24324    YPermitin    7    

Регистры накопления. Структура хранения в базе данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Структура хранения регистров накопления в базе данных для платформы 1С:Предприятие 8.x. Первая часть в серии публикаций.

16.05.2019    42475    YPermitin    30    

Метод формирования движений в типовых регистрах нетиповыми регистраторами Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

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

05.12.2017    28205    itriot11    34    

О расширениях замолвите слово...

Практика программирования Разработка v8 Бесплатно (free)

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    35152    ellavs    126    

Git-репозитории для 1С-кода (опыт использования при небольших проектах)

Практика программирования v8 Бесплатно (free)

Инструкции по взаимодействию с Git-репозиторием, которые писались для тех наших программистов, которые вообще никогда не работали с Git (руководства в духе "Как получить код из git-репозитория?", "Как отправить код в git-репозиторий")...

28.03.2019    27298    ellavs    89    

Трюки с внешними источниками данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Некоторые трюки для преодоления ограничений внешних источников данных.

14.03.2019    31157    YPermitin    53    

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

Практика программирования Разработка внешних компонент Универсальные функции v7.7 v8 Бесплатно (free)

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

27.01.2016    76210    Serginio    108    

Ошибки при работе с хранилищем конфигурации и способы их решения

Практика программирования v8 Бесплатно (free)

В статье собраны наиболее распространенные ошибки при работе с хранилищем конфигурации и способы их обхода и решения.

01.03.2019    38674    Смешной 1С    28    

Разработка и сценарное тестирование с Vanessa-ADD. Отчетность Allure. Автоматизация запуска сценариев

Практика программирования Vanessa Automation v8 Россия Бесплатно (free)

Формируем отчетность о результатах выполнения сценариев. Автоматизируем запуск.

26.02.2019    21788    Vladimir Litvinenko    27    

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С Промо

Математика и алгоритмы Практика программирования v8 v8::blocking 1cv8.cf Бесплатно (free)

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    34532    ids79    40    

Возможности типовых шаблонов ограничения доступа на уровне записей (RLS)

Практика программирования БСП (Библиотека стандартных подсистем) Роли и права v8 v8::Права Бесплатно (free)

Краткий обзор применения типовых шаблонов ограничения доступа на уровне записей в конфигурациях, созданных на базе БСП: #ПоЗначениям, #ПоНаборамЗначений, #ПоЗначениямРасширенный, #ПоЗначениямИНаборамРасширенный

03.02.2019    38942    ids79    9    

Тестер: частые вопросы Промо

Практика программирования v8 Бесплатно (free)

Ошибкам бой - тесты норма жизни!

25.07.2018    29176    grumagargler    28    

EnterpriseData – часть 2. Процесс выгрузки данных

Практика программирования Обмен через XML v8 v8::УФ Россия Бесплатно (free)

Основные этапы выгрузки данных через ED, обработчики событий выгрузки, правила обработки данных, правила конвертации объектов, конвертация свойств первого и второго этапов, процедуры БСП, используемые при выгрузке данных, структура «КомпонентыОбмена».

26.12.2018    26617    ids79    31    

Новый подход к обмену данными EnterpriseData

Практика программирования Обмен через XML v8 v8::УФ Россия Бесплатно (free)

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

14.12.2018    41102    ids79    72    

EnterpriseData - пример доработки правил конвертации без использования КД 3.0 в расширении конфигурации

Практика программирования Обмен через XML v8 v8::УФ БП3.0 УТ11 Россия Бесплатно (free)

В статье подробно описан реальный пример доработки обмена данными через EnterpriseData (универсальный формат обмена) между конфигурациями УТ 11.4 и Бухгалтерия 3.0

16.11.2018    36768    ids79    42    

Ускоряем 1С: модули с повторным использованием возвращаемых значений Промо

Практика программирования v8 Бесплатно (free)

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

04.09.2017    52498    m-rv    61    

Программное заполнение пользовательских параметров и отборов СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

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

13.11.2018    46904    Unk92    25