Разработка и Конфигурация · 10 мин
Как получить документ 1С программно
Способы программного получения документа в 1С: по ссылке, по номеру, через запрос, COM и OData. Примеры кода, проверка результата, типичные ошибки и FAQ.
Получить документ 1С программно — значит обратиться к объекту информационной базы из кода: найти нужный документ, прочитать его реквизиты и табличные части, при необходимости изменить и записать. В зависимости от задачи используются разные механизмы: методы языка 1С (НайтиПоНомеру, ПолучитьОбъект), запросы на встроенном языке, а также внешние каналы доступа — COM-соединение, HTTP-сервисы и стандартный интерфейс OData.
Выбор способа зависит от того, где выполняется код (внутри той же базы или извне), что известно о документе (ссылка, номер, дата, только условия отбора) и нужно ли документ менять или достаточно прочитать данные. Неправильный выбор приводит к лишней нагрузке на базу, блокировкам или ошибкам вида «Объект не найден».
Какие способы получения документа существуют
Все способы делятся на две группы. Первая — работа внутри информационной базы на встроенном языке: это типовой сценарий для обработок, расширений и доработок конфигурации. Вторая — доступ извне: из другой базы 1С, из сторонней системы или скрипта.
Сравнение вариантов
Быстрый поиск по номеру и дате внутри базы. Не подходит, если номер неизвестен или не уникален в периоде.
Гибкий поиск по любым реквизитам, возвращает ссылки и данные без чтения объектов. Требует аккуратности с индексами.
Доступ из другой базы 1С или внешнего приложения на Windows. Тяжеловесен, требует совместимости версий платформы.
Стандартный REST-доступ к данным через HTTP. Нужна публикация на веб-сервере и настройка прав.
Собственный API с полным контролем логики. Требует разработки и поддержки.
Для большинства задач внутри базы достаточно первых двух вариантов. Внешние каналы оправданы при интеграциях: обмен с сайтом, CRM, складской системой.
Получение документа по ссылке и по номеру
Если ссылка на документ уже известна (например, передана как параметр в обработку или хранится в другом объекте), данные реквизитов доступны напрямую через точку — платформа сама прочитает их из базы. Объект при этом не создаётся:
СуммаДокумента = СсылкаНаДокумент.СуммаДокумента;
Когда известны номер и дата, используется метод НайтиПоНомеру. Важно передавать дату, потому что нумерация документов обычно периодическая — один и тот же номер встречается в разных периодах:
Ссылка = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("0000-000125", Дата(2026, 3, 15));
Если Ссылка.Пустая() Тогда
Сообщить("Документ не найден");
Иначе
ДокументОбъект = Ссылка.ПолучитьОбъект();
КонецЕсли;
Поиск документа запросом по произвольным условиям
Запрос — основной инструмент, когда документ нужно найти по контрагенту, складу, сумме, комментарию или комбинации условий. Запрос возвращает выборку со ссылками и нужными полями, не загружая объекты:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Реализация.Ссылка КАК Ссылка,
| Реализация.СуммаДокумента КАК Сумма
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
| Реализация.Контрагент = &Контрагент
| И Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода
| И Реализация.Проведен";
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекущаяДата()));
Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(ТекущаяДата()));
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
НайденнаяСсылка = Выборка.Ссылка;
КонецЕсли;
Всегда передавайте значения через параметры, а не конкатенацией строк — это защищает от ошибок синтаксиса и упрощает поддержку. Для отборов по реквизитам, по которым часто ищут, проверьте индексирование: поиск по неиндексированному полю в большой таблице выполняется полным сканированием.
- 1Определите, по каким реквизитам будете искать документ
- 2Составьте текст запроса с отбором и параметрами
- 3Ограничьте результат: ПЕРВЫЕ 1 или отбор по периоду
- 4Выполните запрос и проверьте, что выборка не пустая
- 5Получите объект через Ссылка.ПолучитьОбъект(), только если нужны изменения
Чтение и изменение найденного документа
После того как ссылка найдена, типовой сценарий изменения выглядит так: получить объект, изменить реквизиты или табличную часть, записать. Режим записи важен: Записать() сохраняет без проведения, а для проведения используется РежимЗаписиДокумента.Проведение:
ДокументОбъект = НайденнаяСсылка.ПолучитьОбъект();
ДокументОбъект.Комментарий = "Скорректировано обработкой";
Для Каждого СтрокаТовара Из ДокументОбъект.Товары Цикл
СтрокаТовара.Цена = СтрокаТовара.Цена * 1.1;
КонецЦикла;
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
При записи из кода срабатывают все подписки на события и обработчики проведения, как при ручном проведении. Если обработчик вызывает интерактивные команды (например, Предупреждение или Вопрос), в фоновом задании или на сервере без клиента это приведёт к ошибке — учитывайте контекст выполнения.
Получение документа из другой базы или внешней системы
Через COM-соединение
COM-подключение применяется для связи двух баз 1С. В подключённой базе доступны те же методы — НайтиПоНомеру, запросы, ПолучитьОбъект. Учтите, что ссылка, полученная через COM, «живёт» только внутри соединения; для хранения в своей базе сохраняйте строковое представление УникальныйИдентификатор и восстанавливайте ссылку через ПолучитьСсылку(Новый УникальныйИдентификатор(Строка)).
Через OData
Стандартный интерфейс OData публикуется на веб-сервере и позволяет читать и изменять документы по HTTP без кода на стороне 1С. Документ адресуется по ключу вида Document_РеализацияТоваровУслуг(guid'...'). Доступ регулируется правами пользователя, под которым выполняется аутентификация, — не публикуйте интерфейс без ограничения прав.
Через собственный HTTP-сервис
Если стандартного OData недостаточно (нужна своя логика, агрегация, нестандартный формат), создаётся HTTP-сервис в конфигурации. Внутри обработчика используются те же методы поиска, описанные выше, а наружу отдаётся JSON или XML. Это самый управляемый, но и самый трудоёмкий вариант.
Как выбрать способ
Проверка результата и типичные ошибки
Любой программный поиск должен завершаться проверкой: найден ли документ, тот ли это документ, в нужном ли он состоянии. Ссылку проверяют методом Пустая(), состояние — реквизитами Проведен и ПометкаУдаления.
Как проверить результат
Ссылка.Пустая() возвращает Ложь
Пустая ссылка — документ не найден, условия неверны
Проведен и ПометкаУдаления соответствуют ожиданию
Документ помечен на удаление или не проведён
После записи реквизиты и движения обновились, ошибок нет
Исключение при записи, движения не сформировались
Если документ не находится, хотя виден в интерфейсе, проверьте права пользователя, под которым выполняется код: ограничение доступа на уровне записей (RLS) фильтрует данные незаметно для разработчика. Вторая частая причина — поиск в неправильном периоде или по номеру с другим префиксом.
Что важно запомнить
Внутри базы документ ищут по ссылке, номеру с датой или запросом; объект получают только для изменения. Извне используют COM, OData или HTTP-сервис. Всегда проверяйте результат поиска и тестируйте массовые изменения на копии базы.
Частые вопросы
Как получить документ, если известен только его уникальный идентификатор?
Используйте метод ПолучитьСсылку менеджера документа: Документы.ИмяДокумента.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаGUID)). Затем проверьте, что объект существует в базе, — например, запросом по ссылке, так как ПолучитьСсылку не проверяет наличие объекта.
Чем отличается ссылка на документ от объекта документа?
Ссылка — это лёгкий указатель на запись в базе, через неё доступны реквизиты для чтения. Объект — полная копия документа в памяти, которую можно изменять и записывать. Создание объекта требует ресурсов, поэтому без необходимости его не вызывают.
Можно ли получить документ из базы, где он помечен на удаление?
Да, поиск по номеру и запросы находят помеченные документы, если явно не добавить отбор ПометкаУдаления = Ложь. В прикладной логике такие документы обычно исключают, чтобы не обрабатывать «мусор».
Как массово получить все документы за период?
Составьте запрос к таблице документа с отбором Дата МЕЖДУ &Начало И &Конец и обработайте выборку в цикле. Для чтения данных работайте с полями выборки; ПолучитьОбъект() вызывайте только для тех документов, которые реально нужно изменить.
Почему запрос не находит документ, который виден в списке?
Чаще всего срабатывает ограничение доступа на уровне записей для текущего пользователя либо неверно заданы параметры отбора — например, дата передана без времени, и граничные документы выпадают из интервала. Проверьте запрос в консоли запросов под тем же пользователем.
Как безопасно протестировать обработку, изменяющую документы?
Сделайте копию рабочей базы или используйте тестовую базу, запустите обработку там, сверьте результат по нескольким документам вручную. Только после успешной проверки и при наличии свежей резервной копии запускайте обработку в рабочей базе.