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