При интеграции двух информационных баз 1С с использованием внешнего соединения разработчики нередко сталкиваются с ситуацией, когда подключение устанавливается и запросы отрабатывают успешно, однако попытка вызвать методы менеджеров объектов (например, СоздатьЭлемент, НайтиПоРеквизиту) приводит к ошибке «Метод не найден» или «Поле объекта не обнаружено». Кроме того, при попытке записи созданного объекта сеанс может аварийно завершаться ошибками исполнения процедур.
Разберем детально, почему возникают подобные проблемы при программном создании элементов через COM-соединение, как устроен механизм вызова динамических методов и как правильно организовать обмен данными.
Проанализируем распространенную ошибку синтаксиса. В коде конфигурации 1С платформа иногда прощает разработчику отсутствие круглых скобок при вызове процедур или функций без параметров. Однако при взаимодействии через COM-соединение (интерфейс IDispatch) действуют строгие правила обращения к свойствам и методам:
МенеджерКонтрагентов.СоздатьЭлемент или НовКонтрагент.Записать), платформа воспринимает обращение как чтение свойства или реквизита объекта, а не вызов функции. Так как реквизита с таким именем у менеджера нет, возникает исключение «Метод не найден» или «Поле объекта не обнаружено».СоздатьЭлемент(), Записать(), Выбрать().Посмотрим на пример корректного создания и заполнения элемента справочника во внешней базе:
// Установка COM-соединения
Попытка
V8 = Новый COMОбъект("V83.COMConnector");
Соединение = V8.Connect("srvr=""" + Сервер + """; ref=""" + База + """; usr=""" + Пользователь + """; pwd=""" + Пароль + """;");
Исключение
Сообщить("Не удалось подключиться к базе данных: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Создание элемента с обязательными круглыми скобками у методов
Попытка
МенеджерКонтрагентов = Соединение.Справочники.Контрагенты;
// Вызов метода создания элемента со скобками ()
НовКонтрагент = МенеджерКонтрагентов.СоздатьЭлемент();
// Заполнение реквизитов объекта
НовКонтрагент.Наименование = "ООО Ромашка";
НовКонтрагент.ИНН = "7701234567";
НовКонтрагент.КПП = "770101001";
// Вызов метода записи объекта со скобками ()
НовКонтрагент.Записать();
Сообщить("Контрагент успешно создан!");
Исключение
Сообщить("Ошибка при создании объекта: " + ОписаниеОшибки());
КонецПопытки;
// Освобождение COM-соединения
Соединение = Неопределено;
Выясним, почему отладчик в окнах «Табло» или «Вычислить выражение» показывает надпись «Метод не найден» при обращении к менеджерам прикладных объектов (например, Соединение.Справочники.Контрагенты):
COMОбъект.Менеджер.СоздатьЭлемент() отрабатывает корректно.Рассмотрим ситуацию, когда соединение успешно создало объект, но при вызове метода Записать() возникает ошибка вида Процедура или функция не обнаружена (Предупреждение) или (ПоказатьОповещение):
ПередЗаписью, ПриЗаписи, ОбработкаЗаполнения) или в подписках на события вызываются диалоговые методы (Предупреждение(), Вопрос(), ОткрытьФорму()), платформа 1С прерывает выполнение с ошибкой.
#Если Клиент Тогда
Предупреждение("Данные успешно сохранены!");
#КонецЕсли
Проанализируем права учетной записи, под которой осуществляется вход через коннектор:
Разберем по шагам правила надежной работы с COM-коннектором:
V83.COMConnector вместо устаревшего V82.COMConnector.Соединение.НачатьТранзакцию() и Соединение.ЗафиксироватьТранзакцию(), что многократно снизит накладные расходы на сетевые вызовы.Неопределено (Соединение = Неопределено;), чтобы своевременно освободить серверный сеанс и память.