Фоновое задание с произвольной выборкой и произвольной обработкой

03.10.19

База данных - Инструменты администратора БД

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Фоновое задание с произвольной выборкой и произвольной обработкой:
.epf 10,81Kb
2
2 Скачать (1 SM) Купить за 1 850 руб.

Метод не уникален, есть несколько подобных публикаций, как например //infostart.ru/public/437160/, но там многопоточность и все такое. Для обычной же работы требуются более простые вещи - дать фоновому заданию некую выборку и сказать, что с ней следует сделать. Даже проще - выборку оно сделает само, мы лишь подсунем ему текст запроса с параметрами, а требуемые действия также передадим в виде строки. Итак, текст процедур, которые нужно поместить в любой неглобальный общий модуль (или создать свой):


Процедура ГрупповаяОбработка(ПараметрыДлительногоЗадания, АдресХранилища) Экспорт
	
	НачалоОбработки = ТекущаяДата();
	РезультатОбработки = Новый Структура("ОбработаноДокументов, НеУдалосьОбработать, ЗаданиеВыполнено, ТекстСообщения", 0, 0, Ложь, "");
	Запрос = Новый Запрос(ПараметрыДлительногоЗадания.ТекстЗапроса);
	Для Каждого Запись Из ПараметрыДлительногоЗадания.ПараметрыЗапроса Цикл
		Запрос.УстановитьПараметр(Запись.Ключ, Запись.Значение);
	КонецЦикла;
	Выборка = Запрос.Выполнить().Выбрать();
	Действие = ПараметрыДлительногоЗадания.Действие;
	КоличествоСтрок = Выборка.Количество();
	НомерСтроки = 0;
	НачалоСообщения = "Найдено "+КоличествоСтрок+" объектов";
	Пока Выборка.Следующий() Цикл
		НомерСтроки = НомерСтроки + 1;
		ПредставлениеДокумента = Строка(Выборка.Документ);
		Осталось = ПолучитьХодВыполнения(НачалоОбработки, НомерСтроки, КоличествоСтрок);
		Проценты = ""+Окр(НомерСтроки * 100 / КоличествоСтрок, 2)+"%  ";
		ТекстСообщения = НачалоСообщения + Символы.ПС + Проценты + Осталось + Символы.ПС + ПредставлениеДокумента;
		СообщитьХодВыполнения(ТекстСообщения);
		Попытка
			Выполнить(Действие);
			РезультатОбработки.ОбработаноДокументов = РезультатОбработки.ОбработаноДокументов + 1;
			РезультатОбработки.ТекстСообщения = ТекстСообщения;
		Исключение
			РезультатОбработки.НеУдалосьОбработать = РезультатОбработки.НеУдалосьОбработать + 1;
		КонецПопытки;
	КонецЦикла;
	РезультатОбработки.ЗаданиеВыполнено = Истина;
	ПоместитьВоВременноеХранилище(РезультатОбработки, АдресХранилища);
	
КонецПроцедуры

Функция ПолучитьХодВыполнения(НачалоОбработки, НомерСтроки, Количество)
	Затрачено = ТекущаяДата() - НачалоОбработки;
	фч = "ЧЦ=2;ЧН=;ЧВН="; // формат числа
	Осталось = Затрачено * Количество / НомерСтроки - Затрачено; // осталось секунд
	Осталось_текст = "(осталось: "+Строка(Формат(Осталось/3600, фч) + ":"+ Формат(Осталось%3600/60, фч) + ":"+ Формат(Осталось%60, фч))+")";
	Возврат Осталось_текст;
КонецФункции

Процедура СообщитьХодВыполнения(ТекстСообщения) Экспорт
 	Сообщение = Новый СообщениеПользователю;
	Сообщение.Текст = ТекстСообщения;
	Сообщение.Сообщить();
КонецПроцедуры

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

Запускается все это добро из внешней обработки, через процедуру

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

Результат можно увидеть на приложенной картинке.

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

Какие преимущества? Текст запроса задаем на клиенте, параметры тоже, действия тоже. Сегодня перепроводим счета-фактуры и перенумеруем ПКО, завтра обрабатываем справочник "Контрагенты", послезавтра обрабатываем поступления, у которых БУ и НУ по 90 счету совпадает - в фоновом задании ничего не требуется переделывать, только во внешней обработке.

Недостатки - не подходит пользователям: чтобы править запрос, нужен конфигуратор, то есть обработка предназначена для программистов. Можно, конечно, вынести текст запроса на форму и задавать там, но и здесь потребуются знания, которые есть только у программиста.

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

Разрабатывалось все под слегка измененную БП 3.0 (релиз 3.0.55.14, платформа 8.3.10.2299), но на типовой тоже пойдет. На других типовых вроде УТ или УПП тоже должно, по крайней мере если у вас есть модуль ДлительныеОперации.

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

См. также

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя. Решение в Реестре отечественного ПО

8400 руб.

20.08.2024    14967    109    46    

108

