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

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

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

Анализируем причину проблемы: Ссылка vs Строка

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

Проанализируем механику платформы: дополнительные реквизиты этого типа хранятся не как обычные строки. Каждое «значение из списка» — это отдельный элемент справочника ЗначенияСвойствОбъектов. Когда форма документа отрисовывается, программные механизмы БСП (Библиотеки стандартных подсистем) считывают данные из табличной части. Если в колонке Значение вместо ссылки на элемент справочника находится строка или ссылка на значение другого свойства, система игнорирует эту запись, и на форме отображается пустое поле.

Шаг 1. Поиск правильного значения в справочнике

Прежде чем записывать данные, нам нужно получить правильную ссылку. Просто использовать НайтиПоНаименованию("Да") недостаточно, так как в системе может быть множество реквизитов с вариантом ответа «Да», и каждый из них привязан к своему владельцу — конкретному свойству из Плана видов характеристик (ПВХ) ДополнительныеРеквизитыИСведения.

Рассмотрим правильный алгоритм поиска ссылки на значение:


// 1. Сначала находим само свойство (владельца)
СвойствоСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("ВашеНаименованиеРеквизита");

// 2. Ищем конкретное значение среди вариантов этого свойства
ЗначениеДляЗаписи = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию("Да", Истина, , СвойствоСсылка);

Если ЗначениеДляЗаписи.Пустая() Тогда
    Сообщить("Значение 'Да' не найдено для данного свойства!");
КонецЕсли;

Шаг 2. Программная запись свойств через типовые механизмы

Хотя можно напрямую редактировать табличную часть ДополнительныеРеквизиты, рекомендуется использовать типовой метод БСП — УправлениеСвойствами.ЗаписатьСвойстваУОбъекта. Это гарантирует, что все служебные проверки будут пройдены, а форма «подхватит» изменения корректно. Для поиска других типовых процедур и готовых примеров кода можно использовать справочник по методам БСП.

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


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

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

// Применяем изменения к объекту
// ОбъектДокумента — это ссылка на документ, который мы меняем
УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(ОбъектДокумента, ТаблицаДопРеквизитов);

Особенности 1С:Документооборот 3.0 и кэширование

Выясним, почему даже после правильной записи данных значения иногда не видны сразу. В ДО 3.0 механизмы работы с формами стали значительно сложнее:

  1. Наборы дополнительных реквизитов: В этой конфигурации свойства привязаны к Видам документов. Проверьте, что ваш реквизит включен в набор именно для того вида документа, который вы редактируете. Если реквизит записан в ТЧ, но не входит в текущий набор свойств вида документа, форма его просто не выведет.
  2. Настройки размещения: В версии 3.0 появилась возможность настраивать видимость и доступность доп. реквизитов через интерфейс «Настройки вида документа». Если значение в базе есть, но поле скрыто условиями видимости, вы его не увидите.
  3. Динамическое построение формы: Форма документа в ДО 3.0 собирается «на лету». Если вы изменили данные объекта программно, но форма уже открыта у пользователя, ему необходимо ее переоткрыть или обновить, чтобы сработали скрипты заполнения динамических полей.

Проверка обязательности заполнения

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


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

Резюме для разработчика

Чтобы избежать проблем с отображением дополнительных реквизитов, всегда следуйте трем правилам:

← На главную