Выбор процессора для 1С: конец споров или начало?

25.05.20

База данных - HighLoad оптимизация

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

Компьютеры, принтеры, процессоры... (с)

ВВЕДЕНИЕ

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

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

СБОР ДАННЫХ

Для сбора данных я использовал последнюю версию теста Гилева, в которой произвел тест своего компьютера - скромного ноутбука от HP с процессором Intel 8250U, 16 Гиб ОЗУ (2х8х2400 МГц) и SSD от SmartBuy - какой-то самый дешманский винт на полгига, который, кстати, работает быстрее основного винта от самсунга (SSD овер M2, 128 Гиг). Также в системе установлен Linux Mint с ядром 5.3.0.53 из стандартного репозитория, ядро это запускается без каких бы то ни было опций.

После теста файловой базы на экране отобразилось количество попугаев (80.65) и список произведенных тестов за всю тестовую историю (наверное).

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

В постгресе я создал табличку (без всяких там индексов) с полями: period, user, value, arch и proc, после чего попытался загрузить туда данные. Загрузка выдала ошибку в формате даты. После кучи попыток привести дату к вменяемому состоянию я натыкался на ошибку часового пояса, в качестве которого система пыталась интерпретировать поле с именем пользователя. В итоге трабла оказалась в разделителе, и поменяв ТАБ на "|" загрузка прошла. Вот команда, которой я преобразовал выгруженный файл в тот, который смог скушать постгрес:

sed -e 's/|/\_/g' \
-e 's/^\([0-9]\{2\}\)\.\([0-9]\+\)\.\([0-9]\+\)\s*[0-9:]\+\t/\3-\2-\1|/g' \
-e 's/\t/\|/g' \
-e 's/\([0-9]\+\)\,\([0-9]\+\)/\1\.\2/g' \
-e 's/||\B/|/g' \
-e '/||/d' \
gilev.txt > gilev1.txt

Здесь символ "\" означает перенос строки - в консоли Linux так делать можно и нужно.

Сначала я меняю все палки на подчеркивания, чтобы в последствии эти палки не были интерпретированы постгресом, как разделители. Дальше я меняю дату из формата ДД-ММ-ГГГГ ЧЧ:ММ:СС на ГГГГ-ММ-ДД, дальше меняю все ТАБ на "|", потом меняю запятые в дробном результате выгрузки на точки, потом меняю двойной разделитель в конце строки на одинарный (в случае, когда имя процессора отсутствует - это, обычно, клиент для Linux, в котором тест Гилева не может определить имя процессора - это можно сделать чтением /proc/cpuinfo - там есть и ядра, и частота, и вся прочая дичь). Дальше удаляю все строки, в которых идут два разделителя подряд - случаи, в которых значение теста равно нулю.

В итоге получаю файл с количеством строк, равным 227 493 (первая строка - заголовок):

$ head gilev1.txt -n 5
Период|Пользователь имя|Значение|Архитектура|Процессор наименование
2020-05-22|starik2005@bk.ru|80.65|Файловая|
2020-05-22|ssa2|28.25|SQL|Intel(R) Xeon(R) CPU E5-2640 v3 @ 2.60GHz
2020-05-22|SKUL-02@Eugenbot|24.39|SQL|Intel(R) Xeon(R) CPU E31275 @ 3.40GHz
2020-05-22|efsol@efsol.ru|13.23|SQL|Intel(R) Xeon(R) Gold 6242 CPU @ 2.80GHz

$ tail gilev1.txt -n 3
2014-04-10|sergey@savel.pro|7.58|SQL|Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz
2014-04-10|sergey@savel.pro|7.53|SQL|Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz
2014-04-10|sergey@savel.pro|7.59|SQL|Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz

$wc gilev1.txt -ml
  227493 16511743 gilev1.txt

Таким образом у нас здесь данные тестов с 4 октября 2014-го по 22 мая 2020-го, последний тест - мой (заметьте, нет названия процессора для Linux).

АНАЛИЗ

Для анализа данных я загрузил этот файл в постгрес - просто жамкнул правой кнопкой мышки в PgAdmin III на имени таблицы, выбрал "Импорт", выбрал файл, указал CSV, заголовок, кодировку и разделитель. Через секунду данные были загружены.

Дальше я написал вот такой вот запросик:

with
    t
    AS
    (
        select arch, case when proc is null then '-' else proc end as proc , max(value) as value
        from gilevtest
        group by arch,proc
    )
select t1.arch, t1.proc, max(t1.value), min(t1.value), avg(t1.value), sum(1)
from gilevtest as t1
    join t as t
    on t.proc = case when t1.proc is null then '-' else t1.proc end and t.arch = t1.arch
where t1.value > t.value / 2 and t1.value < 150
--and t1.proc like '%Xeon%'
group by t1.arch,t1.proc
having sum(1) > 100
order by t1.arch, avg(t1.value) desc, t1.proc 

Время выполнения этого запроса безо всяких индексов с первого раза всего ОДНА секунда.

Здесь я использовал общее табличное выражение - директива WITH, в котором я для каждого процессора получил среднее значение, чтобы потом убрать очень низкие результаты теста, которые были по всей видимости произведены в каких-то особенно плохих условиях. Фактически я здесь отрезаю все результаты, которые ниже половины среднего значения для этого процессора и выше 150. Ну и результат группирую по архитектуре и процессору, сортируя по убыванию среднего значения. Думаю, что можно было бы для этого использовать оконную функцию OVER, но до конца не понял, как ее тут применить )))

Кстати, там есть закомментированная строка с отбором по только по серверным процессорам Xeon - этим мы займемся между делом, попытавшись ответить на вопрос, какой же процессор имеет смысл тащить с китайских барахолок и сколько он стоит )))

Также я убрал процессоры, для которых было набрано меньше СОТНИ результатов тестирвоания.

РЕЗУЛЬТАТЫ

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

Файловая база

> 80

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

arch proc Max Min Avg
Файловая Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz 119,05 62,5 95,87
Файловая - = LINUX = - 142.86 72.46 95.40
Файловая Intel(R) Core(TM) i7-6700K CPU @ 4.00GHz 128.21 78.13 94.98
Файловая Intel(R) Core(TM) i7-8700K CPU @ 3.70GHz 111.11 80.65 91.27
Файловая Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz 113.64 57.47 87.32
Файловая Intel(R) Core(TM) i7-4790K CPU @ 4.00GHz 106.38 54.95 83.74
Файловая Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz 111.11 55.56 83.15
Файловая Intel(R) Core(TM) i5-9600K CPU @ 3.70GHz 113.64 57.47 81.53


В итоге лидером у нас становится I9-9900K, что ожидаемо. Более быстрые процессоры от AMD просто не прошли ценз количества, т.к. AMD Ryzen 3900X показывает лучший результат, но его тестировали МЕНЕЕ ДЕСЯТИ раз.

На втором месте у нас безымянный процессор - это все процессоры, протестированные на платформе Linux в фвйловой базе - 303 результата. Где-то там есть и наш рабочий AMD Ryzen 3600, который в файловом тесте на платформе Linux набрал 125 попугаев, при том на винде эта цифра была в районе 80-ти, что как бы намекает...

Дальше идут разнообразные I7, замыкает топ лидеров I5-9600K. Думаю, что для бюджетных серверов этот процессор является самым предпочтительным по цене за попугай (если не считать Райзен 3600 с вдвое большим количеством потоков за немного меньшие деньги, или даже райзен 3500X, в котором потоков столько же, но в 4 раза больше кеша и цена ниже 10к, но т.к. тестов райзена очень мало, то считайте это моей субъективной оценкой).

70-80

arch proc Max Min Avg
Файловая Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz 108.7 56.18 79.40
Файловая Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz 96.15 48.08 78.87
Файловая Intel(R) Xeon(R) E-2288G CPU @ 3.70GHz 98.04 54.95 74.68
Файловая Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz 100 50.51 74.24
Файловая Common KVM processor 106.38 53.76 73.18
Файловая Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz 100 50.51 70.48
Файловая Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz 90.91 46.3 70.22

 

Итак, в списке процессоров со средним баллом в файловой между 70 и 80 у нас ожидаемо все те же процессоры от Intel, но без суффикса "К", т.е. с заблокированным множителем и их типа нельзя гнать. Это говорит о том, что в общем и целом я использую правильную методику тестирования и данные очень коррелируют с маркетинговыми выкладками от Intel, позиционирующую процессоры со свободным множителем, как более быстрые (но, правда, и более дорогие). Да, они действительно более быстрые - тест Гилева это доказал.

Здесь у нас появляется "самый крутой" XEON - E2288G, который смог добраться до 74,68 попугаев. В принципе это аналог I9-9900K по ядрам/потокам/частоте, да и рассчитан на всего ОДИН сокет, имеет 2-х канальную память и стоимость в районе 50к. Смысла в его приобретении не вижу никакого.

Ну и "Common KVM processor" тут тоже засветился, что говорит о том, что для виртуальных сред не все потеряно.

60-70

arch proc Max Min Avg
Файловая Intel(R) Core(TM) i5-4670 CPU @ 3.40GHz 84.75 42.74 66.01
Файловая Intel(R) Xeon(R) CPU E5-2637 v4 @ 3.50GHz 80.65 43.86 64.65
Файловая Intel(R) Xeon(R) CPU E5-2667 v3 @ 3.20GHz 102.04 51.55 63.69
Файловая Intel(R) Core(TM) i5-3570K CPU @ 3.40GHz 86.21 44.25 62.79
Файловая AMD Ryzen 5 2600 Six-Core Processor 84.75 42.74 62.60
Файловая Intel(R) Core(TM) i3-4170 CPU @ 3.70GHz 76.92 40.32 62.11
Файловая Intel(R) Core(TM) i3-8100 CPU @ 3.60GHz 78.13 42.74 61.41
Файловая Intel(R) Core(TM) i5-7400 CPU @ 3.00GHz 81.97 41.32 61.29
Файловая Intel(R) Core(TM) i3-7100 CPU @ 3.90GHz 83.33 44.25 61.19
Файловая Intel(R) Core(TM) i5-3570 CPU @ 3.40GHz 79.37 40.65 61.15
Файловая Intel(R) Core(TM) i5-4460  CPU @ 3.20GHz 87.72 44.25 60.79
Файловая Intel(R) Xeon(R) CPU E3-1230 V2 @ 3.30GHz 75.76 39.06 60.78
Файловая Intel(R) Core(TM) i3-6100 CPU @ 3.70GHz 79.37 40 60.50
Файловая Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz 80.65 41.32 60.16
Файловая Intel(R) Core(TM) i5-3550 CPU @ 3.30GHz 83.33 41.67 60.13

 

Вот тут уже интересно - появляются базарные Xeon'ы, которые в принципе имеет смысл тащить с Китая, но их цены будут далеко не три копейки - ройте алик. Среди них выделяется E5-2667 v3, который в максимуме преодолевает планку в сотню попугаев, при том его цена на алике в районе 200 долларов, на e-bay - в районе 7к рублей, а в местной рознице - 140к, что как бы намекает бессмысленность его покупки у местных барыг )))

Также тут появился первый процессор от AMD, который в пределе набирает здесь 84,75 попугаев. Но это винда, а на Linux даже мой Ryzen 1600 набирает в пределе 89 попугаев, при этом ZEN+ должен набирать где-то под СТО (т.к. Ryzen 3600 на ZEN2 набирает 125).

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

ИТОГИ ТЕСТА ФАЙЛОВОЙ

Итак, по итогам теста объективно самое лучшее решение для малобюджетного компьютера для 1С (например, компьютер разработчика с множеством файловых баз) - это компьютер на базе i5-9600K за 15 тысяч рублей (стоимость процессора). Субъективно же в качестве самого бюджетного лидера лично я бы взял AMD Ryzen 3600 или 3500X, кои в тесте отсутствуют из-за очень небольшого количества проведенных на них тестов, а эти тесты не могут показать объективную картину.

SQL - КЛИЕНТ-СЕРВЕРНЫЙ ВАРИАНТ

Я здесь не разделял PostgreSQL и MS SQL, т.к. для однопоточного теста Гилева разница средних значений для них несущественна.

> 40

arch proc Max Min Avg
SQL Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz 68.49 34.25 46.43
SQL - = LINUX = - 76.92 38.76 45.53
SQL Intel(R) Core(TM) i7-6700K CPU @ 4.00GHz 68.49 34.25 44.75
SQL Intel(R) Core(TM) i5-9600K CPU @ 3.70GHz 62.5 31.65 44.52
SQL Intel(R) Core(TM) i7-4790K CPU @ 4.00GHz 64.1 32.26 43.30
SQL Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz 64.1 32.26 42.81
SQL Intel(R) Xeon(R) Gold 6144 CPU @ 3.50GHz 60.98 30.67 42.04
SQL Intel(R) Xeon(R) Gold 6154 CPU @ 3.00GHz 67.12 33.78 41.74
SQL Intel(R) Xeon(R) W-2145 CPU @ 3.70GHz 58.14 29.24 41.72
SQL Intel(R) Core(TM) i7-8700K CPU @ 3.70GHz 65.79 33.11 41.10
SQL Intel(R) Xeon(R) Gold 5122 CPU @ 3.60GHz 52.63 26.6 40.89
SQL Intel(R) Xeon(R) CPU E5-2643 v4 @ 3.40GHz" 68.49 34.25 40.70
SQL Intel(R) Xeon(R) Gold 6254 CPU @ 3.10GHz 54.95 28.41 40.31

 

Итак, тесты процессоров, у которых больше СОРОКА попугаев, тоже вполне ожидаемы. На первом месте опять I9-9900K, на втором все процессоры, которые тестировались на платформе Linux, соответственно независимо от процессора это был PostgreSQL - таких тестов 838. Это снова говорит о том, что даже несмотря на процессор, скульный тест под Lniux уступил только ТОПчику. Я бы тут сделал еще один возможно неправильный вывод, что Linux и Postgres - это ТОПчик. Предположу, что вклад сюда могли внести и вычеркнутые из тестов на винде процессоры AMD - там они не вычеркнуты, т.к. сами процессоры нет возможности определить, ибо тест Гилева не собирает данные о процессорах при работе под Linux'ом.

Также здесь у нас снова появляется I5-9600К - он здесь на ЧЕТВЕРТОМ месте. Поэтому я, лично, объективно признаю этот процессор самым эффективным по отношению цена/производительность. Т.к. рекомендуется, чтобы количество пользователей на ядро не превышало 10, то этот процессор смог бы дать работать 50-ти пользователям без особых напрягов.

30-40

