Консолидация складских проводок

Со временем таблица проводок по запасам (InventTrans) продолжит расти и будет потреблять больше места для базы данных. Поэтому запросы, выполняемые с таблицей, постепенно становятся медленнее. В этой статье описывается, как использовать функцию Консолидация складских проводок для консолидации данных о проводках по запасам для повышения производительности системы.

Примечание

В выбранный закрытый период ГК можно консолидировать только финансово обновленные проводки по запасам. Для консолидации у финансово обновленных исходящих проводок по запасам должен быть статус отпуска Продано, а для входящих проводок по запасам должен быть установлен статус поступления Куплено.

При консолидации проводок по запасам все соответствующие проводки переносятся в таблицу InventTransArchive. Проводки отпуска запасов и проводки поступления на склад консолидируются отдельно, на основе комбинации кода номенклатуры (itemId) и кода складской аналитики (inventDimId), и они помещаются в суммарные проводки отпуска и поступления.

Если комбинация itemId и inventDimId содержит только одну проводку поступления или отпуска, проводка не будет консолидирована.

Примечание

После консолидации складских проводок можно дополнительно оптимизировать производительность хранения и производительность системы, используя функцию Архивация с долгосрочным хранением в Dataverse для перемещения записей InventTransArchive в озеро данных Microsoft Azure. Дополнительные сведения см. в разделе Архивирование данных проводок по запасам в Dynamics 365 Supply Chain Management.

Включите функцию в системе

Если ваша система еще не содержит функцию, описанную в этой статье, перейдите в Управление функциями и включите функцию Консолидация складских проводок. После включения этой функции отключить ее невозможно.

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

Перед консолидацией проводок по запасам необходимо учитывать следующие бизнес-сценарии, поскольку на них повлияет операция:

  • При аудите проводок по запасам из соответствующих документов, таких как строки заказа на покупку, они будут показаны как консолидированные. Чтобы просмотреть консолидированные проводки, необходимо перейти Управление запасами > Периодические задачи > Очистка > Консолидация складских проводок.
  • Закрытие склада не может быть отменено для консолидированных периодов.
  • Преобразование стандартных затрат нельзя выполнить для консолидированных периодов.
  • При консолидации проводок по запасам отчеты по запасам, источником которых являются проводки по запасам, будут затронуты. Эти отчеты включают отчет распределения запасов по срокам и отчеты по стоимости запасов.
  • Прогнозы по запасам могут быть затронуты, если они выполняются во временном горизонте консолидированных периодов.

Необходимые условия

Проводки по запасам можно консолидировать только в периоды, когда соблюдаются следующие условия:

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

Консолидация складских проводок

Чтобы консолидировать проводки по запасам, выполните следующие действия.

  1. Перейдите в раздел Управление запасами>Периодические задачи>Очистка>Консолидация складских проводок.

    Появится страница Консолидация складских проводок, в которой отображается список консолидированных записей процесса.

  2. В области действий выберите Консолидация складских проводок для создания консолидации складских проводок.

  3. В диалоговом окне Консолидация складских проводок на экспресс-вкладке Параметры установите следующие поля:

    • Начальная дата в закрытом периоде ГК — выберите самую раннюю дату проводки для включения в консолидацию.
    • Конечная дата в закрытом периоде ГК — выберите самую новую дату проводки для включения в консолидацию.

    Примечание

    Для выбора доступны только периоды, соответствующие предварительным требованиям.

  4. На экспресс-вкладке Выполнять в фоновом режиме настройте сведения о пакетной обработке по мере необходимости. Выполните обычные действия для пакетных заданий в Microsoft Dynamics 365 Supply Chain Management.

  5. Нажмите ОК.

  6. Появится сообщение с предложением подтвердить, что вы хотите продолжить. Внимательно прочтите сообщение и нажмите кнопку Да, если необходимо продолжить операцию.

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

Просмотр консолидированных складских проводок

На странице Консолидация складских проводок отображается полный журнал консолидации. В каждой строке сетки отображаются такие сведения, как дата создания консолидации, пользователь, создавший ее, и ее статус.

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

  • Активные – показать только активные консолидации.
  • Все — отображение всех консолидаций.

Для каждой консолидации в сетке предоставляются следующие сведения:

  • Активно — этот флажок указывает, что консолидация активна.
  • Начальная дата — дата самой старой проводки, которая может быть включена в консолидацию.
  • Конечная дата — дата новейшей проводки, которая может быть включена в консолидацию.
  • Кем запланировано — учетная запись пользователя, создавшего консолидацию.
  • Выполнено — дата создания консолидации.
  • Остановить текущее обновление – флажок указывает, что консолидация выполняется, но была приостановлена.
  • Состояние — статус обработки консолидации. Возможные значения: Ожидание, В обработке и Завершено.

