Доступ к данным 1С:Предприятия снаружи и изнутри: ключи запуска, глобальный контекст, COM

· 9 мин

Содержание

К объектам и методам 1С 8.3 обращаются четырьмя путями. Пользователь — через командный интерфейс (разделы, панели, навигационные ссылки e1cib/...). Скрипт администратора — через ключи командной строки 1cv8.exe. Код внутри конфигурации — через менеджеры глобального контекста (Справочники, Документы, РегистрыСведений). Внешняя программа — через COM-соединение V83.COMConnector или веб-сервис.

Выбор простой. Нужно открыть форму или список — навигационная ссылка. Нужно ночью обновить базу или выгрузить .dt — пакетный запуск конфигуратора. Нужно из Excel, Python или другой базы прочитать справочник — COM-соединение. Ниже каждый путь разобран с синтаксисом, примерами и типичными сбоями.

Как устроен запуск и какие бывают режимы

У платформы несколько исполняемых файлов, и от выбора файла зависит, что вы сможете вызвать.

Файл / объектЧто запускаетГде доступен код
1cv8s.exe, 1cv8.exeСтартер и толстый клиент, конфигураторКлиент и сервер, обычное и управляемое приложение
1cv8c.exeТонкий клиентКлиентский код управляемых форм, сервер через вызовы
V83.COMConnectorВнешнее соединение без интерфейсаСерверный контекст и общие модули с флагом «Внешнее соединение»
V83.ApplicationСервер автоматизации — полноценный клиент с окномКлиентский и серверный контекст
Веб-клиентБраузер через публикацию на веб-сервереКлиентский код управляемых форм

Режимы работы первым параметром командной строки:

  • 🖥️ ENTERPRISE — пользовательский режим;
  • 🛠️ DESIGNER — конфигуратор, в том числе пакетный;
  • 🆕 CREATEINFOBASE — создание новой информационной базы.

Внешнее соединение отличается от остальных режимов главным: у него нет форм и клиентского контекста. Через него нельзя открыть форму документа или вызвать Предупреждение(). Зато можно читать и записывать данные, выполнять запросы и вызывать экспортные процедуры общих модулей.

Ключи командной строки 1cv8 для запуска и пакетных задач

Строка запуска собирается из режима, адреса базы, учётных данных и действий.

"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" ENTERPRISE /S "srv1c\buh" /N "Робот" /P "секрет" /C "ЗагрузкаКурсов" /DisableStartupMessages

Основные ключи:

КлючНазначение
/F "путь"Файловая база по каталогу
/S "сервер\база"Клиент-серверная база
/IBConnectionString "..."Полная строка соединения вместо /F и /S
/N, /PИмя пользователя и пароль 1С
/WA+, /WA-Включить или запретить вход по учётной записи Windows
/C "строка"Передать строку в программу, читается через ПараметрЗапуска
/Execute "файл.epf"Сразу после входа открыть внешнюю обработку
/Out "файл" -NoTruncateПисать служебные сообщения в файл, не очищая его
/DisableStartupMessagesНе показывать предупреждения при старте
/DisableStartupDialogsНе показывать диалоги выбора базы и авторизации
/UC "код"Код разрешения входа при установленной блокировке сеансов
/ClearCacheОчистить кэш клиента перед входом

Пакетные действия конфигуратора:

1cv8.exe DESIGNER /F "D:\Bases\Buh" /N "Админ" /P "" /DumpIB "D:\Backup\buh.dt" /Out "D:\Logs\dump.log" /DumpResult "D:\Logs\result.txt"
1cv8.exe DESIGNER /S "srv1c\buh" /N "Админ" /P "" /UpdateDBCfg /Out "D:\Logs\upd.log"
  • 💾 /DumpIB и /RestoreIB — выгрузка и загрузка .dt;
  • 📦 /DumpCfg и /LoadCfg — выгрузка и загрузка .cf;
  • 🔄 /UpdateDBCfg — обновление конфигурации базы данных.

/RestoreIB полностью заменяет данные базы содержимым файла, а /UpdateDBCfg при изменении структуры требует монопольного доступа. Запускайте их в нерабочее время, предварительно предупредив пользователей и установив блокировку сеансов: открытые сеансы оборвутся или не дадут выполнить операцию.

Передача параметра в программу через /C

Строка из /C попадает в свойство глобального контекста ПараметрЗапуска. Её обрабатывают в модуле приложения или в модуле управляемого приложения:

Процедура ПриНачалеРаботыСистемы()
    Если СтрНайти(ПараметрЗапуска, "ЗагрузкаКурсов") > 0 Тогда
        ОбщийМодульРегламент.ЗагрузитьКурсыНаСервере();
        ЗавершитьРаботуСистемы(Ложь);
    КонецЕсли;
КонецПроцедуры

Так из планировщика Windows запускают задачу, для которой не хочется писать регламентное задание. В типовых конфигурациях на БСП часть параметров /C уже занята (например, ЗапуститьОбновлениеИнформационнойБазы), поэтому свои ключевые слова выбирайте уникальные.