arch proc Max Min Avg
SQL Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz 56.18 28.57 39.49
SQL Intel(R) Xeon(R) Gold 6134 CPU @ 3.20GHz 51.55 25.91 38.96
SQL Intel(R) Xeon(R) CPU E5-2667 v3 @ 3.20GHz 62.5 31.45 38.67
SQL Intel(R) Xeon(R) Gold 6128 CPU @ 3.40GHz 54.35 27.47 37.84
SQL Intel(R) Xeon(R) CPU E5-2643 v3 @ 3.40GHz 48.08 24.15 36.55
SQL Intel(R) Xeon(R) CPU E5-1650 v4 @ 3.60GHz 49.5 24.88 36.49
SQL Intel(R) Xeon(R) CPU E3-1270 v6 @ 3.80GHz 52.08 26.18 36.23
SQL Intel(R) Xeon(R) E-2186G CPU @ 3.80GHz 47.62 26.46 35.54
SQL Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz 51.55 25.91 35.25
SQL Intel(R) Xeon(R) Gold 6136 CPU @ 3.00GHz 50 25.13 34.88
SQL Intel(R) Xeon(R) CPU E5-2637 v4 @ 3.50GHz 46.3 23.26 34.81
SQL Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz 50.51 25.51 34.74
SQL Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz 49.02 24.63 34.53
SQL Intel(R) Xeon(R) CPU E3-1270 V2 @ 3.50GHz 43.48 21.83 33.72
SQL Intel(R) Core(TM) i7-3770K CPU @ 3.50GHz 47.62 24.15 33.64
SQL Intel(R) Xeon(R) CPU E5-2690 0 @ 2.90GHz 61.73 31.06 33.51
SQL Intel(R) Xeon(R) Gold 6126 CPU @ 2.60GHz" 47.62 24.15 33.04
SQL Intel(R) Xeon(R) CPU E5-1650 v2 @ 3.50GHz 45.45 22.73 32.89
SQL Intel(R) Xeon(R) CPU E3-1220 v3 @ 3.10GHz 43.86 22.03 32.68
SQL Intel(R) Xeon(R) CPU E5-2667 v4 @ 3.20GHz 46.73 23.47 32.60
SQL Intel(R) Xeon(R) CPU E5-2623 v3 @ 3.00GHz 43.86 22.32 32.56
SQL Intel(R) Xeon(R) Silver 4210 CPU @ 2.20GHz 43.1 22.52 32.38
SQL Intel(R) Xeon(R) CPU E3-1220 V2 @ 3.10GHz 40.98 20.66 32.34
SQL Intel(R) Core(TM) i7-3820 CPU @ 3.60GHz 47.17 23.7 31.94
SQL Intel(R) Xeon(R) CPU E3-1270 v3 @ 3.50GHz 42.74 22.52 31.54
SQL Intel(R) Xeon(R) CPU E5-2667 v2 @ 3.30GHz 45.45 22.73 31.48
SQL Intel(R) Xeon(R) CPU E5-2643 0 @ 3.30GHz 47.62 24.04 31.35
SQL Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz 42.37 21.19 31.23
SQL Intel(R) Xeon(R) CPU E3-1240 v5 @ 3.50GHz 44.25 22.32 30.76
SQL Intel(R) Xeon(R) CPU E3-1240 v3 @ 3.40GHz 40.65 20.33 30.14
SQL Intel(R) Core(TM) i3-4330 CPU @ 3.50GHz 33.33 17.99 30.08

 

Здесь уже процессоров куда больше. Радует появление в списке уже отметившегося в файловой базе E5-2667 v3 со средним значением в 38 попугаев, что делает его отличным вариантом для корпоративного использования, т.к. в нем 4 канала памяти и поддержка двух сокетов, что в пределе дает 16 ядер и 32 потока, которых должно хватить на обслуживание 200-300 пользователей с максимально возможной производительностью.

Смысла рассматривать процессоры, которые дали в среднем меньше 30 баллов, на мой взгляд нет.

ИТОГИ ТЕСТА SQL

Клиент-серверная база работает совсем не так, как файловая. В ней ПО, отвечающее за хранение данных, отделено от кода сервера приложений, поэтому скорость работы одного пользователя с такой базой будет в ДВА раза МЕНЬШЕ, т.к. 1С берет данные не из своего файлового хранилища, а запрашивает из внешней СУБД. Но если пользователей очень много, то клиент-серверный вариант обеспечивает производительность параллельной работы. И если в файловой базе без использования таких фич, как публикация на веб-сервере, скорость работы даже 10-ти пользователей может упереться в скорость обмена данными по сети, а если все это происходит на одном компьютере (например, когда все подключаются через удаленный рабочий стол), то все будет упираться в исключительные блокировки таблиц при записи данных, которые будут вынуждать остальных пользователей ждать, при этом перед любой транзакцией файловая база будет искать файлы блокировок и разбираться, какие ресурсы заблокированы, а какие - нет. Поэтому при работе даже двух пользователей файловая база иногда начинает тормозить.

На мой взгляд, по отношению цены и качества в клиент-серверном варианте побеждает опять I5-9600K за 15 тысяч рублей. Для работы до 50-ти пользователей этот процессор на мой скромный взгляд, основанный на результатах теста и количестве ядер, будет оптимальным. Субъективно же более дешевый AMD Ryzen 3500X будет не хуже, а 3600-й - лучше, т.к. у него в 2 раза больше потоков, что в пределе может обеспечить работу 100-ни пользователей клиент-серверной базы в комфортной зоне.

Среди процессоров класса Enterprise, к которым относятся процессоры Intel Xeon и AMD Epyc (тестов которых бескрайне мало), то объективно лучшим процессором по цене за попугай будет E5-2667 v3, т.к. он поддерживает ДВА сокета и может обеспечить приемлемой производительностью 200-300 пользователей на своих 16 ядрах и 32-х потоках и 4-х канальной памятью.

Среди дорогих процессоров этого сегмента самым лучшим для 1С будут Xeon(R) Gold 6144, у которого из этой серии максимальная частота в стоке и в бусте, но ценник в 3 килобакса за камень как бы намекает, что если у тебя меньше 300 пользователей, то это не для тебя. Этот процессор может быть установлен в плату с ЧЕТЫРЬМЯ сокетами и имеет 6-канальный контроллер памяти, что делает возможным собрать систему из 32-х ядер и 64-х потоков, которые могут дать вполне хорошо работать уже 600-м пользователям. Его собрат Xeon(R) Gold 6146 имея чуть более низкую частоту в стоке и в полтора раза большее количество ядер уже может позволить не сильно напрягаясь работать почти 1000 пользователей при 4-х сокетной сборке, стоимость и энергопотребление которой заставит взывать даже тех, кто покупает игровые компы на базе I9-9900X за пол-ляма.

ОБЩИЙ ИТОГ

Объективно побеждает у нас I9-9900K, который и в файловой, и в серверной в среднем набрал больше всех баллов. Но он не сильно выиграл у более дешевого I5-9600K, который я бы назвал лучшим процессором для компьютера разработчика 1С (если, конечно, Вы предвзято относитесь к процессорам на ZEN2 от AMD) и для небольшой компании, в которой с 1С одновременно работает не более 50-ти пользователей.

НАСТРОЙКА ПРОИЗВОДИТЕЛЬНОСТИ

Тесты хорошо показали, что один и тот же процессор как в файловой, так и в клиент-серверной базе может работать быстро, а может и тупить. Основная причина "тупизны" - это "сбалансированная" схема управления питанием, которая большую часть времени держит процессор на низкой частоте. Она в Windows является значением по-умолчанию, поэтому администратор легко может и забыть об этом, оставив все как есть. В 100% случаев установка максимальной производительности позволит повысить результат теста Гилева в полтора-два раза, а то и в три-четыре. Это в большей мере справедливо для серверной базы, но и в файловой такая настройка увеличит количество попугаев.

Т.е. первый совет самый простой - переключить схему энергопотребления сервера в режим высокой производительности.

Так же стоит обратить внимание на частоту памяти и на производительность дисковой подсистемы (IOPS). Чем больше эти цифры, тем выше скорость работы 1С.

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

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

Из-за этого нужно не только включать высокую производительность, но и механизм Turbo-Boost, который позволяет системе работать куда быстрее стоковых частот. Благодаря этому даже процессоры со стоковой частотой в 1,6ГГц (как у меня) могут набрать в тесте Гилева более 80-ти баллов, при том субъективно работа в файловой базе ЕРП 2.4 на моем ноутбучном процессоре происходит куда быстрее, чем на рабочем 2ГГц Xeon с 32-мя ядрами - кто-то забыл грамотно настроить сервер.

ДАННЫЕ

Какой бы ни был быстрый и настроенный сервер, всегда найдутся данные, которые его завалят. Поэтому грамотная архитектура здесь, как говорится, "Must Have".

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

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

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

Разделив OLTP - базу данных, которая регистрирует события и контролирует остатки, оперирует множеством маленьких запросов для извлечения данных по индексам и множеством запросов на запись данных - и OLAP - базу, в которой осуществляются большие запросы к общему кубу данных, - можно уже значительно снизить нагрузку на сервер, даже не меняя базу для OLAP - просто скопировав в нее основную базу данных. Но если данные для OLAP преобразовать в отдельные регистры, то скорость доступа к ним даже больших запросов может серьезно вырасти.

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

Для подобных архитектурных подходов в последнее время и сама 1С сделала немало: Анализ данных, Дата-акселератор и Копирование данных. Эти инструменты могут помочь выйти в части OLAP на другую архитектуру для крупных предприятий с хорошим бюджетом на IT, а мелким компаниям остается научиться выбирать и настраивать сервер, чтобы у него оставался запас по производительности, т.к. они вряд ли смогут оплатить OLAP, да и не нужен он им особо - свои три копейки они посчитают и без него, главное чтобы сервер не вис )))

Всем спасибо за внимание.

процессор выбор скорость hiload benchmark производительность

См. также

Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы

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

Анализ простого плана запроса. Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы.

13.03.2024    2988    spyke    26    

42

Быстродействие типовой 1С

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

Оказывается, в типовых конфигурациях 1С есть, что улучшить!

13.03.2024    5113    vasilev2015    19    

37

Анализируем SQL сервер глазами 1С-ника

HighLoad оптимизация Инструменты администратора БД Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Обработка для простого и удобного анализа настроек, нагрузки и проблем с SQL сервером с упором на использование оного для 1С. Анализ текущих зааросов на sql, ожиданий, конвертация запроса в 1с и рекомендации где может тормозить

1 стартмани

15.02.2024    7648    158    ZAOSTG    68    

96

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

HighLoad оптимизация Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Встал вопрос: как быстро удалить строки из ТЗ? Рассмотрел пять вариантов реализации этой задачи. Сравнил их друг с другом на разных объёмах данных с разным процентом удаляемых строк. Также сравнил с выгрузкой с отбором по структуре.

09.01.2024    5982    doom2good    48    

63

Опыт оптимизации 1С на PostgreSQL

HighLoad оптимизация Бесплатно (free)

При переводе типовой конфигурации 1C ERP/УТ/КА на PostgreSQL придется вложить ресурсы в доработку и оптимизацию запросов. Расскажем, на что обратить внимание при потерях производительности и какие инструменты/подходы помогут расследовать проблемы после перехода.

20.11.2023    8873    ivanov660    6    

76

ТОП проблем/задач у владельцев КОРП лицензий 1С на основе опыта РКЛ

HighLoad оптимизация Бесплатно (free)

Казалось бы, КОРП-системы должны быть устойчивы, быстры и надёжны. Но, работая в рамках РКЛ, мы видим немного другую картину. Об основных болевых точках КОРП-систем и подходах к их решению пойдет речь в статье.

15.11.2023    5105    a.doroshkevich    20    

72

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

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

11.10.2023    16189    skovpin_sa    14    

98
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
159. nomad_irk 71 26.05.20 21:18 Сейчас в теме
(156)
Хорошо, для простоты, как вы это любите, в последовательности участвуют 4 документа:

Поступление1
Поступление2
Реализация1
Реализация2

ПоступлениеN и реализацияN взаимосвязанные.

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

Самое простое решение:

1. Получаем запросом таблицу

Номенклатура1|Поступление1|
Номенклатура1|Реализация1|
Номенклатура2|Поступление2|
Номенклатура2|Реализация2|

2. Получаем из таблицы в п.1 список номенклатуры.
3. Формируем цикл по списку из п.2 , выполняя поиск строк в таблице из п.1 по номенклатуре.
4. Найденные строки сортируем по моменту времени документа, либо делаем свою сортировку списка в зависимости от прихода/расхода и сортируем так, чтобы приход был первым.
5. Внутри цикла из п.3. формируем фоновое задание, выполняющее процедуру проведения документа по набору значений.

Содержимое процедуры выполнения проведения из п.5:

1. Цикл по набору
2. Получить объект по ссылке в текущей строки набора.
3. Выполнить запись документа с проведением.


Это САМЫЙ ПРИМИТИВНЫЙ алгоритм из всех, что можно вообще придумать.
160. Salavat 13 26.05.20 21:28 Сейчас в теме
(159)
Для того, чтобы можно было выполнить параллельное выполнение восстановления последовательности необходимо наличие непересекающихся аналитик в документах. Непересекающейся аналитикой, опять же для простоты, будем считать номенклатуру - она разная в каждой паре документов приход-расход.

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

Ты предлагаешь (перед твоим "распараллеливанием" - сначала проверять исполнение твоих условий?
И - много ты покупателей "этого чудо-алгоритма" набрал?
А не многоли ты о себе возомнил?

на перельмановский приз - ты не претендуешь.
Скрытый текст


Это САМЫЙ ПРИМИТИВНЫЙ алгоритм
давай усложняй - мне главное решение.
(повторюсь - не "решение"!)
Всякое фуфло (хотя я понял уже бессмысленность - у нас разные понятия, об общеизвестных принципах/ценностях. Ты из тех, кто - "языком работает") - пропускай.
161. пользователь 26.05.20 21:53
Сообщение было скрыто модератором.
...
162. Salavat 13 26.05.20 22:00 Сейчас в теме
(161) я снова не понял - тебе опять надо повторить?
Нафига ты историю (сию) показываешь?
Я изменил свою т.з. или что/как?
Нет и не собираюсь - отрицать очевидное.
Единственное добавляю - покажите решение (кто не согласен с моей т.з.)

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

Называешь это троллингом - твоё право.
Впрочем - также как и "решения", продавать.
а потом придумывать оправдания.
150. Salavat 13 26.05.20 20:15 Сейчас в теме
(138) нам написали уже многие, да.
Я ответил одним вопросом - https://forum.infostart.ru/forum34/topic241565/?PAGEN_1=2#message2447915

Прицепился только потомучто вы (навальновцы, местные) - очевидность "отрицаете".
(надумываете какието условия выполнения своих распараллеливаний)

Два - это для простоты (также как начинают в школе - не с интегралов/диффернциалов, а именоо с 1+1)

Если тебе легче будет - покажи решение на трёх (или - какое у тебя условие "распараллеливания твоего")) документах.
151. starik-2005 3033 26.05.20 20:18 Сейчас в теме
(150)
Если тебе легче будет - покажи решение на трёх
Так чего мучаешься? Дай базу с данными, чтобы было на чем показать, а то ведь опять скажешь, что не понимаешь решения.
153. Salavat 13 26.05.20 20:36 Сейчас в теме
(151)
я нисколько не мучаюсь. мучаешься видно ты - причины тут придумываешь, очередные.
Демо-базы нет чтоли?
Держи - УТ 10.3 - https://my-files.su/bja36y

