Как преобразовать строку из текстового файла в ссылочный тип данных при заполнении реквизитов документа в 1С?

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

При разработке механизмов обмена данными часто возникает задача переноса информации через простые текстовые форматы (TXT). Основная сложность здесь заключается в десериализации: когда мы считываем из файла строку "ООО Ромашка" или GUID "550e8400-e29b-41d4-a716-446655440000", система 1С воспринимает их просто как набор символов. Для корректного заполнения реквизитов документа нам необходимо превратить эти строки в полноценные ссылки на объекты базы данных (справочники, документы или перечисления).

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

Метод 1: Использование Уникальных Идентификаторов (GUID)

Самый надежный способ связать строку с объектом — использовать его внутренний УникальныйИдентификатор. В отличие от наименования или кода, GUID гарантирует, что мы обратимся именно к тому элементу, который был выгружен, даже если его название изменилось.

Рассмотрим процесс получения ссылки из строки. Представим, что в текстовом файле у нас хранится строковое представление GUID. Проанализируем следующий алгоритм восстановления ссылки:


// Предположим, мы прочитали строку из файла
УИД_Строкой = "123e4567-e89b-12d3-a456-426655440000"; 

// 1. Создаем объект УникальныйИдентификатор на основе строки
УИД = Новый УникальныйИдентификатор(УИД_Строкой); 

// 2. Получаем ссылку на справочник (например, Контрагенты)
СсылкаНаКонтрагента = Справочники.Контрагенты.ПолучитьСсылку(УИД);

// 3. Проверяем, существует ли такой объект в базе
Если СсылкаНаКонтрагента.ПолучитьОбъект() = Неопределено Тогда
    Сообщить("Объект с данным идентификатором не найден. Возможно, нужно создать новый.");
КонецЕсли;

Этот метод хорош тем, что позволяет заранее получить ссылку даже для еще не созданного объекта. Мы можем использовать УстановитьСсылкуНового(), если наша задача — создать точную копию документа с теми же идентификаторами, что были в исходной базе.

Метод 2: Универсальная загрузка через XMLЗначение

Если в вашем текстовом файле формат выгрузки предполагает наличие информации о типе данных (например, как предложил автор темы: "Реквизит - Тип - Значение"), наиболее эффективным решением будет использование функций XML-сериализации. Рассмотрим, как это работает.

Функция XMLСтрока(Значение) при выгрузке преобразует любой тип (ссылку, дату, число) в стандартный текстовый формат. Обратная функция XMLЗначение(Тип, Строка) превращает текст обратно в нужный тип данных.

Разберем пример кода для загрузки реквизитов документа из файла:


// Читаем данные из файла (строка типа и строковое значение)
ИмяТипа = "СправочникСсылка.Номенклатура";
ЗначениеИзФайла = "550e8400-e29b-41d4-a716-446655440000";

// Получаем объект Тип по его строковому имени
НужныйТип = Тип(ИмяТипа);

// Преобразуем строку в ссылку или примитивный тип
Результат = XMLЗначение(НужныйТип, ЗначениеИзФайла);

// Теперь Результат имеет тип СправочникСсылка.Номенклатура и его можно записывать в реквизит
НовыйДокумент.Товар = Результат;

Важный момент: использование XMLЗначение избавляет вас от необходимости писать бесконечные условия Если Тип = ... Тогда. Платформа сама определит, как интерпретировать строку, если вы передадите ей корректный объект Тип.

Метод 3: Динамический обход метаданных при выгрузке и загрузке

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


&НаСервере
Процедура ВыгрузитьРеквизитыОбъекта(СсылкаНаОбъект)
    
    МассивСтрок = Новый Массив;
    МетаданныеОбъекта = СсылкаНаОбъект.Метаданные();
    
    // Проходим по всем реквизитам, описанным в конфигураторе
    Для каждого Реквизит Из МетаданныеОбъекта.Реквизиты Цикл
        
        Имя = Реквизит.Имя;
        Значение = СсылкаНаОбъект[Имя];
        
        // Используем XMLСтрока для получения универсального текстового представления
        ТекстовоеЗначение = XMLСтрока(Значение);
        
        // Формируем строку: ИмяРеквизита|Тип|Значение
        СтрокаВыгрузки = Имя + "|" + Реквизит.Тип + "|" + ТекстовоеЗначение;
        МассивСтрок.Добавить(СтрокаВыгрузки);
        
    КонецЦикла;
    
    // Дальнейшая запись массива в TXT файл...
КонецПроцедуры

При загрузке мы выполняем обратную операцию. Мы считываем строку, разбиваем её на части (используя СтрРазделить) и используем XMLЗначение для восстановления данных. Это позволяет создать "клон" документа, даже если мы не знаем заранее структуру его реквизитов.

Метод 4: Поиск по коду или наименованию

Если в вашем текстовом файле нет GUID, а есть только "понятные" человеку названия (например, "Основной склад"), нам придется прибегнуть к методам поиска. Выясним причину, почему этот метод считается менее надежным: в базе могут быть дубликаты наименований или лишние пробелы в файле.

Рассмотрим безопасный алгоритм поиска:

  1. Очистите прочитанную строку от лишних пробелов функцией СокрЛП().
  2. Используйте метод НайтиПоНаименованию() или НайтиПоКоду() соответствующего менеджера.
  3. Обязательно проверяйте результат на ПустаяСсылка().

ИмяКонтрагента = СокрЛП(СтрокаИзФайла);
Ссылка = Справочники.Контрагенты.НайтиПоНаименованию(ИмяКонтрагента, Истина); // Истина - для точного соответствия

Если Ссылка.Пустая() Тогда
    // Логика обработки: создать новый или пропустить
    Сообщить("Контрагент " + ИмяКонтрагента + " не найден!");
КонецЕсли;

Почему стоит рассмотреть JSON или XML вместо TXT?

Разберем по шагам, почему опытные разработчики советуют отказываться от чистого TXT в пользу структурированных форматов. В 1С есть мощный механизм — СериализаторXDTO. Он позволяет превратить весь документ со всеми его табличными частями в одну строку JSON или XML и восстановить его одной командой.

Преимущества структурированных форматов:

Пример использования JSON для выгрузки (современный подход):


ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
// Сериализуем объект целиком
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, СсылкаНаДокумент.ПолучитьОбъект());
РезультатJSON = ЗаписьJSON.Закрыть();
// Эту строку можно сохранить в файл и позже прочитать СериализаторXDTO.ПрочитатьJSON

Подводя итог, отметим: если вы ограничены форматом TXT, используйте XMLСтрока и XMLЗначение в связке с идентификаторами GUID. Это обеспечит максимальную точность данных и избавит от ошибок приведения типов.

← На главную