Как заменить функцию ЗначениеВСтрокуВнутр() в мобильном приложении 1С?

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

Разработчики, работающие с мобильной платформой 1С, часто сталкиваются с тем, что привычный инструментарий "большой" системы оказывается недоступен. Одной из таких проблем является отсутствие функции ЗначениеВСтрокуВнутр(). Эта функция широко используется в типовых обработках (например, в "Универсальном обмене данными XML") для получения уникального текстового представления объекта, включая его тип и структуру. Поскольку мобильное приложение не поддерживает внутренний формат 1С (Internal Storage Format), нам необходимо найти надежные альтернативы. В этой статье мы подробно рассмотрим, чем заменить эту функцию и как реализовать полноценный обмен данными.

Почему ЗначениеВСтрокуВнутр() не работает и чем это грозит?

Функция ЗначениеВСтрокуВнутр() генерирует строку в специфическом формате 1С, который содержит UUID типа, UUID объекта и дополнительные служебные данные в фигурных скобках. Этот формат изначально создавался для толстого клиента и совместимости с версией 7.7. Мобильная платформа же ориентирована на легковесные стандарты. Проанализируем ситуацию: если ваша задача — адаптировать правила конвертации или универсальный обмен, использование этой функции приведет к ошибке исполнения. Рассмотрим основные способы решения этой проблемы.

Вариант 1: Использование XML-сериализации через XDTO

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

Для преобразования объекта в XML-строку используем следующий код:


Функция ЗначениеВСтрокуXML(Значение) Экспорт
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.УстановитьСтроку;
    // Используем СериализаторXDTO для записи объекта
    СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Значение, НазначениеТипаXML.Явное);
    Возврат ЗаписьXML.Закрыть();
КонецФункции

Для обратного преобразования в мобильном приложении или на стороне основной базы используем зеркальную функцию:


Функция ЗначениеИзСтрокиXML(СтрокаXML) Экспорт
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку(СтрокаXML);
    // Восстанавливаем объект из XML
    Возврат СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
КонецФункции

Проанализируем преимущество этого метода: при использовании НазначениеТипаXML.Явное в XML-файле сохраняется информация о типе данных. Это позволяет системе автоматически восстановить ТаблицуЗначений или СправочникСсылка без ручного разбора тегов.

Вариант 2: JSON-сериализация (наиболее современный подход)

Если ваша цель — не просто "заткнуть дыру" в старом коде, а построить быстрый обмен, обратим внимание на JSON. Начиная с версии платформы 8.3.10, мобильные приложения отлично работают с этим форматом. По скорости сериализации JSON сопоставим с внутренним форматом 1С, но при этом строки получаются более компактными и читаемыми.

Рассмотрим пример преобразования данных в JSON с сохранением типов:


Функция ЗначениеВJSON(Значение) Экспорт
    ЗаписьJSON = Новый ЗаписьJSON;
    Настройки = Новый НастройкиСериализацииJSON;
    Настройки.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.ISO8601;
    
    ЗаписьJSON.УстановитьСтроку();
    // НазначениеТипаJSON.Явное добавит поле "#type"
    ЗаписатьJSON(ЗаписьJSON, Значение, Настройки, "ПреобразоватьОбъектВJSON", ЭтотОбъект);
    Возврат ЗаписьJSON.Закрыть();
КонецФункции

Выясним причину, по которой этот метод часто предпочтительнее XML: JSON легче парсить на мобильных устройствах, и он потребляет меньше оперативной памяти при обработке больших массивов данных, таких как справочник Номенклатура с иерархией.

Вариант 3: Адаптация механизмов универсального обмена

Посмотрим на ситуацию со стороны обработки "Универсальный обмен данными XML". В ней ЗначениеВСтрокуВнутр() часто используется для формирования ключей в таблицах соответствия (чтобы понять, выгружался ли объект ранее). Если вы адаптируете эту обработку под мобильное приложение, нам не обязательно дублировать сложный внутренний формат 1С. Нам достаточно получить уникальную строку для конкретного объекта.

В этом случае заменим вызов функции на более простую логику:

  1. Для ссылочных типов (Справочники, Документы) используем Строка(Объект.УникальныйИдентификатор()).
  2. Для примитивных типов (Число, Строка, Дата) используем стандартное преобразование Строка().
  3. Для сложных типов (Структуры) используем краткую JSON-сериализацию.

Рассмотрим, как может выглядеть такая замена в коде:


Функция ПолучитьУникальныйКлючОбъекта(Объект)
    Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(Объект)) Тогда
        Возврат "Ref_" + Строка(Объект.УникальныйИдентификатор());
    ИначеЕсли ТипЗнч(Объект) = Тип("ТаблицаЗначений") Или ТипЗнч(Объект) = Тип("Структура") Тогда
        // Используем XML или JSON как суррогат
        Возврат ЗначениеВСтрокуXML(Объект);
    Иначе
        Возврат Строка(Объект);
    КонецЕсли;
КонецФункции

Сравнение форматов: XML vs Внутренняя строка

Многие задаются вопросом: "Будет ли XML-строка полной копией того, что выдает ЗначениеВСтрокуВнутр?". Ответ — нет. Разберем на примере ТаблицыЗначений. Внутренний формат выглядит как мешанина из идентификаторов: {"#",acf6192e-..., {9, {2, ...}}}. XML же будет содержать явные названия колонок и типизированные значения. Для целей обмена данными это даже лучше, так как делает процесс отладки прозрачным.

Важный нюанс: при обмене между мобильным приложением и основной базой через СериализаторXDTO, убедитесь, что в обеих конфигурациях описаны одинаковые типы данных. Если в основной базе есть перечисление, которого нет в мобильной, попытка прочитать XML приведет к ошибке "Тип не определен".

Практические советы по реализации обмена

Проанализируем опыт коллег, обсуждавших эту тему. Использование планов обмена на мобильной платформе часто оказывается избыточным или сложным в настройке. Если вы решили идти по пути правил конвертации данных (КД 2.0), то замена ЗначениеВСтрокуВнутр() на XML-сериализацию — это единственный путь заставить типовые алгоритмы "взлететь" на смартфоне.

Подведем итоги нашего исследования:

Таким образом, решив проблему отсутствия одной функции, мы переходим к более современным и универсальным протоколам обмена, которые работают стабильнее и быстрее в условиях мобильных сетей.

← На главную