Сегментирование и многопоточность

Что такое сегментирование в Экстракторе 1С?

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

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

Примеры сегментирования

Пример 1

При выгрузке справочника Номенклатуры данные можно делить по первым двум буквам наименования. В данном случае параметром сегментирования будет «Наименование», а функцией будет «ПервыеДваСимвола()», примененная к этому параметру. Таким образом, набор всех возможных сегментов будет представлять собой список всех возможных первых двух символов в наименовании номенклатуры, которые присутствуют в справочнике. («Аб»,«Ан», «Ба» и т.д. и т.п.). Каждому сегменту при этом могут соответствовать несколько элементов справочника, соответствующих условию:

  • ПервыеДваСимвола(Наименование) =«Аб» — один сегмент;

  • ПервыеДваСимвола(Наименование) =«Ан» — второй сегмент;

  • ПервыеДваСимвола(Наименование) =«Ба» — третий сегмент
    и т.д.

Пример 2

При выгрузке данных не из справочника, а например, данных по оборотам регистра накопления, то удобнее делить данные по дате. Функцией же, применяемой к параметру «Дата» может быть приведение даты к определенному формату представления. Например, к формату «Месяц-Год». Таким образом, набор всех возможных сегментов будет представлять собой список всех возможных сочетаний Месяц-Год, которые присутствуют в таблице регистра. («Декабрь 2023»,«Январь 2024», «Февраль 2024» и т.д. ). Каждому сегменту при этом могут соответствовать несколько строк из таблицы оборотов, соответствующих условию:

  • Дата входит в месяц «Декабрь 2023» - первый сегмент;

  • Дата входит в месяц «Январь 2024» - второй сегмент;

  • Дата входит в месяц «Февраль 2024» - третий сегмент.

В большинстве случаев достаточно использовать один параметр сегментирования. Для справочников — это «Наименование», а для регистров — «Дата» (Период).

Многопоточность

Графически многопоточную выгрузку данных, разделенную на блоки (сегменты), можно представить так:

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

Терминология для понимания принципа сегментирования и многопоточности

Параметры сегментирования — это набор параметров для сегментирования, например [Период,Склад]. Параметры сегментирования задаются либо в запросе, если вы сами составляли запрос, либо на этапе установки параметров при проектировании выгрузки конструктором (Этап 3).

Функция параметра сегментирования — это может быть любая функция. Для значений типа «Дата» можно использовать функции группировки дат по месяцам, по неделям и т.д. Для строковых типов данных (например для наименований номенклатуры) это может быть функция выбирающая определенный кусок этой строки (например первые N букв). Для значений ссылочного типа (ссылка на элемент какого-то справочника например) обычно не применяются функции.

Ключ сегментирования — набор параметров сегментирования в совокупности с применяемыми к ним функциям. Применив функции к параметрам сегментирования - получим ключ сегментирования. Функцию применять необязательно, но к значениям типа Дата обычно применяют какую-то функцию, например Месяц(Период). Весь смысл заключается в группировке строк по определенному набору признаков. В нашем примере Склад оставим без функции. Тогда Ключ сегментирования будет выглядеть так: [Месяц(Период) И Склад]. «И» здесь - это Конъюнкция - термин означает одновременное выполнение условий по Месяцу периода и складу. В ключе сегмента может быть только «И», никаких «ИЛИ» быть не может. Составленный нами на примере ключ сегментирования означает, что каждый отдельный сегмент будет представлять из себя набор записей, одновременно удовлетворяющих двум условиям: 1. Месяц, к которому относится Период = какому-то конкретному месяцу И 2. Склад = Какому-то конкретному складу.

Уникальные значения ключа сегментирования — это значения, которые попадают в очередь выгрузки и отображаются в поле «Партиция». В каждой строке очереди содержится набор тех значений, которые присваиваются параметрам сегментирования при выборе данных из 1С для каждого отдельного уникального сегмента. Например, для ключа сегментирования [Месяц(Период) И Склад] уникальные значения ключа сегментирования для каждого сегмента будут выглядеть так:

Сегмент — блок данных, полученный путем отбора строк из первоначального набора данных по заданному уникальному значению ключа сегментирования. Т.е. например: для ключа сегментирования[Месяц(Период) И Склад] все записи, удовлетворяющие условию «Месяц, к которому относится Период = 202311 И Склад = 'Склад филиала ДСВ' » - это и будет 1 уникальный сегмент .

При описании сегментирования всегда говорят о многопоточности, о неких параллельно выполняющихся потоках. Разберем и эти термины.

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

Примечание

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

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

Пример 3 (для закрепления)

Предположим, что мы сформировали такую настройку набора параметров, как описали в разделе выше:

  • Набор параметров = [Период,Склад];

  • Ключ сегментирования: [Месяц(Период) И Склад].

Это продемонстрировано на скриншоте:

Предположим также, что данные в нашем наборе данных содержат только записи за период с декабря 2023 года по февраль 2024, и складов у нас всего 2.
Какие сегменты к выгрузке будут формироваться? Опишем их человекочитаемым языком:

  • Сегмент 1: «Дата находится в месяце Декабрь 2023 И Склад = Склад №1»

  • Сегмент 2: «Дата находится в месяце Декабрь 2023 И Склад = Склад №2»

  • Сегмент 3: «Дата находится в месяце Январь 2024 И Склад = Склад №1»

  • Сегмент 4: «Дата находится в месяце Январь 2024 И Склад = Склад №2»

  • Сегмент 5: «Дата находится в месяце Февраль 2024 И Склад = Склад №1»

  • Сегмент 6: «Дата находится в месяце Февраль 2024 И Склад = Склад №2»

То есть, для формирования каждого сегмента параллельно выгружаемых данных на набор данных будут накладываться одновременно два условия:

  • условие на вхождение даты в указанный месяц;

  • условие на конкретное значение склада.

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

Про соответствие набора параметров сегментирования и набора параметров запроса при конструировании запроса вручную подробнее в статье «Запросы и сегментирование».