Консолидация складских проводок
Со временем таблица проводок по запасам (InventTrans
) продолжит расти и будет потреблять больше места для базы данных. Поэтому запросы, выполняемые с таблицей, постепенно становятся медленнее. В этой статье описывается, как использовать функцию Консолидация складских проводок для консолидации данных о проводках по запасам для повышения производительности системы.
Примечание
В выбранный закрытый период ГК можно консолидировать только финансово обновленные проводки по запасам. Для консолидации у финансово обновленных исходящих проводок по запасам должен быть статус отпуска Продано, а для входящих проводок по запасам должен быть установлен статус поступления Куплено.
При консолидации проводок по запасам все соответствующие проводки переносятся в таблицу InventTransArchive
. Проводки отпуска запасов и проводки поступления на склад консолидируются отдельно, на основе комбинации кода номенклатуры (itemId
) и кода складской аналитики (inventDimId
), и они помещаются в суммарные проводки отпуска и поступления.
Если комбинация itemId
и inventDimId
содержит только одну проводку поступления или отпуска, проводка не будет консолидирована.
Примечание
После консолидации складских проводок можно дополнительно оптимизировать производительность хранения и производительность системы, используя функцию Архивация с долгосрочным хранением в Dataverse для перемещения записей InventTransArchive
в озеро данных Microsoft Azure. Дополнительные сведения см. в разделе Архивирование данных проводок по запасам в Dynamics 365 Supply Chain Management.
Включите функцию в системе
Если ваша система еще не содержит функцию, описанную в этой статье, перейдите в Управление функциями и включите функцию Консолидация складских проводок. После включения этой функции отключить ее невозможно.
Вопросы, которые необходимо учесть перед консолидацией проводок по запасам
Перед консолидацией проводок по запасам необходимо учитывать следующие бизнес-сценарии, поскольку на них повлияет операция:
- При аудите проводок по запасам из соответствующих документов, таких как строки заказа на покупку, они будут показаны как консолидированные. Чтобы просмотреть консолидированные проводки, необходимо перейти Управление запасами > Периодические задачи > Очистка > Консолидация складских проводок.
- Закрытие склада не может быть отменено для консолидированных периодов.
- Преобразование стандартных затрат нельзя выполнить для консолидированных периодов.
- При консолидации проводок по запасам отчеты по запасам, источником которых являются проводки по запасам, будут затронуты. Эти отчеты включают отчет распределения запасов по срокам и отчеты по стоимости запасов.
- Прогнозы по запасам могут быть затронуты, если они выполняются во временном горизонте консолидированных периодов.
Необходимые условия
Проводки по запасам можно консолидировать только в периоды, когда соблюдаются следующие условия:
- Период главной книги должен быть закрыт.
- Закрытие склада должно выполняться в дату окончания периода консолидации или после нее.
- Период должен быть по крайней мере на один год раньше начальной даты периода консолидации.
- Не должно быть каких-либо существующих перерасчетов запасов.
Консолидация складских проводок
Чтобы консолидировать проводки по запасам, выполните следующие действия.
Перейдите в раздел Управление запасами>Периодические задачи>Очистка>Консолидация складских проводок.
Появится страница Консолидация складских проводок, в которой отображается список консолидированных записей процесса.
В области действий выберите Консолидация складских проводок для создания консолидации складских проводок.
В диалоговом окне Консолидация складских проводок на экспресс-вкладке Параметры установите следующие поля:
- Начальная дата в закрытом периоде ГК — выберите самую раннюю дату проводки для включения в консолидацию.
- Конечная дата в закрытом периоде ГК — выберите самую новую дату проводки для включения в консолидацию.
Примечание
Для выбора доступны только периоды, соответствующие предварительным требованиям.
На экспресс-вкладке Выполнять в фоновом режиме настройте сведения о пакетной обработке по мере необходимости. Выполните обычные действия для пакетных заданий в Microsoft Dynamics 365 Supply Chain Management.
Нажмите ОК.
Появится сообщение с предложением подтвердить, что вы хотите продолжить. Внимательно прочтите сообщение и нажмите кнопку Да, если необходимо продолжить операцию.
Появится сообщение о том, что задание консолидации складских проводок добавлено в очередь пакетных заданий. После этого задание начнет консолидировать проводки по запасам из выбранного периода.
Просмотр консолидированных складских проводок
На странице Консолидация складских проводок отображается полный журнал консолидации. В каждой строке сетки отображаются такие сведения, как дата создания консолидации, пользователь, создавший ее, и ее статус.
В раскрывающемся списке в верхней части страницы выберите одно из следующих значений для фильтрации консолидаций, показанных в сетке:
- Активные – показать только активные консолидации.
- Все — отображение всех консолидаций.
Для каждой консолидации в сетке предоставляются следующие сведения:
- Активно — этот флажок указывает, что консолидация активна.
- Начальная дата — дата самой старой проводки, которая может быть включена в консолидацию.
- Конечная дата — дата новейшей проводки, которая может быть включена в консолидацию.
- Кем запланировано — учетная запись пользователя, создавшего консолидацию.
- Выполнено — дата создания консолидации.
- Остановить текущее обновление – флажок указывает, что консолидация выполняется, но была приостановлена.
- Состояние — статус обработки консолидации. Возможные значения: Ожидание, В обработке и Завершено.
Панель инструментов над сеткой содержит следующие кнопки, которые можно использовать для работы с выбранной консолидацией:
Консолидированные проводки — просмотр подробных сведений о выбранной консолидации. На появившейся странице Консолидированные проводки показаны все проводки в консолидации.
Чтобы просмотреть дополнительные сведения о конкретной проводке на странице Консолидированные проводки, выберите ее в сетке, а затем в области действий выберите Сведения о консолидированной проводке. На появившейся странице Сведения о консолидированной проводке содержатся такие сведения, как разноска ГК, связанные ссылки субкниги и финансовые аналитики.
Приостановить — приостановить выбранную консолидацию, обрабатываемую в данный момент. Пауза вступает в силу только после создания задачи архивирования. Поэтому может быть короткая задержка, прежде чем пауза вступит в силу. Если консолидация была приостановлена, в поле Остановить текущее обновление появится флажок.
Возобновить — возобновить обработку выбранной консолидации, приостановленную в данный момент.
Расширение кода для поддержки настраиваемых полей
Если таблица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;
}
}