Покажи - одновременное проведение двух реализаций (или сколько там тебе нужно, для демонстрации?) документов.
При этом, всё (по общепринятой методологии) должно быть стандартно - себестоимость (списывается, которая), каждого документа, должна быть реальной.

(лучше сделай - через допобработку - так проще будет.
Если нет, не настаиваю (именно на этом) - меняй конфигурацию))
201. user1424343 17.06.20 09:19 Сейчас в теме
(153) На досуге сделал обработку и текст модуля для УТ 10.3 Для простоты решения (ведь на досуге же) сделал "восстановление по партиям" только тех товаров, у которых не было преобразований, таких как изменения качества, серий, комплектаций, перемещений. Обрабатываются только те, которые пришли и ушли, Приход и расход. Распределение по партиям осуществляется по ФИФО.
В обработке можно выбрать номенклатуру, характеристику, серию. Если ничего не выбрано, обрабатывается всё. В обработке есть реквизиты КоличествоПотоков - число целое, ДатаНач, ДатаКон, Номенклатура, ХарактеристикаНоменклатуры, СерияНоменклатуры.

Текст модуля формы обработки:

Перем мИтоговаяТаблица;
Перем мВсеПроцессыВыполнены;
Перем мВыполненныеПроцессы;
Перем мТЗТЗ;
Перем мТЗ;


Процедура КнопкаВыполнитьНажатие(Кнопка)
    лТипыРегистраторов = Новый Массив(); // для простоты решения уберём преобразующие движения
    лТипыРегистраторов.Добавить(Тип("ДокументСсылка.ПоступлениеТоваровУслуг"));
    лТипыРегистраторов.Добавить(Тип("ДокументСсылка.РеализацияТоваровУслуг"));
    
    Зап3 = Новый Запрос("ВЫБРАТЬ
                        |    ПартииТоваровНаСкладах.Номенклатура КАК Номенклатура,
                        |    ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
                        |    ПартииТоваровНаСкладах.СерияНоменклатуры КАК СерияНоменклатуры,
                        |    ПартииТоваровНаСкладах.СтатусПартии КАК СтатусПартии,
                        |    СУММА(ВЫБОР
                        |            КОГДА НЕ ТИПЗНАЧЕНИЯ(ПартииТоваровНаСкладах.Регистратор) В (&ТипыРегистраторов)
                        |                ТОГДА 1
                        |            ИНАЧЕ 0
                        |        КОНЕЦ) КАК Поле1
                        |ПОМЕСТИТЬ П1
                        |ИЗ
                        |    РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
                        |ГДЕ
                        |    ПартииТоваровНаСкладах.Период МЕЖДУ &ДатаНач И &ДатаКон
                        |    И ПартииТоваровНаСкладах.Активность
                        |    И (ПартииТоваровНаСкладах.СерияНоменклатуры = &СерияНоменклатуры
                        |            ИЛИ &СерияНоменклатуры = ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка))
                        |    И (ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры = &ХарактеристикаНоменклатуры
                        |            ИЛИ &ХарактеристикаНоменклатуры = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка))
                        |    И (ПартииТоваровНаСкладах.Номенклатура = &Номенклатура
                        |            ИЛИ &Номенклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка))
                        |
                        |СГРУППИРОВАТЬ ПО
                        |    ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры,
                        |    ПартииТоваровНаСкладах.СерияНоменклатуры,
                        |    ПартииТоваровНаСкладах.СтатусПартии,
                        |    ПартииТоваровНаСкладах.Номенклатура
                        |;
                        |
                        |////////////////////////////////////////////////////////////­­////////////////////
                        |ВЫБРАТЬ
                        |    П1.Номенклатура,
                        |    П1.ХарактеристикаНоменклатуры,
                        |    П1.СерияНоменклатуры,
                        |    П1.СтатусПартии
                        |ИЗ
                        |    П1 КАК П1
                        |ГДЕ
                        |    П1.Поле1 = 0");
    Зап3.УстановитьПараметр("ДатаНач",ДатаНач);
    Зап3.УстановитьПараметр("ДатаКон",ДатаКон);
    Зап3.УстановитьПараметр("ТипыРегистраторов",лТипыРегистраторов);
    Зап3.УстановитьПараметр("Номенклатура", Номенклатура);
    Зап3.УстановитьПараметр("ХарактеристикаНоменклатуры", ХарактеристикаНоменклатуры);
    Зап3.УстановитьПараметр("СерияНоменклатуры", СерияНоменклатуры);
    
    Рез3 = Зап3.Выполнить();
    
    лТЗЗап = Рез3.Выгрузить();
    
    КоличествоСтрок = лТЗЗап.Количество();
    лКолВоПотоков = Мин(КоличествоСтрок,КоличествоПотоков);
    КолВоВПотоке = Цел(КоличествоСтрок/лКолВоПотоков);
    КолвоВПоследнемПотоке = КоличествоСтрок%лКолВоПотоков;
    Сообщить("Количество строк " + КоличествоСтрок + " Количество в потоке " + КолВоВПотоке + " Количество в последнем потоке " + КолвоВПоследнемПотоке);
    
    НТекПотока = 0;
    НСеанса = 0;
    мТЗ.Очистить();
    лТЗ2 = мТЗ.Скопировать();
    лСтрТЗТЗ = мТЗТЗ.Добавить();
    лСтрТЗТЗ.ТЗ = лТЗ2;
    
    Для Каждого лТекСтрТЗЗап Из лТЗЗап Цикл
        лНовСтр = лСтрТЗТЗ.ТЗ.Добавить();
        ЗаполнитьЗначенияСвойств(лНовСтр,лТекСтрТЗЗап);
        НТекПотока = НТекПотока + 1;
        Если НТекПотока%КолВоВПотоке=0 Тогда
            ВызватьСеанс(НСеанса,лСтрТЗТЗ.ТЗ);
            НСеанса = НСеанса + 1;
            лТЗ2 = мТЗ.Скопировать();
            лСтрТЗТЗ = мТЗТЗ.Добавить();
            лСтрТЗТЗ.ТЗ = лТЗ2;
        КонецЕсли;
    КонецЦикла;
    
    Если КолвоВПоследнемПотоке > 0 Тогда
        ВызватьСеанс(НСеанса,лСтрТЗТЗ.ТЗ);
    КонецЕсли;
    
    ПодключитьОбработчикОжидания("ПроверитьСостояниеФоновыхЗаданий",1);
    
КонецПроцедуры

Процедура ВызватьСеанс(пНомер,пТЗ)
    лМассив = Новый массив();
    лНовСтр = мВыполненныеПроцессы.Добавить();
    лНовСтр.НомерЗапущенного = пНомер;
    лНовСтр.АдресВХранилище = Новый УникальныйИдентификатор;
    
    лАдрес = ПоместитьВоВременноеХранилище(Неопределено,лНовСтр.АдресВХранилище);
    лНовСтр.АдресВХранилище = лАдрес;
    
    лМассив.Добавить(пТЗ);
    лМассив.Добавить(ДатаНач);
    лМассив.Добавить(ДатаКон);
    лМассив.Добавить(лАдрес);
    лМассив.Добавить(пНомер);
    
    лКлюч = "ОбрабоктаТаблицы_" + пНомер;
    лСсылка = ПолучитьНавигационнуюСсылкуИнформационнойБазы();
    //Сообщить(лСсылка);
    
    Если СтрНайти(лСсылка,"e1c://server/")>0 и Не ЗапускатьНеВФоне Тогда
        Сообщить("Запущен фоновый процесс " + пНомер);
        лФоновоеЗадание = ФоновыеЗадания.Выполнить("мФоновые.ОбработатьТаблицу", лМассив, лКлюч, "ОбрабоктаТаблицы " + пНомер);
        лНовСтр.ФоновоеЗадание = лФоновоеЗадание;
    Иначе
        Сообщить("Запущен процесс " + пНомер);
        мФоновые.ОбработатьТаблицу(лМассив[0],лМассив[1],лМассив[2],лМассив[3],лМассив[4]);
    КонецЕсли;
КонецПроцедуры

Процедура ПроверитьСостояниеФоновыхЗаданий()
    лФл = Ложь;
    лМассивКУдалению = Новый Массив;
    Для Каждого лТекСтр Из мВыполненныеПроцессы Цикл
        лСтрук = ПолучитьИзВременногоХранилища(лТекСтр.АдресВХранилище);
        Если лСтрук<>Неопределено Тогда
            лТЗ = лСтрук.ТЗ;
            Сообщить("Завершён процесс " +лСтрук.Номер);
            //лТЗ = лДанные.Получить();
            лФл = Истина;
            Для Каждого лТекСтрТЗ Из лТЗ Цикл
                лНовСтр = мТЗ.Добавить();
                ЗаполнитьЗначенияСвойств(лНовСтр,лТекСтрТЗ);
                лФл = Ложь;
            КонецЦикла;
            УдалитьИзВременногоХранилища(лТекСтр.АдресВХранилище);
            лМассивКУдалению.Добавить(лТекСтр);
        Иначе
            лФл = Истина;
        КонецЕсли;
    КонецЦикла;
    
    Для Каждого лТекСтр Из лМассивКУдалению Цикл
        мВыполненныеПроцессы.Удалить(лТекСтр);
    КонецЦикла;
    
    Если лФл Тогда
        Возврат;
    КонецЕсли;
    мТЗ.Сортировать("Период");
    лНабор = РегистрыНакопления.ПартииТоваровНаСкладах.СоздатьНаборЗаписей();
    лРегистратор = Неопределено;
    лСтрокаТовара = "";
    лНаборТЗ = Новый ТаблицаЗначений;
    лСтруктураПоиска = Новый Структура("Номенклатура, Склад,  ХарактеристикаНоменклатуры, СерияНоменклатуры, СтатусПартии, Заказ, Качество");
    Для Каждого лТекСтр Из мТЗ Цикл
        Если лРегистратор<>лТекСтр.Регистратор Тогда
            Если лРегистратор<>Неопределено Тогда
                лНабор.Загрузить(лНаборТЗ);
                лНабор.ОбменДанными.Загрузка = Истина;
                лНабор.Записать(Истина);
                Сообщить("Записан " + лРегистратор);
            КонецЕсли;
            лРегистратор = лТекСтр.Регистратор;
            лНабор.Отбор.Регистратор.Значение = лРегистратор;
            лНабор.Прочитать();
            лНаборТЗ = лНабор.Выгрузить();
            лНабор.Очистить();
        КонецЕсли;
        ЗаполнитьЗначенияСвойств(лСтруктураПоиска,лТекСтр);
        лСтроки = лНаборТЗ.НайтиСтроки(лСтруктураПоиска);
        Для Каждого л_ТекСтрИЗСтроки Из лСтроки Цикл
            лНаборТЗ.Удалить(л_ТекСтрИЗСтроки);
        КонецЦикла;
        лСтрокаНабора = лНаборТЗ.Добавить();
        ЗаполнитьЗначенияСвойств(лСтрокаНабора,лТекСтр);
        лСтрокаНабора.Активность = Истина;
    КонецЦикла;
    Если лРегистратор<>Неопределено Тогда
        лНабор.Загрузить(лНаборТЗ);
        лНабор.ОбменДанными.Загрузка = Истина;
        лНабор.Записать(Истина);
        Сообщить("Записан " + лРегистратор);
    КонецЕсли;
    ОтключитьОбработчикОжидания("ПроверитьСостояниеФоновыхЗаданий");
    Сообщить("Обработаны товары: ");
    лТЗ = мТЗ.Скопировать();
    лТЗ.Свернуть("Номенклатура, ХарактеристикаНоменклатуры, СерияНоменклатуры, СтатусПартии");
    лТЗ.Сортировать("Номенклатура, ХарактеристикаНоменклатуры, СерияНоменклатуры, СтатусПартии");
 
    Для Каждого лТекСтр Из лТЗ Цикл
        Сообщить(" " + лТекСтр.Номенклатура + " | " + лТекСтр.ХарактеристикаНоменклатуры + " | " + лТекСтр.СерияНоменклатуры + " | " + лТекСтр.СтатусПартии);
    КонецЦикла;
    Сообщить("Завершено!")
КонецПроцедуры

Процедура ПриОткрытии()
    ДатаНач = '20070101';
    ДатаКон = '20090101';
    КоличествоПотоков = 5;
КонецПроцедуры

мВсеПроцессыВыполнены = Ложь;
мВыполненныеПроцессы = Новый ТаблицаЗначений();
мВыполненныеПроцессы.Колонки.Добавить("НомерЗапущенного");
мВыполненныеПроцессы.Колонки.Добавить("НомерВыполненного");
мВыполненныеПроцессы.Колонки.Добавить("АдресВХранилище");
мВыполненныеПроцессы.Колонки.Добавить("ФоновоеЗадание");

мТЗТЗ = Новый ТаблицаЗначений();
мТЗТЗ.Колонки.Добавить("ТЗ");

мТЗ = Новый ТаблицаЗначений();

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



Показать




Общий модуль для выполнения фоновых заданий:


