Почему запрос к регистру 'ЗаказыКлиентов' заменили на 'РаспоряженияНаОтгрузку' и будет ли он работать так же?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет Торговля и дистрибуция
← На главную

В процессе анализа кода типовых конфигураций 1С, таких как ERP или Управление торговлей, а также при проведении работ по замеру производительности и поиску узких мест (поможет анализ производительности запросов и планов выполнения), можно столкнуться с ситуацией, когда привычный запрос для проверки незавершенной отгрузки по заказу клиента изменяется. Давайте разберем конкретный пример, чтобы понять причины таких изменений, их влияние на производительность и адекватность получаемого результата.

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

Анализ исходного и нового запросов

Рассмотрим два фрагмента кода. Первый — это "классический" способ проверки, второй — обновленный вариант, который встречается в более свежих версиях конфигураций.

Исходный запрос (старый вариант)

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


ВЫБРАТЬ
	ВЫБОР
		КОГДА ЕСТЬNULL(ЗаказыКлиентовОстатки.ЗаказаноОстаток, 0) <= 0 И
				ЕСТЬNULL(ЗаказыКлиентовОстатки.КОформлениюОстаток, 0) <= 0
			ТОГДА ЛОЖЬ
		ИНАЧЕ ИСТИНА
	КОНЕЦ КАК ЕстьНезавершеннаяОтгрузка
ИЗ
	РегистрНакопления.ЗаказыКлиентов.Остатки(, ЗаказКлиента = &Ссылка) КАК ЗаказыКлиентовОстатки

Логика работы: Запрос получает остатки по ресурсам ЗаказаноОстаток и КОформлениюОстаток для конкретного заказа (&Ссылка). Если оба остатка равны нулю или меньше (что маловероятно, но проверка надежна), это означает, что все товары по заказу отгружены. В противном случае отгрузка считается незавершенной.

Новый запрос

Этот запрос использует виртуальную таблицу оборотов регистра накопления РаспоряженияНаОтгрузку.


ВЫБРАТЬ
	ВЫБОР
		КОГДА ЕСТЬNULL(РаспоряженияНаОтгрузкуОбороты.ЗаказаноОборот, 0) <= 0 И
				ЕСТЬNULL(РаспоряженияНаОтгрузкуОбороты.КОформлениюОборот, 0) <= 0
			ТОГДА ЛОЖЬ
		ИНАЧЕ ИСТИНА
	КОНЕЦ КАК ЕстьНезавершеннаяОтгрузка
ИЗ
	РегистрНакопления.РаспоряженияНаОтгрузку.Обороты(,,, Распоряжение = &Ссылка) КАК РаспоряженияНаОтгрузкуОбороты

Логика работы: На первый взгляд, она схожа. Запрос проверяет обороты по ресурсам с похожими названиями. Если обороты нулевые, отгрузка завершена. Но ключевое отличие кроется в самом источнике данных — регистре РаспоряженияНаОтгрузку.

Возникают два главных вопроса:

  1. Кто и зачем сделал эту замену?
  2. Будет ли второй запрос возвращать тот же логический результат, что и первый?

Давайте разберемся по шагам.

Причина замены: Оптимизация производительности

С большой долей вероятности, эту замену произвели разработчики фирмы "1С" (вендор) в рамках архитектурных изменений в подсистеме управления заказами. Основная причина — повышение производительности системы, особенно в базах, где требуется комплексный анализ продаж, остатков, резервов и доступности товаров.

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

Таким образом, регистр РаспоряженияНаОтгрузку по своей сути является постоянно актуальной, компактной "сводкой" по всем незакрытым отгрузкам. Запрос к такой небольшой таблице выполняется значительно быстрее, чем к потенциально огромной таблице итогов регистра ЗаказыКлиентов, хранящего всю историю.

Адекватность результата: Будет ли новый запрос работать правильно?

Да, второй запрос спроектирован так, чтобы возвращать логически идентичный результат. Логика его работы полностью соответствует задаче, которую также часто решает специализированный отчет для анализа закупки и реализации по заказам клиентов — здесь пригодится технический анализ структуры данных и метаданных.

  1. Пока по заказу клиента требуется отгрузка, в регистре РаспоряженияНаОтгрузку существуют активные записи. Обороты по такому заказу будут положительными. Проверка ЕСТЬNULL(..., 0) <= 0 вернет ЛОЖЬ, и итогом запроса станет ИСТИНА (ЕстьНезавершеннаяОтгрузка).
  2. Когда отгрузка по заказу полностью завершается, система делает сторнирующие движения в этом регистре. В результате суммарные обороты по данному заказу становятся равными нулю. Проверка ЕСТЬNULL(..., 0) <= 0 вернет ИСТИНА, и итогом запроса станет ЛОЖЬ (Незавершенной отгрузки нет).

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

Практические аспекты и возможные нюансы

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

Итоговые выводы

Подведем итог нашего анализа.

  1. Замену запроса произвел вендор (фирма "1С") в рамках эволюции типовых конфигураций. Основная цель — оптимизация производительности.
  2. Новый запрос, использующий оборотный регистр РаспоряженияНаОтгрузку, полностью адекватен и выдает корректный результат. Его архитектура специально спроектирована для быстрой проверки незавершенных отгрузок.

Эта замена — хороший пример того, как развиваются платформенные механизмы и типовые решения 1С для адаптации к растущим объемам данных и требованиям к быстродействию систем.

← На главную