Программный вызов объектов через глобальный контекст

Внутри конфигурации к любому объекту метаданных обращаются через менеджер коллекции. Менеджеры доступны в серверном контексте и в толстом клиенте.

// Справочник
Номенклатура = Справочники.Номенклатура.НайтиПоКоду("00-00000123");

// Документ: новый объект
ДокОбъект = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();

// Константа
Валюта = Константы.ВалютаРегламентированногоУчета.Получить();

// Экспортная процедура общего модуля
ОбщийМодульРасчеты.ПересчитатьОстатки(Дата);

Имена объектов берутся из дерева конфигурации: открыть Конфигуратор → Конфигурация → Открыть конфигурацию и посмотреть имя (не синоним) в свойствах объекта.

Навигационные ссылки — обращение к объектам из командного интерфейса

Командный интерфейс управляемого приложения адресует формы и данные строками вида e1cib/.... Ссылку на открытую форму или элемент даёт команда «Получить ссылку» в заголовке окна, рядом с кнопкой «избранное».

  • 📋 e1cib/list/Документ.РеализацияТоваровУслуг — список документов;
  • 📄 e1cib/data/Справочник.Контрагенты?ref=... — конкретный элемент;
  • 🔗 ссылку можно вставить в окно «Перейти по ссылке» из главного меню или открыть кодом.
&НаКлиенте
Процедура ОткрытьРеализации(Команда)
    ПерейтиПоНавигационнойСсылке("e1cib/list/Документ.РеализацияТоваровУслуг");
    // или форма по полному имени
    ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаСписка");
КонецПроцедуры

Из объекта ссылку получают на сервере функцией ПолучитьНавигационнуюСсылку(Ссылка).

Сеанс и пользователь

Данные о текущем сеансе тоже берут из глобального контекста:

  • 👤 ИмяПользователя() и ПолноеИмяПользователя() — кто вошёл;
  • 🔢 НомерСеансаИнформационнойБазы() — номер текущего сеанса;
  • 📃 ПолучитьСеансыИнформационнойБазы() — массив всех сеансов базы (на сервере, нужны административные права);
  • 🧩 ПараметрыСеанса.ИмяПараметра — значения, которые конфигурация заполняет при входе.

Внешние источники данных

Если в конфигурации описан объект «Внешний источник данных», к таблицам сторонней СУБД обращаются тем же способом — через менеджер ВнешниеИсточникиДанных.ИмяИсточника и запросы. Перед первым чтением источник подключают кодом или вручную в режиме «Предприятие». Строку соединения ODBC храните в параметрах источника, а не в тексте модулей.

COM-соединение: доступ к 1С из Excel, Python и других баз

Внешнее соединение поднимает платформу внутри чужого процесса без окна. Его используют обмены «база — база», скрипты выгрузки и надстройки Excel.

Регистрация компоненты

COM-объект V83.COMConnector даёт библиотека comcntr.dll из каталога bin установленной платформы. Если при создании объекта ошибка «Недопустимая строка с указанием класса», компоненту регистрируют от имени администратора:

regsvr32 "C:\Program Files\1cv8\8.3.24.1548\bin\comcntr.dll"

Разрядность компоненты должна совпадать с разрядностью вызывающей программы. 32-битный Excel не увидит 64-битный comcntr.dll, и наоборот. После обновления платформы регистрацию повторяют для новой версии.

Подключение из 1С

Коннектор = Новый COMОбъект("V83.COMConnector");
Соединение = Коннектор.Connect("Srvr=""srv1c"";Ref=""buh"";Usr=""Робот"";Pwd=""секрет"";");
// для файловой базы: "File=""D:\Bases\Buh"";Usr=""Робот"";Pwd=""секрет"";"

Запрос = Соединение.NewObject("Запрос");
Запрос.Текст = "ВЫБРАТЬ Код, Наименование ИЗ Справочник.Номенклатура";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Сообщить(Выборка.Код + " " + Выборка.Наименование);
КонецЦикла;

После Connect объект соединения ведёт себя как глобальный контекст чужой базы: Соединение.Справочники.Номенклатура, Соединение.Константы, Соединение.ОбщийМодульОбмен.Метод(). Конструкторы вызываются через NewObject, а не Новый.

Подключение из Python

import win32com.client

connector = win32com.client.Dispatch("V83.COMConnector")
conn = connector.Connect('File="D:\\Bases\\Buh";Usr="Робот";Pwd="секрет";')

query = conn.NewObject("Запрос")
query.Text = "ВЫБРАТЬ Код, Наименование ИЗ Справочник.Номенклатура"
sel = query.Execute().Select()
while sel.Next():
    print(sel.Код, sel.Наименование)

Английские синонимы методов (Execute, Select, Next) работают всегда, русские имена реквизитов — тоже.

