При настройке обмена данными между различными конфигурациями 1С (например, между Бухгалтерией предприятия 3.0 и Управлением сбытом продукции 1.3) программисты часто используют механизм COM-соединения. Однако в процессе разработки можно столкнуться с ситуацией, когда новый реквизит, добавленный в базу-приемник, оказывается «невидимым» для внешней программы, хотя в самом конфигураторе он присутствует. Разберем подробно, почему так происходит, и как решить эту проблему.
Рассмотрим ситуацию: мы подключаемся из одной базы к другой с помощью объекта V83.COMConnector. В этот момент в оперативной памяти сервера или клиентской машины создается экземпляр COM-сервера 1С. Основная сложность заключается в том, что этот экземпляр может использовать кэшированные данные о структуре объектов конфигурации.
Если вы добавили реквизит номер_качественного в документ Оприходование и сразу попытались обратиться к нему через COM, система может выдать ошибку «Поле объекта не обнаружено». Проанализируем основные причины этого поведения:
rphost могут удерживать соединения в пуле. Даже после закрытия вашего скрипта COM-сервер может оставаться активным, сохраняя старую версию метаданных, в которой нового реквизита еще не существовало.Прежде всего, убедимся, что реквизит действительно принадлежит объекту метаданных, а не является элементом формы. Разберем по шагам:
Оприходование.Как показывает практика, часто решением является простой перезапуск. Однако в промышленной среде важно понимать, что именно нужно «перезапустить». Если «перезаход» в базу не помогает, выполним следующие действия:
1. Завершим все активные сеансы пользователя, под которым происходит COM-подключение.
2. Если база серверная, может потребоваться перезапуск службы Агента сервера 1С:Предприятия или, как минимум, удаление временных файлов в каталоге srvinfo на сервере (очистка серверного кэша).
3. Проверим регистрацию библиотеки comcntr.dll. Для этого можно использовать командную строку от имени администратора:
regsvr32 "C:\Program Files\1cv8\8.3.XX.XXXX\bin\comcntr.dll"
Посмотрим на пример кода, который создает документ в базе-приемнике через COM-соединение. Проанализируем ситуацию, когда мы заполняем новый реквизит:
// Инициализация соединения
ПараметрыСоединения = "Srvr='ServerName';Ref='BaseName';Usr='Login';Pwd='Password';";
Connector = Новый COMОбъект("V83.COMConnector");
Соединение = Connector.Connect(ПараметрыСоединения);
// Создание документа
ДокументОбъект = Соединение.Документы.ОприходованиеТоваров.СоздатьДокумент();
ДокументОбъект.Дата = ТекущаяДата();
// Заполнение стандартного реквизита
ДокументОбъект.Комментарий = "Создано через COM";
// Заполнение нашего проблемного реквизита
// Важно: убедитесь, что имя совпадает с именем в Конфигураторе
Попытка
ДокументОбъект.НомерКачественного = "АБ-123";
Исключение
Сообщить("Ошибка доступа к реквизиту: " + ОписаниеОшибки());
КонецПопытки;
ДокументОбъект.Записать();
Если отладчик всё еще не видит поле, попробуем использовать метод ЗаполнитьЗначенияСвойств, передав структуру. Иногда это помогает обойти ограничения прямой видимости свойств прокси-объекта.
Выясним причину возможной блокировки на уровне прав. Даже если вы подключаетесь под учетной записью с полными правами, в некоторых кастомизированных конфигурациях (таких как УСП 1.3) могут быть специфические проверки в модуле объекта. Выясним это, проанализировав процедуру ПередЗаписью в модуле объекта документа Оприходование. Если там есть код, обращающийся к правам текущего пользователя, это может блокировать запись конкретных полей через COM.
Рассмотрим долгосрочное решение. Механизм COM считается устаревшим и нестабильным для высоконагруженных систем. Он чувствителен к обновлениям платформы, разрядности ОС и требует установки тяжелого клиента 1С на стороне отправителя.
Проанализируем преимущества перехода на HTTP-сервисы:
В конфигурации УСП 1.3 (базирующейся на архитектуре УПП) можно создать простой веб-сервис или HTTP-сервис, который будет принимать структуру данных и создавать документ локально. Это полностью исключит ошибку «невидимости» реквизитов, так как код будет исполняться непосредственно внутри базы-приемника.
Подведем итог: если вы столкнулись с тем, что реквизит не виден через COM, в первую очередь очистите кэш и перезапустите сеансы. Если это не помогло, проверьте права доступа и убедитесь, что реквизит не принадлежит исключительно форме. В будущем старайтесь использовать современные способы интеграции, такие как веб-сервисы, чтобы избежать подобных инфраструктурных проблем.