При переходе с конфигурации «Бухгалтерия предприятия 2.0» на версию 3.0 разработчики часто сталкиваются с тем, что отлаженные годами механизмы обмена данными через OLE перестают работать. Типичная ситуация: внешняя обработка в 1С 7.7 пытается создать документ в 1С 8.3, но получает ошибку инициализации модуля: Переменная не определена (СчетаУчетаВДокументах). Рассмотрим подробно, почему это происходит и как адаптировать обмен под новые реалии платформы 8.3 и управляемых форм.
Основная проблема кроется в изменении архитектуры конфигураций на управляемых формах (БП 3.0). Когда мы используем код СоздатьОбъект("V83.Application") в 1С 7.7, платформа 8.3 запускается как полноценное клиентское приложение. В этом режиме система эмулирует работу пользователя, причем по умолчанию это происходит в контексте толстого клиента.
Ошибка Переменная не определена возникает из-за того, что модуль документа в 1С 8.3 при компиляции пытается обратиться к общему модулю СчетаУчетаВДокументах. Если у этого общего модуля в конфигураторе не установлены соответствующие флаги (права на видимость в конкретном типе клиента), то для системы этот модуль просто не существует в данном контексте. Разберем основные способы решения этой задачи.
Это наиболее правильный и эффективный метод. В отличие от V83.Application, который запускает тяжелое графическое приложение, V83.COMConnector создает максимально легкое «внешнее соединение». Большинство типовых модулей в 1С:Бухгалтерия 3.0 (включая СчетаУчетаВДокументах) уже имеют установленный флаг «Внешнее соединение».
Проанализируем, как изменится код инициализации в 1С 7.7:
// Было:
// Соединение = СоздатьОбъект("V83.Application");
// Стало:
COM = СоздатьОбъект("V83.COMConnector");
ПараметрыСтр = "Srvr=""ServerName"";Ref=""BaseName"";Usr=""Admin"";Pwd=""Pass"";";
// Или для файловой базы:
// ПараметрыСтр = "File=""C:\Base83"";Usr=""Admin"";Pwd=""Pass"";";
Соединение = COM.Connect(ПараметрыСтр);
Использование COMConnector позволяет избежать загрузки интерфейса и значительно ускоряет процесс обмена. Кроме того, это решает проблему доступности модулей, так как контекст внешнего соединения является стандартным для программного взаимодействия между базами.
Если по каким-то причинам вы обязаны использовать именно V83.Application, нам придется вручную корректировать свойства метаданных в конфигурации-приемнике. Рассмотрим ситуацию: V83.Application запускает сеанс Толстого клиента (управляемое приложение).
Выясним, какие действия необходимо предпринять в конфигураторе 1С 8.3:
СчетаУчетаВДокументах.Application.Важный момент: если внутри модуля СчетаУчетаВДокументах вызываются функции из других модулей, вам придется по цепочке проставить аналогичные флаги и в них. Это может быть трудоемко и не всегда желательно для типовой конфигурации, находящейся на поддержке.
Не забудем про системный уровень. 1С 7.7 — это всегда 32-битное приложение. Если вы пытаетесь подключиться к 64-битному серверу 1С 8.3 через COM, могут возникнуть проблемы с регистрацией библиотек. Разберем, как проверить готовность среды:
Для корректной работы COMConnector на компьютере, где запущена 7.7, должен быть установлен 32-битный клиент платформы 1С 8.3. Даже если сервер 64-битный, библиотеки для связи (comcntr.dll) должны соответствовать разрядности вызывающего приложения (т.е. 7.7).
Если регистрация не проходит автоматически, выполним её вручную через командную строку от имени администратора:
regsvr32 "C:\Program Files (x86)\1cv8\8.3.18.1208\bin\comcntr.dll"
Иногда ошибка «Переменная не определена» является лишь следствием того, что модуль не смог инициализироваться из-за пустых параметров сеанса. При OLE-подключении не отрабатывают привычные обработчики ПриНачалеРаботыСистемы, которые заполняют текущего пользователя, организацию или настройки цен.
Посмотрим, как можно программно инициализировать окружение сразу после подключения:
// В 1С 7.7 после создания объекта Соединение
// Можно вызвать процедуру модуля управляемого приложения (если есть экспортная)
// или напрямую заполнить нужные параметры, если это предусмотрено в 8.3
Соединение.ПараметрыСеанса.ТекущийПользователь = Соединение.Справочники.Пользователи.НайтиПоНаименованию("Админ");
Однако в типовой БП 3.0 лучше полагаться на механизмы модуля Сеанс, проверив, чтобы там не было кода, который жестко требует наличия графического интерфейса (форм, диалогов), иначе OLE-соединение будет разорвано с ошибкой.
Проанализировав ситуацию, мы видим, что наиболее стабильным решением является использование V83.COMConnector. Это избавляет от необходимости «расставлять галочки» в свойствах сотен общих модулей типовой конфигурации и обеспечивает более высокую скорость работы. Если же вы ограничены использованием V83.Application, обязательно убедитесь, что в конфигурации 8.3 включена поддержка управляемых форм в толстом клиенте и у соответствующих модулей стоят флаги компиляции для толстого клиента.