Почему программно созданный документ в 1С не отображается в списке и как это исправить?

Программист 1С v8.3 (Управляемые формы) Бухгалтерский учет Промышленность, строительство и АПК
← На главную

При программном создании документов в управляемом приложении (например, при импорте из XML или внешних систем) разработчики часто сталкиваются с ситуацией: код выполняется без ошибок, запись проходит успешно, но в режиме «1С:Предприятие» новый документ не виден в журнале. В некоторых случаях реквизиты или ссылки на созданный объект и вовсе отображаются как <Объект не найден>.

В этой статье мы разберем основные причины такого поведения и пошагово рассмотрим, как найти «потерянный» документ и корректно настроить его программное создание.

Шаг 1. Проверяем фактическое наличие документа в базе данных

Первое, что необходимо сделать, — выяснить, действительно ли документ записался в базу данных или транзакция откатилась. Обычный визуальный поиск в журнале может быть обманчивым из-за установленных отборов. Для проверки выполним прямой запрос к таблице документов.

Выполним следующий код или воспользуемся консолью запросов:


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

Запрос.УстановитьПараметр("НомерДокумента", "00000006435");
РезультатЗапроса = Запрос.Выполнить();

Если НЕ РезультатЗапроса.Пустой() Тогда
    Сообщить("Документ успешно найден в базе данных!");
Иначе
    Сообщить("Документ отсутствует в таблице БД.");
КонецЕсли;

Если запрос возвращает ссылку на документ, значит, объект физически создался и записан. Проблема заключается в механизме отображения списка документов в интерфейсе.

Шаг 2. Анализируем запрос динамического списка формы

В управляемых формах списки документов работают на основе Динамических списков. Запрос динамического списка типовых конфигураций (таких как «Бухгалтерия предприятия» или «БИТ.Строительство») содержит сложную логику с левыми соединениями и условиями.

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

  1. Отбор по виду операции: В формах списков часто установлен неявный или явный отбор по полю ВидОперации (например, «Товары, услуги, комиссия»). Если при программном создании заполнение этого реквизита было пропущено или указано неверное значение перечисления, документ не пройдет фильтрацию.
  2. Соединения с регистрами сведений: Запрос списка документов может соединяться с дополнительными регистрами (например, РегистрСведений.СтатусыДокументов, РегистрСведений.СостоянияЭД). Если логика формы ожидает наличия записи в соответствующем регистре или конкретного значения статуса, документ без этих данных может быть отфильтрован.
  3. Использование быстрых отборов: Убедимся, что в шапке формы списка сняты все ограничения по организации, периоду, контрагенту и ответственному.

Шаг 3. Устраняем ошибку «Объект не найден» и проблемы с транзакциями

Если реквизит формы или отладчик показывает ссылку вида <Объект не найден> (466:90b40050...), это указывает на то, что ссылка была сгенерирована (например, через метод УстановитьСсылкуНового()), но сам объект не был записан или его запись была отменена.

Разберем частые ошибки при работе с транзакциями и ссылками:

Шаг 4. Правильный шаблон программного создания документа

Чтобы избежать блокировки записи подписками на события и гарантировать корректное заполнение всех необходимых реквизитов, рекомендуется использовать режим загрузки данных ОбменДанными.Загрузка = Истина.

Рассмотрим правильный пример создания документа ПоступлениеТоваровУслуг:


НачатьТранзакцию();

Попытка
    // 1. Создаем и записываем документ
    НовоеПТУ = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
    
    // Отключаем лишние интерактивные проверки при записи
    НовоеПТУ.ОбменДанными.Загрузка = Истина;
    
    // 2. Заполняем обязательные реквизиты шапки
    НовоеПТУ.Дата = ТекущаяДата();
    НовоеПТУ.Организация = СсылкаОрганизация;
    НовоеПТУ.Контрагент = СсылкаКонтрагент;
    НовоеПТУ.ДоговорКонтрагента = СсылкаДоговор;
    
    // КРИТИЧЕСКИ ВАЖНО: заполняем вид операции для фильтрации в динамическом списке
    НовоеПТУ.ВидОперации = Перечисления.ВидыОперацийПоступлениеТоваровУслуг.ПокупкаКомиссия;
    
    НовоеПТУ.ВалютаДокумента = СсылкаВалюта;
    НовоеПТУ.ПодразделениеОрганизации = СсылкаПодразделение;
    НовоеПТУ.Комментарий = "Создано программно";
    
    // 3. Записываем документ
    НовоеПТУ.Записать(РежимЗаписиДокумента.Запись);
    
    ЗафиксироватьТранзакцию();
    Сообщить("Документ успешно создан: " + Строка(НовоеПТУ.Ссылка));
    
Исключение
    ОтменитьТранзакцию();
    Сообщить("Ошибка при создании документа: " + ОписаниеОшибки());
КонецПопытки;

Подведем итог: если ваш документ создается программно, но не виден в интерфейсе, первым делом выполните запрос к базе данных. Если объект найден — проверьте заполнение реквизита ВидОперации и сбросьте отборы в форме списка. Если запрос не находит объект — проверьте корректность обработки транзакций и вызова метода Записать().

← На главную