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