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

Программист 1С v8.3 (Управляемые формы) 1С:Документооборот IT и автоматизация бизнеса
← На главную

При переходе к разработке в конфигурации 1С:Документооборот (особенно версии 2.1) многие специалисты, привыкшие к классическим учетным решениям вроде 1С:ERP, 1С:Управление торговлей или 1С:Бухгалтерия, сталкиваются с неожиданным препятствием. Попытка найти привычные объекты метаданных в ветке Документы дерева конфигуратора для работы с договорами, приказами или актами заканчивается неудачей. В этой статье мы подробно разберем, почему архитектура 1С:ДО спроектирована именно так, как правильно писать запросы к документам в версиях 2.1 и 3.0, а также рассмотрим важные нюансы оптимизации и работы со связанными данными.

Архитектурный диссонанс: почему документы в 1С:ДО — это справочники?

Для понимания логики построения запросов необходимо сначала разобраться в причинах, по которым разработчики фирмы «1С» приняли решение хранить документы в справочниках. С пользовательской точки зрения система оперирует терминами «Внутренний документ», «Входящий документ» и «Исходящий документ». Однако в конфигураторе за них отвечают соответствующие справочники:

Такой подход обусловлен спецификой автоматизации документооборота и делопроизводства:

  1. Иерархическая структура хранения данных. В делопроизводстве критически важно распределять документы по папкам (например, «Договоры», «Приказы по основной деятельности», «Заявления»). В платформе «1С:Предприятие» стандартные объекты типа Документ не поддерживают иерархию «из коробки». Справочники же изначально обладают встроенным механизмом иерархии (папок и элементов), что позволяет легко настраивать права доступа на папки документов.
  2. Жизненный цикл и отсутствие проведения. Документы в учетных системах предназначены для отражения хозяйственных операций и делают движения по регистрам (проведение). Документы в 1С:ДО не имеют движений в классическом понимании — их состояние меняется в ходе процессов согласования, утверждения и исполнения. Справочники создают гораздо меньшую транзакционную нагрузку на СУБД при частых изменениях реквизитов и статусов, что положительно сказывается на производительности совместной работы сотен пользователей.

Выяснив эту особенность, мы понимаем, что для получения списка документов нам нужно обращаться запросом к таблицам справочников.

Составление запроса для 1С:Документооборот 2.1

Рассмотрим практический пример. Предположим, перед нами стоит задача отобрать все внутренние документы определенного вида (например, «Договор аренды»). У каждого элемента справочника ВнутренниеДокументы есть обязательный реквизит ВидДокумента, который ссылается на справочник ВидыВнутреннихДокументов.

Разберем по шагам написание запроса в конфигурации версии 2.1:


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

В данном запросе мы:

Кардинальные изменения в 1С:Документооборот 3.0

Если вы разрабатываете отчеты или дорабатываете систему на базе новой редакции 1С:Документооборот 3.0, то старый подход не сработает. Разработчики фирмы «1С» полностью пересмотрели архитектуру хранения данных в новой редакции конфигурации.

Проанализируем основные изменения:

Посмотрим на пример аналогичного запроса для версии 3.0:


ВЫБРАТЬ
    Документы.Ссылка КАК ДокументСсылка,
    Документы.Наименование КАК Наименование,
    Документы.ЧисловойНомер КАК Номер,
    Документы.ДатаЗаписи КАК ДатаЗаписи
ИЗ
    Справочник.ДокументыПредприятия КАК Документы
ГДЕ
    Документы.ВидДокумента = &ОпределенныйВидДокумента
    И НЕ Документы.ПометкаУдаления

Как мы видим, синтаксис запроса остался схожим, однако источник данных изменился на Справочник.ДокументыПредприятия. Это значительно упрощает сквозной анализ документов разных потоков, избавляя от необходимости объединять таблицы (ОБЪЕДИНИТЬ ВСЕ) входящих, исходящих и внутренних документов.

Нюансы написания запросов, о которых важно знать разработчику

Просто выбрать документы по виду — это лишь базовая задача. В реальной практике разработки в 1С:ДО необходимо учитывать ряд критически важных факторов, влияющих на скорость работы базы данных и корректность результатов.

1. Влияние ограничений прав доступа на уровне записей (RLS)

1С:Документооборот характеризуется чрезвычайно гибкой и сложной системой разграничения прав доступа. В зависимости от настроек, пользователь может видеть только документы своей организации, своего подразделения, или те, в которых он указан в рабочей группе.

Если запрос выполняется в сеансе обычного пользователя (не под полными правами), платформа автоматически модифицирует ваш запрос на уровне СУБД, добавляя к нему сложные условия проверки прав (RLS). Это может приводить к катастрофическому падению производительности на больших базах данных.

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


УстановитьПривилегированныйРежим(Истина);
// Выполнение запроса
УстановитьПривилегированныйРежим(Ложь);

2. Работа с дополнительными реквизитами

Пользователи 1С:ДО часто создают собственные свойства для видов документов (например, «Сумма договора», «Срок действия гарантии» и т.д.). Эти свойства не создают новых колонок в физической таблице справочника документов. Они хранятся в подчиненной табличной части ДополнительныеРеквизиты.

Посмотрим на пример запроса, извлекающего значение дополнительного реквизита «Сумма договора» для внутренних документов:


ВЫБРАТЬ
    ВнутренниеДокументы.Ссылка КАК Договор,
    ВнутренниеДокументы.Наименование КАК Наименование,
    ЕСТЬNULL(ДопРеквизиты.Значение, 0) КАК СуммаДоговора
ИЗ
    Справочник.ВнутренниеДокументы КАК ВнутренниеДокументы
    
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВнутренниеДокументы.ДополнительныеРеквизиты КАК ДопРеквизиты
        ПО ДопРеквизиты.Ссылка = ВнутренниеДокументы.Ссылка
        И ДопРеквизиты.Свойство = &СвойствоСуммаДоговора
ГДЕ
    ВнутренниеДокументы.ВидДокумента = &ВидДоговор

В этом примере мы используем ЛЕВОЕ СОЕДИНЕНИЕ с табличной частью дополнительных реквизитов по ссылке на документ и по конкретному свойству (которое передаем параметром &СвойствоСуммаДоговора типа ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения). Использование функции ЕСТЬNULL гарантирует возвращение нуля в случае, если реквизит у документа не заполнен.

3. Получение связанных документов

Часто требуется отобрать не просто документы определенного вида, но и связанные с ними объекты (например, найти все дополнительные соглашения к конкретному договору). Связи между документами в 1С:ДО хранятся в специальном регистре сведений.

Выясним, как выглядит запрос для получения связанных документов:


ВЫБРАТЬ
    Связи.СвязанныйДокумент КАК СвязанныйОбъект,
    Связи.ТипСвязи КАК ТипСвязи
ИЗ
    РегистрСведений.СвязиДокументов КАК Связи
ГДЕ
    Связи.Документ = &ИсходныйДокумент

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

Используя приведенные шаблоны запросов и учитывая специфику архитектуры метаданных 1С:Документооборот, вы сможете эффективно решать задачи по выборке и анализу данных любой сложности.

← На главную