Как исправить ошибку «Процедура или функция с указанным именем не определена (ЗначениеИзСтрокиВнутр)» при проверке тонкого клиента в 1С?

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

При сохранении модулей или синтаксическом контроле внешней обработки в Конфигураторе разработчики часто сталкиваются с сообщением об ошибке: «Процедура или функция с указанным именем не определена (ЗначениеИзСтрокиВнутр)». При этом проверка ссылается на контекст Тонкий клиент.

Разберем подробно, почему возникают подобные предупреждения платформы, как временно отключить лишние проверки и как правильно переписать код согласно стандартам разработки 1С.

Выясним причину возникновения ошибки

Функции внутреннего представления ЗначениеИзСтрокиВнутр() и ЗначениеВСтрокуВнутр() предназначены исключительно для использования в толстом клиенте, на сервере или во внешнем соединении. В контексте тонкого и веб-клиента данные функции отсутствуют в глобальном контексте платформы.

Кроме того, эти функции чаще всего применяются для восстановления сложных объектов данных, таких как ТаблицаЗначений. Тип ТаблицаЗначений недоступен на тонком клиенте — на клиенте вместо него используются типы Массив или ДанныеФормыКоллекция. Попытка десериализовать такой объект в тонком клиенте вызывает ошибку компиляции.

Рассмотрим основные варианты решения этой задачи: от быстрых настроек Конфигуратора до правильного архитектурного рефакторинга кода.

Способ 1. Отключение проверки синтаксиса для тонкого клиента в Конфигураторе

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

Выполним следующие шаги в Конфигураторе:

  1. Откроем верхнее меню Сервис и выберем пункт Параметры.
  2. Перейдем на вкладку Модули, а затем в раздел Проверка.
  3. Снимем флаг напротив пункта Тонкий клиент в списке проверяемых режимов запуска.
  4. Нажмем кнопку Применить или ОК для сохранения настроек.

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

Способ 2. Использование инструкций препроцессора

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

Посмотрим на пример применения инструкции препроцессора:


#Если ТолстыйКлиентУправляемоеПриложение Или Сервер Тогда
    ТЗ = ЗначениеИзСтрокиВнутр(ПромежуточныйЭтапПолученияТЗ(Файл.ПолноеИмя, 1));
#КонецЕсли

В этом случае платформа пропустит блок при синтаксической проверке контекста ТонкийКлиент, и ошибка не появится.

Способ 3. Перенос вызова функций на сервер (Рекомендуемый подход)

Наиболее правильным и универсальным решением является соблюдение клиент-серверной архитектуры платформы «1С:Предприятие 8.3». Работа с тяжелыми типами данных и системными функциями преобразования должна выполняться на стороне сервера.

Разберем по шагам, как вынести десериализацию на сервер и вернуть данные на клиент:

  1. Создадим процедуру или функцию с директивой компиляции &НаСервереБезКонтекста или &НаСервере.
  2. На сервере выполним десериализацию строки через ЗначениеИзСтрокиВнутр().
  3. Преобразуем полученную ТаблицуЗначений в тип, доступный на тонком клиенте (например, в Массив структур или заполненный реквизит формы).

Проанализируем пример реализации такого подхода:


&НаКлиенте
Процедура ВыполнитьЗагрузку()
    ТекстФайла = ПолучитьТекстИзФайла(Файл.ПолноеИмя);
    МассивДанных = ПолучитьДанныеНаСервере(ТекстФайла);
    // Дальнейшая работа с массивом структур на тонком клиенте
КонецПроцедуры

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

Если десериализованные данные нужно 바로 вывести на управляемую форму, на сервере можно загрузить ТаблицуЗначений напрямую в реквизит формы с помощью системной функции ЗначениеВРеквизитФормы().

Альтернативные методы сериализации данных

Фирма «1С» считает использование ЗначениеИзСтрокиВнутр() устаревшим подходом, сохраненным в основном для обратной совместимости. В современных конфигурациях рекомендуется использовать более универсальные механизмы:

← На главную