Процедура ОбработатьТаблицу(пТЗ,пДатаНач,пДатаКон,пАдресВХранилище,пНомер) Экспорт
    мТЗ = пТЗ.Скопировать();
    Зап = Новый Запрос("ВЫБРАТЬ
                       |    ТЗ.Номенклатура,
                       |    ТЗ.Склад,
                       |    ТЗ.ХарактеристикаНоменклатуры,
                       |    ТЗ.СерияНоменклатуры,
                       |    ТЗ.СтатусПартии,
                       |    ТЗ.Заказ,
                       |    ТЗ.Качество
                       |ПОМЕСТИТЬ ТЗВрТаб
                       |ИЗ
                       |    &ТЗ КАК ТЗ
                       |;
                       |
                       |////////////////////////////////////////////////////////////­­////////////////////
                       |ВЫБРАТЬ
                       |    ПартииТоваровНаСкладах.Период КАК Период,
                       |    ПартииТоваровНаСкладах.Регистратор КАК Регистратор,
                       |    ПартииТоваровНаСкладах.НомерСтроки,
                       |    ПартииТоваровНаСкладах.Активность,
                       |    ПартииТоваровНаСкладах.ВидДвижения,
                       |    ПартииТоваровНаСкладах.Номенклатура КАК Номенклатура,
                       |    ПартииТоваровНаСкладах.Склад КАК Склад,
                       |    ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
                       |    ПартииТоваровНаСкладах.СерияНоменклатуры КАК СерияНоменклатуры,
                       |    ПартииТоваровНаСкладах.ДокументОприходования,
                       |    ПартииТоваровНаСкладах.СтатусПартии КАК СтатусПартии,
                       |    ПартииТоваровНаСкладах.Заказ КАК Заказ,
                       |    ПартииТоваровНаСкладах.Качество КАК Качество,
                       |    ПартииТоваровНаСкладах.Количество,
                       |    ПартииТоваровНаСкладах.Стоимость,
                       |    ПартииТоваровНаСкладах.КодОперации,
                       |    ПартииТоваровНаСкладах.СписаниеПартий,
                       |    ПартииТоваровНаСкладах.НомерКорСтроки,
                       |    ПартииТоваровНаСкладах.ДокументДвижения,
                       |    ПартииТоваровНаСкладах.ДокументДвиженияПериод,
                       |    ПартииТоваровНаСкладах.НомерСтрокиСписанныхТоваров
                       |ИЗ
                       |    РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
                       |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТЗВрТаб КАК ТЗ
                       |        ПО ПартииТоваровНаСкладах.Номенклатура = ТЗ.Номенклатура
                       |            И ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры = ТЗ.ХарактеристикаНоменклатуры
                       |            И ПартииТоваровНаСкладах.СерияНоменклатуры = ТЗ.СерияНоменклатуры
                       |            И ПартииТоваровНаСкладах.СтатусПартии = ТЗ.СтатусПартии
                       |ГДЕ
                       |    ПартииТоваровНаСкладах.Период МЕЖДУ &ДатаНач И &ДатаКон
                       |    И ПартииТоваровНаСкладах.Активность
                       |
                       |УПОРЯДОЧИТЬ ПО
                       |    Склад,
                       |    Номенклатура,
                       |    ХарактеристикаНоменклатуры,
                       |    СерияНоменклатуры,
                       |    СтатусПартии,
                       |    Заказ,
                       |    Качество,
                       |    Период,
                       |    Регистратор");
    Зап.УстановитьПараметр("ТЗ",мТЗ);
    Зап.УстановитьПараметр("ДатаНач",пДатаНач);
    Зап.УстановитьПараметр("ДатаКон",пДатаКон);
    Рез = Зап.Выполнить();
    лНоменклатура = Неопределено;
    лХарактеристикаНоменклатуры = Неопределено;
    лСклад = Неопределено;
    лСерияНоменклатуры = Неопределено;
    лСтатусПартии = Неопределено;
    лЗаказ = Неопределено;
    лКачество = Неопределено;
    
    Выборка = Рез.Выбрать();
    
    мТЗ.Очистить();
    лТЗДокументовОприходования = Новый ТаблицаЗначений();
    лТЗДокументовОприходования.Колонки.Добавить("ДокументОприходования");
    лТЗДокументовОприходования.Колонки.Добавить("Количество");
    лТЗДокументовОприходования.Колонки.Добавить("Стоимость");
    
    Пока Выборка.Следующий() Цикл
        Если лНоменклатура=Выборка.Номенклатура И
            лХарактеристикаНоменклатуры=Выборка.ХарактеристикаНоменклатуры И
            лСклад=Выборка.Склад И
            лСерияНоменклатуры=Выборка.СерияНоменклатуры И
            лСтатусПартии=Выборка.СтатусПартии И
            лЗаказ=Выборка.Заказ И
            лКачество=Выборка.Качество Тогда
            
        Иначе
            лНоменклатура=Выборка.Номенклатура;
            лХарактеристикаНоменклатуры=Выборка.ХарактеристикаНоменклатуры;
            лСклад=Выборка.Склад;
            лСерияНоменклатуры=Выборка.СерияНоменклатуры;
            лСтатусПартии=Выборка.СтатусПартии;
            лЗаказ=Выборка.Заказ;
            лКачество=Выборка.Качество;
            
            лТЗДокументовОприходования.Очистить();
        КонецЕсли;
            
        Если Выборка.ВидДвижения = ВидДвиженияНакопления.Приход Тогда
            лНовСтр = мТЗ.Добавить();
            ЗаполнитьЗначенияСвойств(лНовСтр,Выборка);
            Если Выборка.Количество<>0 Тогда
                лНовСтрОприходования = лТЗДокументовОприходования.Добавить();
                ЗаполнитьЗначенияСвойств(лНовСтрОприходования, Выборка);
            КонецЕсли;
        Иначе
            лКоличество = Выборка.Количество;
            лМассивСтрокКУдалению = Новый Массив;
            Для Каждого лТекСтрОприходования Из лТЗДокументовОприходования Цикл // ФИФО
                лНовСтр = мТЗ.Добавить();
                ЗаполнитьЗначенияСвойств(лНовСтр,Выборка);
                лЦена = лТекСтрОприходования.Стоимость / лТекСтрОприходования.Количество;
                лНовСтр.ДокументОприходования = лТекСтрОприходования.ДокументОприходования;
                Если лТекСтрОприходования.Количество>лКоличество Тогда
                    лТекСтрОприходования.Количество = лТекСтрОприходования.Количество - лКоличество;
                    лНовСтр.Количество = лКоличество;
                    лНовСтр.Стоимость = лКоличество*лЦена;
                    лТекСтрОприходования.Стоимость = лТекСтрОприходования.Стоимость - лНовСтр.Стоимость;
                    лКоличество=0;
                ИначеЕсли лТекСтрОприходования.Количество<=лКоличество Тогда
                    лКоличество = лКоличество - лТекСтрОприходования.Количество;
                    лНовСтр.Количество = лТекСтрОприходования.Количество;
                    лНовСтр.Стоимость = лТекСтрОприходования.Стоимость;
                    лМассивСтрокКУдалению.Добавить(лТекСтрОприходования);                        
                КонецЕсли;
                Если лКоличество<=0 Тогда
                    Прервать;
                КонецЕсли;
            КонецЦикла;
            Если лКоличество>0 Тогда
                Сообщить("Не хватает количества при распределении по партиям товар: " + Выборка.Номенклатура + " " + Выборка.ХарактеристикаНоменклатуры + " по документу " + Выборка.Регистратор);
            КонецЕсли;
            Для Каждого лТекСтрОприходования Из лМассивСтрокКУдалению Цикл
                лТЗДокументовОприходования.Удалить(лТекСтрОприходования);
            КонецЦикла;
        КонецЕсли;
        
    КонецЦикла;
    лСтрук = Новый Структура("ТЗ, Номер", мТЗ, пНомер); 
    лАдрес = ПоместитьВоВременноеХранилище(лСтрук, пАдресВХранилище);
    ЗаписьЖурналаРегистрации("ТестированиеЖР",,,,лАдрес);
    ЗаписьЖурналаРегистрации("ТестированиеЖР",,,,пАдресВХранилище);
    
КонецПроцедуры

Показать


Опробовано на сервере 1с с СУБД MSSQL на 5-50 потоках.
В фоновый процесс передаётся список товаров для обработки. Там он по товарам получает данные по записям регистра "Партии товаров на складах" и проходит последовательно по ним. Возвращает таблицу значений для своей порции данных.
Запись в регистры выполняется в один поток, но и это можно размножить.
Использовалась Обычная демобаза торговли 10.3.
157. пользователь 26.05.20 20:54
Сообщение было скрыто модератором.
...
200. mrsmrv 125 06.06.20 07:25 Сейчас в теме
(150)
Прицепился только потомучто вы (навальновцы, местные) - очевидность "отрицаете".

Почему вы упомянули Навальновцев?
Почему "отрицаете" в кавычках?
95. starik-2005 3033 26.05.20 18:04 Сейчас в теме
(85)
Этот факт, надеюсь - не будете оспаривать.
А я утверждаю, что и сам делал механизм восстановления последовательности документов (всех документов в системе) многопоточным, скорость перепроведения документов в итоге повышалась в 5 примерно раз (использовалось шесть потоков), и - более того - встречал даже здесь, на Инфостарте, несколько реализаций подобного многопоточного перепроведения документов.

Просто не понимаю, с чем Вы тут пытаетесь спорить? Ну не получилось у Вас лично это реализовать - бывает, но это не значит, что никто этого сделать не смог.
mrsmrv; nomad_irk; +2 Ответить
96. Salavat 13 26.05.20 18:15 Сейчас в теме
(95) одно с пёстрым не путайте!
(95)
многопоточным, скорость перепроведения документов в итоге повышалась в 5 примерно раз
где я утверждал (как Вы тут меня пытаетесь обвинить!), что якобы я говорил, что распараллеливание время обработки не уменьшает?

(95)
Просто не понимаю,
ещё раз говорю - какие исходные данные Вы берёте для проведения второго документа, если документ первый - ещё не проведён?
Интерполяционные - так это всего-лишь, приближение (погрешность которого зависит от методики, но - никак не нулевая!), а не точность.

И - спорить я уже не пытаюсь.
Скрытый текст
99. starik-2005 3033 26.05.20 18:25 Сейчас в теме
(96)
какие исходные данные Вы берёте для проведения второго документа
Этот Ваш неверный посыл исходит из глубюокого непонимания того, что себестоимость, даже хранимая в партиях товаров, определяется для конкретного товара, и в большом количестве данных есть совершенно независимые документы. Я уже приводил пример булок и баранок с документом синхронизации потоков, в котором булки и баранки оказались одновременно - в таком случае система должна провести все потоки до этого документа, потом этот документ, потом следующие. Часть из этих документов может быть проведена параллельно, часть должна быть проведена последовательно, но если помимо булок и баранок добавить сузари, то проведение документов с сухарями можно произвести параллельно, пока не встретится случай с сухарями и булками или баранками.

Да, алгоритм получается сложнее, чем дважды два. Поэтому для того, чтобы документы не перепроводить, существует решение на базе СЛАУ - РАУЗ. Но даже в партионном учете есть возможность провести документы параллельно, хоть это и реализуется достаточно непростым алгоритмом.

С третьей стороны, и этого, как я понял, Вам вообще понять не дано, можно распараллелить только запись регистров накопления и бухгалтерии, при этом совершенно нет надобности записывать сам объект, который будет записан каждый раз при стандартном механизме перепроведения через "Документ.Записать(РежимЗаписиДокумента.Проведение)", при этом сам объект не меняется - зачем его записывать? Более того, нет смысла каждый раз читать остатки, т.к. остатки можно хранить в таблице значений в нужных разрезах - этот тот же регистр остатков, только в памяти. ТЗ индексируется в 1С, поэтому поиск в ней будет куда быстрее, чем чтение регистров остатков при проведении каждого документа. А дальше параллельно в совершенно любой последовательности можно записать полученные наборы записей регистров.

В общем Вы спорите с тем, что не понимаете.
mrsmrv; nomad_irk; +2 Ответить
175. nickperel 5 28.05.20 19:36 Сейчас в теме
Господин Salavat, а причем тут Навальный? Сходите-ка к доктору
101. Salavat 13 26.05.20 18:28 Сейчас в теме
(95)
не получилось у Вас лично это реализовать
и да - я не "пытаюсь реализовать" то, что противоречит элементарным аксиомам.

Если я делаю приближение/итерацию (Ваш пример) - я это именно так и называю.
А не горню, что я сделал то, что другим не удастся.
Ну - ждите, когда Вам (и всем Вашим сторонникам) вручат нобелевку.
(другого варианта - просто нет. Также как есть факт, что - за математику, её и не вручают)
102. starik-2005 3033 26.05.20 18:34 Сейчас в теме
(101)
за математику, её и не вручают
Так за математику есть другая премия, от которой в свое время отказался уважаемый Григорий Перельман.

Но еще раз: параллелить само проведение вовсе не обязательно - достаточно буферизировать исторические данные и параллелить запись результата, который получен даже в один поток. Один поток генерирует записи, сто потоков их записывают. Где противоречие?
103. Salavat 13 26.05.20 18:43 Сейчас в теме
(102)
Где противоречие?
противоречие в том, что - буферизовать нечего!
Данных для проведения второго документа нет - пока первый не проведён.
Какие исторические данные?
Скрытый текст

С таким же успехом (но, с меньшей/большей/другой/... скоростью и точностью - возможно) - интерполяцию используйте.

Когда первый проведётся, тогда и будут данные для второго.
Данные - истинные!
А не.... (как хотите называйте/получайте/...)

И делайте (после этого!)с ними, на здоровье, что/как угодно.
Хоть буферизуйте мильярд раз.
107. starik-2005 3033 26.05.20 18:50 Сейчас в теме
(103)
Какие исторические данные?
Ну вот купили вы баранки - ПТУ, в ней увеличилась задолженность перед поставщиком, увеличилась себестоимость и количество купленных баранок - появились две записи в двух ТЗ, одна из которых - это ДЗ, вторая - партии товаров. Дальше ПТУ с сухарями. Если поставщик тот же - нашли соглашение с поставщиком, увеличили долг, или просто дописали еще одну строку, если нужен долг в разрезе документов. Дальше оплатили деньги - уменьшили долг по всем документам соглашения, упорядоченным по дате (в принципе, если в ТЗ данные помещаются пл-порядку, то и дату не нужно хранить). Если оплатили все - вычли из двух строк ТЗ суммы, остались две пустые строки, которые можно удалить. Если переплатили - появилась строка с КЗ и документом оплаты.

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

Ну что как маленький-то, просто...
nomad_irk; mrsmrv; +2 Ответить
116. Salavat 13 26.05.20 19:05 Сейчас в теме
(107) я такому большому (но - необразованному, даже элементарным вещам) человеку - не в силах - объяснить элементарные аксимы.
Раз пять уже пробовал (лично тебе!).

Последняя попытка -

- как ты буферизуешь исторические данные первого документа (который ещё не проведён?
А при этом - собираешься провести второй?

(Напомню - второму требуются данные первого документа)
Скрытый текст
117. starik-2005 3033 26.05.20 19:06 Сейчас в теме
(116)
не в силах - объяснить элементарные аксимы
Ну так сначала дорастите до уровня, потом пытайтесь что-то объяснить. Пока Вы откровенно бред несете.
118. Salavat 13 26.05.20 19:11 Сейчас в теме
(117)
откровенно бред несете.
я не нёс ничего.
Я элементарную аксиому сказал.
(не городя кучу "умных слов")
125. mrsmrv 125 26.05.20 19:33 Сейчас в теме
(118)Давайте так. Опишите, что у вас за база? типовая или нет. На какой версии платформы работает. И что нужно перепровести, какие документы.
А пока что любое восстановление последовательсти представляется следующим образом: Считываем начальные остатки из регистров. Считываем таблицы документов, которые нужно перепровести. Причём таблицы, лишь те, что нужны для получения результата перепроведения/восстановления последовательности.
В общем случае при начале работы с базой - начальные остатки нулевые, первый документ как правило - приход (ввод начальных остатков, или первое поступление от поставщика) да даже если и расход. Считывая данные из всех документов мы Сразу знаем Сколько уникальных товаров всего нужно обработать. Сколько уникальных временных меток нужно пройти. В таблице нам нужно лишь сделать арифметические операции + - / * для каждой временнОй метки и каждого товара, что можно (и нужно) распараллелить. Причём Приход-то зачем перепроводить - ну с логики изменения количества и себестоимости товара. Приход-то не нуждается в пересчёте по идее. Ну да ладно. Короче в итоге для каждой временнОй метки мы получаем результат приходов, расходов и прочих вычислений согласно Алгоритма (ФИФО ЛИФО по среднему и т.п.) Разве в этом алгоритме данные по одному товару влияют на данные по другому товару? Нет. После того как ПОСЛЕДОВАТЕЛЬНО для каждой временной метки и по каждому товару был получен результат (очевидно себестоимость) этот результат можно записать в СУБД, ладно, в регистры, которые "двигает" документ соответствующий той или иной временнОй метке.
Как ещё разжевать логику параллельного перепроведения я незнаю. Но думаю если будет поставлена чёткая задача и мной будет написан код для решения этой конкретной чёткой задачи, вы сможете убедиться в том, что Распараллелить этот процесс можно. Если конечно у вас там действительно не заложена какая-то киллер фича, влияющая на Все товары при перепроведения Каждого документа.
starik-2005; nomad_irk; +2 Ответить
105. Salavat 13 26.05.20 18:45 Сейчас в теме
(102)
Так за математику есть другая премия, от которой в свое время отказался уважаемый Григорий Перельман.
молодцом!
постарайся теперь вспомнить - почему он отказался?
109. starik-2005 3033 26.05.20 18:51 Сейчас в теме
(105)
постарайся вспомнить - почему он отказался?
Потому, что он теперь может одной силой мысли Вселенной управлять (по крайней мере он так выразился). Но Вам до этого далеко, раз банальных вещей не можете понять и кроме первого документа ничего не видите...
user1424343; +1 Ответить
112. Salavat 13 26.05.20 18:55 Сейчас в теме
(102) Запомните (постарайтесь пожалуйста - умоляю) одно - распараллеливается только то, что есть.
То чего не существует (в один момент!) - невозможно распараллелить.
Т.к. элементарно (хотябы) - распараллеливать нечего.
Принципиально!

Скрытый текст
114. mrsmrv 125 26.05.20 19:01 Сейчас в теме
(112)Ну вот есть задача допустим восстановить последовательность за месяц. Есть 1000 товаров. Что нам мешает не заглядывая в документы, напрямую из регистров взять данные о том, сколько товара пришло, ушло, когда? Вот матрица, по горизонтали пусть будет время (это вообще в физике кстати тоже понятие такое... чисто эмоциональное чтоли), по вертикали пусть будет товар, в ячейках количество + приход, - уход. Задача сводится лишь к решению системы уравнений, с таким расчётом чтобы в ячейкам матрицы с - ухода количества была соответствующая себестоимость.
Даже если оторваться от решения СЛАУ, Можно каждый товар в этой матрице тупо прогнать "перепроведением последовательно". Но распараллелить процесс - т.е. 1000 потоков на каждый товар. После того как матрица обработана, результат готов, Записать полученный результат в тех ячейках где был - (расход товара со склада) в те документы, которые соответствуют меткам времени. Всё. Движения в регистры 1С писать умеет, без Перепроведения документов. Элементарно.
nomad_irk; starik-2005; +2 Ответить
119. Salavat 13 26.05.20 19:13 Сейчас в теме
(114)
Что нам мешает не заглядывая в документы, напрямую из регистров взять данные о том
нам (тем кто знаком с истиной) мешает взять не то, что мы не знаем где взять, а -

- не даёт элементарное, отсутствие необходимой информации!
120. mrsmrv 125 26.05.20 19:14 Сейчас в теме
(119)т.е. на не надо документы за прошедший месяц проводить? и лишь в реальном времени? по мере их поступления?
122. starik-2005 3033 26.05.20 19:19 Сейчас в теме
(120) коллега, спор зашел в тупик ))) Предлагаю пока забить на этот спор болт, т.к. они ничего не меняет. У нас с Вами все может параллелиться, у оппонентов - нет. Пусть они (оппоненты) остаются в скучном однопоточном мире и считают числа ряда Фибоначчи только последовательно.
ЗЫ: Постоянное упоминание Навального - это возрастной диагноз, так что вообще смысла нет, да и время сейчас неспокойное - мало ли кризис у человека. Я знал много народу, кто при массовом засилии ООП-подхода с их SOLID и прочими фичами из Agile просто из программистов пошли в охранники. И они там счастливы, что радует )))
123. пользователь 26.05.20 19:22
Сообщение было скрыто модератором.
...
124. nomad_irk 71 26.05.20 19:30 Сейчас в теме
(123)Если у вас всего 2 документа для восстановления последовательности: "поступление товаров №1" и "реализация товаров №1", то задача не паралеллелиться.

