При разработке механизмов обмена данными часто возникает задача переноса информации через простые текстовые форматы (TXT). Основная сложность здесь заключается в десериализации: когда мы считываем из файла строку "ООО Ромашка" или GUID "550e8400-e29b-41d4-a716-446655440000", система 1С воспринимает их просто как набор символов. Для корректного заполнения реквизитов документа нам необходимо превратить эти строки в полноценные ссылки на объекты базы данных (справочники, документы или перечисления).
В этой статье мы подробно разберем, как правильно выгружать данные в текст и, что более важно, как восстановить типы данных при загрузке, используя различные механизмы платформы 1С:Предприятие 8.3.
Самый надежный способ связать строку с объектом — использовать его внутренний УникальныйИдентификатор. В отличие от наименования или кода, GUID гарантирует, что мы обратимся именно к тому элементу, который был выгружен, даже если его название изменилось.
Рассмотрим процесс получения ссылки из строки. Представим, что в текстовом файле у нас хранится строковое представление GUID. Проанализируем следующий алгоритм восстановления ссылки:
// Предположим, мы прочитали строку из файла
УИД_Строкой = "123e4567-e89b-12d3-a456-426655440000";
// 1. Создаем объект УникальныйИдентификатор на основе строки
УИД = Новый УникальныйИдентификатор(УИД_Строкой);
// 2. Получаем ссылку на справочник (например, Контрагенты)
СсылкаНаКонтрагента = Справочники.Контрагенты.ПолучитьСсылку(УИД);
// 3. Проверяем, существует ли такой объект в базе
Если СсылкаНаКонтрагента.ПолучитьОбъект() = Неопределено Тогда
Сообщить("Объект с данным идентификатором не найден. Возможно, нужно создать новый.");
КонецЕсли;
Этот метод хорош тем, что позволяет заранее получить ссылку даже для еще не созданного объекта. Мы можем использовать УстановитьСсылкуНового(), если наша задача — создать точную копию документа с теми же идентификаторами, что были в исходной базе.
Если в вашем текстовом файле формат выгрузки предполагает наличие информации о типе данных (например, как предложил автор темы: "Реквизит - Тип - Значение"), наиболее эффективным решением будет использование функций XML-сериализации. Рассмотрим, как это работает.
Функция XMLСтрока(Значение) при выгрузке преобразует любой тип (ссылку, дату, число) в стандартный текстовый формат. Обратная функция XMLЗначение(Тип, Строка) превращает текст обратно в нужный тип данных.
Разберем пример кода для загрузки реквизитов документа из файла:
// Читаем данные из файла (строка типа и строковое значение)
ИмяТипа = "СправочникСсылка.Номенклатура";
ЗначениеИзФайла = "550e8400-e29b-41d4-a716-446655440000";
// Получаем объект Тип по его строковому имени
НужныйТип = Тип(ИмяТипа);
// Преобразуем строку в ссылку или примитивный тип
Результат = XMLЗначение(НужныйТип, ЗначениеИзФайла);
// Теперь Результат имеет тип СправочникСсылка.Номенклатура и его можно записывать в реквизит
НовыйДокумент.Товар = Результат;
Важный момент: использование XMLЗначение избавляет вас от необходимости писать бесконечные условия Если Тип = ... Тогда. Платформа сама определит, как интерпретировать строку, если вы передадите ей корректный объект Тип.
Чтобы сделать обработку универсальной для любого документа, проанализируем ситуацию, когда нам нужно программно перебрать все реквизиты. Посмотрим на пример кода, который автоматизирует выгрузку реквизитов объекта в текстовый массив с сохранением их типизации:
&НаСервере
Процедура ВыгрузитьРеквизитыОбъекта(СсылкаНаОбъект)
МассивСтрок = Новый Массив;
МетаданныеОбъекта = СсылкаНаОбъект.Метаданные();
// Проходим по всем реквизитам, описанным в конфигураторе
Для каждого Реквизит Из МетаданныеОбъекта.Реквизиты Цикл
Имя = Реквизит.Имя;
Значение = СсылкаНаОбъект[Имя];
// Используем XMLСтрока для получения универсального текстового представления
ТекстовоеЗначение = XMLСтрока(Значение);
// Формируем строку: ИмяРеквизита|Тип|Значение
СтрокаВыгрузки = Имя + "|" + Реквизит.Тип + "|" + ТекстовоеЗначение;
МассивСтрок.Добавить(СтрокаВыгрузки);
КонецЦикла;
// Дальнейшая запись массива в TXT файл...
КонецПроцедуры
При загрузке мы выполняем обратную операцию. Мы считываем строку, разбиваем её на части (используя СтрРазделить) и используем XMLЗначение для восстановления данных. Это позволяет создать "клон" документа, даже если мы не знаем заранее структуру его реквизитов.
Если в вашем текстовом файле нет GUID, а есть только "понятные" человеку названия (например, "Основной склад"), нам придется прибегнуть к методам поиска. Выясним причину, почему этот метод считается менее надежным: в базе могут быть дубликаты наименований или лишние пробелы в файле.
Рассмотрим безопасный алгоритм поиска:
СокрЛП().НайтиПоНаименованию() или НайтиПоКоду() соответствующего менеджера.ПустаяСсылка().
ИмяКонтрагента = СокрЛП(СтрокаИзФайла);
Ссылка = Справочники.Контрагенты.НайтиПоНаименованию(ИмяКонтрагента, Истина); // Истина - для точного соответствия
Если Ссылка.Пустая() Тогда
// Логика обработки: создать новый или пропустить
Сообщить("Контрагент " + ИмяКонтрагента + " не найден!");
КонецЕсли;
Разберем по шагам, почему опытные разработчики советуют отказываться от чистого TXT в пользу структурированных форматов. В 1С есть мощный механизм — СериализаторXDTO. Он позволяет превратить весь документ со всеми его табличными частями в одну строку JSON или XML и восстановить его одной командой.
Преимущества структурированных форматов:
Пример использования JSON для выгрузки (современный подход):
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
// Сериализуем объект целиком
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, СсылкаНаДокумент.ПолучитьОбъект());
РезультатJSON = ЗаписьJSON.Закрыть();
// Эту строку можно сохранить в файл и позже прочитать СериализаторXDTO.ПрочитатьJSON
Подводя итог, отметим: если вы ограничены форматом TXT, используйте XMLСтрока и XMLЗначение в связке с идентификаторами GUID. Это обеспечит максимальную точность данных и избавит от ошибок приведения типов.