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

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

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

Как в модуле менеджера документа 1С получить ссылку: НайтиПоНомеру, запрос, ПолучитьСсылку по УИД. Примеры кода, типичные ошибки и ответы на вопросы.

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

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

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

Как устроен модуль менеджера и что там можно вызывать

Модуль менеджера открывается из конфигуратора: в дереве объектов найдите нужный документ, откройте контекстное меню и выберите «Модули» → «Модуль менеджера». Все процедуры и функции в нём выполняются на сервере, поэтому здесь недоступны интерактивные вызовы — предупреждения, вопросы пользователю, открытие форм.

Директивы компиляции в модуле менеджера не используются — весь код неявно серверный. Экспортные процедуры и функции модуля менеджера доступны извне через точку: Документы.РеализацияТоваровУслуг.ИмяФункции(Параметры). Это удобный способ инкапсулировать логику поиска ссылок в одном месте.

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

Получение ссылки по номеру и дате через НайтиПоНомеру

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

Функция НайтиРеализациюПоНомеру(НомерДокумента, ДатаДокумента) Экспорт

НайденнаяСсылка = Документы.РеализацияТоваровУслуг.НайтиПоНомеру(НомерДокумента, ДатаДокумента);

Если НайденнаяСсылка.Пустая() Тогда

Возврат Неопределено;

КонецЕсли;

Возврат НайденнаяСсылка;

КонецФункции

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

Метод НайтиПоНомеру не находит помеченные на удаление документы? Нет — находит и их тоже. Пометка удаления не мешает поиску, поэтому после получения ссылки стоит проверить реквизит ПометкаУдаления, если логика требует работать только с активными документами.

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

Когда номер неизвестен или нужно искать по произвольным условиям — организации, контрагенту, сумме, комментарию — используется запрос к таблице документа. Запрос возвращает поле Ссылка, которое и является искомой ссылкой.

Функция НайтиРеализациюПоКонтрагенту(Контрагент, НачалоПериода, КонецПериода) Экспорт

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ ПЕРВЫЕ 1

| Реализация.Ссылка КАК Ссылка

|ИЗ

| Документ.РеализацияТоваровУслуг КАК Реализация

|ГДЕ

| Реализация.Контрагент = &Контрагент

| И Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода

| И НЕ Реализация.ПометкаУдаления

|УПОРЯДОЧИТЬ ПО

| Реализация.Дата УБЫВ";

Запрос.УстановитьПараметр("Контрагент", Контрагент);

Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);

Запрос.УстановитьПараметр("КонецПериода", КонецПериода);

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда

Возврат Выборка.Ссылка;

КонецЕсли;

Возврат Неопределено;

КонецФункции

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

Для массового поиска (например, получить ссылки на все проведённые документы за месяц) используйте Выгрузить() вместо Выбрать() и работайте с колонкой «Ссылка» таблицы значений — так меньше обращений к базе.

bsl
СсылкаНаДокумент = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("000000012", Дата(2026, 6, 15));
Если СсылкаНаДокумент.Пустая() Тогда
    ВызватьИсключение "Документ не найден";
КонецЕсли;

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

Если известен уникальный идентификатор документа (например, он пришёл из внешней системы, из плана обмена или был сохранён ранее), ссылку получают методом ПолучитьСсылку:

Функция СсылкаПоУИД(СтрокаУИД) Экспорт

УИД = Новый УникальныйИдентификатор(СтрокаУИД);

Возврат Документы.РеализацияТоваровУслуг.ПолучитьСсылку(УИД);

КонецФункции

Здесь есть тонкость: ПолучитьСсылку всегда возвращает непустую ссылку, даже если документа с таким идентификатором в базе нет. Это «битая ссылка» — она выглядит корректно, но данных за ней не существует. Поэтому проверка Пустая() здесь бесполезна.

Для проверки существования документа используйте запрос по ссылке или попытку обращения к реквизиту внутри попытки. Простой способ — запрос:

Функция ДокументСуществует(Ссылка) Экспорт

