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