1. Вы в состоянии осознать, что документов может быть много больше 2-х?
2. Вы в состоянии осознать, что во всех этих документах может быть не пересекающиеся данные по номенклатуре/складу?
127. Salavat 13 26.05.20 19:39 Сейчас в теме
(124)
у вас всего 2 документа для восстановления последовательности: "поступление товаров №1" и "реализация товаров №1", то задача не паралеллелиться.
о как, ну надоже - ты оказывается в силах, признать истину.
Скрытый текст


1. Вы в состоянии осознать, что документов может быть много больше 2-х?
мы в состоянии - ты не в состоянии осознать, что - два, это всего-лишь для простоты.
Сколько тебе надо документов для распараллеливания?

(124)
2. Вы в состоянии осознать, что во всех этих документах может быть не пересекающиеся данные по номенклатуре/складу?
мы да, в состоянии, в отличии от тебя. Как это влияет на "твоё распараллеливание"? (которое, как оказалось - зависит от "количества распаралелливаемого...."
129. nomad_irk 71 26.05.20 19:49 Сейчас в теме
(127)
мы в состоянии - ты не в состоянии осознать, что - два, это всего-лишь для простоты.
Сколько тебе надо документов для распараллеливания?

мы да, в состоянии, в отличии от тебя. Как это влияет на "твоё распараллеливание"? (которое, как оказалось - зависит от количества распаралелливаемого...."


Никто в здравом уме не будет пытаться паралеллить проведение документов с одной номенклатурой/по одному складу.
Очень жаль, что для вас эта аксиома так и осталась недоступной для понимания.
131. starik-2005 3033 26.05.20 19:50 Сейчас в теме
(129)
Очень жаль, что для вас эта аксиома так и осталась недоступной для понимания.
И это говорит человек, у которого один склад и одна номенклатура ))) Все остальное разворовал Навальный, ага )))
mrsmrv; nomad_irk; +2 Ответить
134. nomad_irk 71 26.05.20 19:52 Сейчас в теме
(131) с изречениями про Навального - это, похоже, уже - диагноз, хотя я и не имею соответствующего медицинского образования, но свое оценочное суждение высказать могу :)
126. mrsmrv 125 26.05.20 19:36 Сейчас в теме
(123)
а тыто откуда свалился? арёл.
Это простите вы мне?

Сколько у вас товаров?
Сколько документов? за день, неделю, месяц?
128. Salavat 13 26.05.20 19:44 Сейчас в теме
(126) мы да, тебе в т.ч.
(и да, прощу - когда/если признаешь элементарную аксиому)

условие задачи - http://forum.infostart.ru/forum34/topic241565/message2447899/#message2447899

Жду решения.
С применением "распаралееливания", разумеется)

И да (отвечаю на бессмысленные твои вопросы)
Сколько у вас товаров?
Сколько документов? за день, неделю, месяц?

Бери, на своё усмотрение (раз тебе это принципиально) - наши товары и период
130. mrsmrv 125 26.05.20 19:49 Сейчас в теме
Даже проведние двух документов можно ускорить объединив их логику в одну транзакцию, Чтение табличных частей документов, вычисление результатов для каждого товара каждого документа, и запись результата в движения каждого документа в рамках одной транзакции. Чтение и запись можно разделить в несколько потоков сгруппировав по нескольку (десятков) товаров. Если в Каждом документе лишь один товар, то задача не требует распараллеливания. Но замерить длительность отдельных операций и в рамках одной транзакции было бы интересно.
133. пользователь 26.05.20 19:52
Сообщение было скрыто модератором.
...
132. пользователь 26.05.20 19:50
Сообщение было скрыто модератором.
...
136. пользователь 26.05.20 19:55
Сообщение было скрыто модератором.
...
137. mrsmrv 125 26.05.20 19:57 Сейчас в теме
(136)Чтение и запись можно разделить в несколько потоков сгруппировав по нескольку (десятков) товаров. Если в Каждом документе лишь один товар, то задача не требует распараллеливания.
141. mrsmrv 125 26.05.20 20:06 Сейчас в теме
145. Salavat 13 26.05.20 20:10 Сейчас в теме
(141) И где решение?
Стыдно показать - именно это, я прекрасно понимаю.
146. starik-2005 3033 26.05.20 20:12 Сейчас в теме
(145)
И где решение?
Да Вы тут в соседней теме даже не смогли додуматься, что есть несколько типовых макетов оформления, при том критикуете автора за "плохой вопрос". Вы просто графоман, батенька. Идите на Дзен - там кирпичами про навальных и окраинцев можно с утра до ночи откладывать.
nomad_irk; mrsmrv; +2 Ответить
147. mrsmrv 125 26.05.20 20:12 Сейчас в теме
(145)Я ТЕБЕ, Арёл уже давно и несколько раз решение описал, Читай если умеешь.
148. starik-2005 3033 26.05.20 20:13 Сейчас в теме
(147) Не умеет он. Не его это, так что не дави - забей просто.
149. mrsmrv 125 26.05.20 20:14 Сейчас в теме
(148)Да я хотел понять для какой конфы законфигурить обработку "проведения" документов. Потому что для современных типовых не очень-то и надо. А для 7.7. не охота просто так гонять буквы по клаве.
Как видите (в моих публикациях) я даже без мзды не прочь чего нибудь поконфигурить.
158. Salavat 13 26.05.20 20:57 Сейчас в теме
(147) я тебе решение задал - четырьмя строками.
(короткими)
Ты (в том числе) - изливал воду какуюто, которую обозвал "решением".

Я вон даже базу выложил (как твой коллега выразился, для "демонстрации решения").

Решение жду.
(не "решения")

Нужно распараллелить проведение N документов.
При этом нужно (в данном случае интересно!) - не ускорение проведения.
(эту тупость - я и не опровергал!)
А сохранить основной функционал - себестоимость должна быть реальной.
(разжевать надо - что это значит?)
195. mrsmrv 125 03.06.20 10:31 Сейчас в теме
(158)
На досуге сделал обработку и текст модуля для УТ 10.3 Для простоты решения (ведь на досуге же) сделал "восстановление по партиям" только тех товаров, у которых не было преобразований, таких как изменения качества, серий, комплектаций, перемещений. Обрабатываются только те, которые пришли и ушли, Приход и расход. Распределение по партиям осуществляется по ФИФО.
В обработке можно выбрать номенклатуру, характеристику, серию. Если ничего не выбрано, обрабатывается всё. В обработке есть реквизиты КоличествоПотоков - число целое, ДатаНач, ДатаКон, Номенклатура, ХарактеристикаНоменклатуры, СерияНоменклатуры.

Текст модуля формы обработки:
Перем мИтоговаяТаблица;
Перем мВсеПроцессыВыполнены;
Перем мВыполненныеПроцессы;
Перем мТЗТЗ;
Перем мТЗ;


Процедура КнопкаВыполнитьНажатие(Кнопка)
	лТипыРегистраторов = Новый Массив(); // для простоты решения уберём преобразующие движения
	лТипыРегистраторов.Добавить(Тип("ДокументСсылка.ПоступлениеТоваровУслуг"));
	лТипыРегистраторов.Добавить(Тип("ДокументСсылка.РеализацияТоваровУслуг"));
	
	Зап3 = Новый Запрос("ВЫБРАТЬ
	                    |	ПартииТоваровНаСкладах.Номенклатура КАК Номенклатура,
	                    |	ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
	                    |	ПартииТоваровНаСкладах.СерияНоменклатуры КАК СерияНоменклатуры,
	                    |	ПартииТоваровНаСкладах.СтатусПартии КАК СтатусПартии,
	                    |	СУММА(ВЫБОР
	                    |			КОГДА НЕ ТИПЗНАЧЕНИЯ(ПартииТоваровНаСкладах.Регистратор) В (&ТипыРегистраторов)
	                    |				ТОГДА 1
	                    |			ИНАЧЕ 0
	                    |		КОНЕЦ) КАК Поле1
	                    |ПОМЕСТИТЬ П1
	                    |ИЗ
	                    |	РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
	                    |ГДЕ
	                    |	ПартииТоваровНаСкладах.Период МЕЖДУ &ДатаНач И &ДатаКон
	                    |	И ПартииТоваровНаСкладах.Активность
	                    |	И (ПартииТоваровНаСкладах.СерияНоменклатуры = &СерияНоменклатуры
	                    |			ИЛИ &СерияНоменклатуры = ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка))
	                    |	И (ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры = &ХарактеристикаНоменклатуры
	                    |			ИЛИ &ХарактеристикаНоменклатуры = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка))
	                    |	И (ПартииТоваровНаСкладах.Номенклатура = &Номенклатура
	                    |			ИЛИ &Номенклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка))
	                    |
	                    |СГРУППИРОВАТЬ ПО
	                    |	ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры,
	                    |	ПартииТоваровНаСкладах.СерияНоменклатуры,
	                    |	ПартииТоваровНаСкладах.СтатусПартии,
	                    |	ПартииТоваровНаСкладах.Номенклатура
	                    |;
	                    |
	                    |////////////////////////////////////////////////////////////­////////////////////
	                    |ВЫБРАТЬ
	                    |	П1.Номенклатура,
	                    |	П1.ХарактеристикаНоменклатуры,
	                    |	П1.СерияНоменклатуры,
	                    |	П1.СтатусПартии
	                    |ИЗ
	                    |	П1 КАК П1
	                    |ГДЕ
	                    |	П1.Поле1 = 0");
	Зап3.УстановитьПараметр("ДатаНач",ДатаНач);
	Зап3.УстановитьПараметр("ДатаКон",ДатаКон);
	Зап3.УстановитьПараметр("ТипыРегистраторов",лТипыРегистраторов);
	Зап3.УстановитьПараметр("Номенклатура", Номенклатура);
	Зап3.УстановитьПараметр("ХарактеристикаНоменклатуры", ХарактеристикаНоменклатуры);
	Зап3.УстановитьПараметр("СерияНоменклатуры", СерияНоменклатуры);
	
	Рез3 = Зап3.Выполнить();
	
	лТЗЗап = Рез3.Выгрузить();
	
	КоличествоСтрок = лТЗЗап.Количество();
	лКолВоПотоков = Мин(КоличествоСтрок,КоличествоПотоков);
	КолВоВПотоке = Цел(КоличествоСтрок/лКолВоПотоков);
	КолвоВПоследнемПотоке = КоличествоСтрок%лКолВоПотоков;
	Сообщить("Количество строк " + КоличествоСтрок + " Количество в потоке " + КолВоВПотоке + " Количество в последнем потоке " + КолвоВПоследнемПотоке);
	
	НТекПотока = 0;
	НСеанса = 0;
	мТЗ.Очистить();
	лТЗ2 = мТЗ.Скопировать();
	лСтрТЗТЗ = мТЗТЗ.Добавить();
	лСтрТЗТЗ.ТЗ = лТЗ2;
	
	Для Каждого лТекСтрТЗЗап Из лТЗЗап Цикл
		лНовСтр = лСтрТЗТЗ.ТЗ.Добавить();
		ЗаполнитьЗначенияСвойств(лНовСтр,лТекСтрТЗЗап);
		НТекПотока = НТекПотока + 1;
		Если НТекПотока%КолВоВПотоке=0 Тогда
			ВызватьСеанс(НСеанса,лСтрТЗТЗ.ТЗ);
			НСеанса = НСеанса + 1;
			лТЗ2 = мТЗ.Скопировать();
			лСтрТЗТЗ = мТЗТЗ.Добавить();
			лСтрТЗТЗ.ТЗ = лТЗ2;
		КонецЕсли;
	КонецЦикла;
	
	Если КолвоВПоследнемПотоке > 0 Тогда
		ВызватьСеанс(НСеанса,лСтрТЗТЗ.ТЗ);
	КонецЕсли;
	
	ПодключитьОбработчикОжидания("ПроверитьСостояниеФоновыхЗаданий",1);
	
