Почему программно заполненные дополнительные сведения пропадают при выделении поля и как это исправить?

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

В процессе разработки и автоматизации в среде 1С:Предприятие 8.3 (особенно в конфигурациях на базе БСП, таких как ЗУП 3.1, ERP 2 или КА 2) программисты часто сталкиваются с задачей массового заполнения дополнительных сведений для объектов. Однако нередко возникает странная ситуация: в форме объекта значение отображается корректно, но стоит пользователю щелкнуть по полю или попытаться его отредактировать, как данные мгновенно исчезают. Давайте подробно разберем, почему это происходит и как правильно реализовать программную запись, чтобы избежать подобных ошибок.

Анализ механизма хранения дополнительных сведений

Прежде всего, проанализируем разницу между дополнительными реквизитами и дополнительными сведениями. Многие начинающие разработчики путают эти понятия. Дополнительные реквизиты хранятся в табличных частях самих объектов (например, в справочнике Сотрудники или Номенклатура), в то время как дополнительные сведения вынесены в отдельный регистр сведений ДополнительныеСведения.

Структура этого регистра крайне проста и включает в себя:

  1. Объект (Измерение) — ссылка на владельца сведений (например, конкретный сотрудник).
  2. Свойство (Измерение) — ссылка на элемент Плана видов характеристик ДополнительныеРеквизитыИСведения.
  3. Значение (Ресурс) — собственно данные, тип которых определяется настройками в ПВХ.

Рассмотрим ситуацию: вы программно создали записи в этом регистре, указали сотрудника, выбрали нужное свойство и подставили значение. В списке или при открытии формы вы видите текст. Однако при попытке активации поля система выполняет валидацию типа данных. Если тип значения в регистре не совпадает с типом, жестко заданным для этого свойства в метаданных, элемент управления на форме «сбрасывает» невалидное значение, и поле становится пустым.

Выясняем причину: типизация и справочник ЗначенияСвойствОбъектов

Чаще всего ошибка кроется в том, что для свойства в Плане видов характеристик установлен тип Дополнительное значение. Это означает, что в качестве значения в регистр должна записываться ссылка на элемент специального справочника ЗначенияСвойствОбъектов.

Разберем по шагам, на что нужно обратить внимание при программном заполнении:

  1. Проверка владельца значения. Каждый элемент справочника ЗначенияСвойствОбъектов имеет обязательный реквизит Владелец. Владельцем должен быть именно тот элемент Плана видов характеристик, для которого создается запись. Если вы создали универсальное значение (например, «Сменный график») для Свойства А, но пытаетесь записать его в регистр для Свойства Б, система сочтет это ошибкой типизации.
  2. Соответствие типов. Если в настройках свойства указано, что это Число, а вы записываете Строку, визуально платформа может попытаться отобразить строку, но при редактировании поле очистится.
  3. Иерархические значения. Обратите внимание, что существует два похожих справочника: ЗначенияСвойствОбъектов и ЗначенияСвойствОбъектовИерархия. Важно использовать именно тот, который указан в настройках типа конкретного свойства.

Правильная программная запись данных

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

Для записи дополнительных сведений рекомендуется использовать процедуру УправлениеСвойствами.ЗаписатьДополнительныеСведения. Посмотрим на пример кода:


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

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

НоваяСтрока = ТаблицаСведений.Добавить();
НоваяСтрока.Свойство = СвойствоСсылка;
НоваяСтрока.Значение = ЗначениеСведения;

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

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

Как проверить корректность вручную

Если вы уже заполнили данные и столкнулись с проблемой «исчезновения», выполните следующие действия для диагностики:

  1. Выберите одного сотрудника, у которого значение «пропадает».
  2. Зайдите в форму дополнительных сведений этого сотрудника интерактивно и выберите значение вручную. Нажмите «Записать».
  3. Откройте Консоль запросов или Универсальный редактор реквизитов и сравните запись в регистре ДополнительныеСведения, которую создала система, с той записью, которую создали вы программно.
  4. Особое внимание уделите полю Значение. Проверьте тип (через ТипЗнч()) и уникальный идентификатор (GUID) ссылки.

Важный нюанс: если вы записываете «пустое» значение, чтобы очистить сведения, лучше не просто записывать Неопределено или пустую ссылку, а физически удалять набор записей из регистра для данного объекта и свойства. Это исключит хранение «мусорных» записей, которые могут мешать стандартным алгоритмам отображения.

Заключение

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

← На главную