Доступ к данным 1С:Предприятия снаружи и изнутри: ключи запуска, глобальный контекст, COM
Содержание
К объектам и методам 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С с узкой ролью: только нужные объекты и «Внешнее соединение».
- Запретите этому пользователю интерактивный вход, если он нужен лишь для COM.
- Не держите пароль в открытом виде в bat-файле: параметры процесса с
/Pвидны в диспетчере задач. Где можно — используйте/WA+и учётную запись Windows, от имени которой работает задача планировщика. - Ограничьте доступ к папке со скриптами и логами правами NTFS.
- Включите в типовой конфигурации защиту от опасных действий для внешних обработок, а не отключайте её ради удобства.
Пользователь интеграции — удобная метка в журнале регистрации. Отфильтровав по нему, вы за минуту увидите, что именно меняла внешняя программа.
Безопасный режим
Внешние обработки, которые открываются через /Execute, выполняются с правами текущего пользователя. В конфигурациях на БСП к ним применяется механизм профилей безопасности: обработка без разрешений не сможет обращаться к файлам и сети. Код из сторонних источников запускайте только после просмотра в конфигураторе.
Частые вопросы
Можно ли через COM-соединение открыть форму документа?
V83.Application с видимым окном.Занимает ли COM-соединение лицензию?
Как вызвать из внешней программы свою процедуру?
Соединение.ИмяМодуля.ИмяПроцедуры().Чем `/C` отличается от `/Execute`?
/C передаёт строку в конфигурацию, а что с ней делать, решает код модуля приложения. /Execute сразу открывает указанную внешнюю обработку.Можно ли подключиться по COM к базе на Linux-сервере?
comcntr.dll.