1с параметр фонового задания не поддерживает сериализацию
Добрый день коллеги, пытаюсь с помощью многопоточности ускорить обработку таблицы значений, но встал вопрос как эту таблицу передать в фоновое задание, через параметры если передавать, то пожирается гигов 30 памяти на сервере 1С и повисает, запуска самих заданий не дождался, есть какие идеи?
такую таблицу проще затолкать в таблицу скуля и обработать там, если она на куски не рубится
(0) И кто только придумал эту ересь - передавать огромные ТЗ в параметры фонового задания. Распараллеливают они, ппц
Лучше придумать другой алгоритм "диспетчерзиации" задач между запущенными заданиями. Так, чтобы не требовалось гонять половину базы в оперативной памяти (а это и происходит при передаче параметров фонового задания).
(3) Этот вариант оч. долго согласовывать, и скорее всего не одобрят, плюс доступы на SQL выпрашивать. И не совсем понятно как объектные сущности в таблице значений разложить в таблице SQL много шаманства по моему будет
>И не совсем понятно как объектные сущности в таблице значений разложить в таблице SQL много шаманства по моему будет
мы не в курсе накой черт тебе 12 лямов записей
(15) Передается из одной процедуры выполняемом в серверном общем модуле, в фоновое задание, которое то же на сервере выполняется.
>Как эта ТЗ формируется? Очень сложно?
запускают чего-то типа расчет себестоимости - и привет
тз ->хз. можно еще попробовать хз в строку внутреннюю.
либо тз с хз и в временный файл.
было не так давно в одной отраслевой упп.
модуль проведение документа.
внутри 2-го обход ТЧ и набивание ТЗ построчно.
теперь простая арифметика:
ТЗ = 10 000 000 строк
клиент "думает" до 2 Гб и падает
что делает клиент? звонит во франь, консультант франя заходит по rdp на сервак и (о чудо!) проводит документ. За 10 минут. Сервак 64-бит. А значит 3,5 Гб на клиента скребя ложкой по дну ему хватает.
какой вывод сделал франь?
купите 64-бит сервер 1с.
+(33) например, в фоновое передавать только организацию, подразделение и там группу какой-нить номенклатуры, а таблицу оборотов (предположим, что речь про обороты) получать из базы уже там
(33) нет, так как запрос делается по движениям в базе, которые потом либо меняются либо удаляются (после запроса), если один фон начнет менять движения, а второй начнет их только читать перед подготовкой ТЗ, то в итоге они будут работать с разными таблицами значений
(35) Пусть фоны читают ТЗ и ждут, пока все флаги в служебном регистре сведений не установятся в "Можно писать"
(37) управляемый режим давно уже включен, "ДЛЯ ИЗМЕНЕНИЯ" игнорится, наверное можно управляемую блокировку установить, только по таймауту тож легко вылететь
(36) Наверное в регистр в ресурс с типом ХранилищеЗначения проще положить саму табличку, спасиб за идею с регистром, ща буду пробовать
(38) При положении в ХЗ пойдет сериализация в XDTO + кодирование в base64, которое, я боюсь, выполнено через опу..
При извлечении из ХЗ пойдет обратный процесс.
(41) На тот невероятный случай, когда один процесс прочтет и запишет данные раньше, чем запустится другой процесс.
(29) нет, зачем франч предложил купить 64бит сервер, если он уже есть? на который консультант зашел через рдп.
(41) Пишется и читается вне транзакции, блокировки вообще не сработают, плюс (если делать в транзакции) большая вероятность таймаута
(31) распараллеливается запись одного набора?
и в наборе 12 миллионов строк?
что-то я не очень понял.
странно что все пытаются придумать что делать с тз, вместо того, чтобы удостовериться в том, что в принципе выбрана правильная методика решения задачи.
(50) тогда почему нельзя приготовить отдельные наборы с меньшим числом записей на базе этой таблицы, и передавать уже их?
(51) Мне то они не нужны, типовой расчет себестоимости в упп 1.3, по методологии расчета вопрос тож не ко мне, не я ее утверждал.
(40) Да, не получилось в ХранилищеЗначения в рег. сведений поместить, 200 тыс. записей легко прошли сек. за 20, а на 5 млн отвалилось по ошибке потока (
(58) Вы пытаетесь сделать какое-то "еврейское" распараллеливание - думаю, что ничего у Вас не выйдет. Предполагаемая модель для распределения задач по "потокам" - убога и нежизнеспособна.
Вместо того, чтобы пытаться с помощью "молотка и такой-то матери" как-то передать ТЗ "потоку" - гораздо перспективней будет подойти к вопросу с другой стороны.
Проанализировать алгоритм, определить на какие атомарные операции его можно разбить - и уже от этого "плясать"
(59) Угумс. Типы, не имеющие XDTO-сериализации - прекрасно помещаются в хранилище значения. Есть и обратные примеры - когда тип помещается в хранилище, но не имеет XDTO-сериализации.
Исследования методом "научного тыка" показали, что, помещение в хранилище значения - эквивалентно ЗначениеВСтрокуВнутр(), а не XDTO-сериализации.
(60) Все такие умные, что ППЦ.
Ну, разбей хотя бы алгоритм удаления движений по нескольку регистров на поток - заипешься код писать, а потом (самое главное) ошибки ловить. Это примитив.
А мы тут про расчет себестоимости.
+(61) Обратные примеры - когда тип имеет XDTO-сериализацию, но в хранилище значения не помещается. Очепятался
(62) Многопоточность это вообще сложно.
(64) И что? Есть типы, которые ее не имеют - но в хранилище помещаются. И наоборот, есть типы которые не помещаются в хранилище, но пишутся в XDTO
(61)
Исследования методом "научного тыка" показали.
(66) Вкратце - перебирались почти все типы встроенного языка (вплоть до ОбъектМетаданных, ИсторияРаботыПользователей, РасширенноеИмяXML - и прочего безобразия).
Для каждого типа делалась попытка:
(68) Масштабно, епта.
Результаты опубликуй.
ТЗ В XDTO есть? Нет? А если найду?!
(69) Если найду - опубликую.
Еще выяснилось, что просто ЗаписатьXML() - который метод глобального контекста - тоже сильно разнится с СериализаторXDTO.ЗаписатьXML().
ТЗ в XDTO есть :) Но это не значит, что помещение в хранилище значения - есть XDTO
(70)
ЗаписатьXML() - который метод глобального контекста - тоже сильно разнится с СериализаторXDTO.ЗаписатьXML().
(71) Это имеет не очень не много смысла.
Подозреваю, что просто ЗаписатьXML() от 8.0 остался, пока XDTO не было.
(0) Я через выгружал в текстовый файл и булками загружал во временную таблицу.
(71) Ты случайно с ЗаписатьXDTO не путаешь?
(68) Дааа, ты чертовски прав..
1) Создал справочник с реквизитом ХЗ.
Добавил в общий модуль процедуру выполнения фонового задания.
В само задание передаю в качестве параметра массив значений:
Проходит все без ошибок, но в ЖР вижу, что задание выполнено якобы с ошибками, много фактических параметров для метода фонового задания.
(15) ошибка была в том, что в вызываемой процедуре было мало входящих параметров.
Для этого и было сказано, чтобы увеличить их в самой процедуре.
Вот теперь сделано правильно. Но зачем-то и месте вызова поменяли.
Поймите главное. Даже в (11) привели информацию из СП.
В вызове метода Выполнить(, , , ) должно быть только 4 параметра и 2 параметр это массив, в котором каждый добавленный элемент это и есть добавленный параметр в порядке следования входящих параметров процедуры для вызова в фоновом задании.
Итого должно быть так:
Вызов фонового задания:
Вот так должно отрабатывать.
(3) а передаете в него аж 4 параметра. Каждый элемент массива ПараметрыФЗ это отдельный параметр для выполняемой процедуры в фоновом задании, в порядке следования.
(4)
и как выйти из ситуации?
мне нужно именоо четыре значения передать.
я хочу пакетно выполнять регл. задание.
и как раз данный метод задумывался, чтобы в фон.задание передавались данные по значениям, в которых первый пакет обрабтывается к примеру для поразделения1, потом все так же, только для подразделения2 и там далее.
(5) Значит нужно метод РасчетФоновоеВыполнение.Расчитать изменить на получение 4 параметров соответствующих типов, или переделать ПараметрыФЗ на добавление 1 элемента, в котором и передавать нужные данные. Тут уж сами решайте, как удобнее.
Вот из этого и исходите.
(8) ошибка вызова исчезнет. Но нужно понимать, что теперь в самой процедуре нужно переделывать на работу с этими параметрами.
(10) показывайте текущий запуск фонового задания и начало процедуры Выполнить из общего модуля РасчетФоновоеВыполнение
(9)
и вообще-то согласно СП
"Синтаксис:
Выполнить(, , , )
Параметры:
(обязательный)
(необязательный)
Тип: Массив.
Массив параметров, передаваемых в метод. Количество и типы параметров должны соответствовать параметрам метода.
Все передаваемые параметры должны поддерживать сериализацию. В противном случае будет выдано исключение и фоновое задание не будет запущено.
Если последние параметры метода имеют значения по-умолчанию, то их можно не задавать в массиве.
Если все параметры метода имеют значение по-умолчанию, то массив можно не передавать вообще.
Размер передаваемых данных ограничен 1 ГБ. Если внутреннее представление превышает указанное значение, будет вызвано исключение. Параметры большого размера рекомендуется передавать через базу данных."
не пойму в чем же правда и как надо.
в фоновом задании прописал так:
Задание = ФоновыеЗадания.Выполнить("РасчетФоновоеВыполнение.Расчитать", СписокНоменклатур, Параметры.ДатаНачала, Параметры.ДатаОкончания, Подразделение.Значение, Строка(Новый УникальныйИдентификатор()), НаименованиеЗадания);
Вот это совсем не так. Нужно было оставить как было раньше.
Вторым параметром передается массив, в котором каждый элемент это принимаемый параметр в вызываемой функции. Верните вызов фонового задания, как было раньше и вызов будет отрабатывать.
(14)
но ведь не отрабатывал.
само регламентное задание как-бы выполнялось, но фоновое всегда было с ошибкой.
(15) ошибка была в том, что в вызываемой процедуре было мало входящих параметров.
Для этого и было сказано, чтобы увеличить их в самой процедуре.
Вот теперь сделано правильно. Но зачем-то и месте вызова поменяли.
Поймите главное. Даже в (11) привели информацию из СП.
В вызове метода Выполнить(, , , ) должно быть только 4 параметра и 2 параметр это массив, в котором каждый добавленный элемент это и есть добавленный параметр в порядке следования входящих параметров процедуры для вызова в фоновом задании.
1С:Предприятие > 8.1.8, клиент-серверная архитектура, MS SQL.
Общий неглобальный серверный модуль. Обработка с одной формой, одной кнопкой и одним табличным полем.
Нажав кнопку на форме, запустить некий долгий алгоритм расчета так, чтобы при этом форма была доступна для нажатия других кнопок, менюшек, перемещения.
По окончании расчета передать результат расчета в табличное поле и отобразить результат.
Методика:
Как показала практика, из отработавшего фонового задания вернуть штатным путем каке-либо данные невозможно. Имеется 2 способа, позволяющих это
делать:
1) фоновое задание пишет результат своей работы в БД, обработка отслеживает, что фоновое задание завершилось и считывает из БД результат. В качестве места хранения результата предлагается
использовать регистр сведений, где измерение хранит UID экземпляра фонового задания, а ресурс имеет тип ХранилищеЗначений.
2) извращенный способ – передать значение через программную генерацию исключения (оператор «ВызватьИсключение»).
Решение:
Описывать способ с регистром сведений не буду, так как это достаточно просто реализовать, а минусом является необходимость добавления в конфигурацию регистра сведений. Поэтому опишу вариант с
«ВызватьИсключение»:
Процедура общего модуля:
Модуль формы обработки:
Результат:
Жмем кнопку. 15 секунд наслаждаемся перетаскиванием формы и прочими действиями (кроме закрытия).
Потом резко (само! шайтан! :) заполнится табличное поле на форме, чего и следовало ожидать.
Нагрузочные испытания проведены на передаче таблицы значений из 2 полей с количеством строк 100 тыс.
шт. – успешно.
Надеюсь, статья будет вам полезна.
Выражаю благодарность всем, кто помог мне осуществить данную операцию.
С уважением, Алексей Шачнев.
Вместо обработки ожидания использовал отправку датаграммы из фонового задания форме посредством MS WinSock (ActiveX)
Нужно было выполнить заполнение дерева в фоне (что бы не блокировать основной интерфейс). Нашел эту статейку.
Собственно удалось выполнить фоновое задание без "ВызватьИсключение".
8.2.19.68 (Управляемое приложение)
В рамках выполнения проекта столкнулся с интересной задачей ускорения загрузки данных из других информационных баз. Задача загрузки данных предполагала выполнение к внешней базе несвязанных между собой запросов, результаты которых помещаются в одну таблицу значений. Когда на оптимизацию запроса рука уже не поднималась, приступил к ускорению загрузки с помощью распараллеливания процессов. Отмечу, что элементы кода в данном посте приведены для клиент-серверного варианта и укрупнено для общего понимания подхода.
Что у нас в 1с Предприятии 8.2 имеется для распараллеливания & это фоновые задачи. Метод, который будет вызываться в фоновой задаче, должен быть прописан в серверном общем модуле и быть экспортным. Естественно нам понадобиться в фоновую задачу передавать и забирать значения.
Зачем нам в фоновую задачу передавать адрес во временном хранилище. Наша фоновая задача должна куда-то положить результат, причем так чтобы мы знали где его потом взять.
Для того чтобы запустить фоновые задачи выполняется следующий код:
Перед запуском фоновой задачи через ФоновыеЗадания.Выполнить() мы формируем массив параметров. Значения из массива параметров переходят в метод фонового задания в качестве параметров. В МассивЗапущенныхЗаданий хранятся все фоновые задачи, которые мы запустили. Теперь надо подождать их ожидания.
ФоновыеЗадания.ОжидатьЗавершения(МассивЗапущенныхЗаданий);
После того как все задачи были завершены, можем приступить к получению из них данных. Для этого мы проходим по всем адресам в хранилище, которые хранятся в массиве МассивАдресовВХранилище. После получения результата фонового задания перегоняем его в общую таблицу.
Вопрос определения оптимального количества потоков выходит за рамки данного поста. А после получения некоторых результатов на рабочих данных пока что выходит и за рамки моего сознания . Но если у вас есть идеи как посчитать нужное количество потоков, пишите в комментариях, с радостью почитаю.
Похожие FAQ
Автоматическое резервное копирование 1С:Предприятия в облако с помощью ПО Effector Saver 3
Всем известно, для большей гарантии восстановления важных данных, необходимо копировать архивы в несколько мест хранения. Отдельный диск может помочь в случае порчи основного, но в случае если устройство будет потеряно или украдено, он будет так же Автоматическое резервное копирование 1С:Предприятия в облако с помощью ПО Effector Saver 0
Всем известно, для большей гарантии восстановления важных данных, необходимо копировать архивы в несколько мест хранения. Отдельный диск может помочь в случае порчи основного, но в случае если устройство будет потеряно или украдено, он будет так же База 1С при запуске уходит в дамп и вылетает 1
В последнее время частенько обращаются пользователи у которых после замены или ремонта компьютера 1С не запускается, а точнее при открытии уходит в dump и вылетает. Как правило, решение одно: Отключить аппаратное ускорение видеокарты В Window Где скачать классификатор ФИАС (вместо КЛАДР) для загрузки в 1С и как установить ФИАС? 2
Думаю, уже многие слышали что KLADR заменен на ФИАС (Федеральная информационная адресная система) Единой информацией из ФИАС будут обязаны пользоваться все ведомства – ГИБДД, Росреестр, ЗАГС, ФМС России и др, в частности Почта России – которая ис Журнал транзакций для базы данных "db_buh" переполнен. Причина: "LOG_BACKUP". HRESULT=80040E14 30
При обновлении бухгалтерии, на этапе сохранения, получил следующую ошибку: Каталог не обнаружен v8srvr://sql/acc_main/configsave/e0666db2-45d6-49b4-a200-061c6ba7d569.6b9d6525-ee94-4e13-b73d-82d3e8e8441d по причине: Каталог не обнаружен Confi Посмотреть все результаты поиска похожих
Еще в этой же категории
Регламентные и фоновые задания (создание, настройка, запуск) 41
При работе в 1С встречается много рутинных операций которые должны запускаться или формироваться по расписанию выполняя то или иное действие, например: проведение документов или загрузка данных в 1С с сайта. Недавно я разместил статью: Чтение данн Фоновые задания: Пример запуска выполнения процедуры / функции на сервере 0
Как в 1С производится запуск фоновых заданий, каким образом можно получить список заданий при помощи метода "ПолучитьФоновыеЗадания()? В одном проекте понадобилось запускать выполнение выгрузки на сайт с сервера. Пользователь на своем клиенте от Посмотреть все в категории Регламентные задания, Фоновые задания
Как в 1С производится запуск фоновых заданий, каким образом можно получить список заданий при помощи метода "ПолучитьФоновыеЗадания()?
В одном проекте понадобилось запускать выполнение выгрузки на сайт с сервера.
Пользователь на своем клиенте открывает обработку, устанавливает параметры и нажимает выгрузить.
Выгрузка идет не с компьютера клиента, а создается фоновое задание на сервере!
На клиенте в модуле Кнопки Выгрузить:
ПараметрыФоновогоЗадания - это переменные функции, они задаются по порядку как определены в вызываемой функции.
На сервере в общем модуле МодульРегламентныхЗаданий:
Как Получить фоновые задания?
Напишем в процедуре обработки нажания следующий код:
Текст процедуры на сервере:
Похожие FAQ
Как заполнить табличную часть формы программно? 8
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П 10060 (0x0000274C): Попытка установить соединение была безуспешной 19
Установили новый терминальный сервер, на нем подняли 1С, терминальные пользователе неописуемо довольны, все просто летает :) И вот же надо было такому случиться, главному бухгалтеру не понравилось работать через терминал, а еще у нее свой ноутбук и 17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C: Enterprise Development Tools 50
И вот случилось долгожданное: Вышел 1C: Enterprise Development Tools - это среда для разработки конфигурации в IDE Eclipse. С сайта 1С: « 1C:Enterprise Development Tools » – это инструмент нового поколения для разработчиков бизнес-приложений систем rphost занимает память и грузит процессор 19
У многих возникают проблемы с rphost.exe, разного вида: rphost занимает всю память rphost грузит процессор rphost жрет память причем 1С даже на запущена, а в диспетчере следующее: ежеминутно расчет на 2-3 мегабайта. Как быть и что делат Посмотреть все результаты поиска похожих
Еще в этой же категории
Регламентные и фоновые задания (создание, настройка, запуск) 41
При работе в 1С встречается много рутинных операций которые должны запускаться или формироваться по расписанию выполняя то или иное действие, например: проведение документов или загрузка данных в 1С с сайта. Недавно я разместил статью: Чтение данн Фоновые задания 1С, примеры работы и параллельного запуска 7
В рамках выполнения проекта столкнулся с интересной задачей ускорения загрузки данных из других информационных баз. Задача загрузки данных предполагала выполнение к внешней базе несвязанных между собой запросов, результаты которых помещаются в одну Посмотреть все в категории Регламентные задания, Фоновые задания
Читайте также: