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