При сохранении модулей или синтаксическом контроле внешней обработки в Конфигураторе разработчики часто сталкиваются с сообщением об ошибке: «Процедура или функция с указанным именем не определена (ЗначениеИзСтрокиВнутр)». При этом проверка ссылается на контекст Тонкий клиент.
Разберем подробно, почему возникают подобные предупреждения платформы, как временно отключить лишние проверки и как правильно переписать код согласно стандартам разработки 1С.
Функции внутреннего представления ЗначениеИзСтрокиВнутр() и ЗначениеВСтрокуВнутр() предназначены исключительно для использования в толстом клиенте, на сервере или во внешнем соединении. В контексте тонкого и веб-клиента данные функции отсутствуют в глобальном контексте платформы.
Кроме того, эти функции чаще всего применяются для восстановления сложных объектов данных, таких как ТаблицаЗначений. Тип ТаблицаЗначений недоступен на тонком клиенте — на клиенте вместо него используются типы Массив или ДанныеФормыКоллекция. Попытка десериализовать такой объект в тонком клиенте вызывает ошибку компиляции.
Рассмотрим основные варианты решения этой задачи: от быстрых настроек Конфигуратора до правильного архитектурного рефакторинга кода.
Если обработка действительно разрабатывается для работы исключительно в режиме толстого клиента и переносить функционал не планируется, можно скрыть предупреждения платформы при сохранении модулей.
Выполним следующие шаги в Конфигураторе:
После выполнения этих действий синтаксический контроль перестанет анализировать модуль формы на предмет совместимости с тонким клиентом, и ошибки при сохранении выводиться не будут.
Чтобы код не вызывал ошибок компиляции при синтаксическом контроле во всех клиентах, можно ограничить его выполнение с помощью условий препроцессора. Это дает платформе четкое понимание того, в каком контексте должен компилироваться блок кода.
Посмотрим на пример применения инструкции препроцессора:
#Если ТолстыйКлиентУправляемоеПриложение Или Сервер Тогда
ТЗ = ЗначениеИзСтрокиВнутр(ПромежуточныйЭтапПолученияТЗ(Файл.ПолноеИмя, 1));
#КонецЕсли
В этом случае платформа пропустит блок при синтаксической проверке контекста ТонкийКлиент, и ошибка не появится.
Наиболее правильным и универсальным решением является соблюдение клиент-серверной архитектуры платформы «1С:Предприятие 8.3». Работа с тяжелыми типами данных и системными функциями преобразования должна выполняться на стороне сервера.
Разберем по шагам, как вынести десериализацию на сервер и вернуть данные на клиент:
&НаСервереБезКонтекста или &НаСервере.ЗначениеИзСтрокиВнутр().ТаблицуЗначений в тип, доступный на тонком клиенте (например, в Массив структур или заполненный реквизит формы).Проанализируем пример реализации такого подхода:
&НаКлиенте
Процедура ВыполнитьЗагрузку()
ТекстФайла = ПолучитьТекстИзФайла(Файл.ПолноеИмя);
МассивДанных = ПолучитьДанныеНаСервере(ТекстФайла);
// Дальнейшая работа с массивом структур на тонком клиенте
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьДанныеНаСервере(СодержимоеФайла)
ТаблицаИзСтроки = ЗначениеИзСтрокиВнутр(СодержимоеФайла);
// Преобразуем ТаблицуЗначений в Массив структур для передачи на клиент
Результат = Новый Массив;
Для Каждого Стр Из ТаблицаИзСтроки Цикл
СтруктураСтроки = Новый Структура;
Для Каждого Колонка Из ТаблицаИзСтроки.Колонки Цикл
СтруктураСтроки.Вставить(Колонка.Имя, Стр[Колонка.Имя]);
КонецЦикла;
Результат.Добавить(СтруктураСтроки);
КонецЦикла;
Возврат Результат;
КонецФункции
Если десериализованные данные нужно 바로 вывести на управляемую форму, на сервере можно загрузить ТаблицуЗначений напрямую в реквизит формы с помощью системной функции ЗначениеВРеквизитФормы().
Фирма «1С» считает использование ЗначениеИзСтрокиВнутр() устаревшим подходом, сохраненным в основном для обратной совместимости. В современных конфигурациях рекомендуется использовать более универсальные механизмы:
ПрочитатьJSON() и ЗаписатьJSON(), а также ЗначениеИзСтрокиJSON(). Они нативно поддерживаются на тонком клиенте и работают с массивами и структурами.СериализаторXDTO в комбинации с ЧтениеXML и ЗаписьXML для работы с любыми типами данных.