Почему не передаются данные при обмене с сайтом и как исправить ошибку Метод объекта не обнаружен (Свойство)

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

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

Часть 1. Настройка HTTP-обмена: коннект есть, а данных нет

Рассмотрим типичную ситуацию: вы написали код для отправки XML-файла на сайт, сервер возвращает код состояния 200 OK, но лог веб-сервера показывает пустой объем передаваемых данных или PHP-скрипт не видит входящий пакет. Проанализируем пример кода, который часто становится источником проблем:


ЗаголовокHTTP = Новый Соответствие;
ЗаголовокHTTP.Вставить("Content-Type", "text/html; charset=utf-8");
// ... установка соединения ...
HTTP.ОтправитьДляОбработки(ФайлЗапроса, "import/index.php", ФайлОтвета, ЗаголовокHTTP);

Выясним причины, по которым данные могут «теряться» при такой отправке:

  1. Неверный Content-Type. В примере указан text/html. Если вы передаете XML, сервер может ожидать text/xml или application/xml. Если же серверная часть написана так, что ожидает данные в массиве $_POST, то заголовок должен быть application/x-www-form-urlencoded.
  2. Чтение тела запроса на сервере. При использовании метода ОтправитьДляОбработки (POST-запрос) данные передаются в теле сообщения. В PHP такие данные не попадают в стандартный массив $_POST автоматически. Чтобы их прочитать, на стороне сайта нужно использовать конструкцию file_get_contents('php://input').
  3. Использование устаревших методов. Вместо передачи имени файла в метод ОтправитьДляОбработки, современный стандарт разработки в 1С предполагает использование объекта HTTPЗапрос.

Разберем правильный подход с использованием объекта HTTPЗапрос. Этот метод более гибкий и позволяет явно управлять всеми параметрами передачи:


// Подготовим файл и заголовки
ПутьКФайлу = "C:\temp\data.xml";
ЗаголовокHTTP = Новый Соответствие;
ЗаголовокHTTP.Вставить("Content-Type", "text/xml; charset=utf-8");

// Создаем объект запроса
Ресурс = "/import/index.php";
Запрос = Новый HTTPЗапрос(Ресурс, ЗаголовокHTTP);
Запрос.УстановитьИмяФайлаТела(ПутьКФайлу);

// Выполняем отправку
Соединение = Новый HTTPСоединение("mysite.com", , , , , Истина, ЗащищенноеСоединение);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);

Если Ответ.КодСостояния = 200 Тогда
    ТекстОтвета = Ответ.ПолучитьТелоКакСтроку();
    Сообщить("Данные успешно отправлены!");
КонецЕсли;

Важный нюанс: при работе через HTTPS на платформе 8.3.12 и выше, убедитесь, что объект ЗащищенноеСоединениеOpenSSL инициализирован корректно, иначе соединение может быть сброшено ОС до момента передачи данных.

Часть 2. Ошибка «Метод объекта не обнаружен (Свойство)» в 1С:Розница

Теперь перейдем ко второй проблеме, которая часто проявляется в конфигурации «1С:Розница 2.2» после обновления платформы (например, до версии 8.3.12.1714). При попытке обмена или ввода контактной информации система выдает критическую ошибку в модуле РасширенныйВводКонтактнойИнформации.

Проанализируем ситуацию. Ошибка возникает в строке:

Если НЕ ОбъектАдреса.Свойство("AddressType") Тогда

Причина здесь кроется в изменении механизмов десериализации JSON в новых версиях платформы. Переменная ОбъектАдреса, которая раньше ожидалась как Структура, в новых реалиях может приходить в виде обычной Строки. У типа Строка, разумеется, нет метода Свойство(), что и вызывает падение системы.

Как поправить код самостоятельно

Если у вас нет возможности немедленно обновить конфигурацию до актуального релиза, где эта ошибка исправлена разработчиками «1С», мы можем применить «заплатку» в коде. Нам необходимо убедиться, что ОбъектАдреса является структурой, а если это строка — преобразовать её.

Рассмотрим шаги по исправлению в конфигураторе:

  1. Найдем модуль менеджера обработки РасширенныйВводКонтактнойИнформации.
  2. Перейдем к строке, вызывающей ошибку (обычно это район строки 675).
  3. Добавим проверку типа данных перед обращением к методу Свойство().

Пример исправленного кода может выглядеть следующим образом:


// Было:
// Если НЕ ОбъектАдреса.Свойство("AddressType") Тогда

// Стало:
Если ТипЗнч(ОбъектАдреса) = Тип("Строка") Тогда
    // Пытаемся преобразовать строку JSON в структуру
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(ОбъектАдреса);
    ОбъектАдреса = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();
КонецЕсли;

Если ТипЗнч(ОбъектАдреса) = Тип("Структура") ИЛИ ТипЗнч(ОбъектАдреса) = Тип("Соответствие") Тогда
    Если НЕ ОбъектАдреса.Свойство("AddressType") Тогда
        // Ваша логика обработки
    КонецЕсли;
КонецЕсли;

Проанализируем, что мы сделали: мы добавили блок десериализации. Если ОбъектАдреса пришел в виде JSON-строки, мы превращаем его в объект 1С (структуру), после чего метод Свойство() отработает корректно. Это универсальный способ обхода несовместимости версий платформы и кода конфигурации.

Рекомендации по чистке кэша

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

Однако помните, что чистка кэша помогает только в случае «залипания» старых скомпилированных модулей. Если в коде есть логическая ошибка или несовместимость типов (как в случае с AddressType), поможет только модификация программного кода или обновление конфигурации.

Подводя итог, отметим, что стабильность обмена данными зависит как от правильности формирования HTTP-пакетов, так и от готовности кода конфигурации к изменениям в логике работы платформы. Регулярно проверяйте типы принимаемых данных через ТипЗнч() и всегда используйте современные объекты платформы, такие как HTTPЗапрос и ЧтениеJSON, для минимизации подобных ошибок.

← На главную