Как программно заполнить реквизиты формы, которые не принадлежат объекту, в 1С:Документооборот?

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

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

Анализируем причину проблемы: почему реквизиты объекта пусты?

Первым делом проанализируем архитектуру современных конфигураций на управляемых формах. В 1С существует два типа реквизитов, которые отображаются на экране:

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

Выясним причину, по которой поле остается пустым при программном создании. В конфигурации 1С:Документооборот реализован механизм отделения метаданных документа от его регистрационных данных. Когда пользователь открывает форму элемента ДокументыПредприятия, срабатывает обработчик события ПриЧтенииНаСервере. Внутри этого обработчика система выполняет запросы к другим таблицам — регистрам сведений или связанным документам — и «подтягивает» значения в визуальные поля формы. Если вы просто создали элемент справочника, но не создали связанные с ним записи в других таблицах, форме просто нечего будет отображать.

Способ 1: Создание связанного документа «Корреспонденция»

Как было выявлено в ходе обсуждения проблемы, многие визуальные поля справочника ДокументыПредприятия на самом деле отображают данные из подчиненного документа Корреспонденция. Рассмотрим, как программно создать такую связь.

Разберем по шагам алгоритм действий в вашем внешнем обработчике:

  1. Создаем и записываем элемент справочника ДокументыПредприятия.
  2. Создаем новый документ Корреспонденция.
  3. Устанавливаем реквизит Основание (или аналогичный, в зависимости от версии конфигурации) в созданном документе, ссылаясь на наш справочник.
  4. Заполняем нужные даты и номера в документе Корреспонденция.
  5. Записываем документ.

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


// 1. Создаем основной элемент справочника
НовыйДокументП = Справочники.ДокументыПредприятия.СоздатьЭлемент();
НовыйДокументП.Наименование = "Импортированный документ из Excel";
// Заполнение других реквизитов объекта...
НовыйДокументП.Записать();

// 2. Создаем связанный объект Корреспонденция
СвязаннаяКорреспонденция = Документы.Корреспонденция.СоздатьДокумент();
СвязаннаяКорреспонденция.Дата = ТекущаяДата();
СвязаннаяКорреспонденция.Основание = НовыйДокументП.Ссылка;
СвязаннаяКорреспонденция.ДатаОтправления = ДанныеИзЭксксель.Дата; // Тот самый реквизит формы
СвязаннаяКорреспонденция.Записать(РежимЗаписиДокумента.Запись);

После выполнения этого кода, при открытии формы справочника ДокументыПредприятия, процедура ПриЧтенииНаСервере выполнит функцию Документы.Корреспонденция.ЗаполнитьДанныеНаФормеДокумента(ЭтотОбъект), найдет созданную нами запись и отобразит дату в соответствующем поле.

Способ 2: Использование типового API (Регистр «Сведения о документах»)

В более новых версиях 1С:Документооборота данные на форму могут попадать из регистра сведений СведенияОДокументах. Это сделано для ускорения работы списков. Если вы изменили данные в связанном объекте, но форма всё равно пустая, необходимо принудительно обновить записи в этом регистре.

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


// После записи основного объекта и всех связанных документов
// вызываем обновление сведений, чтобы форма "увидела" изменения
РаботаСДокументами.ОбновитьСведенияОДокументе(НовыйДокументП.Ссылка);

Этот метод является предпочтительным, так как он автоматически учитывает все нюансы прав доступа и бизнес-логики, заложенные вендором.

Способ 3: Программная работа с формой (через ПолучитьФорму)

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

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


ДокументСсылка = ОбьектСправочника.Ссылка;
КлючПараметр = Новый Структура("Ключ", ДокументСсылка);
Форма = ПолучитьФорму("Справочник.ДокументыПредприятия.ФормаЭлемента", КлючПараметр);

// Допустим, на форме есть реквизит "ДатаВылета", не связанный с объектом
Форма.ДатаВылета = ДанныеИзФайла.Дата; 

// Для сохранения изменений формы может потребоваться имитация записи
ПараметрыЗаписи = Новый Структура;
ПараметрыЗаписи.Вставить("РежимЗаписи", РежимЗаписиДокумента.Запись);
Форма.Записать(ПараметрыЗаписи);

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

Подведение итогов

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

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

← На главную