При программном создании документов в управляемом приложении (например, при импорте из XML или внешних систем) разработчики часто сталкиваются с ситуацией: код выполняется без ошибок, запись проходит успешно, но в режиме «1С:Предприятие» новый документ не виден в журнале. В некоторых случаях реквизиты или ссылки на созданный объект и вовсе отображаются как <Объект не найден>.
В этой статье мы разберем основные причины такого поведения и пошагово рассмотрим, как найти «потерянный» документ и корректно настроить его программное создание.
Первое, что необходимо сделать, — выяснить, действительно ли документ записался в базу данных или транзакция откатилась. Обычный визуальный поиск в журнале может быть обманчивым из-за установленных отборов. Для проверки выполним прямой запрос к таблице документов.
Выполним следующий код или воспользуемся консолью запросов:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Поступление.Ссылка КАК Ссылка,
| Поступление.Проведен КАК Проведен,
| Поступление.Организация КАК Организация,
| Поступление.ВидОперации КАК ВидОперации
|ИЗ
| Документ.ПоступлениеТоваровУслуг КАК Поступление
|ГДЕ
| Поступление.Номер = &НомерДокумента";
Запрос.УстановитьПараметр("НомерДокумента", "00000006435");
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
Сообщить("Документ успешно найден в базе данных!");
Иначе
Сообщить("Документ отсутствует в таблице БД.");
КонецЕсли;
Если запрос возвращает ссылку на документ, значит, объект физически создался и записан. Проблема заключается в механизме отображения списка документов в интерфейсе.
В управляемых формах списки документов работают на основе Динамических списков. Запрос динамического списка типовых конфигураций (таких как «Бухгалтерия предприятия» или «БИТ.Строительство») содержит сложную логику с левыми соединениями и условиями.
Проанализируем основные причины, почему записанный документ скрывается из списка:
ВидОперации (например, «Товары, услуги, комиссия»). Если при программном создании заполнение этого реквизита было пропущено или указано неверное значение перечисления, документ не пройдет фильтрацию.РегистрСведений.СтатусыДокументов, РегистрСведений.СостоянияЭД). Если логика формы ожидает наличия записи в соответствующем регистре или конкретного значения статуса, документ без этих данных может быть отфильтрован.Если реквизит формы или отладчик показывает ссылку вида <Объект не найден> (466:90b40050...), это указывает на то, что ссылка была сгенерирована (например, через метод УстановитьСсылкуНового()), но сам объект не был записан или его запись была отменена.
Разберем частые ошибки при работе с транзакциями и ссылками:
НачатьТранзакцию(), а внутри блока возникла ошибка, перехваченная через Попытка ... Исключение, транзакция помечается как недействительная. Вызов ЗафиксироватьТранзакцию() в таком случае не сохранит данные.Чтобы избежать блокировки записи подписками на события и гарантировать корректное заполнение всех необходимых реквизитов, рекомендуется использовать режим загрузки данных ОбменДанными.Загрузка = Истина.
Рассмотрим правильный пример создания документа ПоступлениеТоваровУслуг:
НачатьТранзакцию();
Попытка
// 1. Создаем и записываем документ
НовоеПТУ = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
// Отключаем лишние интерактивные проверки при записи
НовоеПТУ.ОбменДанными.Загрузка = Истина;
// 2. Заполняем обязательные реквизиты шапки
НовоеПТУ.Дата = ТекущаяДата();
НовоеПТУ.Организация = СсылкаОрганизация;
НовоеПТУ.Контрагент = СсылкаКонтрагент;
НовоеПТУ.ДоговорКонтрагента = СсылкаДоговор;
// КРИТИЧЕСКИ ВАЖНО: заполняем вид операции для фильтрации в динамическом списке
НовоеПТУ.ВидОперации = Перечисления.ВидыОперацийПоступлениеТоваровУслуг.ПокупкаКомиссия;
НовоеПТУ.ВалютаДокумента = СсылкаВалюта;
НовоеПТУ.ПодразделениеОрганизации = СсылкаПодразделение;
НовоеПТУ.Комментарий = "Создано программно";
// 3. Записываем документ
НовоеПТУ.Записать(РежимЗаписиДокумента.Запись);
ЗафиксироватьТранзакцию();
Сообщить("Документ успешно создан: " + Строка(НовоеПТУ.Ссылка));
Исключение
ОтменитьТранзакцию();
Сообщить("Ошибка при создании документа: " + ОписаниеОшибки());
КонецПопытки;
Подведем итог: если ваш документ создается программно, но не виден в интерфейсе, первым делом выполните запрос к базе данных. Если объект найден — проверьте заполнение реквизита ВидОперации и сбросьте отборы в форме списка. Если запрос не находит объект — проверьте корректность обработки транзакций и вызова метода Записать().