Инструменты администратора БД Инструментарий разработчика Роли и права Программист Платформа 1С v8.3 1C:Бухгалтерия Россия Платные (руб)

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

15000 руб.

10.11.2023    12014    45    33    

67

Инструменты администратора БД Роли и права Системный администратор Программист Пользователь 8.3.14 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Документооборот 1С:Зарплата и кадры государственного учреждения 3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Роли… Вы тратите много времени и сил на подбор ролей среди около 2400 в ERP или 1500 в Рознице 2, пытаясь понять какими правами они обладают? Вы все время смотрите права в конфигураторе или отчетах чтоб создать нормальные профили доступа? Вы хотите наглядно видеть какие права дает профиль и редактировать все в простом виде? А может хотите просто указать подсистему и дать права на просмотр и добавление на объекты и не лезть в дебри прав и чтоб обработка сама подобрала нужные роли? Все это теперь стало возможно! Обновление от 18.09.2024, версия 1.2

18000 руб.

06.12.2023    10874    47    8    

78

SALE! %

Инструментарий разработчика Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия Россия Платные (руб)

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

4800 3840 руб.

14.01.2013    191531    1153    0    

920

Закрытие периода Инструменты администратора БД Корректировка данных Бухгалтер Пользователь Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Расширение «Оперативное проведение» в 4 раза уменьшает время проведения документов и закрытия месяца. Является комплексным решением проблем 62 и 60 счетов. Оптимизирует проведение при включенной функциональной опции «Раздельный учет НДС». Используется в более 10 организациях уже 2 года. Совместимо с конфигурацией Бухгалтерия 3.0 (+КОРП).

14400 руб.

29.04.2020    33918    108    152    

75

Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 1C:Бухгалтерия Платные (руб)

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

3600 руб.

06.02.2017    32721    145    18    

51

Архивирование (backup) Инструменты администратора БД Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Данная разработка позволит решить вопрос с резервным копированием Ваших баз в автоматическом режиме, расположенных на сервере 1С. Система умеет ставить блокировки на вход, блокировать фоновые задания, принудительно отключать сеансы пользователей. И все это система делает в автоматически при создании бэкапа (или через команду). Выгрузка происходит в родной формат 1С - .dt. Так же система умеет архивировать данные выгрузки с установкой пароля. Умеет менять расширение файла zip или dt на любое указанное вами, что позволит сохранить выгрузки от шифровальщика. Может удалять старые копии выгрузок, оставляя указанное количество резервных копий, начиная с самой поздней. Только для WINDOWS!

6000 руб.

06.11.2012    73829    629    45    

88

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

Многие сталкиваются с проблемой когда изображения, находящиеся в базе разные по объему и размерам. Менеджеры могут добавить файлы в очень высоком разрешении, объемом свыше 20 Мегабайт. База данных становится слишком большой, выгрузка на сайт идёт медленно и требуется много место на хостинге. Как сжать картинки и уменьшить размер базы 1С? Это можно сделать с помощью данной обработки. Существует возможность выбрать различные варианты для того чтобы уменьшить картинки: в разы, в процентах от первоначального объема, а также сделать картинки одинаковой ширины. В результате размер базы 1С значительно сократится (в зависимости от количества и размера картинок), а изображения станут небольшого объема, равными по ширине, почти без потери качества. Работает на управляемых формах для УТ 11, КА, ERP.

3000 руб.

21.07.2022    10206    10    4    

18
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. AlexandrSmith 69 03.10.19 22:34 Сейчас в теме
Хорошо что вы текст печатаете можно самому попробовать, поиграться. Без покупки, но лайк, я поставил.
2. dmalyshev 23 09.10.19 10:20 Сейчас в теме
Почему механизм дополнительных внешних обработок не подошел, которые запускаются по расписанию?
user774630; +1 Ответить
3. warden 101 09.10.19 14:57 Сейчас в теме
(2) Здесь речь не про работу по расписанию, а про возможность любой код выполнить в фоне, к любой выборке, и еще следить за прогрессом.
4. bulldog 11.10.19 14:25 Сейчас в теме
можно подробнее о процедурах в обработке? как получать сообщения с фонового задания?
5. warden 101 17.10.19 15:59 Сейчас в теме
(4)Легко. За это отвечают 2 процедуры:

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

&НаСервере
Процедура ПолучитьПоследнееСообщениеФоновогоЗадания(УИДЗадания)
	
	Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(УИДЗадания);
	Если Задание = Неопределено Тогда
		Возврат;
	КонецЕсли;
	МассивСообщений = Задание.ПолучитьСообщенияПользователю(Ложь);
	Если МассивСообщений = Неопределено Тогда
		Возврат;
	КонецЕсли;
	Для Каждого Сообщение Из МассивСообщений Цикл
		ТекстПоследнегоСообщения = Сообщение.Текст;
	КонецЦикла;
	
КонецПроцедуры
Показать


Здесь ТекстПоследнегоСообщения - реквизит формы, из него берутся данные для отображения на табличном документе. Сама работа с табдоком тоже здесь.
Оставьте свое сообщение