В каком порядке выходят ссылки в запросе 1С, если не указать сортировку?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При написании запросов к базе данных 1С:Предприятие разработчики часто сталкиваются с вопросом: в каком порядке будут возвращены записи, если в тексте запроса не указать оператор УПОРЯДОЧИТЬ ПО? Давайте подробно разберем, почему полагаться на «интуитивный» порядок — это опасное заблуждение, и как обеспечить корректную работу вашего кода.

Почему порядок выборки непредсказуем?

Многие начинающие программисты замечают, что при выполнении простых запросов к справочникам данные часто приходят в порядке возрастания ссылок или создания элементов. Однако это является лишь побочным эффектом внутренней реализации СУБД, а не гарантированным поведением платформы.

Реляционная теория и стандарты SQL (ANSI SQL) определяют таблицу как неупорядоченное множество. Если вы не указываете УПОРЯДОЧИТЬ ПО, сервер базы данных самостоятельно выбирает наиболее эффективный план выполнения запроса. Этот план зависит от огромного количества факторов:

  1. Тип СУБД: MS SQL Server, PostgreSQL, IBM DB2 или файловый вариант — все они используют разные алгоритмы доступа к данным.
  2. План запроса: Оптимизатор может решить использовать сканирование индекса или полное сканирование таблицы в зависимости от количества данных.
  3. Состояние кэша и индексов: Наличие данных в памяти (кэше) или степень фрагментации индексов могут кардинально менять порядок выдачи строк.
  4. Параллелизм: При выполнении запроса в несколько потоков строки могут возвращаться в том порядке, в котором потоки завершают обработку страниц данных.

Опасность использования ПЕРВЫЕ 1 без сортировки

Особое внимание стоит уделить конструкции ВЫБРАТЬ ПЕРВЫЕ 1. Часто разработчики используют ее для получения «какого-нибудь» документа или записи, полагаясь на то, что это будет «последний созданный документ».

Это классическая ошибка, которая может привести к «плавающим» багам. На тестовой базе, где данных мало, запрос может всегда возвращать нужную запись. Но после переноса на реальные данные или обновления статистики СУБД, результат может измениться. В итоге система начнет «цеплять» совершенно случайный документ, что приведет к ошибкам в логике расчетов, отчетах или бизнес-процессах.

Разберем пример проблемного кода:


// Пример потенциально нестабильного кода
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
               |    БанковскиеСчета.Ссылка
               |ИЗ
               |    Справочник.БанковскиеСчета КАК БанковскиеСчета
               |ГДЕ
               |    БанковскиеСчета.Владелец = &Владелец";

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

Как гарантировать порядок выборки?

Чтобы ваш код был надежным и предсказуемым в любых условиях, всегда используйте предложение УПОРЯДОЧИТЬ ПО. Только это гарантирует, что результат будет соответствовать вашим ожиданиям, независимо от версии SQL-сервера или состояния базы данных.

Рассмотрим правильный подход к решению задачи:


// Пример правильного и стабильного кода
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
               |    БанковскиеСчета.Ссылка
               |ИЗ
               |    Справочник.БанковскиеСчета КАК БанковскиеСчета
               |ГДЕ
               |    БанковскиеСчета.Владелец = &Владелец
               |УПОРЯДОЧИТЬ ПО
               |    БанковскиеСчета.ДатаСоздания УБЫВ";

Практические рекомендации

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

Таким образом, мы выяснили, что в отсутствие явного указания порядка, выборка ссылок происходит в произвольном порядке, диктуемом текущим планом выполнения СУБД. Применяя УПОРЯДОЧИТЬ ПО, мы берем управление процессом в свои руки и гарантируем стабильность работы всей системы 1С:Предприятие.

← На главную