Как исправить ошибку «Переменная не определена» при OLE-обмене между 1С 7.7 и 1С 8.3

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

При переходе с конфигурации «Бухгалтерия предприятия 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 при компиляции пытается обратиться к общему модулю СчетаУчетаВДокументах. Если у этого общего модуля в конфигураторе не установлены соответствующие флаги (права на видимость в конкретном типе клиента), то для системы этот модуль просто не существует в данном контексте. Разберем основные способы решения этой задачи.

Решение 1: Переход с Application на COMConnector

Это наиболее правильный и эффективный метод. В отличие от 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 позволяет избежать загрузки интерфейса и значительно ускоряет процесс обмена. Кроме того, это решает проблему доступности модулей, так как контекст внешнего соединения является стандартным для программного взаимодействия между базами.

Решение 2: Настройка свойств общих модулей в 1С 8.3

Если по каким-то причинам вы обязаны использовать именно V83.Application, нам придется вручную корректировать свойства метаданных в конфигурации-приемнике. Рассмотрим ситуацию: V83.Application запускает сеанс Толстого клиента (управляемое приложение).

Выясним, какие действия необходимо предпринять в конфигураторе 1С 8.3:

  1. Найдем общий модуль СчетаУчетаВДокументах.
  2. Перейдем в его свойства (правой кнопкой мыши — Свойства).
  3. Проверим наличие галочки «Толстый клиент (управляемое приложение)». Если она снята — модуль не будет виден при OLE-соединении через Application.
  4. Установим этот флаг и обновим конфигурацию базы данных.

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

Решение 3: Устранение конфликта разрядности (32-бит против 64-бит)

Не забудем про системный уровень. 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"

Решение 4: Инициализация параметров сеанса

Иногда ошибка «Переменная не определена» является лишь следствием того, что модуль не смог инициализироваться из-за пустых параметров сеанса. При OLE-подключении не отрабатывают привычные обработчики ПриНачалеРаботыСистемы, которые заполняют текущего пользователя, организацию или настройки цен.

Посмотрим, как можно программно инициализировать окружение сразу после подключения:


// В 1С 7.7 после создания объекта Соединение
// Можно вызвать процедуру модуля управляемого приложения (если есть экспортная)
// или напрямую заполнить нужные параметры, если это предусмотрено в 8.3
Соединение.ПараметрыСеанса.ТекущийПользователь = Соединение.Справочники.Пользователи.НайтиПоНаименованию("Админ");

Однако в типовой БП 3.0 лучше полагаться на механизмы модуля Сеанс, проверив, чтобы там не было кода, который жестко требует наличия графического интерфейса (форм, диалогов), иначе OLE-соединение будет разорвано с ошибкой.

Подведем итоги

Проанализировав ситуацию, мы видим, что наиболее стабильным решением является использование V83.COMConnector. Это избавляет от необходимости «расставлять галочки» в свойствах сотен общих модулей типовой конфигурации и обеспечивает более высокую скорость работы. Если же вы ограничены использованием V83.Application, обязательно убедитесь, что в конфигурации 8.3 включена поддержка управляемых форм в толстом клиенте и у соответствующих модулей стоят флаги компиляции для толстого клиента.

← На главную