При работе с конфигурацией 1С:MDM Управление нормативно-справочной информацией (1С:НСИ) специалисты часто сталкиваются с задачей импорта данных в универсальные справочники. Одной из типичных проблем является ситуация, когда стандартные поля (например, Наименование) загружаются корректно, а пользовательские реквизиты, такие как Дата рождения, остаются пустыми. Проанализируем, почему так происходит, и разберем пошагово методы решения этой задачи.
Для начала разберем важный технический нюанс. В конфигурации 1С:НСИ универсальные справочники реализованы не как обычные объекты метаданных в конфигураторе. Они работают на базе механизма EAV (Entity-Attribute-Value). Это означает, что когда вы добавляете реквизит ДатаРождения в пользовательском режиме, система не создает физическую колонку в таблице базы данных. Вместо этого создается запись в специальном плане видов характеристик, а значения хранятся в подчиненной табличной части Дополнительные реквизиты.
Когда мы запускаем загрузку данных, встроенный механизм импорта должен четко сопоставить колонку из Excel с конкретной характеристикой. Если на каком-то этапе происходит сбой типизации (например, дата воспринимается как текст), система MDM «тихо» игнорирует запись, так как она не проходит внутреннюю валидацию типа данных.
Выясним причину, по которой отладчик может показывать тип значения «Строка» для реквизита ДатаРождения. При чтении файла Excel через COM-объект или встроенные средства 1С, формат ячейки имеет решающее значение. Если в Excel ячейка имеет формат «Текстовый» или «Общий», 1С считывает ее как строку. Однако универсальный реквизит в 1С:НСИ строго ожидает тип Дата.
Рассмотрим, как принудительно преобразовать значение в правильный формат. В настройках загрузки данных 1С:НСИ для каждого поля предусмотрена возможность указать Алгоритм разбора или Выражение. Мы рекомендуем использовать явное приведение типов.
Проанализируем пример кода, который можно вставить в обработчик загрузки поля:
// Предположим, что ЗначениеИзФайла — это переменная, содержащая текст из Excel
Попытка
Результат = Дата(ЗначениеИзФайла);
Исключение
// Если формат даты в Excel нестандартный (например, ДД.ММ.ГГГГ), используем другой подход
ЧастиДаты = СтрРазделить(ЗначениеИзФайла, ".");
Если ЧастиДаты.Количество() = 3 Тогда
Результат = Дата(ЧастиДаты[2], ЧастиДаты[1], ЧастиДаты[0]);
КонецЕсли;
КонецПопытки;
Посмотрим на настройки заполнения. В 1С:НСИ импорт осуществляется через Шаблоны импорта. Важно убедиться, что для реквизита Дата рождения установлены правильные правила сопоставления. Проверьте следующие моменты:
ОбменДанными.Загрузка = Истина. Это отключает лишние проверки, которые могут блокировать запись в дополнительные реквизиты.В конфигурации 1С:НСИ существует мощный инструмент — Алгоритмы разбора. Если стандартное сопоставление не работает, мы можем прописать логику поиска и записи значения вручную. Разберем ситуацию, когда реквизит является дополнительным свойством.
Для записи значения в дополнительный реквизит универсального справочника через алгоритм, нам необходимо найти ссылку на свойство в Плане видов характеристик (обычно это ДополнительныеРеквизитыИСведения) и добавить строку в табличную часть ДополнительныеРеквизиты объекта.
Посмотрим на пример логики, которую можно применить в алгоритме:
// Поиск свойства по наименованию или GUID
СвойствоСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Дата рождения");
// Поиск строки в табличной части объекта
НоваяСтрока = Объект.ДополнительныеРеквизиты.Добавить();
НоваяСтрока.Свойство = СвойствоСсылка;
НоваяСтрока.Значение = Дата(СтрокаИзExcel);
Чтобы минимизировать ошибки при загрузке, проанализируем требования к исходному файлу:
Дата рождения содержит пустые ячейки, убедитесь, что загрузчик корректно обрабатывает NULL или ПустаяДата.Подводя итог, можно сказать, что проблема незаполнения даты рождения в 1С:НСИ чаще всего кроется в типизации данных. Поскольку универсальные справочники в MDM крайне чувствительны к типам хранимых характеристик, любая попытка записать строку в поле типа «Дата» будет отклонена системой без выдачи явной ошибки.
Для успешного решения задачи выполните следующие действия:
Дата().ДополнительныеРеквизиты и убедиться, что тип значения в этот момент — именно Дата, а не Строка.