В современных конфигурациях 1С, построенных на базе Библиотеки стандартных подсистем (БСП), работа с дополнительными реквизитами существенно отличается от работы с обычными реквизитами объекта. Часто разработчики сталкиваются с ситуацией: код по заполнению табличной части написан верно, данные в базе сохраняются, но на форме документа пользователь их не видит. Разберем подробно, почему это происходит и как правильно реализовать программное заполнение.
Проанализируем механику работы управляемых форм в БСП. Когда вы открываете документ, система не просто выводит содержимое табличной части ДополнительныеРеквизиты. Вместо этого подсистема "Управление свойствами" динамически создает на форме программные реквизиты. Их имена выглядят примерно так: ДополнительныйРеквизит_УникальныйИдентификатор. Именно эти динамические элементы связаны с полями ввода, которые видит пользователь. Для гибкой настройки отображения таких полей в интерфейсе подойдёт инструмент для интерактивного управления свойствами элементов дополнительных реквизитов.
Если вы программно изменили строки в табличной части Объект.ДополнительныеРеквизиты, форма "не догадывается", что связанные с ними динамические реквизиты тоже нужно обновить. Выясним, как правильно связать данные объекта и элементы интерфейса.
Если задача стоит заполнить реквизиты непосредственно в открытой форме (например, при нажатии кнопки), мы можем изменить табличную часть Объект, но затем обязаны "оповестить" форму об изменениях. Рассмотрим пример кода:
// 1. Находим ссылку на нужное свойство (доп. реквизит)
// Рекомендуется искать по имени, заданному на вкладке "Для разработчиков"
ДопРеквизитСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоИмени("ИмяВашегоРеквизита");
Если ДопРеквизитСсылка.Пустая() Тогда
Возврат; // Реквизит не найден
КонецЕсли;
// 2. Ищем строку в табличной части объекта
ПараметрыОтбора = Новый Структура("Свойство", ДопРеквизитСсылка);
Строки = Объект.ДополнительныеРеквизиты.НайтиСтроки(ПараметрыОтбора);
Если Строки.Количество() > 0 Тогда
СтрокаРеквизита = Строки[0];
Иначе
СтрокаРеквизита = Объект.ДополнительныеРеквизиты.Добавить();
СтрокаРеквизита.Свойство = ДопРеквизитСсылка;
КонецЕсли;
// 3. Устанавливаем значение (убедитесь, что тип значения соответствует настройкам реквизита)
СтрокаРеквизита.Значение = НужноеЗначение;
// 4. КРИТИЧЕСКИ ВАЖНЫЙ ШАГ: Обновление динамических реквизитов формы
// Используем метод общего модуля БСП
УправлениеСвойствами.ОбновитьДополнительныеРеквизиты(ЭтотОбъект);
Проанализируем ситуацию: метод ОбновитьДополнительныеРеквизиты перечитывает данные из Объект.ДополнительныеРеквизиты и принудительно записывает их в программные элементы формы. После этого пользователь сразу увидит изменения на экране.
Разберем более продвинутый и безопасный подход. БСП предоставляет готовые инструменты в модуле УправлениеСвойствами, которые берут на себя проверку типов и корректное заполнение индексов. Если вам нужно записать значения в базе данных (без учета открытой формы), лучше использовать процедуру ЗаписатьЗначенияСвойств.
Рассмотрим пример записи данных для объекта, ссылка на который у нас уже есть:
// Подготовим таблицу с данными для записи
ТаблицаСвойств = Новый ТаблицаЗначений;
ТаблицаСвойств.Колонки.Добавить("Свойство");
ТаблицаСвойств.Колонки.Добавить("Значение");
НоваяСтрока = ТаблицаСвойств.Добавить();
НоваяСтрока.Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоИмени("Тест");
НоваяСтрока.Значение = "Значение для записи";
// Вызываем типовой метод БСП для записи в базу
УправлениеСвойствами.ЗаписатьЗначенияСвойств(СсылкаНаДокумент, ТаблицаСвойств);
Этот метод хорош тем, что он автоматически определяет, является ли свойство Реквизитом (хранится в ТЧ документа) или Сведением (хранится в независимом регистре сведений ДополнительныеСведения). Это избавляет разработчика от необходимости писать разные алгоритмы для разных типов дополнительных свойств.
НайтиПоНаименованию, если этого можно избежать. Пользователь может переименовать заголовок реквизита в интерфейсе, и ваш код сломается. Используйте поиск по Имени (внутренний идентификатор для разработчика).Значение в табличной части имеет тип Характеристика.ДополнительныеРеквизитыИСведения. Если дополнительный реквизит имеет тип "Дополнительное значение" (ссылка на спец. справочник), вы не можете просто записать туда строку. Вам нужно передать ссылку на элемент этого справочника.УправлениеСвойствами обычно доступны на сервере. Если вы работаете в модуле формы, вызовы должны происходить в серверном контексте.Посмотрим на пример правильного приведения типа перед записью:
// Получаем объект метаданных свойства для проверки типа
ОписаниеТипа = ДопРеквизитСсылка.ТипЗначения;
// Приводим наше значение к нужному типу (например, если передали строку в числовое поле)
ЗначениеДляЗаписи = ОписаниеТипа.ПривестиЗначение(ВходящиеДанные);
// Теперь можно безопасно записывать
МассивСтрок = Объект.ДополнительныеРеквизиты.НайтиСтроки(Новый Структура("Свойство", ДопРеквизитСсылка));
// ... логика добавления/изменения строки
Чтобы программно заполненные данные появились на форме, выполните следующие действия:
ДополнительныеРеквизитыИСведения.Объект.ДополнительныеРеквизиты.Свойство и Значение с учетом типа данных.УправлениеСвойствами.ОбновитьДополнительныеРеквизиты(ЭтотОбъект).УправлениеСвойствамиКлиент.ПослеИзмененияДополнительногоРеквизита.Соблюдение этих правил гарантирует корректную работу вашего кода в любых типовых решениях (1С:ERP, КА, УТ 11, БП 3.0), использующих современные стандарты разработки 1С. Для изучения других типовых функций и быстрого подбора готового кода можно воспользоваться справочником по методам БСП с примерами использования.