Как проверить тип реквизита на составной и восстановить данные из текстового файла в 1С

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

При разработке механизмов обмена данными часто возникает задача выгрузки информации в текстовом формате без использования стандартных средств (XML или JSON). В качестве альтернативы стандартным подходам можно изучить модуль «Трансформер» для конвертации JSON/XML/CSV/TOON, который на практике показывает высокую гибкость работы с данными. Одной из главных сложностей здесь становится корректная обработка составных типов данных и последующее восстановление ссылок. В этой статье мы разберем, как правильно определить, является ли тип составным, и как универсально искать объекты в базе данных по их текстовому описанию.

Различие между типом значения и типом реквизита

Прежде всего, проанализируем распространенную ошибку. Попытка сравнения ТипЗнч(Значение) = Тип("СоставнойТип") всегда будет приводить к ошибке, так как в платформе 1С не существует типа с названием СоставнойТип. Более того, функция ТипЗнч() всегда возвращает один конкретный тип, который имеет объект в данный момент.

Для того чтобы выяснить, является ли само поле в конфигурации составным, нам необходимо обратиться к метаданным объекта. Рассмотрим, как это сделать правильно:


// Получаем описание типов конкретного реквизита из метаданных
ОписаниеТиповРеквизита = Метаданные.Документы.РеализацияТоваровУслуг.Реквизиты.Контрагент.Тип;

// Проверяем количество допустимых типов
Если ОписаниеТиповРеквизита.Типы().Количество() > 1 Тогда
    Сообщить("Это составной тип данных");
КонецЕсли;

Универсальный обход реквизитов документа

Представим ситуацию: нам нужно перебрать все реквизиты документа и подготовить их для выгрузки.


Для Каждого ТекРеквизит Из ДокументСсылка.Метаданные().Реквизиты Цикл
    ИмяРеквизита = ТекРеквизит.Имя;
    ЗначениеРеквизита = ДокументСсылка[ИмяРеквизита];
    ТипЗначения = ТипЗнч(ЗначениеРеквизита);
    
    // Если это ссылка, нам нужно получить полное имя метаданных (например, "Справочник.Склады")
    МетаданныеТипа = Метаданные.НайтиПоТипу(ТипЗначения);
    Если МетаданныеТипа <> Неопределено Тогда
        ПолноеИмяТипа = МетаданныеТипа.ПолноеИмя();
    Иначе
        // Для примитивных типов (Строка, Число, Дата) используем строковое представление типа
        ПолноеИмяТипа = Строка(ТипЗначения);
    КонецЕсли;
    
    // Формируем строку для записи в текстовый файл
    ТекстСтроки = СтрШаблон("%1 | %2 | %3", ИмяРеквизита, ПолноеИмяТипа, ЗначениеРеквизита);
    // Запись в файл...
КонецЦикла;

Восстановление данных: превращаем строку в объект

После того как данные выгружены в текст, возникает задача их загрузки. Основная сложность — имея строку "Справочник.Номенклатура" и значение "Стол кухонный", получить реальную ссылку. В ситуациях, когда базы не идентичны, часто выручает универсальный перенос данных между разными конфигурациями 1С 8.3 на базе COM или HTTP, но для текстовых файлов алгоритм поиска приходится писать вручную.

Для создания универсального загрузчика разберем по шагам алгоритм получения менеджера объекта:

  1. Разделим полное имя типа (например, "Справочник.Банки") на две части: Класс (Справочник) и Имя (Банки).
  2. Используем глобальные коллекции Справочники, Документы, Перечисления и т.д., обращаясь к ним через квадратные скобки.
  3. Вызовем метод поиска (по коду, наименованию или номеру).

Посмотрим на пример реализации такой функции:


Функция НайтиСсылкуПоОписанию(ПолноеИмяТипа, ЗначениеДляПоиска)
    
    МассивЧастей = СтрРазделить(ПолноеИмяТипа, ".");
    Если МассивЧастей.Количество() < 2 Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    КлассМетаданных = МассивЧастей[0]; // Справочник, Документ и т.д.
    ИмяОбъекта = МассивЧастей[1];
    
    Если КлассМетаданных = "Справочник" Тогда
        // Сначала пробуем найти по коду, так как это надежнее
        Ссылка = Справочники[ИмяОбъекта].НайтиПоКоду(ЗначениеДляПоиска);
        Если Ссылка.Пустая() Тогда
            Ссылка = Справочники[ИмяОбъекта].НайтиПоНаименованию(ЗначениеДляПоиска);
        КонецЕсли;
        Возврат Ссылка;
        
    ИначеЕсли КлассМетаданных = "Документ" Тогда
        // Для документов поиск сложнее, желательно иметь дату
        Возврат Документы[ИмяОбъекта].НайтиПоНомеру(ЗначениеДляПоиска);
        
    ИначеЕсли КлассМетаданных = "Перечисление" Тогда
        // Для перечислений ищем по имени значения (идентификатору)
        Возврат Перечисления[ИмяОбъекта][ЗначениеДляПоиска];
    КонецЕсли;
    
    Возврат Неопределено;
КонецФункции

Важные рекомендации по работе с типами

Использование естественных ключей. При отказе от УИД (GUID) крайне важно определить, что делает объект уникальным. Для решения задач обмена между не полностью идентичными конфигурациями отлично подходит выгрузка и загрузка данных XML адаптивная, которая позволяет использовать гибкие отборы.

Преобразование примитивных типов. Чтобы избежать проблем с форматами дат и чисел при чтении текстового файла, рекомендуем использовать функции XMLString() при выгрузке и XMLValue() при загрузке. Несмотря на названия, они отлично работают в обычном текстовом обмене, создавая стандартную строку, которую платформа 1С всегда поймет однозначно.

Безопасность и целостность. Если вы передаете конфиденциальную информацию через внешние файлы, используйте универсальную выгрузку-загрузку данных с возможностью шифрования, чтобы защитить данные на этапе транспортировки.

Работа с именами метаданных. Всегда выгружайте Имя объекта метаданных, а не его Синоним. Синоним предназначен для пользователя и может быть изменен в любой момент, в то время как программное имя остается стабильным, что гарантирует работоспособность вашего кода в будущем.

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

← На главную