Разработка и Конфигурация · 10 мин
Как обратиться к менеджеру документа в 1С
Как получить менеджер документа в 1С через Документы.ИмяДокумента, какие методы доступны, как создать, найти и изменить документ из кода. Примеры и ошибки.
Менеджер документа — это объект встроенного языка 1С, через который выполняются все операции с документами конкретного вида: создание, поиск, получение ссылки, выборка и проверка заполнения. Обратиться к нему можно только через коллекцию менеджеров Документы, указав имя документа так, как оно задано в конфигураторе. Понимание того, как работает этот механизм, необходимо для любой программной обработки документов — от простого создания до пакетного перепроведения.
Типичная ошибка начинающих разработчиков — путать менеджер документа, ссылку на документ и объект документа. Это три разных сущности: менеджер — «завод» по производству и поиску, ссылка — лёгкий указатель на запись в базе, объект — полноценная структура данных, которую можно менять и записывать. Ниже разберём, как получить менеджер, какие методы он предоставляет и как не допустить типовых ошибок.
Что такое менеджер документа и зачем он нужен
Менеджер документа — это объект типа ДокументМенеджер.<ИмяДокумента>, который платформа создаёт автоматически для каждого вида документов, определённого в конфигурации. Сам менеджер не хранит данные конкретного документа: он предоставляет методы для работы со всей совокупностью документов данного вида.
Через менеджер выполняются операции, не привязанные к одному конкретному экземпляру: создание нового документа, поиск по номеру или реквизиту, получение ссылки по GUID, формирование выборки по периоду, получение пустой ссылки. Если же нужно изменить табличную часть конкретного документа, сначала через менеджер или по ссылке получают объект, а уже затем работают с его данными.
Базовый синтаксис обращения
Обращение к менеджеру выполняется через глобальный контекст Документы с указанием имени документа из дерева метаданных:
МенеджерДокумента = Документы.РеализацияТоваровУслуг;
Имя должно точно совпадать с именем объекта в конфигураторе, включая регистр букв не обязательно, но написание — строго. Если документа с таким именем нет в конфигурации, возникнет ошибка времени выполнения «Переменная не определена» или обращение к несуществующему свойству. Поэтому при написании универсальных обработок имя документа часто передают строкой и обращаются через квадратные скобки:
ИмяДокумента = "ПоступлениеТоваровУслуг";
МенеджерДокумента = Документы[ИмяДокумента];
Такой способ незаменим в универсальных обработках, где вид документа выбирает пользователь. Перед обращением стоит проверить существование вида через Метаданные.Документы.Найти(ИмяДокумента) — это защитит код от падения при переносе в другую конфигурацию.
Создание документа через менеджер
Метод СоздатьДокумент() возвращает новый объект типа ДокументОбъект, который ещё не записан в базу. После заполнения реквизитов и табличных частей документ нужно записать явно:
НовыйДок = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
НовыйДок.Дата = ТекущаяДатаСеанса();
НовыйДок.Организация = Организация;
НовыйДок.Заполнить(Основание);
НовыйДок.Записать(РежимЗаписиДокумента.Проведение);
Обратите внимание: до вызова Записать() документ существует только в памяти, у него нет ни номера, ни ссылки в базе. Если нужно получить ссылку заранее (например, чтобы указать её в другом объекте до записи), используют связку ПолучитьСсылку() менеджера и УстановитьСсылкуНового() объекта.
- 1Получите менеджер: Документы.ИмяДокумента
- 2Вызовите СоздатьДокумент() и заполните реквизиты
- 3Заполните табличные части через Добавить()
- 4Вызовите Записать() с нужным режимом
- 5Проверьте результат: ссылка заполнена, документ доступен в списке
Поиск и получение существующих документов
Поиск по номеру
Метод НайтиПоНомеру(Номер, Дата) возвращает ссылку на документ с указанным номером. Второй параметр — дата, в пределах периода уникальности которой ведётся нумерация. Если номера уникальны в пределах года, поиск без даты может вернуть не тот документ или не найти его вовсе.
НайденнаяСсылка = Документы.СчетФактура.НайтиПоНомеру("00000125", Дата(2026, 3, 15));
Если НайденнаяСсылка.Пустая() Тогда
// документ не найден
КонецЕсли;
Получение ссылки по уникальному идентификатору
Метод ПолучитьСсылку() с параметром типа УникальныйИдентификатор возвращает ссылку по GUID. Это основной способ обмена между базами: GUID хранится в строковом виде и восстанавливается через конструктор Новый УникальныйИдентификатор(СтрокаGUID).
Выборка документов
Метод Выбрать() возвращает выборку для перебора документов за период. Для больших объёмов данных выборка уступает запросу по скорости и гибкости, поэтому для анализа и отборов по реквизитам предпочтителен запрос, а выборку используют, когда нужен именно последовательный обход с получением объектов.
Способы получения документов
Быстрый поиск одного документа по номеру. Требует указания даты периода нумерации, не ищет по другим реквизитам.
Идеален для обмена между базами. Не проверяет фактическое существование документа — ссылка может быть «битой».
Перебор документов за период. Медленнее запроса на больших объёмах, не поддерживает сложные отборы.
Гибкие отборы по любым реквизитам, соединения с другими таблицами. Возвращает ссылки, для изменения нужен ПолучитьОбъект().
Различие ссылки, объекта и менеджера
Ключевой момент, который нужно усвоить: менеджер возвращает либо ссылки, либо объекты, и это принципиально разные вещи. Ссылка (ДокументСсылка) — это только идентификатор плюс доступ к реквизитам «шапки» на чтение. Попытка обратиться к табличной части через ссылку вызовет ошибку.
Объект (ДокументОбъект) получают вызовом Ссылка.ПолучитьОбъект(). Объект загружает все данные документа в память, позволяет их менять и записывать. Цена этого — производительность: получение объекта блокирует запись и тяжелее чтения через ссылку или запрос. Поэтому правило простое: если нужно только прочитать данные — работайте через ссылку или запрос, если нужно изменить — получайте объект.
Типичные ошибки при работе с менеджером документа
Большинство проблем при обращении к менеджеру документа связаны не с синтаксисом, а с контекстом выполнения и непониманием модели данных. Разберём самые частые.
Отдельно стоит сказать про контекст выполнения. В управляемом приложении коллекция Документы недоступна в клиентских процедурах формы. Код создания или поиска документов размещают в серверных процедурах общих модулей или в процедурах с директивой &НаСервере, а на клиент передают только результат — ссылку или структуру данных.
Проверка результата и отладка
После операций через менеджер всегда проверяйте результат. Для поиска — что ссылка не пустая (Ссылка.Пустая() возвращает Ложь). Для записи — что она завершилась без исключения, при необходимости обернув вызов в попытку с откатом транзакции.
Как проверить результат
Ссылка.Пустая() = Ложь, реквизиты читаются
Пустая ссылка — документ не найден, проверьте номер и дату
Документ виден в списке, ссылка заполнена
Исключение при записи — смотрите текст ошибки о незаполненных реквизитах
Запросом или попыткой чтения реквизита подтверждено существование
«Объект не найден» при чтении — битая ссылка
Для отладки удобно выводить тип полученного значения через ТипЗнч() и строковое представление ссылки. Это сразу показывает, что именно вернул метод: ссылку, объект или пустое значение, — и снимает большинство вопросов «почему код не работает».
Что важно запомнить
Менеджер документа получают через Документы.ИмяДокумента по имени метаданных. Через него создают (СоздатьДокумент), ищут (НайтиПоНомеру, ПолучитьСсылку) и перебирают (Выбрать) документы. Для чтения достаточно ссылки или запроса, для изменения нужен объект через ПолучитьОбъект(). Код с менеджером выполняется только на сервере.
Частые вопросы
Можно ли обратиться к менеджеру документа на клиенте в управляемой форме?
Нет. Коллекция Документы доступна только в серверном контексте. В управляемой форме создайте серверную процедуру с директивой &НаСервере или вынесите логику в серверный общий модуль, а на клиент возвращайте ссылку или структуру с данными.
Чем ПолучитьСсылку() отличается от НайтиПоНомеру()?
ПолучитьСсылку() формирует ссылку по уникальному идентификатору и не проверяет, существует ли документ в базе — ссылка может оказаться «битой». НайтиПоНомеру() выполняет реальный поиск в базе и возвращает пустую ссылку, если документ не найден.
Почему НайтиПоНомеру не находит документ, который точно есть?
Чаще всего не указана или неверно указана дата периода нумерации. Если номера уникальны в пределах года, передайте любую дату нужного года вторым параметром. Также проверьте тип номера: в строковом номере могут быть лидирующие нули или префикс базы.
Как перебрать все документы вида за период?
Используйте Документы.ИмяДокумента.Выбрать(НачалоПериода, КонецПериода) и цикл Пока Выборка.Следующий() Цикл. Для больших объёмов и отборов по реквизитам эффективнее запрос к таблице документа с последующим обходом результата.
Можно ли изменить документ, не получая объект?
Нет. Через ссылку доступно только чтение реквизитов шапки. Любое изменение — реквизитов, табличных частей, проведение — требует получения объекта через Ссылка.ПолучитьОбъект() и последующего вызова Записать().
Как узнать имя документа для обращения, если известен только его синоним?
Откройте конфигуратор и найдите документ в дереве метаданных — имя указано в свойстве «Имя». Программно соответствие можно получить перебором Метаданные.Документы с сравнением свойств Синоним и Имя.