Как завершить работу V83.Application и правильно формировать отчеты через COM-соединение

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

Работа с внешними соединениями в 1С:Предприятие 8.3 через механизмы COM — это мощный инструмент для интеграции и автоматизации. Однако разработчики часто сталкиваются с тем, что после завершения работы программный процесс 1cv8.exe продолжает висеть в памяти, потребляя ресурсы сервера. Кроме того, при попытке сформировать отчеты в типовых конфигурациях, таких как ЗУП 3.0, через COM-соединение, результат часто оказывается пустым. В этой статье мы подробно разберем, как корректно управлять жизненным циклом COM-объекта и обеспечивать правильный вывод данных в сложных отчетах.

Различия между V83.Application и V83.COMConnector

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

  1. V83.Application: Это полноценный запуск клиента 1С. При таком подключении инициализируется модуль управляемого приложения, срабатывают обработчики ПриНачалеРаботыСистемы, могут открываться формы. Этот объект поддерживает визуальное отображение (свойство Visible).
  2. V83.COMConnector: Это облегченный вариант соединения. Он предназначен для выполнения серверного кода и обращения к данным без инициализации интерфейсной части. Он работает быстрее и потребляет меньше памяти.

Если ваша задача — программно сформировать отчет и сохранить его в файл, мы рекомендуем использовать COMConnector. Если же требуется интерактивное взаимодействие или использование методов, доступных только в клиенте (например, ОткрытьФорму), используется Application.

Проблема "зависших" процессов и завершение работы

Часто программисты пытаются закрыть соединение методами ЗавершитьРаботуСистемы() или Exit(), но процесс остается в диспетчере задач. Выясним причину: COM-объект удерживается в памяти до тех пор, пока на него существует хотя бы одна ссылка в вызывающей программе. Если вы создали переменную Соединение, а затем внутри него получили Форму или Запрос, то эти дочерние объекты также удерживают основное соединение.

Рассмотрим правильный алгоритм завершения работы для V83.Application:


// В вызывающей базе
Коннектор = Новый COMОбъект("V83.Application");
Коннектор.Connect(СтрокаПодключения);

// ... выполняем действия ...

// Попытка штатного завершения
Коннектор.Exit(Ложь); 

// КРИТИЧЕСКИ ВАЖНО: Обнуление всех ссылок
// Если были созданы промежуточные объекты (запросы, таблицы), 
// их тоже нужно приравнять к Неопределено
ФормаОтчета = Неопределено;
Коннектор = Неопределено;

Для COMConnector метод Exit() не существует. Достаточно просто обнулить переменную, содержащую объект соединения. Если процесс все равно не завершается, проверьте, не остались ли в области видимости другие переменные, ссылающиеся на объекты из внешней базы.

Настройка разрядности (32-бит против 64-бит)

Разберем ситуацию, когда при попытке создать COMОбъект возникает ошибка "Класс не зарегистрирован". Это часто случается на 64-разрядных серверах 1С. Проблема в том, что 64-битный процесс сервера не может напрямую вызвать 32-битную DLL библиотеку COM-соединения.

Рассмотрим пути решения:

  1. Использование 32-битного клиента: Если запуск происходит на локальной машине разработчика, убедитесь, что используется 32-битная версия платформы 1С.
  2. Настройка COM+ в Windows: Это более профессиональный метод для серверов. В консоли "Службы компонентов" (dcomcnfg) создается новое пустое приложение COM+. В него добавляется компонента v83.comconnector. В настройках приложения на вкладке "Активация" выбирается "Выделенный процесс". Это позволяет системе проксировать вызовы между процессами разной разрядности через механизм dllhost.exe.

Специфика формирования отчетов в ЗУП 3.0 через COM

Многие разработчики сталкиваются с тем, что отчет в 1С:Зарплата и Управление Персоналом, запущенный через COM, возвращает пустую таблицу, хотя в интерфейсе он работает корректно. Проанализируем причину. В современных конфигурациях на базе БСП (Библиотека стандартных подсистем), особенно в ЗУП, используется механизм динамического формирования текстов запросов СКД.

В схемах компоновки данных (СКД) часто встречаются временные таблицы-заглушки, такие как Представления_КадровыеДанныеСотрудников. Эти таблицы заполняются программно в модулях менеджеров отчетов непосредственно перед выводом. При вызове через COM этот механизм "магического" заполнения автоматически не срабатывает.

Рассмотрим, как правильно инициализировать отчет ЗУП через COM-соединение:


// Устанавливаем соединение через COMConnector
ОбъектКоннектор = Новый COMОбъект("V83.COMConnector");
Соединение = ОбъектКоннектор.Connect(ПараметрыПодключения);

// Получаем менеджер нужного отчета
ТекМенеджерОтчета = Соединение.Отчеты.ОдинИзТиповыхОтчетовЗУП;
ТекОтчет = ТекМенеджерОтчета.Создать();

// ГЛАВНЫЙ СЕКРЕТ: Вызов специального метода для инициализации источников данных
// Этот метод заменяет "заглушки" Представления_ на реальные запросы к базе
Соединение.ЗарплатаКадрыОбщиеНаборыДанных.ЗаполнитьОбщиеИсточникиДанныхОтчета(ТекОтчет);

// Загружаем настройки (например, из XML, подготовленного заранее)
ЧтениеXML = Соединение.NewObject("ЧтениеXML");
ЧтениеXML.ОткрытьФайл(ПутьКФайлуНастроек);
НастройкиКомпоновки = Соединение.СериализаторXDTO.ПрочитатьXML(ЧтениеXML);

// Далее стандартный цикл вывода СКД
Схема = ТекОтчет.СхемаКомпоновкиДанных;
КомпоновщикМакета = Соединение.NewObject("КомпоновщикМакетаКомпоновкиДанных");
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, НастройкиКомпоновки);

ПроцессорКомпоновки = Соединение.NewObject("ПроцессорКомпоновкиДанных");
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , , Истина);

ТабДок = Соединение.NewObject("ТабличныйДокумент");
ПроцессорВывода = Соединение.NewObject("ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент");
ПроцессорВывода.УстановитьДокумент(ТабДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

// Сохраняем результат
ТабДок.Записать("C:\Reports\Result.xls", Соединение.ТипФайлаТабличногоДокумента.XLS);

Резюме и практические советы

Для стабильной работы интеграции через COM мы рекомендуем соблюдать следующие правила:

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

← На главную