КонецПроцедуры

Процедура ВызватьСеанс(пНомер,пТЗ)
	лМассив = Новый массив();
	лНовСтр = мВыполненныеПроцессы.Добавить();
	лНовСтр.НомерЗапущенного = пНомер;
	лНовСтр.АдресВХранилище = Новый УникальныйИдентификатор;
	
	лАдрес = ПоместитьВоВременноеХранилище(Неопределено,лНовСтр.АдресВХранилище);
	лНовСтр.АдресВХранилище = лАдрес;
	
	лМассив.Добавить(пТЗ);
	лМассив.Добавить(ДатаНач);
	лМассив.Добавить(ДатаКон);
	лМассив.Добавить(лАдрес);
	лМассив.Добавить(пНомер);
	
	лКлюч = "ОбрабоктаТаблицы_" + пНомер;
	лСсылка = ПолучитьНавигационнуюСсылкуИнформационнойБазы();
	//Сообщить(лСсылка);
	
	Если СтрНайти(лСсылка,"e1c://server/")>0 и Не ЗапускатьНеВФоне Тогда
		Сообщить("Запущен фоновый процесс " + пНомер);
		лФоновоеЗадание = ФоновыеЗадания.Выполнить("мФоновые.ОбработатьТаблицу", лМассив, лКлюч, "ОбрабоктаТаблицы " + пНомер);
		лНовСтр.ФоновоеЗадание = лФоновоеЗадание;
	Иначе
		Сообщить("Запущен процесс " + пНомер);
		мФоновые.ОбработатьТаблицу(лМассив[0],лМассив[1],лМассив[2],лМассив[3],лМассив[4]);
	КонецЕсли;
КонецПроцедуры

Процедура ПроверитьСостояниеФоновыхЗаданий()
	лФл = Ложь;
	лМассивКУдалению = Новый Массив;
	Для Каждого лТекСтр Из мВыполненныеПроцессы Цикл
		лСтрук = ПолучитьИзВременногоХранилища(лТекСтр.АдресВХранилище);
		Если лСтрук<>Неопределено Тогда
			лТЗ = лСтрук.ТЗ;
			Сообщить("Завершён процесс " +лСтрук.Номер);
			//лТЗ = лДанные.Получить();
			лФл = Истина;
			Для Каждого лТекСтрТЗ Из лТЗ Цикл
				лНовСтр = мТЗ.Добавить();
				ЗаполнитьЗначенияСвойств(лНовСтр,лТекСтрТЗ);
				лФл = Ложь;
			КонецЦикла;
			УдалитьИзВременногоХранилища(лТекСтр.АдресВХранилище);
			лМассивКУдалению.Добавить(лТекСтр);
		Иначе
			лФл = Истина;
		КонецЕсли;
	КонецЦикла;
	
	Для Каждого лТекСтр Из лМассивКУдалению Цикл
		мВыполненныеПроцессы.Удалить(лТекСтр);
	КонецЦикла;
	
	Если лФл Тогда
		Возврат;
	КонецЕсли;
	мТЗ.Сортировать("Период");
	лНабор = РегистрыНакопления.ПартииТоваровНаСкладах.СоздатьНаборЗаписей();
	лРегистратор = Неопределено;
	лСтрокаТовара = "";
	лНаборТЗ = Новый ТаблицаЗначений;
	лСтруктураПоиска = Новый Структура("Номенклатура, Склад,  ХарактеристикаНоменклатуры, СерияНоменклатуры, СтатусПартии, Заказ, Качество");
	Для Каждого лТекСтр Из мТЗ Цикл
		Если лРегистратор<>лТекСтр.Регистратор Тогда
			Если лРегистратор<>Неопределено Тогда
				лНабор.Загрузить(лНаборТЗ);
				лНабор.ОбменДанными.Загрузка = Истина;
				лНабор.Записать(Истина);
				Сообщить("Записан " + лРегистратор);
			КонецЕсли;
			лРегистратор = лТекСтр.Регистратор;
			лНабор.Отбор.Регистратор.Значение = лРегистратор;
			лНабор.Прочитать();
			лНаборТЗ = лНабор.Выгрузить();
			лНабор.Очистить();
		КонецЕсли;
		ЗаполнитьЗначенияСвойств(лСтруктураПоиска,лТекСтр);
		лСтроки = лНаборТЗ.НайтиСтроки(лСтруктураПоиска);
		Для Каждого л_ТекСтрИЗСтроки Из лСтроки Цикл
			лНаборТЗ.Удалить(л_ТекСтрИЗСтроки);
		КонецЦикла;
		лСтрокаНабора = лНаборТЗ.Добавить();
		ЗаполнитьЗначенияСвойств(лСтрокаНабора,лТекСтр);
		лСтрокаНабора.Активность = Истина;
	КонецЦикла;
	Если лРегистратор<>Неопределено Тогда
		лНабор.Загрузить(лНаборТЗ);
		лНабор.ОбменДанными.Загрузка = Истина;
		лНабор.Записать(Истина);
		Сообщить("Записан " + лРегистратор);
	КонецЕсли;
	ОтключитьОбработчикОжидания("ПроверитьСостояниеФоновыхЗаданий");
	Сообщить("Обработаны товары: ");
	лТЗ = мТЗ.Скопировать();
	лТЗ.Свернуть("Номенклатура, ХарактеристикаНоменклатуры, СерияНоменклатуры, СтатусПартии");
	лТЗ.Сортировать("Номенклатура, ХарактеристикаНоменклатуры, СерияНоменклатуры, СтатусПартии");
 
	Для Каждого лТекСтр Из лТЗ Цикл
		Сообщить(" " + лТекСтр.Номенклатура + " | " + лТекСтр.ХарактеристикаНоменклатуры + " | " + лТекСтр.СерияНоменклатуры + " | " + лТекСтр.СтатусПартии);
	КонецЦикла;
	Сообщить("Завершено!")
КонецПроцедуры

Процедура ПриОткрытии()
	ДатаНач = '20070101';
	ДатаКон = '20090101';
	КоличествоПотоков = 5;
КонецПроцедуры

мВсеПроцессыВыполнены = Ложь;
мВыполненныеПроцессы = Новый ТаблицаЗначений();
мВыполненныеПроцессы.Колонки.Добавить("НомерЗапущенного");
мВыполненныеПроцессы.Колонки.Добавить("НомерВыполненного");
мВыполненныеПроцессы.Колонки.Добавить("АдресВХранилище");
мВыполненныеПроцессы.Колонки.Добавить("ФоновоеЗадание");

мТЗТЗ = Новый ТаблицаЗначений();
мТЗТЗ.Колонки.Добавить("ТЗ");

мТЗ = Новый ТаблицаЗначений();

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

Показать


