К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как получить данные из документа 1С

Способы получить данные из документа 1С: через интерфейс, запрос, код на встроенном языке, COM и веб-сервисы. Примеры кода, ошибки и проверка результата.

Данные документа в 1С — это реквизиты шапки (номер, дата, контрагент, организация), табличные части (товары, услуги) и связанные движения по регистрам. В зависимости от задачи их можно получить прямо в интерфейсе, через отчёт, запросом на языке 1С, программно из кода или из внешней системы. Каждый способ имеет свои ограничения по правам, скорости и рискам.

Главная ошибка новичков — пытаться читать данные напрямую из таблиц SQL-базы, минуя платформу. Это нарушает логику блокировок, обходит права доступа и может привести к чтению неактуальных данных. Правильный подход — всегда работать через объектную модель платформы или её штатные интерфейсы обмена.

Какие данные хранит документ и как к ним обращаться

Документ в 1С состоит из стандартных реквизитов (Ссылка, Номер, Дата, Проведен), реквизитов, заданных в конфигураторе (Контрагент, СуммаДокумента, Склад), и табличных частей (например, «Товары» с колонками Номенклатура, Количество, Цена). Кроме того, проведённый документ формирует движения — записи в регистрах накопления, сведений или бухгалтерии.

Обращение к данным всегда начинается со ссылки — уникального идентификатора объекта. По ссылке платформа находит нужную строку в таблице документа. Через точку от ссылки доступны значения реквизитов в режиме чтения: ДокументСсылка.Номер вернёт номер без загрузки всего объекта в память.

Табличные части через ссылку напрямую недоступны — для их чтения нужно либо получить объект целиком, либо выполнить запрос к виртуальной таблице табличной части. Движения документа читаются через наборы записей регистров с отбором по регистратору.

Получение данных через интерфейс без программирования

Если задача разовая — посмотреть или выгрузить данные нескольких документов — программировать не нужно. Откройте список документов нужного вида, настройте отбор по периоду, контрагенту или организации и выведите нужные колонки через меню «Ещё — Изменить форму» (в управляемых формах) или настройку списка.

Для выгрузки в Excel откройте документ, перейдите в табличную часть и используйте «Ещё — Вывести список» — платформа сформирует табличный документ, который сохраняется в форматах XLSX, CSV, PDF. То же работает для списка документов целиком.

Для сложных выборок используйте универсальный отчёт (в типовых конфигурациях: «Администрирование — Печатные формы, отчеты и обработки») или консоль отчетов СКД. Универсальный отчёт позволяет выбрать тип документа, реквизиты и табличную часть, наложить отборы и получить результат без единой строки кода.

Выгрузка табличной части документа в Excel
  1. 1
    Откройте документ в режиме просмотра
  2. 2
    Встаньте курсором в табличную часть (например, «Товары»)
  3. 3
    Нажмите «Ещё» — «Вывести список»
  4. 4
    Отметьте нужные колонки и подтвердите вывод
  5. 5
    Сохраните табличный документ: Файл — Сохранить как — формат XLSX или CSV

Получение данных запросом на языке 1С

Запрос — основной способ массового чтения данных документов. Он не загружает объекты в память, работает быстро и позволяет соединять таблицы. Запрос обращается к таблице документа по имени вида Документ.РеализацияТоваровУслуг, а к табличной части — Документ.РеализацияТоваровУслуг.Товары.

Типовой пример — выбрать проведённые документы за период с суммами и контрагентами:

bsl
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Реализация.Ссылка КАК Документ,
| Реализация.Номер,
| Реализация.Дата,
| Реализация.Контрагент,
| Реализация.СуммаДокумента
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
| Реализация.Дата МЕЖДУ &Начало И &Конец
| И Реализация.Проведен";
Запрос.УстановитьПараметр("Начало", НачалоМесяца(ТекущаяДата()));
Запрос.УстановитьПараметр("Конец", КонецМесяца(ТекущаяДата()));
Результат = Запрос.Выполнить().Выгрузить();

Для чтения табличной части обращайтесь к ней как к отдельной таблице с полем Ссылка, по которому можно соединиться с шапкой. Учтите: в запросе нельзя использовать точку для обхода реквизитов составного типа без приведения — используйте ВЫРАЗИТЬ(...) или соединение с таблицей справочника.

Проверка результата проста: количество строк в выборке должно совпадать с количеством документов в списке при тех же отборах. Если строк меньше — чаще всего причина в отборе по Проведен или в правах доступа на уровне записей (RLS).

Программное чтение через объект документа

Когда нужна полная структура документа — все реквизиты и табличные части — используют метод ПолучитьОбъект(). Он загружает документ из базы в память целиком, после чего доступны любые поля и коллекции:

bsl
ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
Сумма = ДокументОбъект.СуммаДокумента;
Для Каждого СтрокаТовара Из ДокументОбъект.Товары Цикл
 Сообщить(СтрокаТовара.Номенклатура);
КонецЦикла;

Этот способ удобен для обхода табличных частей и последующего изменения документа, но он медленнее запроса и требует больше памяти. Для массового чтения тысяч документов всегда предпочтительнее запрос. Объектный метод оправдан, когда нужно не только прочитать, но и изменить документ либо вызвать его прикладную логику.

Получение данных из внешних систем

Для интеграций платформа предлагает несколько штатных каналов. Выбор зависит от того, кто инициатор обмена и какая версия платформы используется.

