Как найти все соглашения (типовые и индивидуальные), действующие для конкретного партнера в 1С:УТ 11?

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

При работе с конфигурациями на базе «1С:Управление торговлей 11», «1С:ERP» или «1С:Комплексная автоматизация» разработчики часто сталкиваются с задачей получения списка всех доступных соглашений для конкретного клиента. Сложность заключается в том, что если индивидуальные соглашения имеют прямую ссылку на партнера, то типовые соглашения в поле Партнер содержат пустое значение. В этой статье мы подробно разберем архитектуру хранения этих данных и научимся правильно строить запросы для их получения.

Понимание структуры справочника СоглашенияСКлиентами

Для начала проанализируем, как система разделяет соглашения. Все они хранятся в одном справочнике — СоглашенияСКлиентами. Ключевым реквизитом здесь является Типовое (тип Булево). Именно он определяет логику поведения объекта:

Рассмотрим подробнее, как типовое соглашение понимает, к какому партнеру оно относится. Связь здесь не прямая, а логическая, базирующаяся на нескольких условиях доступности.

Связь через сегменты партнеров

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

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

Дополнительные фильтры доступности

Помимо принадлежности к партнеру или сегменту, система проверяет еще ряд условий, без которых соглашение не будет считаться «действующим» для конкретной сделки:

  1. Статус соглашения: Соглашение должно находиться в статусе Действует. Реквизит Статус принимает значения из перечисления СтатусыСоглашенийСКлиентами. Соглашения в статусах Подготовлено или Закрыто игнорируются системой в оперативной работе.
  2. Период действия: Проверяются реквизиты ДатаНачала и ДатаОкончания. Если текущая дата не входит в этот интервал (при условии, что даты заполнены), соглашение не будет отображаться в списке выбора у партнера.
  3. Организация: Если в типовом соглашении указана конкретная организация, оно будет доступно только для документов, оформляемых от этого юридического лица.
  4. Хозяйственная операция: Соглашения фильтруются по типу операции (например, «Реализация» или «Передача на комиссию»).

Разработка комплексного запроса

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

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


ВЫБРАТЬ
    Соглашения.Ссылка КАК Ссылка
ИЗ
    Справочник.СоглашенияСКлиентами КАК Соглашения
ГДЕ
    Соглашения.Партнер = &Партнер
    И Соглашения.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыСоглашенийСКлиентами.Действует)
    И НЕ Соглашения.ПометкаУдаления

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

Проанализируем итоговый вариант запроса с использованием ОБЪЕДИНИТЬ ВСЕ:


ВЫБРАТЬ
    Соглашения.Ссылка КАК Ссылка
ИЗ
    Справочник.СоглашенияСКлиентами КАК Соглашения
ГДЕ
    Соглашения.Партнер = &Партнер
    И Соглашения.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыСоглашенийСКлиентами.Действует)
    И НЕ Соглашения.ПометкаУдаления

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Соглашения.Ссылка
ИЗ
    Справочник.СоглашенияСКлиентами КАК Соглашения
ГДЕ
    Соглашения.Типовое = ИСТИНА
    И Соглашения.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыСоглашенийСКлиентами.Действует)
    И НЕ Соглашения.ПометкаУдаления
    И (Соглашения.СегментПартнеров = ЗНАЧЕНИЕ(Справочник.СегментыПартнеров.ПустаяСсылка)
        ИЛИ Соглашения.СегментПартнеров В (
            ВЫБРАТЬ
                Рег.Сегмент
            ИЗ
                РегистрСведений.ПартнерыСегмента КАК Рег
            ГДЕ
                Рег.Партнер = &Партнер
        ))

Особенности использования функциональных опций

Выясним причину, по которой соглашения могут вообще не выбираться или не влиять на систему. В конфигурациях УТ 11 / ERP существует функциональная опция ИспользоватьСоглашенияСКлиентами. Если она отключена в настройках системы, то справочник может быть заполнен, но логика подбора в документах работать не будет. При разработке отчетов или обработок всегда полезно проверять значение этой опции, чтобы поведение вашей разработки совпадало с поведением системы.

Приоритет выбора соглашений

Важно помнить, что если для партнера доступны и индивидуальные, и типовые соглашения, система обычно отдает приоритет индивидуальным. Это логично: персональные условия, зафиксированные для конкретного клиента, важнее общих правил продаж. При программном поиске «лучшего» соглашения (например, для заполнения в новом документе) рекомендуется сначала искать индивидуальное действующее соглашение, и только при его отсутствии переходить к поиску среди типовых.

Таким образом, мы выяснили, что связь типовых соглашений с партнером является динамической и вычисляется «на лету» на основе данных о сегментах и статусах. Использование предложенного выше запроса позволит вам всегда получать актуальный список условий продаж для любого контрагента в базе.

← На главную