С выходом обновлений 1С:Управление торговлей 11.5 и 1С:ERP 2.5 многие разработчики и аналитики столкнулись с существенным изменением в архитектуре системы. Привычный регистр накопления ЗаказыКлиентов, который имел вид «Остатки», был исключен из механизмов учета. В этой статье мы разберем, почему это произошло, какой регистр пришел ему на смену и как теперь правильно получать данные о невыполненных остатках по заказам в количестве и сумме.
Прежде чем мы перейдем к практике, давайте проанализируем ситуацию, которая побудила фирму «1С» пойти на такой шаг. В высоконагруженных системах, где одновременно работают сотни пользователей, классические регистры остатков становятся узким местом. При проведении документа (например, ЗаказКлиента или РеализацияТоваровУслуг) система должна обновить таблицу итогов регистра остатков.
В этот момент происходит блокировка записей в таблице итогов. Если несколько пользователей одновременно пытаются провести документы по одной и той же номенклатуре или складу, возникают очереди (Wait on lock) и ошибки превышения времени ожидания. Переход на оборотные регистры позволяет значительно ускорить запись данных, так как системе не нужно пересчитывать итоги «на лету» в транзакции проведения — данные просто добавляются в таблицу движений.
Вместо регистра ЗаказыКлиентов теперь используется регистр накопления РаспоряженияНаОтгрузку. Рассмотрим его основные особенности:
Распоряжение, которое ссылается на документ-основание.Поскольку физической таблицы остатков больше нет, понятие «невыполненный остаток» теперь является расчетной величиной. Мы должны вычислить разницу между тем, что было заказано, и тем, что фактически отгружено или оформлено. Разберем по шагам, как это реализовать в запросе.
Для получения актуального состояния нам необходимо обратиться к виртуальной таблице Обороты регистра РаспоряженияНаОтгрузку. Чтобы получить «срез» на текущий момент, мы можем вызвать таблицу без указания периода или установить только конечную границу периода.
Рассмотрим пример запроса, который позволяет получить данные по незакрытым заказам:
ВЫБРАТЬ
РаспоряженияНаОтгрузкуОбороты.Распоряжение КАК Заказ,
РаспоряженияНаОтгрузкуОбороты.Номенклатура КАК Номенклатура,
РаспоряженияНаОтгрузкуОбороты.Характеристика КАК Характеристика,
(РаспоряженияНаОтгрузкуОбороты.КоличествоОборот) КАК ОстатокКоличества,
(РаспоряженияНаОтгрузкуОбороты.СуммаОборот) КАК ОстатокСуммы
ИЗ
РегистрНакопления.РаспоряженияНаОтгрузку.Обороты(&НачалоПериода, &КонецПериода, , ) КАК РаспоряженияНаОтгрузкуОбороты
ГДЕ
РаспоряженияНаОтгрузкуОбороты.КоличествоОборот <> 0
Важный нюанс: как отмечают эксперты, такие запросы могут работать медленнее, чем привычное обращение к таблице остатков. Это связано с тем, что системе приходится суммировать все движения по конкретному заказу за все время его существования.
Проанализируем ситуацию с производительностью. Чтобы ваш отчет не «тормозил» на больших объемах данных, придерживайтесь следующих правил:
Распоряжение, которые имеют статус «Не закрыт».Распоряжение).КлючиАналитикиНоменклатуры. Если вы пишете сложный запрос со стыковкой нескольких регистров, лучше делать это через эти ключи.В обсуждениях часто встречается мнение, что проще «нарисовать свой регистр остатков по старинке» (как в 11.4). Давайте выясним, почему это плохое решение:
РаспоряженияНаОтгрузку. Ваш регистр будет «жить своей жизнью», и его придется постоянно синхронизировать с типовой логикой.ЗаказыПоставщикам, и ЗаказыНаСборку. Лучше один раз освоить работу с оборотными регистрами для получения остатков, чем пытаться бороться с архитектурой платформы.Переход на регистр РаспоряженияНаОтгрузку в 1С:Управление торговлей 11.5 — это вынужденная мера для обеспечения высокой производительности. Несмотря на то, что получение остатков через виртуальные таблицы оборотов кажется менее привычным и иногда более медленным, это стандарт современной разработки на платформе 1С. Для корректной работы нам необходимо перестроить логику своих отчетов и запросов, ориентируясь на разницу оборотов по конкретным распоряжениям, и активно использовать фильтры по статусам документов, чтобы отсекать уже закрытые и неактуальные данные.