Как программно заполнить поле Организация при создании Приобретения на основании Реализации в 1С:ERP?

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

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

На первый взгляд задача кажется тривиальной: перенести данные из документа-основания в новый документ. Однако многие разработчики сталкиваются с тем, что ключевые поля, такие как Организация, остаются пустыми, даже если в коде прописано прямое присваивание. Разберем подробно, почему так происходит, как это исправить и какие архитектурные нюансы 1С:ERP необходимо учитывать.

Анализ причины ошибки: почему не заполняется Организация?

Рассмотрим ситуацию, с которой столкнулся автор вопроса. В коде обработки заполнения была использована следующая конструкция:

Приобретение.Организация = Реализация.Контрагент;

При отладке видно, что свойство Реализация.Контрагент заполнено, но в целевом документе поле Организация остается пустым. Причина кроется в строгой типизации системы 1С:Предприятие.

Проанализируем типы данных этих реквизитов:

  1. Реквизит Организация в документе имеет тип СправочникСсылка.Организации. Это наши собственные юридические лица.
  2. Реквизит Контрагент в документе имеет тип СправочникСсылка.Контрагенты. Это справочник для ведения учета взаиморасчетов с юридическими лицами (в том числе и внешними).

Хотя логически мы понимаем, что «Контрагент» в документе продажи — это и есть наша вторая «Организация» (покупатель), для платформы 1С это два совершенно разных объекта метаданных. Прямое присваивание ссылки одного типа реквизиту другого типа невозможно, поэтому платформа игнорирует эту строчку, оставляя поле пустым.

Решение 1: Поиск соответствия по реквизитам (ИНН)

Чтобы корректно заполнить поле, нам необходимо найти ссылку на справочник Организации, которая соответствует Контрагенту из документа реализации. Самый надежный и простой идентификатор для юридических лиц — это ИНН.

Алгоритм действий будет следующим:

  1. Получаем ИНН из контрагента документа-основания (Реализации).
  2. Ищем в справочнике Организации элемент с таким же ИНН.
  3. Полученную ссылку присваиваем в новый документ.

Реализуем это в коде:


// Получаем ИНН покупателя из реализации
ИННПокупателя = Реализация.Контрагент.ИНН;

// Ищем нашу организацию по этому ИНН
НашаОрганизацияПокупатель = Справочники.Организации.НайтиПоРеквизиту("ИНН", ИННПокупателя);

// Проверяем, удалось ли найти организацию
Если НЕ НашаОрганизацияПокупатель.Пустая() Тогда
    Приобретение.Организация = НашаОрганизацияПокупатель;
Иначе
    // Обработка ситуации, если организация не найдена (например, сообщить пользователю)
    Сообщить("Не найдена организация с ИНН " + ИННПокупателя);
КонецЕсли;

Этот метод решает непосредственную проблему пустого поля. Однако при создании зеркальных документов в ERP существует ряд подводных камней, которые мы рассмотрим далее.

Важные нюансы: Партнеры, Контрагенты и Договоры

В 1С:ERP структура данных сложнее, чем в старых конфигурациях. Помимо связки "Организация — Контрагент", существует понятие Партнер. Рассмотрим, что еще нужно учесть при программном создании документа.

1. Заполнение поля Партнер

В документе Приобретения поле Партнер (Поставщик) не равно полю Партнер (Клиент) из Реализации. Если в Реализации партнером является фирма-покупатель, то в Приобретении партнером должна стать фирма-продавец.

Вам придется выполнить «зеркальный» поиск: найти Партнера и Контрагента, которые соответствуют Организации-продавцу из исходного документа.

2. Проблема с Договорами

Одна из самых частых ошибок после исправления Организации — попытка скопировать Договор.


// ТАК ДЕЛАТЬ НЕЛЬЗЯ
Приобретение.Договор = Реализация.Договор;

Почему это вызовет ошибку при проведении?

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

Решение 2: Использование типового механизма «Интеркампани»

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

Если ваша задача — отразить перепродажу товара внутри холдинга, рекомендуется использовать именно его. Рассмотрим преимущества:

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

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


Приобретение.ХозяйственнаяОперация = ПредопределенноеЗначение("Перечисление.ХозяйственныеОперации.ЗакупкаУПоставщика");

Рекомендации по синхронизации документов

Если вы создаете документы кодом, возникает проблема их дальнейшей синхронизации. Что будет, если в Реализации изменится количество товара? Приобретение об этом не узнает.

Чтобы избежать дублей при повторном запуске обработки и поддерживать связь, используйте уникальные идентификаторы (GUID) или дополнительные реквизиты.

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


// Пример создания документа с привязкой, чтобы избежать дублей
// В реальной практике лучше использовать критерии поиска или регистры соответствия
НовыйДокумент = Документы.ПриобретениеТоваровУслуг.СоздатьДокумент();
// Заполнение реквизитов...
НовыйДокумент.ДокументОснование = Реализация.Ссылка; // Если добавлен такой реквизит

Подведем итог

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

← На главную