Как получить один банковский счет контрагента в запросе 1С?

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

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

Метод первый: использование инструкции ПЕРВЫЕ 1

Этот подход является наиболее предпочтительным, когда нам необходимо получить любую одну запись из списка доступных счетов для каждого контрагента. Оператор ПЕРВЫЕ ограничивает количество записей, которые возвращает база данных.

Чтобы результат был предсказуемым, мы рекомендуем использовать сортировку. Без сортировки запрос может вернуть произвольный счет, что не всегда приемлемо для бизнес-логики. Давайте посмотрим, как это выглядит в коде:


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

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

Метод второй: использование агрегатной функции МАКСИМУМ

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

Разберем подробнее, как это работает:


ВЫБРАТЬ
    Счета.Владелец КАК Контрагент,
    МАКСИМУМ(Счета.Ссылка) КАК БанковскийСчет
ИЗ
    Справочник.БанковскиеСчета КАК Счета
СГРУППИРОВАТЬ ПО
    Счета.Владелец

Важно понимать: использование функции МАКСИМУМ для ссылочного типа данных возвращает ту ссылку, чей внутренний идентификатор (GUID) является «большим» в системе. Это технический способ получения значения, который не всегда совпадает с понятием «основной» или «последний созданный» счет. Используйте этот метод с осторожностью, если логика выбора счета принципиальна.

Рекомендации по фильтрации данных

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

  1. Всегда добавляйте условие ГДЕ Счета.ПометкаУдаления = ЛОЖЬ.
  2. Если в вашей конфигурации предусмотрен реквизит «Не использовать» или «Активен», обязательно включайте его в критерии отбора.
  3. Если в системе есть понятие «Основной банковский счет», лучше всего обращаться к соответствующему регистру сведений или реквизиту самого контрагента, а не пытаться вычислить его программно через запросы.

Подводя итог, можно сказать, что выбор метода зависит от вашей конкретной задачи. Если нужно быстрое решение для одного контрагента — используйте ПЕРВЫЕ 1 с явной сортировкой. Если требуется сводный отчет по всем контрагентам — применяйте СГРУППИРОВАТЬ ПО, но всегда учитывайте, что именно вы выбираете в качестве «одного счета».

← На главную