Как привести текстовое значение к определенному типу по его имени в 1С?

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

В процессе разработки механизмов обмена данными, загрузки из внешних источников (Excel, CSV, JSON) или реализации самописной сериализации объектов, программисты часто сталкиваются с необходимостью превратить обычную строку в типизированное значение 1С. Если для простых случаев достаточно условий Если...ИначеЕсли, то для универсальных решений требуется более системный подход. Рассмотрим подробно, как правильно приводить текстовые значения к примитивным, ссылочным и даже составным типам.

Использование системной функции XMLЗначение

Разберем один из наиболее надежных способов конвертации — использование встроенной функции XMLЗначение(). Этот метод хорош тем, что он опирается на внутренние механизмы платформы и корректно обрабатывает не только числа и даты, но и уникальные идентификаторы ссылочных объектов.

Для работы функции требуется два параметра: объект типа Тип и сама строка. Проанализируем пример:


// Пример преобразования строки в дату и число
НужныйТип = Тип("Дата");
ЗначениеДаты = XMLЗначение(НужныйТип, "2023-10-25T14:30:00");

НужныйТипЧисло = Тип("Число");
ЗначениеЧисла = XMLЗначение(НужныйТипЧисло, "150.75");

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

Динамическое вычисление типа через функцию Вычислить

Посмотрим на способ, предложенный в обсуждении на форуме. Функция Вычислить() позволяет исполнить строку кода 1С «на лету». Несмотря на то, что этот метод считается потенциально опасным (из-за возможности инъекции кода), в закрытых системных обработках он может быть полезен.


// Текстовое имя типа, например "Число" или "Дата"
ИмяТипа = "Число";
СтроковоеЗначение = "42";

// Динамическое приведение
Результат = Вычислить(ИмяТипа + "(" + СтроковоеЗначение + ")");

Однако помните, что такой подход требует строгой валидации входящих данных. Если в переменной СтроковоеЗначение окажется вредоносный код, платформа попытается его исполнить.

Работа с метаданными и получение полного имени типа

Часто возникает обратная задача: как правильно выгрузить тип значения в текст, чтобы потом корректно его прочитать? Вместо ручного сравнения через ТипЗнч(), проанализируем использование объекта Метаданные.

Для получения строкового представления типа любого объекта (будь то справочник, документ или перечисление), рекомендуется использовать следующий код:


Значение = Справочники.Номенклатура.НайтиПоКоду("001");
Если Значение <> Неопределено Тогда
    ПолноеИмяТипа = Метаданные.НайтиПоТипу(ТипЗнч(Значение)).ПолноеИмя();
    // На выходе получим строку вида "СправочникСсылка.Номенклатура"
КонецЕсли;

Это имя типа является универсальным ключом. На стороне приемника мы можем использовать Тип(ПолноеИмяТипа), чтобы получить объект типа для дальнейшей десериализации.

Восстановление ссылок по имени типа и GUID

Если у нас есть полное имя типа (например, СправочникСсылка.Контрагенты) и строковое представление ссылки (UUID), мы можем восстановить объект максимально эффективно. Разберем алгоритм:

  1. Получаем объект Метаданные по полному имени.
  2. Используем менеджер соответствующего типа.
  3. Генерируем ссылку на основе УникальныйИдентификатор.

ИмяТипа = "СправочникСсылка.Контрагенты";
СтрокаGUID = "550e8400-e29b-41d4-a716-446655440000";

// Получаем имя таблицы (Контрагенты)
ИмяОбъекта = Метаданные.НайтиПоПолномуИмени(ИмяТипа).Имя;

// Получаем ссылку через менеджер
НоваяСсылка = Справочники[ИмяОбъекта].ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаGUID));

Обработка составных типов данных

Ситуация усложняется, когда реквизит имеет составной тип. В этом случае простого вызова XMLЗначение может быть недостаточно, так как системе нужно точно знать, к какому именно типу из списка разрешенных нужно привести строку.

Выясним причину возможных ошибок: если мы передаем строку "100" в реквизит, который может быть и Числом, и Строкой, 1С может выбрать неверный тип по умолчанию. Чтобы этого избежать, используйте объект ОписаниеТипов и его метод ПривестиЗначение().


// Создаем описание типа (например, только Число)
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("Число"));
НужноеОписание = Новый ОписаниеТипов(МассивТипов);

// Безопасное приведение
ЧистоеЗначение = НужноеОписание.ПривестиЗначение("123.45");

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

Современный подход: JSON и СериализаторXDTO

В современных версиях платформы (8.3.6 и выше) для передачи данных между базами или модулями лучше всего использовать JSON-сериализацию. Рассмотрим, как это упрощает жизнь программисту.

С помощью СериализаторXDTO можно записывать объекты и значения в JSON-строку, которая уже содержит информацию о типах. При чтении такая строка автоматически превращается в нужный объект 1С (дату, число или ссылку).


// Запись в строку
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, ОбъектДляВыгрузки, НазначениеТипаXML.Явное);
РезультатТекст = ЗаписьJSON.Закрыть();

// Чтение из строки
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(РезультатТекст);
ВосстановленноеЗначение = СериализаторXDTO.ПрочитатьJSON(ЧтениеJSON);

Важный момент: использование НазначениеТипаXML.Явное заставляет систему сохранять информацию о типах внутри JSON-структуры, что делает процесс восстановления данных абсолютно прозрачным и надежным.

Внутреннее представление (ЗначениеИзСтрокиВнутр)

Проанализируем еще один метод — ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр(). Хотя этот формат считается устаревшим и «нечитаемым» для человека, он является самым быстрым способом сохранить сложный объект (даже ТаблицаЗначений или Структура) в текст внутри одной базы данных.

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

Подводя итог, выбор метода зависит от вашей задачи: для простых значений используйте XMLЗначение, для сложных структур — JSON через СериализаторXDTO, а для динамического определения типов — возможности объекта Метаданные.

← На главную