Как получить документ в 1С программно: ссылка, объект и запрос
Чтобы получить документ 1С программно по номеру, используйте метод менеджера
Документы.Имя.НайтиПоНомеру(Номер, ДатаИнтервала). Он вернёт
ссылку на документ (или пустую ссылку, если не найден). Для документов
с периодической нумерацией параметр ДатаИнтервала обязателен — без него
поиск по номеру не сработает.
Если документ нужно только прочитать, достаточно ссылки (реквизиты
доступны через точку или запросом). Если документ нужно изменить и записать —
получите объект через Ссылка.ПолучитьОбъект(). Для отбора по нескольким
реквизитам используйте запрос.
Получить документ по номеру: НайтиПоНомеру
Самый частый способ получить документ 1С программно — по номеру, методом менеджера
НайтиПоНомеру(). Он возвращает ссылку на документ, а если документа нет —
пустую ссылку:
Ссылка = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("00000001", ТекущаяДата());
Если НЕ Ссылка.Пустая() Тогда
Сообщить("Нашли документ: " + Ссылка);
Иначе
Сообщить("Документ с таким номером не найден");
КонецЕсли;
Параметр ДатаИнтервала — ключевой нюанс. Если номера документов уникальны
в пределах периода (год, месяц, день), метод должен знать, в каком именно интервале искать.
Например, при годовой нумерации и дате 10.12.2026 поиск идёт среди документов
за весь 2026 год. Без даты для такого документа НайтиПоНомеру() вернёт пустую
ссылку, даже если номер существует.
Получить документ по ссылке: ПолучитьОбъект
Когда ссылка на документ уже есть (получена из формы, реквизита, запроса), получить сам
документ для изменения помогает метод ПолучитьОбъект(). Он загружает объект
документа целиком и позволяет менять и записывать данные:
ДокументОбъект = Ссылка.ПолучитьОбъект();
ДокументОбъект.Комментарий = "Проверено";
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
ПолучитьОбъект() — это тяжёлая операция: она читает документ
вместе со всеми табличными частями. Получайте объект только когда действительно
нужно изменение и запись. Для простого чтения реквизитов объект не нужен —
достаточно ссылки или запроса.
Получить реквизиты документа: через точку или запросом
Если нужно получить данные документа (дату, номер, контрагента, сумму), не обязательно получать объект. Для одного-двух реквизитов от ссылки можно обратиться через точку:
ДатаДокумента = Ссылка.Дата;
Контрагент = Ссылка.Контрагент;
Но помните: обращение к реквизиту документа через точку от ссылки загружает объект целиком (со всеми табличными частями). Если нужно получить несколько реквизитов документа сразу — быстрее и правильнее сделать это запросом, который читает только нужные поля:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслуг.Номер КАК Номер,
| РеализацияТоваровУслуг.Дата КАК Дата,
| РеализацияТоваровУслуг.Контрагент КАК Контрагент,
| РеализацияТоваровУслуг.СуммаДокумента КАК Сумма
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Сообщить("Документ на сумму: " + Выборка.Сумма);
КонецЕсли;
Запрос выбирает из базы только перечисленные поля, не загружая табличные части. Это главный приём, когда нужно быстро получить реквизиты документа в 1С без лишней нагрузки.
Получить документ по реквизиту: НайтиПоРеквизиту
Найти документ по значению произвольного реквизита (например, по номеру входящего документа
или внешнему идентификатору) помогает метод менеджера НайтиПоРеквизиту():
Ссылка = Документы.ПоступлениеТоваровУслуг.НайтиПоРеквизиту("ВходящийНомер", "ВН-100");
Если НЕ Ссылка.Пустая() Тогда
Сообщить("Документ: " + Ссылка);
КонецЕсли;
НайтиПоРеквизиту() работает только с реквизитами верхнего уровня
(не с табличными частями) и возвращает первый совпавший документ. Для отбора
по нескольким условиям одним вызовом он не подходит — используйте запрос.
Получить документ запросом: несколько условий и отбор по реквизитам
Когда документ нужно получить по нескольким условиям (период + контрагент, номер + организация) или без привязки к периоду нумерации, надёжнее всего запрос. Он же — самый быстрый способ получить документ запросом по реквизитам:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| РеализацияТоваровУслуг.Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &КонецПериода
| И РеализацияТоваровУслуг.Контрагент = &Контрагент";
Запрос.УстановитьПараметр("НачалоПериода", НачалоГода(ТекущаяДата()));
Запрос.УстановитьПараметр("КонецПериода", КонецГода(ТекущаяДата()));
Запрос.УстановитьПараметр("Контрагент", КонтрагентСсылка);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Ссылка = Выборка.Ссылка;
Иначе
Ссылка = Документы.РеализацияТоваровУслуг.ПустаяСсылка();
КонецЕсли;
Такой запрос возвращает ссылку на документ, а не объект — этого достаточно
для чтения и передачи дальше. Конструкция ВЫБРАТЬ ПЕРВЫЕ 1 не даёт лишней
нагрузки, если под условие подходит много документов.
Ссылка, объект и выборка: чем отличаются
-
Ссылка (
ДокументСсылка) — лёгкий идентификатор документа «только для чтения». Её возвращаютНайтиПоНомеру(),НайтиПоРеквизиту()и запрос. Достаточна, чтобы получить документ для чтения. -
Объект (
ДокументОбъект) — полная загрузка документа для изменения и записи. Получается черезСсылка.ПолучитьОбъект(). Тяжёлый — берите только под запись. -
Выборка (
ДокументВыборка) — для перебора многих документов порциями (через запрос илиДокументы.Имя.Выбрать()). Не грузит всё в память, подходит для больших объёмов.
Правило простое: нужен один реквизит — запрос; нужно перебрать множество документов — выборка; нужно изменить документ и записать — объект.
Частые ошибки при получении документа в 1С
- ПолучитьОбъект() ради чтения. Получать объект, чтобы просто прочитать реквизит, — лишняя нагрузка: грузятся все табличные части. Для чтения хватает ссылки или запроса.
-
НайтиПоНомеру() без даты для периодической нумерации. Если номера уникальны
в пределах периода, без
ДатаИнтерваламетод вернёт пустую ссылку. Передавайте дату из нужного периода. -
Получение документа в цикле через ПолучитьОбъект(). Вызов
ПолучитьОбъект()внутри цикла по тысячам строк — источник тормозов. Читайте данные запросом, а объект получайте только там, где реально идёт запись. -
Сравнение результата с Неопределено.
НайтиПоНомеру()иНайтиПоРеквизиту()возвращают пустую ссылку, а неНеопределено. Проверяйте через.Пустая(). -
Обращение к реквизитам через точку в цикле. Каждое
Ссылка.Реквизитв цикле — это скрытая загрузка объекта целиком. Соберите нужные поля одним запросом заранее.
Частые вопросы о получении документа в 1С
Как получить документ по номеру в 1С программно?
Методом менеджера Документы.Имя.НайтиПоНомеру(Номер, ДатаИнтервала). Для
документов с периодической нумерацией дата интервала обязательна — она задаёт период,
в котором ищется номер. Метод возвращает ссылку на документ или пустую ссылку.
Когда нужен ПолучитьОбъект, а когда достаточно ссылки?
Ссылки достаточно для чтения данных документа. ПолучитьОбъект() нужен только
для изменения и записи документа — это тяжёлая операция, загружающая объект целиком, поэтому
ради чтения её вызывать не стоит.
Как получить реквизиты документа без лишней нагрузки?
Запросом, который выбирает только нужные поля по условию
Документ.Ссылка = &Ссылка. Обращение к реквизитам через точку от ссылки
загружает документ целиком, поэтому для нескольких реквизитов запрос быстрее.