Панель инструментов над сеткой содержит следующие кнопки, которые можно использовать для работы с выбранной консолидацией:

  • Консолидированные проводки — просмотр подробных сведений о выбранной консолидации. На появившейся странице Консолидированные проводки показаны все проводки в консолидации.

    Чтобы просмотреть дополнительные сведения о конкретной проводке на странице Консолидированные проводки, выберите ее в сетке, а затем в области действий выберите Сведения о консолидированной проводке. На появившейся странице Сведения о консолидированной проводке содержатся такие сведения, как разноска ГК, связанные ссылки субкниги и финансовые аналитики.

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

  • Возобновить — возобновить обработку выбранной консолидации, приостановленную в данный момент.

Расширение кода для поддержки настраиваемых полей

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

  • Если настраиваемые поля из таблицы InventTrans имеют те же имена полей, что и таблица InventtransArchive, это означает, что они сопоставлены 1:1. Таким образом, можно просто поместить настраиваемые поля в группу полей InventoryArchiveFields таблицы inventTrans.
  • Если имена настраиваемых полей в таблице InventTrans не соответствуют именам полей в таблице InventtransArchive, необходимо добавить код для их сопоставления. Например, если у вас есть системное поле InventTrans.CreatedDateTime, необходимо создать поле в таблице InventTransArchive с новым именем (например, InventtransArchive.InventTransCreatedDateTime) и добавить расширения в классы InventTransArchiveProcessTask и InventTransArchiveSqlStatementHelper, как показано в следующем примере кода.

В следующем примере кода показано, как добавить необходимое расширение к классу InventTransArchiveProcessTask.

[ExtensionOf(classStr(InventTransArchiveProcessTask))]
Final class InventTransArchiveProcessTask_Extension
{

    protected void addInventTransFields(SysDaSelection _selectionObject)
    {
        _selectionObject.add(fieldStr(InventTrans, ModifiedBy))
            .add(fieldStr(InventTrans, CreatedBy)).add(fieldStr(InventTrans, CreatedDateTime));

        next addInventTransFields(_selectionObject);
    }


    protected void addInventTransArchiveFields(SysDaSelection _selectionObject)
    {
        _selectionObject.add(fieldStr(InventTransArchive, InventTransModifiedBy))
            .add(fieldStr(InventTransArchive, InventTransCreatedBy)).add(fieldStr(InventTransArchive, InventTransCreatedDateTime));

        next addInventTransArchiveFields(_selectionObject);
    }
}

В следующем примере кода показано, как добавить необходимое расширение к классу InventTransArchiveSqlStatementHelper.

[ExtensionOf(classStr(InventTransArchiveSqlStatementHelper))]
final class InventTransArchiveSqlStatementHelper_Extension
{
    private str     inventTransModifiedBy;  
    private str     inventTransCreatedBy;
    private str     inventTransCreatedDateTime;

    protected void initialize()
    {
        next initialize();
        inventTransModifiedBy = new SysDictField(tablenum(InventTrans), fieldNum(InventTrans, ModifiedBy)).name(DbBackend::Sql);
        inventTransCreatedDateTime = new SysDictField(tablenum(InventTrans), fieldNum(InventTrans, CreatedDateTime)).name(DbBackend::Sql);
        inventTransCreatedBy = new SysDictField(tablenum(InventTrans), fieldNum(InventTrans, CreatedBy)).name(DbBackend::Sql);
    }

    protected str buildInventTransArchiveSelectionFieldsStatement()
    {
        str     ret;

        ret = next buildInventTransArchiveSelectionFieldsStatement();
        
        if (inventTransModifiedBy)
        {
            ret += ',';
            ret += strFmt('%1',  new SysDictField(tablenum(InventTransArchive), fieldNum(InventTransArchive, InventTransModifiedBy)).name(DbBackend::Sql));
        }

        if (inventTransCreatedBy)
        {
            ret += ',';
            ret += strFmt('%1',  new SysDictField(tablenum(InventTransArchive), fieldNum(InventTransArchive, InventTransCreatedBy)).name(DbBackend::Sql));
        }

        if (inventTransCreatedDateTime)
        {
            ret += ',';
            ret += strFmt('%1',  new SysDictField(tablenum(InventTransArchive), fieldNum(InventTransArchive, InventTransCreatedDateTime)).name(DbBackend::Sql));
        }

        return ret;
    }

    protected str buildInventTransTargetFieldsStatement()
    {
        str     ret;

        ret = next buildInventTransTargetFieldsStatement();

        if (inventTransModifiedBy)
        {
            ret += ',';
            ret += strFmt('%1', inventTransModifiedBy);
        }

        if (inventTransCreatedBy)
        {
            ret += ',';
            ret += strFmt('%1', inventTransCreatedBy);
        }

        if (inventTransCreatedDateTime)
        {
            ret += ',';
            ret += strFmt('%1', inventTransCreatedDateTime);
        }

        return ret;
    }
}