В практике администраторов и разработчиков 1С часто возникает задача массового изменения данных в нескольких распределенных или разрозненных базах. Типичный пример — необходимость деактивировать учетные записи уволенных сотрудников в десяти и более информационных базах одновременно. Рассмотрим подробнее, какими способами можно реализовать программный доступ к базе 1С и как заставить внешнюю систему выполнить требуемые действия.
Это классический метод, который позволяет одной базе 1С «управлять» другой. Существует два основных объекта для работы через COM: V83.COMConnector и V83.Application. Проанализируем их различия. COMConnector является более легковесным, так как он не запускает полноценное клиентское приложение с графическим интерфейсом, а устанавливает только соединение с сервером (или открывает файл базы). Это работает значительно быстрее и потребляет меньше ресурсов.
Разберем по шагам процесс подключения. Сначала нам необходимо создать объект коннектора, сформировать строку подключения и вызвать метод Connect. Посмотрим на пример функции, которая возвращает объект соединения:
Функция ИБОткрыть(ПараметрыБазы, Коннектор = Истина) Экспорт
Попытка
Если Коннектор Тогда
Соединение = Новый COMОбъект("V83.COMConnector");
Иначе
Соединение = Новый COMОбъект("V83.Application");
КонецЕсли;
// Формирование строки соединения для клиент-серверного варианта
// Srvr - адрес сервера, Ref - имя базы на сервере
СтрокаСоединения = "Srvr=""" + ПараметрыБазы.Сервер + """;Ref=""" + ПараметрыБазы.ИмяБазы + """;"
+ "Usr=""" + ПараметрыБазы.Пользователь + """;Pwd=""" + ПараметрыБазы.Пароль + """;";
База = Соединение.Connect(СтрокаСоединения);
Если Не Коннектор Тогда
База = Соединение;
КонецЕсли;
Возврат База;
Исключение
Сообщить("Ошибка подключения: " + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункции
После того как мы получили объект База, мы можем обращаться к метаданным удаленной системы так, будто работаем в текущей базе, но с префиксом объекта соединения. Например, чтобы найти сотрудника и установить ему признак Недействителен, мы будем использовать менеджеры справочников удаленной базы.
Рассмотрим пример кода, который ищет пользователя по наименованию и меняет его статус:
Процедура ДеактивироватьСотрудникаВУдаленнойБазе(Соединение, ФИО)
// Ищем пользователя в удаленной базе через менеджер справочника
УдаленныйПользователь = Соединение.Справочники.Пользователи.НайтиПоНаименованию(ФИО);
Если Не УдаленныйПользователь.Пустая() Тогда
// Получаем объект для редактирования
ОбъектПользователя = УдаленныйПользователь.ПолучитьОбъект();
// Устанавливаем признак недействительности
ОбъектПользователя.Недействителен = Истина;
// Отключаем проверки при записи, чтобы избежать конфликтов с бизнес-логикой
ОбъектПользователя.ОбменДанными.Загрузка = Истина;
ОбъектПользователя.Записать();
Сообщить("Сотрудник " + ФИО + " успешно деактивирован.");
Иначе
Сообщить("Сотрудник не найден в базе.");
КонецЕсли;
КонецПроцедуры
Важный нюанс: при работе через COMConnector все вызовы являются синхронными. Если удаленная база долго отвечает или возникла сетевая задержка, основная программа будет «висеть». Также помните, что каждое такое соединение расходует одну клиентскую лицензию 1С.
Выясним причину, почему в современных реалиях стоит предпочесть OData. Если ваши базы работают на платформе 8.3, вы можете включить автоматический REST-сервис. Это позволяет выполнять CRUD-операции (создание, чтение, обновление, удаление) через обычные HTTP-запросы без создания тяжелых COM-объектов.
Проанализируем алгоритм работы через OData:
HTTPСоединение для отправки PATCH или POST запросов.Этот метод гораздо безопаснее и стабильнее, так как он не зависит от разрядности операционной системы (32/64 bit), что часто является «головной болью» при настройке COM на стороне сервера.
Если стандартного интерфейса OData недостаточно (например, при записи сотрудника нужно выполнить сложную цепочку действий: уволить, закрыть доступы, отправить уведомление), рекомендуется создать собственный HTTP-сервис. Рассмотрим, как это работает. В конфигурации создается объект HTTP-сервис с определенным шаблоном URL. Внутри метода POST или GET вы пишете обычный код на языке 1С.
Преимущества данного подхода:
В ситуации, когда у вас много файловых баз (например, 200 штук), использование соединений может быть затруднительным. В этом случае эффективно использовать параметр запуска /Execute. Вы можете написать одну внешнюю обработку (файл .epf), которая в процедуре ПриОткрытии считывает параметры из текстового файла, выполняет деактивацию сотрудников и закрывает приложение командой ЗавершитьРаботуСистемы().
Скрипт запуска в простейшем виде будет выглядеть так:
1cv8.exe ENTERPRISE /F "ПутьКБазе" /N "Админ" /P "Пароль" /Execute "C:\Scripts\DeactivateUsers.epf"
Независимо от выбранного метода, проанализируем важные моменты, которые помогут избежать ошибок в промышленной эксплуатации:
Попытка...Исключение. Удаленная база может быть заблокирована для регламентных работ или обновлений.HTTPСоединение обязательно указывайте таймаут (например, 30-60 секунд). Это предотвратит «зависание» вызывающего потока.БезопасноеХранилищеДанных.Таким образом, для разовых или простых задач в Windows-среде вполне подходит COM-соединение. Однако для масштабируемых и современных систем наиболее правильным решением будет использование HTTP-сервисов или OData, которые обеспечивают высокую скорость и надежность обмена данными.