Программирование в 1С

Как получить документ в 1С программно: ссылка, объект и запрос

Коротко

Чтобы получить документ 1С программно по номеру, используйте метод менеджера Документы.Имя.НайтиПоНомеру(Номер, ДатаИнтервала). Он вернёт ссылку на документ (или пустую ссылку, если не найден). Для документов с периодической нумерацией параметр ДатаИнтервала обязателен — без него поиск по номеру не сработает.

Если документ нужно только прочитать, достаточно ссылки (реквизиты доступны через точку или запросом). Если документ нужно изменить и записать — получите объект через Ссылка.ПолучитьОбъект(). Для отбора по нескольким реквизитам используйте запрос.

Получить документ по номеру: НайтиПоНомеру

Самый частый способ получить документ 1С программно — по номеру, методом менеджера НайтиПоНомеру(). Он возвращает ссылку на документ, а если документа нет — пустую ссылку:

Ссылка = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("00000001", ТекущаяДата());
Если НЕ Ссылка.Пустая() Тогда
    Сообщить("Нашли документ: " + Ссылка);
Иначе
    Сообщить("Документ с таким номером не найден");
КонецЕсли;
НайтиПоНомеру
НомерДокументачисло или строка — тип зависит от настройки нумерации
ДатаИнтерваладата из периода нумерации; обязательна при периодической нумерации
ДокументСсылка

Параметр ДатаИнтервала — ключевой нюанс. Если номера документов уникальны в пределах периода (год, месяц, день), метод должен знать, в каком именно интервале искать. Например, при годовой нумерации и дате 10.12.2026 поиск идёт среди документов за весь 2026 год. Без даты для такого документа НайтиПоНомеру() вернёт пустую ссылку, даже если номер существует.

Получить документ по ссылке: ПолучитьОбъект

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

ДокументОбъект = Ссылка.ПолучитьОбъект();
ДокументОбъект.Комментарий = "Проверено";
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
ПолучитьОбъект
вызывается у ДокументСсылка без параметров
ДокументОбъект

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

Получить реквизиты документа: через точку или запросом

Если нужно получить данные документа (дату, номер, контрагента, сумму), не обязательно получать объект. Для одного-двух реквизитов от ссылки можно обратиться через точку:

ДатаДокумента = Ссылка.Дата;
Контрагент    = Ссылка.Контрагент;

Но помните: обращение к реквизиту документа через точку от ссылки загружает объект целиком (со всеми табличными частями). Если нужно получить несколько реквизитов документа сразу — быстрее и правильнее сделать это запросом, который читает только нужные поля:

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

Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    Сообщить("Документ на сумму: " + Выборка.Сумма);
КонецЕсли;

Запрос выбирает из базы только перечисленные поля, не загружая табличные части. Это главный приём, когда нужно быстро получить реквизиты документа в 1С без лишней нагрузки.

Получить документ по реквизиту: НайтиПоРеквизиту

Найти документ по значению произвольного реквизита (например, по номеру входящего документа или внешнему идентификатору) помогает метод менеджера НайтиПоРеквизиту():

Ссылка = Документы.ПоступлениеТоваровУслуг.НайтиПоРеквизиту("ВходящийНомер", "ВН-100");
Если НЕ Ссылка.Пустая() Тогда
    Сообщить("Документ: " + Ссылка);
КонецЕсли;
НайтиПоРеквизиту
ИмяРеквизитаимя реквизита как в конфигураторе, верхний уровень
ЗначениеРеквизитаискомое значение
ДокументСсылка

НайтиПоРеквизиту() работает только с реквизитами верхнего уровня (не с табличными частями) и возвращает первый совпавший документ. Для отбора по нескольким условиям одним вызовом он не подходит — используйте запрос.

Получить документ запросом: несколько условий и отбор по реквизитам

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

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

Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    Ссылка = Выборка.Ссылка;
Иначе
    Ссылка = Документы.РеализацияТоваровУслуг.ПустаяСсылка();
КонецЕсли;

Такой запрос возвращает ссылку на документ, а не объект — этого достаточно для чтения и передачи дальше. Конструкция ВЫБРАТЬ ПЕРВЫЕ 1 не даёт лишней нагрузки, если под условие подходит много документов.

Ссылка, объект и выборка: чем отличаются

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

Правило простое: нужен один реквизит — запрос; нужно перебрать множество документов — выборка; нужно изменить документ и записать — объект.

Частые ошибки при получении документа в 1С

  • ПолучитьОбъект() ради чтения. Получать объект, чтобы просто прочитать реквизит, — лишняя нагрузка: грузятся все табличные части. Для чтения хватает ссылки или запроса.
  • НайтиПоНомеру() без даты для периодической нумерации. Если номера уникальны в пределах периода, без ДатаИнтервала метод вернёт пустую ссылку. Передавайте дату из нужного периода.
  • Получение документа в цикле через ПолучитьОбъект(). Вызов ПолучитьОбъект() внутри цикла по тысячам строк — источник тормозов. Читайте данные запросом, а объект получайте только там, где реально идёт запись.
  • Сравнение результата с Неопределено. НайтиПоНомеру() и НайтиПоРеквизиту() возвращают пустую ссылку, а не Неопределено. Проверяйте через .Пустая().
  • Обращение к реквизитам через точку в цикле. Каждое Ссылка.Реквизит в цикле — это скрытая загрузка объекта целиком. Соберите нужные поля одним запросом заранее.

Частые вопросы о получении документа в 1С

Как получить документ по номеру в 1С программно?

Методом менеджера Документы.Имя.НайтиПоНомеру(Номер, ДатаИнтервала). Для документов с периодической нумерацией дата интервала обязательна — она задаёт период, в котором ищется номер. Метод возвращает ссылку на документ или пустую ссылку.

Когда нужен ПолучитьОбъект, а когда достаточно ссылки?

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

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

Запросом, который выбирает только нужные поля по условию Документ.Ссылка = &Ссылка. Обращение к реквизитам через точку от ссылки загружает документ целиком, поэтому для нескольких реквизитов запрос быстрее.