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