Как вытащить основной договор контрагента в 1С:ERP запросом

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

При переходе с системы 1С:Бухгалтерия (БП) на 1С:ERP Управление предприятием многие разработчики и аналитики сталкиваются с неожиданной проблемой: в справочнике Контрагенты отсутствует привычный реквизит ОсновнойДоговор. Это вызывает сложности при построении отчетов или написании обработок, где требуется автоматически подставить договор по умолчанию. Рассмотрим подробнее, почему так сделано и как решить задачу получения «основного» договора с помощью запроса.

Разбор архитектурных отличий 1С:ERP

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

Проанализируем основные способы получения данных, которые заменяют функционал «основного договора» в ERP.

Способ 1: Получение договора через Соглашения

В 1С:ERP первичным звеном взаимодействия часто является Соглашение (типовое или индивидуальное). Именно в соглашении фиксируются условия продаж или закупок, и там же может быть указан конкретный договор, который должен использоваться. Если в вашей базе ведется учет по соглашениям, то запрос должен обращаться именно к ним.

Рассмотрим пример логики запроса для получения договора через индивидуальное соглашение с клиентом:


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

Способ 2: Выборка активного договора из справочника ДоговорыКонтрагентов

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

Разберем по шагам создание такого запроса:

  1. Устанавливаем фильтр по Владельцу (Контрагенту).
  2. Устанавливаем фильтр по Организации (так как договор в ERP всегда привязан к организации).
  3. Обязательно проверяем Статус договора. В ERP это перечисление СтатусыДоговоровКонтрагентов. Нам нужны только те, что имеют значение Действует.
  4. Если договоров несколько, обычно берется либо первый по порядку, либо самый свежий по дате начала действия.

Пример запроса для получения «первого подходящего» договора:


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

Способ 3: Использование регистра сведений (для доработанных систем)

В типовой конфигурации ERP нет регистра «Основные договоры». Однако, как отмечалось в дискуссии, пользователи часто просят внедрить такой функционал. Посмотрим на ситуацию, когда в системе реализовано расширение или используется отраслевое решение. В этом случае может существовать регистр сведений (например, НастройкиЗаполненияОбъектов или созданный вручную ОсновныеДоговорыКонтрагентов).

Если вы обнаружили, что в вашей базе такой регистр есть, запрос упрощается:


ВЫБРАТЬ
    ОсновныеДоговоры.Договор
ИЗ
    РегистрСведений.НазваниеВашегоРегистра КАК ОсновныеДоговоры
ГДЕ
    ОсновныеДоговоры.Контрагент = &Контрагент
    И ОсновныеДоговоры.Организация = &Организация

Важные нюансы при работе с запросами в ERP

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

Резюме для разработчика

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

← На главную