Что важно помнить про COM

  • 🐢 Каждое обращение к свойству чужого объекта — это межпроцессный вызов. Цикл по 100 000 элементов с чтением пяти реквизитов даст полмиллиона вызовов. Выгружайте данные одним запросом.
  • 📦 Ссылки и объекты чужой базы нельзя положить в свою базу напрямую. Передавайте строки, числа, даты или XML.
  • 🔒 Код через внешнее соединение видит только общие модули с флагом «Внешнее соединение» в свойствах модуля.
  • ♻️ Освобождайте соединение (Соединение = Неопределено), иначе сеанс висит и занимает лицензию.

V83.Application используют реже: он открывает настоящее окно клиента и позволяет показывать формы, но расходует больше памяти и требует интерактивного рабочего стола.

Обработка ошибок и запись результатов

Скрипт, который молча падает ночью, хуже, чем отсутствие скрипта. Логи нужны на трёх уровнях.

Уровень командной строки. Ключ /Out пишет служебные сообщения платформы, /DumpResult — код завершения пакетной операции конфигуратора: 0 при успехе, иное значение при ошибке. Bat-файл проверяет этот файл:

1cv8.exe DESIGNER /S "srv1c\buh" /N "Админ" /P "" /UpdateDBCfg /Out "D:\Logs\upd.log" /DumpResult "D:\Logs\res.txt"
set /p RES=<"D:\Logs\res.txt"
if not "%RES%"=="0" echo Обновление не выполнено, смотрите upd.log

Уровень кода. Опасные вызовы оборачивают в Попытка ... Исключение:

Попытка
    ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
    Инфо = ИнформацияОбОшибке();
    ЗаписьЖурналаРегистрации("Интеграция.ЗагрузкаДокументов",
        УровеньЖурналаРегистрации.Ошибка, , ,
        ПодробноеПредставлениеОшибки(Инфо));
    ВызватьИсключение;
КонецПопытки;
  • 📝 КраткоеПредставлениеОшибки() — для пользователя;
  • 🔍 ПодробноеПредставлениеОшибки() — со стеком вызовов, для журнала;
  • 📚 запись попадает в журнал регистрации: Администрирование → Обслуживание → Журнал регистрации, фильтр по имени события.

Уровень внешней программы. При COM-вызове исключение 1С приходит как COM-ошибка с текстом. В Python это pywintypes.com_error: ловите его и пишите текст в собственный лог, иначе потеряете описание.

Диагностика: выберите симптом

Права доступа и безопасность внешних вызовов

Под каким пользователем идёт вызов, такие права он и получает. Отдельного «технического» обхода прав нет.

Права, которые нужно выдать

  • 🔌 «Внешнее соединение» — для COM-подключения;
  • 💻 «Тонкий клиент», «Толстый клиент», «Веб-клиент» — для соответствующих режимов запуска;
  • 🧾 «Интерактивное открытие внешних отчетов и обработок» — для ключа /Execute с файлом .epf;
  • 🛠️ «Администрирование» — для пакетных операций конфигуратора и списка сеансов.

Права проверяют в коде функциями ПравоДоступа("Чтение", Метаданные.Справочники.Номенклатура) и РольДоступна("ПолныеПрава"). Привилегированный режим (УстановитьПривилегированныйРежим(Истина)) работает только на сервере и только в коде самой конфигурации.

Как не раздать лишнего

  1. Заведите для интеграции отдельного пользователя 1С с узкой ролью: только нужные объекты и «Внешнее соединение».
  2. Запретите этому пользователю интерактивный вход, если он нужен лишь для COM.
  3. Не держите пароль в открытом виде в bat-файле: параметры процесса с /P видны в диспетчере задач. Где можно — используйте /WA+ и учётную запись Windows, от имени которой работает задача планировщика.
  4. Ограничьте доступ к папке со скриптами и логами правами NTFS.
  5. Включите в типовой конфигурации защиту от опасных действий для внешних обработок, а не отключайте её ради удобства.

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

Безопасный режим

Внешние обработки, которые открываются через /Execute, выполняются с правами текущего пользователя. В конфигурациях на БСП к ним применяется механизм профилей безопасности: обработка без разрешений не сможет обращаться к файлам и сети. Код из сторонних источников запускайте только после просмотра в конфигураторе.

Частые вопросы

Можно ли через COM-соединение открыть форму документа?
Нет. Внешнее соединение работает без интерфейса. Для форм нужен сервер автоматизации V83.Application с видимым окном.
Занимает ли COM-соединение лицензию?
Да, каждое внешнее соединение — сеанс, которому нужна клиентская лицензия. Закрывайте соединение сразу после работы.
Как вызвать из внешней программы свою процедуру?
Поместите экспортную процедуру в общий модуль, включите у модуля флаг «Внешнее соединение» и вызовите Соединение.ИмяМодуля.ИмяПроцедуры().
Чем `/C` отличается от `/Execute`?
/C передаёт строку в конфигурацию, а что с ней делать, решает код модуля приложения. /Execute сразу открывает указанную внешнюю обработку.
Можно ли подключиться по COM к базе на Linux-сервере?
Сам кластер может работать на Linux. Вызывающая сторона должна быть Windows-машиной с установленной платформой нужной версии и зарегистрированным comcntr.dll.