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