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

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

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

Разбор типичной ошибки при создании документа

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


НовыйДок = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
НовыйДок.Дата = ТекущаяДата();
НовыйДок.УстановитьНовыйНомер();
НовыйДок.Партнер = Справочники.Партнеры.НайтиПоНаименованию("Тест");
НовыйДок.Склад = Справочники.Склады.НайтиПоНаименованию("Основной");
НовыйДок.Записать();

В данном примере документ физически записывается в таблицу базы данных. Однако в современных конфигурациях, таких как УТ 11, ERP 2 или Комплексная автоматизация, этого недостаточно. Проблема заключается в том, что журналы документов (динамические списки) работают на основе сложных запросов с жесткими фильтрами.

Причина №1: Отсутствие хозяйственной операции

Выясним причину, связанную с логикой построения интерфейса. В конфигурациях на базе Управления торговлей 11 реквизит ХозяйственнаяОперация является ключевым. Именно на его основе система определяет, к какому типу относится документ (закупка у поставщика, прием на комиссию, возврат и т.д.).

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

Причина №2: Влияние RLS и реквизита «Организация»

Проанализируем ситуацию с точки зрения безопасности. В 1С часто включен механизм RLS (Record Level Security) — ограничение прав доступа на уровне записей. Если в документе не заполнена Организация, система защиты может расценить это как попытку доступа к несанкционированным данным. Для обычного пользователя (не администратора) такие документы будут скрыты автоматически, так как их параметры не подпадают ни под одно правило разрешенного доступа.

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

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

Разберем по шагам, как модифицировать код, чтобы избежать описанных проблем. Вместо простого присвоения нескольких полей, необходимо использовать стандартные механизмы инициализации объекта.

  1. Использование метода Заполнить(): Всегда вызывайте метод Заполнить() сразу после создания объекта. Это инициирует внутренние алгоритмы конфигурации, которые подставят значения по умолчанию (валюту, налогообложение, хозяйственную операцию).
  2. Обязательное заполнение ключевых полей: К ним относятся Организация, ХозяйственнаяОперация, Статус (если используется) и Подразделение.
  3. Обработка исключений: Обязательно заключайте метод Записать() в блок Попытка...Исключение, чтобы увидеть реальную причину отказа, если сработают проверки в модуле объекта.

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


Попытка
    НовыйДок = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
    
    // Инициализация стандартных реквизитов (валюта, налоги и др.)
    НовыйДок.Заполнить(); 
    
    НовыйДок.Дата = ТекущаяДата();
    НовыйДок.Организация = Справочники.Организации.НайтиПоНаименованию("Наша Фирма");
    НовыйДок.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ЗакупкаУПоставщика;
    
    // Установка контрагента и склада
    НовыйДок.Партнер = Справочники.Партнеры.НайтиПоНаименованию("Поставщик");
    НовыйДок.Склад = Справочники.Склады.НайтиПоНаименованию("Основной склад");
    
    // Заполнение номера (лучше делать перед записью)
    НовыйДок.УстановитьНовыйНомер();
    
    НовыйДок.Записать(РежимЗаписиДокумента.Запись);
    Сообщить("Документ успешно создан: " + НовыйДок.Номер);
Исключение
    Сообщить("Ошибка при записи документа: " + ОписаниеОшибки());
КонецПопытки;

Как проверить существование документа, если его не видно в списке?

Если вы уверены, что код отработал, но документа нет в журнале, выполните следующие действия:

Важный нюанс нумерации: Если вы вызываете УстановитьНовыйНомер(), а затем запись документа прерывается ошибкой, номер в системе все равно может считаться «использованным». Это объясняет, почему при последующих попытках номера документов растут, хотя сами документы в списке не появляются — это явный признак того, что транзакция записи либо не завершается, либо документ записывается с некорректными данными, скрывающими его из вида.

Таким образом, для корректной работы с документами в современных конфигурациях 1С крайне важно соблюдать полноту заполнения аналитических реквизитов, таких как Организация и ХозяйственнаяОперация, и всегда использовать встроенные механизмы заполнения по умолчанию.

← На главную