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