Общий модуль для выполнения фоновых заданий:
Процедура ОбработатьТаблицу(пТЗ,пДатаНач,пДатаКон,пАдресВХранилище,пНомер) Экспорт
	мТЗ = пТЗ.Скопировать();
	Зап = Новый Запрос("ВЫБРАТЬ
	                   |	ТЗ.Номенклатура,
	                   |	ТЗ.Склад,
	                   |	ТЗ.ХарактеристикаНоменклатуры,
	                   |	ТЗ.СерияНоменклатуры,
	                   |	ТЗ.СтатусПартии,
	                   |	ТЗ.Заказ,
	                   |	ТЗ.Качество
	                   |ПОМЕСТИТЬ ТЗВрТаб
	                   |ИЗ
	                   |	&ТЗ КАК ТЗ
	                   |;
	                   |
	                   |////////////////////////////////////////////////////////////­////////////////////
	                   |ВЫБРАТЬ
	                   |	ПартииТоваровНаСкладах.Период КАК Период,
	                   |	ПартииТоваровНаСкладах.Регистратор КАК Регистратор,
	                   |	ПартииТоваровНаСкладах.НомерСтроки,
	                   |	ПартииТоваровНаСкладах.Активность,
	                   |	ПартииТоваровНаСкладах.ВидДвижения,
	                   |	ПартииТоваровНаСкладах.Номенклатура КАК Номенклатура,
	                   |	ПартииТоваровНаСкладах.Склад КАК Склад,
	                   |	ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
	                   |	ПартииТоваровНаСкладах.СерияНоменклатуры КАК СерияНоменклатуры,
	                   |	ПартииТоваровНаСкладах.ДокументОприходования,
	                   |	ПартииТоваровНаСкладах.СтатусПартии КАК СтатусПартии,
	                   |	ПартииТоваровНаСкладах.Заказ КАК Заказ,
	                   |	ПартииТоваровНаСкладах.Качество КАК Качество,
	                   |	ПартииТоваровНаСкладах.Количество,
	                   |	ПартииТоваровНаСкладах.Стоимость,
	                   |	ПартииТоваровНаСкладах.КодОперации,
	                   |	ПартииТоваровНаСкладах.СписаниеПартий,
	                   |	ПартииТоваровНаСкладах.НомерКорСтроки,
	                   |	ПартииТоваровНаСкладах.ДокументДвижения,
	                   |	ПартииТоваровНаСкладах.ДокументДвиженияПериод,
	                   |	ПартииТоваровНаСкладах.НомерСтрокиСписанныхТоваров
	                   |ИЗ
	                   |	РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
	                   |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТЗВрТаб КАК ТЗ
	                   |		ПО ПартииТоваровНаСкладах.Номенклатура = ТЗ.Номенклатура
	                   |			И ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры = ТЗ.ХарактеристикаНоменклатуры
	                   |			И ПартииТоваровНаСкладах.СерияНоменклатуры = ТЗ.СерияНоменклатуры
	                   |			И ПартииТоваровНаСкладах.СтатусПартии = ТЗ.СтатусПартии
	                   |ГДЕ
	                   |	ПартииТоваровНаСкладах.Период МЕЖДУ &ДатаНач И &ДатаКон
	                   |	И ПартииТоваровНаСкладах.Активность
	                   |
	                   |УПОРЯДОЧИТЬ ПО
	                   |	Склад,
	                   |	Номенклатура,
	                   |	ХарактеристикаНоменклатуры,
	                   |	СерияНоменклатуры,
	                   |	СтатусПартии,
	                   |	Заказ,
	                   |	Качество,
	                   |	Период,
	                   |	Регистратор");
	Зап.УстановитьПараметр("ТЗ",мТЗ);
	Зап.УстановитьПараметр("ДатаНач",пДатаНач);
	Зап.УстановитьПараметр("ДатаКон",пДатаКон);
	Рез = Зап.Выполнить();
	лНоменклатура = Неопределено;
	лХарактеристикаНоменклатуры = Неопределено;
	лСклад = Неопределено;
	лСерияНоменклатуры = Неопределено;
	лСтатусПартии = Неопределено;
	лЗаказ = Неопределено;
	лКачество = Неопределено;
	
	Выборка = Рез.Выбрать();
	
	мТЗ.Очистить();
	лТЗДокументовОприходования = Новый ТаблицаЗначений();
	лТЗДокументовОприходования.Колонки.Добавить("ДокументОприходования");
	лТЗДокументовОприходования.Колонки.Добавить("Количество");
	лТЗДокументовОприходования.Колонки.Добавить("Стоимость");
	
	Пока Выборка.Следующий() Цикл
		Если лНоменклатура=Выборка.Номенклатура И
			лХарактеристикаНоменклатуры=Выборка.ХарактеристикаНоменклатуры И
			лСклад=Выборка.Склад И
			лСерияНоменклатуры=Выборка.СерияНоменклатуры И
			лСтатусПартии=Выборка.СтатусПартии И
			лЗаказ=Выборка.Заказ И
			лКачество=Выборка.Качество Тогда
			
		Иначе
			лНоменклатура=Выборка.Номенклатура;
			лХарактеристикаНоменклатуры=Выборка.ХарактеристикаНоменклатуры;
			лСклад=Выборка.Склад;
			лСерияНоменклатуры=Выборка.СерияНоменклатуры;
			лСтатусПартии=Выборка.СтатусПартии;
			лЗаказ=Выборка.Заказ;
			лКачество=Выборка.Качество;
			
			лТЗДокументовОприходования.Очистить();
		КонецЕсли;
			
		Если Выборка.ВидДвижения = ВидДвиженияНакопления.Приход Тогда
			лНовСтр = мТЗ.Добавить();
			ЗаполнитьЗначенияСвойств(лНовСтр,Выборка);
			Если Выборка.Количество<>0 Тогда
				лНовСтрОприходования = лТЗДокументовОприходования.Добавить();
				ЗаполнитьЗначенияСвойств(лНовСтрОприходования, Выборка);
			КонецЕсли;
		Иначе
			лКоличество = Выборка.Количество;
			лМассивСтрокКУдалению = Новый Массив;
			Для Каждого лТекСтрОприходования Из лТЗДокументовОприходования Цикл // ФИФО
				лНовСтр = мТЗ.Добавить();
				ЗаполнитьЗначенияСвойств(лНовСтр,Выборка);
				лЦена = лТекСтрОприходования.Стоимость / лТекСтрОприходования.Количество;
				лНовСтр.ДокументОприходования = лТекСтрОприходования.ДокументОприходования;
				Если лТекСтрОприходования.Количество>лКоличество Тогда
					лТекСтрОприходования.Количество = лТекСтрОприходования.Количество - лКоличество;
					лНовСтр.Количество = лКоличество;
					лНовСтр.Стоимость = лКоличество*лЦена;
					лТекСтрОприходования.Стоимость = лТекСтрОприходования.Стоимость - лНовСтр.Стоимость;
					лКоличество=0;
				ИначеЕсли лТекСтрОприходования.Количество<=лКоличество Тогда
					лКоличество = лКоличество - лТекСтрОприходования.Количество;
					лНовСтр.Количество = лТекСтрОприходования.Количество;
					лНовСтр.Стоимость = лТекСтрОприходования.Стоимость;
					лМассивСтрокКУдалению.Добавить(лТекСтрОприходования);						
				КонецЕсли;
				Если лКоличество<=0 Тогда
					Прервать;
				КонецЕсли;
			КонецЦикла;
			Если лКоличество>0 Тогда
				Сообщить("Не хватает количества при распределении по партиям товар: " + Выборка.Номенклатура + " " + Выборка.ХарактеристикаНоменклатуры + " по документу " + Выборка.Регистратор);
			КонецЕсли;
			Для Каждого лТекСтрОприходования Из лМассивСтрокКУдалению Цикл
				лТЗДокументовОприходования.Удалить(лТекСтрОприходования);
			КонецЦикла;
		КонецЕсли;
		
	КонецЦикла;
	лСтрук = Новый Структура("ТЗ, Номер", мТЗ, пНомер); 
	лАдрес = ПоместитьВоВременноеХранилище(лСтрук, пАдресВХранилище);
	ЗаписьЖурналаРегистрации("ТестированиеЖР",,,,лАдрес);
	ЗаписьЖурналаРегистрации("ТестированиеЖР",,,,пАдресВХранилище);
	
КонецПроцедуры
Показать


Опробовано на сервере 1с с СУБД MSSQL на 5 потоках.
В фоновый процесс передаётся список товаров для обработки. Там он по товарам получает данные по записям регистра "Партии товаров на складах" и проходит последовательно по ним. Возвращает таблицу значений для своей порции данных.
Запись в регистры выполняется в один поток
nomad_irk; +1 Ответить
203. Salavat 13 19.06.20 21:29 Сейчас в теме
(195), а теперь - попробуй, пожалуйста,
(своим алгоритмом):

1. Условия:

есть последовательность документов -

Приход1, Расход1, Приход2, Расход2.

Номенклатура одна позиция (для простоты).

В приходах - цена, разная.

Да - возьмём ФИФО (как ты привёл, но - сути это не меняет, здесь. Можно и ЛИФО, и Среднюю - без разницы)

2. Задача.

Провести параллельно - 4 документа.

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

---
Получишь верный результат?
(своим алгоритмом!)
204. starik-2005 3033 19.06.20 22:13 Сейчас в теме
(203)
Получишь верный результат?
Аргумент слабый, ибо любой может предложить условия задачи, в которой самый лучший алгоритм проиграет самому худшему (например, упорядочить массив из двух аргументов, при том быстрая сортировка параллелится отлично, но на двух элементах она проиграет примитивному сравнению, даже не четырех она будет проигрывать пузырьку, а вот на миллионе - там уже мало что с ней сравнится при параллельной реализации). Для четырех документов смысла в параллельности нет, т.к. это ровно такой случай. А на сотне тысяч случайных документов последовательный алгоритм проиграет параллельному.
209. Salavat 13 20.06.20 08:31 Сейчас в теме
(204)
Продемонстрируй факт!
(чтобы не было блудом - снова)

Где алгоритм (любой!) - даст однозначное (и верное!) решение.

Задачу, повторю - не "Получить решение от 2+2" (как тут многие поняли!),
а именно- Распараллеить проведение документов (принадлежащих - одной последовательности).

Продолжай дерзать!
(пока - безуспешно)
213. mrsmrv 125 20.06.20 09:33 Сейчас в теме
(209)
Распараллеить проведение документов


Вы же писали что параллелить нужно не проведение документов а:

"34. Salavat 13 25.05.20 19:07
(14)
т.к. интерпретатор языка 1С не умеет многопоточность, в привычном понимании этого термина.
1с - никогда и не будет многозадачным.
Пример - попробуйте распараллелить восстановление последовательности документов.

Параллельность можно применить, только - если есть статические данные.
Архивирование, картинки, видео - всё.
А не те, что зависят от других (меняющихся)."

Вы же хотели распараллелить Восстановление последовательности. И Конкретно - партионный учёт.


У вас что, ума не хватило текст модулей воткнуть и проверить работу приведённого мной текста?
217. Salavat 13 20.06.20 10:09 Сейчас в теме
(213) унас - не хватило, да.
я оставил этот удел - "умникам".

Ответь на простой вопрос -
(применительно, к далее, мною уточнённому, для обозначения сути -
Повторюсь (раз ты не можешь никак понять), до сих пор-

Есть 4 Дока (Номенклатура - одна позиция. Не количество и не Цена!) -
Берём "по средней" - чтобы ещё проще было)

Поступление1 2 Шт * 3 руб.
Реализаци1 - 1 шт. * 3 руб.
Поступление2 - 2 шт. * 4 руб.
Реализация - 2 шт * 2,667 руб.

Нука, давай сделай параллельное (и с верной ценой!) проведение, всех 4-рёх документов.

(и да - ненадо тут "хвастаться своим "знанием и умением Систем Уравнений и ,.." прочими терминами кидаться.
Я тебе скажу уточнение, всего-лишь!
Перед проведением - все документы - должны быть распроведены.
(напомнить - что значит - восстановить последовательность?)
А => и Цены Реализации не известны!)

ну и - Где ты ("умник") - цену взял для Реализаций?
Причём - для Обеих Реализаций!

Повторюсь - Распараллелить, это не значит "2+2 сосчитать", а значит -

- Одномоментно Проводить 4 (в данном примере!) и С Верными Ценами!

Да (одно снисхождение сделаю) -
Хорошо - попробуй (хотябы) сделать, чтобы -
Поступления Проведены (Уже!).
А надо, только провести (Параллельно!) оба Расхода.
(Напомню - перед проведением каждой Реализации - должна быть известна Цена Реализации)

Надеюсь всёже - ты не скажешь, что - "проблемы нет - провести параллельно 1*3 и 2*2,667"
(повторю "умник" - 1, 3, 2 и 2,667 - это всего-лишь пример (элементарный простой).
Сделай, как в математике формулы излагают - на X, Y, Z,..

Скрытый текст
216. mrsmrv 125 20.06.20 10:04 Сейчас в теме
(204) Сначала задача показалась мне интересной, и немного была интереса реакция персонажа. Теперь резко и сразу мне стало на него абсолютно пофигу, потому-что он невменяем. Если и будет решение для перепроведения (восстановления последовательности) параллельной. то это будет уже универсальное и платное решение, если и будет. Актуальность этой задачи в современных реалиях сомнительна. Нужно будет какому нибудь заказчику, что-ж сделаем.
218. starik-2005 3033 20.06.20 17:23 Сейчас в теме
(216)
Теперь резко и сразу мне стало на него абсолютно пофигу, потому-что он невменяем.
Так сразу было ясно, что человек страдает деменцией. Я вот на него давно перестал реагировать, а тут - на тебе - куча новых сообщений, 90% содержания которых у данного персонажа - бред. Человек в принципе не понимает, что самая долгая операция при проведении документов - это запись состояния, а запись готовых наборов можно производить параллельно без труда. Для него проведение - это именно запись документа-объекта целиком в режиме проведения, при том он из-за деменции своей не может понять, что восстановление последовательности документов, если какой-то добрый человек записал их все в 23:59:59 (что часто встречается) может и не дать результата, если вдруг окажется, что документы реализации проводятся вперед документов поступления. Ему такой кейс и в голову не придет.
205. mrsmrv 125 20.06.20 04:39 Сейчас в теме
(203) Арёл, ты спрашивал про любые условия задачи, получил пример, когда можно распараллелить. Теперь начал ставить свои. Чтож. Я был готов к этому, подозревал что ты начнёшь что-то подобное. Будет время, допилю, а пока извини лето, стройка, свободного времени нет.
Можно и по одной номенклатуре распараллелить, только документов логично взять побольше. При определённых условиях можно и по два, Например в каждом документе по сотне других товаров, трогать которые не требуется.
208. Salavat 13 20.06.20 08:24 Сейчас в теме
(205) арёл, ну написал бы алгоритм для сложения 2+2 и хвастался бы этим.
Абсолютно - с такимже успехом.

Я тебе (в т.ч.) - обозначил элементарную задачу.

которую - невозможно распараллелить!
Принципиально! (об этом - я также, неоднократно повторял!)

Выж тут (большинство!) - "пытались" обозвать меня идиотом.
Ты вон даже - "мыло какоето, сварить" попытался.

И сноваже (продолжая отрицать, элементарные аксиомы!) - продолжаешь звать меня кретином.

Ну давай, "Перельман" (кавычки - потомучто ты себя считаешь - не тем!) - продолжай дальше, придумывать "очередной" рецепт мыла.
Скрытый текст
212. mrsmrv 125 20.06.20 09:31 Сейчас в теме
215. Salavat 13 20.06.20 09:46 Сейчас в теме
(212), да -
я не опечатался/ошибся.
Очередной - примитивный (это - не укор тебе!, а всего-лишь для того-чтобы было ясно. Максимально ясно - т.к., об обыденной вещи сказал)пример сравнения.
207. mrsmrv 125 20.06.20 05:09 Сейчас в теме
(203) Извините.
Дурачок никогда не признает свою неправоту. Он начнёт юлить, изменять условия задачи, ставить всё новые ограничения, но сказать, "Да я был не прав, ваше решение работает, признаю свою ошибку" Это же так в духе НеНавальновцев, неправда ли Салаватушка, Арёл ты наш.
Так что дружок, думай-тэ, прежде чем написать что-то, а тем более грубить.
210. Salavat 13 20.06.20 08:36 Сейчас в теме
(207), "умник" - я тебе уже неоднократно приводил пример (твоих бессмысленых выбросов) -
(повторяю снова)

Навальный, тоже себя считает праведником.
(Правда при этом - легко не платит налоги - в т.ч..
А финансирование получает - от того, кого и на его родине считают преступником.
Но, у него-то, отмазато "железная есть" - "он борется с коррупцией")

Продолжай и ты, дальше "бороться".
211. Salavat 13 20.06.20 08:45 Сейчас в теме
(207), и да - я своё имя - не скрывал никогда, и не стыдился т.б.

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

Это - всего-лишь выбор другого.

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

И ещё - ты себе дружков, в своей подворотне, ищи.
(но ты похоже - и здесь начнёшь "надумывать на ровном месте")
У меня - никогда не было дружков и, никогда и не будет!

Ок - на тебе пищу, очередным твоим изливаниям.
198. mrsmrv 125 05.06.20 20:01 Сейчас в теме
(158) Просто берёшь например демобазу УТ, создаёшь обработку в конфигураторе, на форме создаёшь реквизиты: КоличествоПотоков - число целое, ДатаНач, ДатаКон, Номенклатура, ХарактеристикаНоменклатуры, СерияНоменклатуры типы значений логично, что даты и ссылки на справочники. В модуле формы вставляешь первый пример кода.
Создаёшь общий модуль мФоновые, в него копируешь текст из второго примера кода.
Запускаешь, указываешь желаемое число потоков, которые будут обрабатывать Параллельно, сочетания Номенклатуры, Характеристики и Серии, Наслаждаешься процессом, В диспетчере задач, можешь наблюдать за нагрузкой на многоядерный процессор. В консоли администрирования серверов можно посмотреть сеансы, а в журнале регистрации базы. как процессы запускались и как они завершались. Ну и результат по партиям можно попроверять, приходные документы поизменять и посмотреть результат в отчёте "Ведомость по партиям товаров на складах". Если будут вопросы, или ты увидишь, что алгоритм работает неправильно - пиши, посмотрю, я не гордный. Но Твоё поведение в комментариях выглядит идиотским и заставляет сомневаться в твоей умственной полноценности.
199. mrsmrv 125 05.06.20 20:02 Сейчас в теме
(158) И ещё - чистить комменты - трусость!
202. Salavat 13 19.06.20 21:12 Сейчас в теме
(199) Трус - ты.
(хотя согласен - это не в тему Но тыже не испугался пукнуть, в мой адрес)

Я чищу - от синтаксических/грамматических/смысловых/.. ошибок.
Моих ошибок!

С какжика, "смелый" - с каких пор поправление себя - считается трусостью?
206. mrsmrv 125 20.06.20 04:43 Сейчас в теме
(202)
Трус - ты.

Подскажите "любезный", в чём же проявилась моя трусость?

"С какжика, "смелый" - с каких пор поправление себя - считается трусостью?" -
Была удалена целая ветка комментариев вместе с моими. Может это модератора сайта, а может и нет.
214. Salavat 13 20.06.20 09:44 Сейчас в теме
(206), я (всего-лишь!) - показал бессмысленность твою и здесь.
Расшифровываю "умнику" в очередной раз -

научись (хотябы!) подбирать выражения, к месту.
Глядишь (не 100%!, но и не 0%) - и понимание остальных - появится.
139. starik-2005 3033 26.05.20 20:02 Сейчас в теме
(132)
а чО грубим
Видимо с работы турнули из-за того, что не смог распараллелить учет в своей шахте угля )))

ЗЫ: Как-то у нас был контур проверки недействительных паспортов. Работало так: читался файл с недействительными паспортами, каждый новый паспорт дописывался в файл с именем серии, потом это все по 50к, упорядоченное по серии, вставлялось в регистр сведений. Занимало упражнение 8 часов. Распараллелили - стало занимать 4 часа даже при 10-ти потоках, но начиная с 20кк (а там было 120кк) записей каждая третья, а потом и вторая, а потом и девять из десяти параллельных записей валились в дэдлок, т.к. даже при последовательной записи упорядоченных непересекающихся данных в несколько потоков система сильно тормозила на расщеплении страниц.
Т.е. вот независимые данные, которые - пожалуйста - параллель, как хошь безо всяких вксиом, но т.к. таблица одна, и она проиндексирована, все начинает упираться в механику СУБД.
В итоге я предложил вариант, когда просто создается соответствие с ключом серии и значением ЗаписьТекста, в которое в соответствии с серией записывается файл. Никакой многопоточности, 40 минут на все про все.
Но мы потом пошли дальше - создали большую хеш-таблицу, куда засунули все возможные версии - 10 минут в один поток с поиском О(1). И этот алгоритм можно было распараллелить на сколько угодно потоков - эффективность росла пропорционально потокам. На С++ в один поток файл грузился даже на моем ноуте в районе 4-х секунд, а если разархивировать, прочитать и записать в архив хеш-таблицу - 90 секунд примерно, из которых разархивирование занимает 95% времени.

Все зависит от алгоритма. Если воспринимать учет, как жестко связанную последовательность событий, то это ни разу не параллелится, а если как матрицу состояний - легко.
nomad_irk; mrsmrv; +2 Ответить
142. Salavat 13 26.05.20 20:06 Сейчас в теме
(139)
Все зависит от алгоритма.
любым (выбор за тобой) - реши задачу - https://forum.infostart.ru/forum34/topic241565/?PAGEN_1=2#message2447915
135. mrsmrv 125 26.05.20 19:55 Сейчас в теме
(123)
Есть 2 документа.
Результат второго - зависит от результата первого.
Как нам параллельно провести, оба документа?
тут это и незачем именно параллельно, но незачем если в каждом документе товар лишь один, а если товаров больше одного то и здесь можно распараллелить (но особого смысла нет, если их не сотни и тысячи), способ я уже описал, ищи-Те.
144. Salavat 13 26.05.20 20:09 Сейчас в теме
(135)
ищи-Те
я уже нашёл.