Запрос = Новый Запрос(

"ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА

|ИЗ Документ.РеализацияТоваровУслуг КАК Д

|ГДЕ Д.Ссылка = &Ссылка");

Запрос.УстановитьПараметр("Ссылка", Ссылка);

Возврат Не Запрос.Выполнить().Пустой();

КонецФункции

Создание нового документа и получение его ссылки

Если документа ещё нет и его нужно создать из модуля менеджера, используется связка СоздатьДокумент() → заполнение → Записать() → чтение свойства Ссылка:

Функция СоздатьРеализацию(Организация, Контрагент) Экспорт

НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();

НовыйДокумент.Дата = ТекущаяДатаСеанса();

НовыйДокумент.Организация = Организация;

НовыйДокумент.Контрагент = Контрагент;

НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);

Возврат НовыйДокумент.Ссылка;

КонецФункции

До вызова Записать() свойство Ссылка у нового объекта содержит пустую ссылку. Записывайте документ до того, как возвращаете ссылку вызывающему коду, иначе получатель не сможет с ней работать.

Если документ создаётся в транзакции и транзакция может быть отменена, не передавайте ссылку наружу до фиксации — после отката она станет битой.

Порядок действий
  1. 1
    Откройте модуль менеджера документа в конфигураторе
  2. 2
    Добавьте экспортную функцию с параметрами поиска (номер и дата или УИД)
  3. 3
    Используйте НайтиПоНомеру, запрос или ПолучитьСсылку в зависимости от входных данных
  4. 4
    Проверьте результат: Пустая() для поиска, запрос существования — для ПолучитьСсылку
  5. 5
    Верните ссылку или Неопределено при отсутствии документа
  6. 6
    Проверьте вызов функции из внешнего кода: Документы.ИмяДокумента.ИмяФункции()

Проверка результата и типичные ошибки

Главная ошибка — использование ссылки без проверки. Если НайтиПоНомеру вернул пустую ссылку, а код дальше обращается к реквизитам (Ссылка.Контрагент), произойдёт ошибка обращения к полю через пустую ссылку. Минимальная защита — проверка Пустая() сразу после поиска.

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

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

Типичные ошибки
01
Обращение к реквизитам без проверки Пустая() — ошибка исполнения при отсутствии документа
02
Поиск по номеру без даты или с датой другого периода нумерации — документ не находится
03
Передача числа вместо строки номера без лидирующих нулей — поиск не срабатывает
04
Считать, что ПолучитьСсылку проверяет существование — получение битой ссылки
05
Вызов ПолучитьОбъект() только для чтения реквизитов — лишняя нагрузка вместо чтения через ссылку или запрос

Выбор способа в зависимости от задачи

Единого «правильного» метода нет — выбор зависит от того, что известно о документе и что нужно сделать дальше. Сводная логика выбора приведена ниже.

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

Как выбрать действие

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

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

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

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

Чем ссылка отличается от объекта документа?

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

Почему НайтиПоНомеру возвращает пустую ссылку, хотя документ есть в списке?

Чаще всего причина в несовпадении формата номера (лидирующие нули) или в дате, попадающей в другой период нумерации. Сравните передаваемый номер посимвольно с номером в списке и убедитесь, что дата относится к тому же году, что и документ.

Можно ли получить ссылку на документ другого вида из модуля менеджера?

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

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

Надёжного способа нет — представление документа не уникально. Из строки вида «Реализация 000000012 от 15.06.2026» можно извлечь номер и дату разбором строки, а затем использовать НайтиПоНомеру. Но лучше передавать между системами уникальный идентификатор, а не представление.

Нужно ли проверять ссылку, полученную из параметра процедуры?

Да, если параметр приходит извне (из формы, фонового задания, веб-сервиса). Минимальная проверка — на пустоту и на тип значения. Для ссылок, полученных из внешних систем по УИД, дополнительно проверяйте существование документа запросом.

Что быстрее: НайтиПоНомеру или запрос?

При поиске по номеру НайтиПоНомеру обычно эффективнее, так как использует индекс по номеру и дате. Запрос оправдан, когда условия поиска выходят за рамки номера и даты или нужно выбрать сразу несколько документов с дополнительными полями.