Способы доступа извне

OData (REST)

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

HTTP-сервисы

Собственные точки доступа, создаваемые в конфигураторе. Гибкая логика и формат ответа, но требуют разработки. Подходят для нестандартных выборок.

COM-соединение

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

Web-сервисы (SOAP)

Классический вариант для корпоративных интеграций. Требует публикации и описания в конфигурации, сейчас чаще заменяется HTTP-сервисами.

При чтении через OData документ доступен по URL вида /odata/standard.odata/Document_РеализацияТоваровУслуг с фильтрами в query-параметрах. Аутентификация — по пользователю информационной базы, поэтому права на чтение документов должны быть выданы явно.

Чтение движений документа по регистрам

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

Программно движения читаются через набор записей регистра с установленным отбором по регистратору. В запросе удобнее обращаться к виртуальным таблицам регистров (Остатки, Обороты) с отбором по полю Регистратор — так можно получить, например, все проводки конкретного документа одним запросом к регистру бухгалтерии.

В интерфейсе движения видны прямо из формы документа: кнопка «Дт/Кт» для проводок и команда перехода к движениям по регистрам в меню «Ещё». Это самый быстрый способ проверить, что документ сформировал ожидаемые записи.

Контрольные точки

Как проверить результат

Количество строк выборки
Норма

Совпадает с числом документов в списке при тех же отборах

Тревожный признак

Строк меньше — проверьте отбор по Проведен и права RLS

Значения реквизитов
Норма

Совпадают с формой документа

Тревожный признак

Пустые значения при заполненных полях — нет прав на реквизит или объект

Движения документа
Норма

Наборы записей по регистрам не пусты для проведённого документа

Тревожный признак

Движений нет — документ не проведён или проведение отключено

Типичные ошибки и ограничения

Большинство проблем при получении данных из документов связано не с синтаксисом, а с контекстом выполнения: правами, транзакциями и выбором инструмента не под задачу.

Типичные ошибки
01
Чтение напрямую из SQL-таблиц — обход прав, риск получить незафиксированные данные и нарушить поддержку конфигурации
02
Использование ПолучитьОбъект() в цикле по тысячам документов — резкое падение производительности; для чтения нужен запрос
03
Обращение к несуществующей ссылке без проверки — ошибка «Объект не найден»; проверяйте через запрос или ПустаяСсылка()
04
Игнорирование RLS — выборка возвращает меньше строк, чем ожидалось, и это принимается за ошибку кода
05
Вызов Записать() в коде чтения — случайное изменение проведённых документов и пересчёт регистров

Отдельное ограничение — длинные транзакции. Массовое чтение объектов внутри одной транзакции удерживает блокировки и мешает работе пользователей. Для больших выгрузок разбивайте обработку на порции по периодам или по диапазонам ссылок.

Маршрут решения

Как выбрать способ

Нужно разово посмотреть или выгрузить несколько документовИспользуйте интерфейс: список, «Вывести список», универсальный отчёт
Нужна массовая выборка по многим документамПишите запрос к таблице документа и табличной части
Нужно прочитать и изменить конкретный документПолучите объект через ПолучитьОбъект(), работайте на копии базы
Данные нужны внешней системеНастройте OData для простого чтения или HTTP-сервис для нестандартной логики
Нужны проводки и остатки, а не реквизитыЧитайте виртуальные таблицы регистров с отбором по регистратору
Итог

Что важно запомнить

Данные документа получают через ссылку, запрос или объект — в зависимости от объёма и цели. Для чтения массовых данных используйте запросы, для изменения — объекты, для интеграций — OData или HTTP-сервисы. Никогда не читайте базу напрямую через SQL и не вызывайте Записать() в коде, предназначенном только для чтения.

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

Можно ли получить данные документа, не открывая базу 1С?

Да, если заранее настроен канал доступа: публикация OData или HTTP-сервиса на веб-сервере, либо COM-соединение с машины, где установлена платформа. Без настроенного интерфейса обмена внешний доступ невозможен — это осознанное ограничение безопасности.

Как получить данные удалённого документа?

Помеченный на удаление документ ещё физически существует, и запрос его вернёт, если не добавлен отбор по полю ПометкаУдаления. После штатного удаления через «Удаление помеченных объектов» данные восстановлению не подлежат — только из резервной копии.

Почему запрос возвращает меньше документов, чем видно в списке?

Чаще всего работает ограничение доступа на уровне записей (RLS): в запросе без ключевого слова РАЗРЕШЕННЫЕ платформа может вести себя иначе, чем в интерфейсе. Добавьте РАЗРЕШЕННЫЕ в текст запроса и сравните отборы — в списке могут быть скрытые отборы по организации или периоду.

Как выгрузить табличную часть сразу по многим документам?

Запросом к таблице вида Документ.ИмяДокумента.ИмяТабличнойЧасти с отбором Ссылка В (&СписокДокументов). Результат выгружается в таблицу значений, которую можно сохранить в Excel через табличный документ или передать во внешнюю систему.

Чем отличается чтение через ссылку от ПолучитьОбъект()?

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

Безопасно ли читать данные через COM из внешнего скрипта?

Само чтение безопасно, если код не вызывает методы записи и проведения. Риски — в правах пользователя подключения (выдавайте минимально необходимые) и в стабильности: оборванное COM-соединение может оставить зависший сеанс, поэтому предусматривайте освобождение соединения в коде.