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