При переходе к разработке в конфигурации 1С:Документооборот (особенно версии 2.1) многие специалисты, привыкшие к классическим учетным решениям вроде 1С:ERP, 1С:Управление торговлей или 1С:Бухгалтерия, сталкиваются с неожиданным препятствием. Попытка найти привычные объекты метаданных в ветке Документы дерева конфигуратора для работы с договорами, приказами или актами заканчивается неудачей. В этой статье мы подробно разберем, почему архитектура 1С:ДО спроектирована именно так, как правильно писать запросы к документам в версиях 2.1 и 3.0, а также рассмотрим важные нюансы оптимизации и работы со связанными данными.
Для понимания логики построения запросов необходимо сначала разобраться в причинах, по которым разработчики фирмы «1С» приняли решение хранить документы в справочниках. С пользовательской точки зрения система оперирует терминами «Внутренний документ», «Входящий документ» и «Исходящий документ». Однако в конфигураторе за них отвечают соответствующие справочники:
Справочник.ВнутренниеДокументыСправочник.ВходящиеДокументыСправочник.ИсходящиеДокументыТакой подход обусловлен спецификой автоматизации документооборота и делопроизводства:
Документ не поддерживают иерархию «из коробки». Справочники же изначально обладают встроенным механизмом иерархии (папок и элементов), что позволяет легко настраивать права доступа на папки документов.Выяснив эту особенность, мы понимаем, что для получения списка документов нам нужно обращаться запросом к таблицам справочников.
Рассмотрим практический пример. Предположим, перед нами стоит задача отобрать все внутренние документы определенного вида (например, «Договор аренды»). У каждого элемента справочника ВнутренниеДокументы есть обязательный реквизит ВидДокумента, который ссылается на справочник ВидыВнутреннихДокументов.
Разберем по шагам написание запроса в конфигурации версии 2.1:
ВЫБРАТЬ
ВнутренниеДокументы.Ссылка КАК ДокументСсылка,
ВнутренниеДокументы.Код КАК Код,
ВнутренниеДокументы.Наименование КАК Наименование,
ВнутренниеДокументы.ДатаРегистрации КАК ДатаРегистрации,
ВнутренниеДокументы.РегистрационныйНомер КАК Номер
ИЗ
Справочник.ВнутренниеДокументы КАК ВнутренниеДокументы
ГДЕ
ВнутренниеДокументы.ВидДокумента = &ОпределенныйВидДокумента
И НЕ ВнутренниеДокументы.ПометкаУдаления
В данном запросе мы:
Справочник.ВнутренниеДокументы.ВидДокумента с помощью параметра &ОпределенныйВидДокумента (в который мы передадим ссылку на нужный элемент справочника видов документов).НЕ ВнутренниеДокументы.ПометкаУдаления, чтобы не захламлять выборку неактуальными данными.Если вы разрабатываете отчеты или дорабатываете систему на базе новой редакции 1С:Документооборот 3.0, то старый подход не сработает. Разработчики фирмы «1С» полностью пересмотрели архитектуру хранения данных в новой редакции конфигурации.
Проанализируем основные изменения:
Справочник.ДокументыПредприятия.ЯвляетсяВходящейКорреспонденцией или ЯвляетсяИсходящейКорреспонденцией). Если флаги не установлены, документ считается внутренним.Посмотрим на пример аналогичного запроса для версии 3.0:
ВЫБРАТЬ
Документы.Ссылка КАК ДокументСсылка,
Документы.Наименование КАК Наименование,
Документы.ЧисловойНомер КАК Номер,
Документы.ДатаЗаписи КАК ДатаЗаписи
ИЗ
Справочник.ДокументыПредприятия КАК Документы
ГДЕ
Документы.ВидДокумента = &ОпределенныйВидДокумента
И НЕ Документы.ПометкаУдаления
Как мы видим, синтаксис запроса остался схожим, однако источник данных изменился на Справочник.ДокументыПредприятия. Это значительно упрощает сквозной анализ документов разных потоков, избавляя от необходимости объединять таблицы (ОБЪЕДИНИТЬ ВСЕ) входящих, исходящих и внутренних документов.
Просто выбрать документы по виду — это лишь базовая задача. В реальной практике разработки в 1С:ДО необходимо учитывать ряд критически важных факторов, влияющих на скорость работы базы данных и корректность результатов.
1С:Документооборот характеризуется чрезвычайно гибкой и сложной системой разграничения прав доступа. В зависимости от настроек, пользователь может видеть только документы своей организации, своего подразделения, или те, в которых он указан в рабочей группе.
Если запрос выполняется в сеансе обычного пользователя (не под полными правами), платформа автоматически модифицирует ваш запрос на уровне СУБД, добавляя к нему сложные условия проверки прав (RLS). Это может приводить к катастрофическому падению производительности на больших базах данных.
Рекомендация: Если вам необходимо программно обработать документы (например, в регламентном задании или при заполнении служебных реквизитов) и проверка прав текущего пользователя в этот момент не требуется, выполняйте запрос в привилегированном модуле или используйте метод:
УстановитьПривилегированныйРежим(Истина);
// Выполнение запроса
УстановитьПривилегированныйРежим(Ложь);
Пользователи 1С:ДО часто создают собственные свойства для видов документов (например, «Сумма договора», «Срок действия гарантии» и т.д.). Эти свойства не создают новых колонок в физической таблице справочника документов. Они хранятся в подчиненной табличной части ДополнительныеРеквизиты.
Посмотрим на пример запроса, извлекающего значение дополнительного реквизита «Сумма договора» для внутренних документов:
ВЫБРАТЬ
ВнутренниеДокументы.Ссылка КАК Договор,
ВнутренниеДокументы.Наименование КАК Наименование,
ЕСТЬNULL(ДопРеквизиты.Значение, 0) КАК СуммаДоговора
ИЗ
Справочник.ВнутренниеДокументы КАК ВнутренниеДокументы
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВнутренниеДокументы.ДополнительныеРеквизиты КАК ДопРеквизиты
ПО ДопРеквизиты.Ссылка = ВнутренниеДокументы.Ссылка
И ДопРеквизиты.Свойство = &СвойствоСуммаДоговора
ГДЕ
ВнутренниеДокументы.ВидДокумента = &ВидДоговор
В этом примере мы используем ЛЕВОЕ СОЕДИНЕНИЕ с табличной частью дополнительных реквизитов по ссылке на документ и по конкретному свойству (которое передаем параметром &СвойствоСуммаДоговора типа ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения). Использование функции ЕСТЬNULL гарантирует возвращение нуля в случае, если реквизит у документа не заполнен.
Часто требуется отобрать не просто документы определенного вида, но и связанные с ними объекты (например, найти все дополнительные соглашения к конкретному договору). Связи между документами в 1С:ДО хранятся в специальном регистре сведений.
Выясним, как выглядит запрос для получения связанных документов:
ВЫБРАТЬ
Связи.СвязанныйДокумент КАК СвязанныйОбъект,
Связи.ТипСвязи КАК ТипСвязи
ИЗ
РегистрСведений.СвязиДокументов КАК Связи
ГДЕ
Связи.Документ = &ИсходныйДокумент
При переходе на версию 3.0 имя регистра может измениться на СвязиОбъектов, однако общая логика связывания через отдельный регистр сведений сохраняется во всех редакциях.
Используя приведенные шаблоны запросов и учитывая специфику архитектуры метаданных 1С:Документооборот, вы сможете эффективно решать задачи по выборке и анализу данных любой сложности.