Жду решения твоего (ты же - не согласен с ним) - https://forum.infostart.ru/forum34/topic241565/?PAGEN_1=2#message2447915

Нука, покажи - свою половозрелость.
(тыже - на неё уже начал "ударять")
115. starik-2005 3033 26.05.20 19:02 Сейчас в теме
(112)
То чего нет (в один момент!) - невозможно распараллелить.
Ну вот всем друзьям Перельмана как минимум должно быть известно о числах ряда Фибоначчи. Чем интересны эти числа? Тем, что следующее число равно двум предыдущим. Полагаясь на примитивную логику можно предположить, что алгоритм не параллелится, но это только для тех, кто не в курсе свойств этих чисел.

А вот тут пример использования CUDA для многопоточного расчета этих чисел с кодом.
nomad_irk; mrsmrv; +2 Ответить
121. Salavat 13 26.05.20 19:18 Сейчас в теме
(115)
А вот тут пример использования CUDA для многопоточного расчета этих чисел с кодом.
а теперь приведи пример - как упорядочить неупорядоченно, принципиально!

Как ты (я - не время имею ввиду! упорядочиваешь количества и суммы (которые, абсолютно разные и не систематизированы никак!)?

Повторяю - не путай комбайн с экскаватором.
Это - разные предметы.
Не надо приплетать "умные словечки" куда ни попадя.

Я тебе элементарный вопрос задал - попробуй ответить на него.
(применив один из ваших методов навального.
179. Painted 49 29.05.20 18:21 Сейчас в теме
(115) Чет кажется ошибку нашел ))
Прикрепленные файлы:
181. starik-2005 3033 29.05.20 18:42 Сейчас в теме
(179)
Чет кажется ошибку нашел
Да, должен быть плюс. Просто автор неудачно скопировал, видимо, поэтому ошибка затесалась.Там умножение дальше идет.
83. Salavat 13 26.05.20 13:46 Сейчас в теме
(79)
на таком разрешении с хорошим видеоадаптером могут показать и 60 таких кадров в секунду.
однако - более 60, в настоящее время - проблематично, до сих пор.
Очень проблематично.
81. Salavat 13 26.05.20 13:37 Сейчас в теме
(78)Да, согласен (я слишком обрезал, своё высказывание), правильнее сказать так:

В 1с, есть задачи, которые невозможно сделать параллельными.
(Из-за их - природы происхождения)
И таких задач (именно в 1с) - немало! Решается.

А так, конечно - ничто не мешает, в 1с вкрутить тотже архиватор (идеально подходит для распараллеливания)
И (на основании этой вкрутки "утверждать", что - без проблем, распараллеливается.

Повторюсь - есть задачи, в которых элементы, находятся в зависимости (временнОй - в т.ч.) от других.
Такие задачи - невозможно распараллелить. Принципиально. (странно, если ктото - сомневается в этом)

(78)
роведение закрытия месяца делать средствами видеоядер
- это другое.
Таже Нвидия например показала именно то, о чём Вы сказали сейчас - https://3dnews.ru/1011801
33. Salavat 13 25.05.20 19:04 Сейчас в теме
(12)
Я говорю про объективность теста Гилева
как Вы можете говорить об объективности, если элементарно сами - необъективно пытаетесь оценить.
Gilev.Vyacheslav; +1 Ответить
31. Salavat 13 25.05.20 19:02 Сейчас в теме
(9)
На том же Xeon D-1557 1.50GHz
такие "ГГц" - надо было выкинуть - лет 15 назад, железно!
(даже файловым сервером на током фуфле - это издевательство над юзерами)
69. Sedaiko 572 26.05.20 01:48 Сейчас в теме
(31) Про файловые сервера я не говорю. Адепты файловых БД - берите хоть 3.4ГГц и садите всех на терминалку или через http. Пусть в той же ЗУП поработают человек 20-40. В этом случае сколько бы ядер не было, здесь решает все тактовая частота.
Результаты в клиент-серверном варианте на процессоре 1,5 ГГц и нужном количестве ядер, с точки зрения пользователя, выглядит гораздо лучше, не смотря на то что тест Гилева говорит об обратном.
А теперь сравните стоимость серверных процессоров в зависимости от тактовой частоты.
Однако неграмотный админ или 1С-ник будет орентироваться на тест Гилева и рекомендовать процессор с большей тактовой частотой.

такие "ГГц" - надо было выкинуть - лет 15 назад, железно!

Вы не путайте геймерские сборки с промышленными.
71. Salavat 13 26.05.20 05:57 Сейчас в теме
(69)
Про файловые сервера я не говорю. Адепты файловых БД - берите хоть 3.4ГГц
Вы путаете - разные вещи. Абсолютно.
Слова разные слышали, а смысл их - не поняли.
Раз не поняли, разъясняю (кратко) -
- У файловой - весь код выполняется на клиенте.
- У серверной - на сервере.
Соответственно и частота нужна - или клиента, или сервера.
(кстати не забывайте! На клиенте - тоже код выполняется. И у серверной базы!)
(69)
на процессоре 1,5 ГГц
это не процессор, это мусор (даже для смартфонов - уже вплотную к 3 ГГц, подошли) - уже, лет 15, минимум! Я реально не знаю - что Вы там можете получить (с 1с - в частности).
(мы (15 пользователей - максимум) на 2,5 ГГц - не можем ЗУП 3.1 пользовать - ждём ответа..........)
(69)
сравните стоимость серверных процессоров в зависимости от тактовой частоты.
цена зависит от частоты - это принципиальная характеристика влияющая на цену, именно процессоров.
И не только серверных - всех!
(только не надо тут утверждать, что - i9-9900K стоит дешевле любого (современного!) Xeona
(69)
Вы не путайте геймерские сборки с промышленными
В отличие от Вас - я смотрю не только на названия, а на суть.
У геймерской и промышленной сборки, задача одна - достаточная производительность.
(да - в разных разрезах, но - решение для получения результата одна! Частота ЦПУ - должна быть выше.
Только не надо тут умными словечками бросаться про - ГПУ, SSD, разрешение (и - его частоту!) монитора, настройку системы))
Абсолютно всегда и везде - на любую сборку поставьте ЦПУ, с большей частотой - и результат (производительность!) будет выше.
(И да - не говорите тут про тормоза в дисковой, ОЗУ, сетевой,... системах.
Про это - Вы "думайте" на своих 1,5 ГГц. На здоровье)

Скрытый текст
Gilev.Vyacheslav; +1 Ответить
10. acanta 25.05.20 13:03 Сейчас в теме
Если ПО (или оперционка) лицезируется по количеству ядер процессора и при этом нормально тянет меньшее количество прикладных программ, чем доступные ядра, то мне не понятно сколько ядер нужно для нормальной работы самой операционки и почему эти ядра включены в лицензионное соглашение.
35. Salavat 13 25.05.20 19:10 Сейчас в теме
(10)ядер нужно столько, чтобы хватало на работу пользователей.
Всех.
Если что - и ядра/потоки, это тоже - не идеал.
Это просто - самый простой/эффективный способ увеличения параллельности.
Всех процессов. (не только 1с их использует!)
Даже если ядро одно (утрирую, но - когдато было именно так!), то - одно ядро, будет поочереди исполнять все потоки
18. starik-2005 3033 25.05.20 14:48 Сейчас в теме
i7-4500U - это древний проц (2013-го года). У меня на работе ноут на I7-5500U - более новом, максимум смог из него выжать 49 попугаев на файловой на обычном винте, в Гилеве видел максимально 54.35. Сейчас посмотрел I7-4500U - максимум был в 2014-м году 58.82 на файловой, при этом частота 1,8 против 2,4 и одинаковая в бусте, но тестов очень мало - менее 10 на каждый процессор. При этом тесты R5-3500U тоже есть, и они хуже, чем у Intel - до 50-ти не дотягивают и все от текущего года. Но частота в бусте у АМД 3,7 против 3.0 у Интела, поэтому меня терзают смустные сомнения, ибо разброс значений у Интела от 30+ до 50+, а у АМД 37-45, что, на мой взгляд, говорит о том, что высокую производительности пользователи АМД не включили в своей винде, т.к. даже мой ноут домашний на 8250U набирает в Гилеве 80!

Да, и этот АМД - это ZEN+, а не ZEN2 - уже не самая новая архитектура.
26. Salavat 13 25.05.20 18:43 Сейчас в теме
Intel® Core™ i9-9900K
не удивительно.
Одно НО (немаловажное!) - это несерверный ЦПУ
(ОЗУ, линий PCIe,... - слишком мало у него. Масштабируемости - 0 Для серверов)

И (добавка) - вышел (только-только - ещё в магазинах нет) - i9-10900K - он ещё быстрее!
(без сарказма, я здесь)

Такие ЦПУ- годятся для неслишком обеспокоенных резервированием.
(повторюсь - согласен - это самые быстрые! что для 1с - первоочередное!)

Для серверов нужны:

Xeon® Gold 6256
Xeon® Gold 6244
Xeon® Gold 6246.

Но,... - готовьте бабки господа!
Gilev.Vyacheslav; Sedaiko; +2 Ответить
27. starik-2005 3033 25.05.20 18:49 Сейчас в теме
(26)
Для серверов нужны:

Xeon® Gold 6256
Xeon® Gold 6244
Xeon® Gold 6246.
Тогда уж 6250 - у него сток 3,9ГГц, а буст - 4.5ГГц - вот он даст просраться всем ))) А еще и кэша у него больше.
29. Salavat 13 25.05.20 18:57 Сейчас в теме
(27) Сами смотрите/выбирайте - https://ark.intel.com/content/www/ru/ru/ark/compare.html?productIds=198652,198655,192442,193969
Насчёт - НеБуст (Буст - одинаков) у него выше, это не особо значимая величина.

Любой ЦПУ - легко свою частоту может (в зависимости от нагрузки) и меньше делать и больше. (Базы).
И 100 МГц - это не та величина, на которую я бы променял - 4 дополнительных ядра.
(8 потоков - ровно, в 1,5 раза больше Вашего 6250)
66. sklskl 8 26.05.20 00:00 Сейчас в теме
А кто бы какой проц взял если выбирать из: e5 2637 v3, e5 2643 v3, e5 2667 v3, E5-1650V3?
67. starik-2005 3033 26.05.20 01:06 Сейчас в теме
(66)
e5 2637 v3, e5 2643 v3, e5 2667 v3, E5-1650V3?


E5-1650V3 - 1 сокет, но при этом максимальная частота в стоке и бусте. Память DDR4 2133, но 4 канала, что уже хорошо.

Остальные процессоры 2-х сокетные и различаются только ядрами и частотой, так что все зависит от количества пользователей.

E5-2637V3 - самый быстрый из них, но у него всего 4 ядра и 8 потоков. В полном комплекте даст работать 80-150 пользователям.
E5-2643V3 - чуть медленнее в стоке, но уже 6 ядер 12 потоков, должен догнать по производительность хорошо настроенный Ryzen 2600. 100-200 пользователей.
E5-2667V3 - ещё чутка медленнее в стоке и бусте, но не сильно, при том 8 ядер и 16 потоков. В пределе даст работать 200-300 пользователям.

Если пользователей меньше ста, то я бы взял первый проц.
70. ansh15 26.05.20 02:35 Сейчас в теме
(66) Сейчас, при уже выпускающихся и продающихся E-2278G, W-2245 и каких-нибудь Gold 6244?
Никакой. Все это уже устарело. Надо смотреть вперед.
80. sklskl 8 26.05.20 13:03 Сейчас в теме
(70) Вы как бы не заметили, что сокет то 2011? Не нужно сравнивать красное с зеленым, здесь вопрос риторический на самом деле, но есть рабочее железо на котором стоит совсем убогий камень. Нужно его сменить, поэтому я просто поинтересовался. Почему не v4? Да потому что разницы совсем мало между одним и тем же камне v3 и v4, а стоимость глобально различается.
68. starik-2005 3033 26.05.20 01:07 Сейчас в теме
Кстати, попалась на глаза статейка, почему винда в однопоточном тесте Гилева показывает результаты хуже, чем Linux.
https://www.overclockers.ua/cpu/amd-zen-2-custom-power-plan/

Просто для пояснения: планировщик Windows не поддерживает SMT, только алгоритм парковки ядра осведомлен о SMT. Почему это важно? Потому что в режиме высокой производительности система основной парковки отключена. Каждое отдельное ядро отключено, и поэтому планировщик процессов весело мигрирует потоки через каждое физическое и виртуальное ядро в системе (если все ядра не заняты, например, многопоточной рабочей нагрузкой). Это означает, что даже однопоточная рабочая нагрузка заканчивается перемещением между CCX или даже CCD, и ей приходится перетаскивать все данные, с которыми она работает, за ним, примерно в среднем каждые 5–40 миллисекунд в зависимости от используемого SMU и сборки ОС. В игре умножьте это на количество эффективных потоков, которые игра запускает и в результате вы получите фризы или низкий 1% фреймрейт. Не только это, но и потоки разделяют физическое ядро гораздо чаще. Linux справляется с этим гораздо лучше: он активно предпочитает хранить потоки на одном и том же ядре до тех пор, пока на этом ядре нет конфликтов планирования. Таким образом, однопоточная рабочая нагрузка в Linux обычно будет оставаться на одном и том же ядре в течение нескольких секунд, если не дольше. Это не только позволяет избежать накладных расходов при миграции потока, но также позволяет избежать пропусков кэша и трафика между CCX, который может возникнуть в результате такой миграции. Такое поведение не является специфичным для Ryzen, но было стандартным на всех компьютерах SMP/SMT/CMT, работающих под управлением Linux, в течение нескольких лет.

Неделю назад Microsoft выпустила обновление для Windows 10 (1909), которое дает планировщику ОС возможность определять приоритеты потоков. Я протестировал предварительную сборку этой версии и не заметил значительных улучшений. Довольно часто планировщик использовал более высокий приоритет для фоновых процессов. Я думаю, вы представляете, что происходит, если Windows отдает приоритет такому процессу, а не вашей текущей запущенной игре.

Мой подход к устранению этого недостатка в планировщике Windows заключается в использовании настраиваемого профиля электропитания, который обеспечивает лучшее управление планировщиком по распределению нагрузок между ядрами. Сперва будут вовлечены, по возможности, лучшие ядра, что приведет более высокому и плавному fps. Если лучшие ядра будут заняты — нагрузка распределится по ядрам с меньшим рангом.
74. Salavat 13 26.05.20 10:05 Сейчас в теме
(68)
статейка, почему винда в однопоточном тесте Гилева показывает результаты хуже, чем Linux.
странная статейка.
С такимже успехом можно сравнить комбайн и экскаватор.
73. Albert_2008 26.05.20 09:54 Сейчас в теме
Спасибо. Хорошая статья для подумать.
Оставьте свое сообщение