Работа с большими массивами данных в системе 1С:Предприятие часто требует точной фильтрации информации. Одним из наиболее частых запросов разработчиков и администраторов является необходимость выделить документы определенного вида из общей выборки. Это может потребоваться как для формирования сложной отчетности, так и для проведения регламентных операций или обработки данных в фоновом задании. Понимание механизмов отбора позволяет существенно оптимизировать производительность системы и избежать ошибок в логике работы программных модулей.

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

В данной статье мы детально разберем все доступные способы реализации отбора. Мы рассмотрим нюансы работы с перечислениями видов операций, специфику сравнения типов данных и типичные ошибки, которые допускают начинающие специалисты при написании кода. Правильное использование этих инструментов станет залогом стабильной работы ваших конфигураций.

Отбор в языке запросов через ВидОперации

Самый эффективный способ фильтрации документов на уровне базы данных — использование свойства ВидОперации в запросе. Это свойство ссылается на предопределенное перечисление, которое хранится в метаданных конфигурации. При формировании запроса важно понимать, что сравнение должно происходить между совместимыми типами данных.

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

Рассмотрим пример запроса, где мы выбираем только документы реализации товаров и услуг:

ВЫБРАТЬ

РеализацияТоваровУслуг.Ссылка КАК Ссылка,

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

РеализацияТоваровУслуг.Номер КАК Номер

ИЗ

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

ГДЕ

РеализацияТоваровУслуг.ВидОперации = &ВидОперации

Здесь параметр &ВидОперации должен быть передан в запрос с соответствующим значением из перечисления. Использование такого подхода позволяет базе данных использовать индексы по полям отбора, что критически важно для быстродействия при больших объемах данных. Оптимизация запросов начинается именно с грамотного формирования условий выборки.

💡

Всегда передавайте значения перечислений в запрос через параметры, а не подставляйте их строковым представлением. Это защищает код от ошибок при переименовании элементов перечисления в конфигураторе.

Стоит отметить, что свойство ВидОперации доступно не для всех объектов. Оно существует только у документов, у которых в метаданных определено соответствующее перечисление. Если вы попытаетесь обратиться к этому свойству у документа, где вид операции не предусмотрен, система выдаст ошибку компиляции или выполнения.

Фильтрация по типу ссылки во встроенном языке

Часто возникает ситуация, когда отбор необходимо выполнить в цикле обработки уже полученных данных или при работе с универсальными коллекциями значений. Встроенный язык 1С предоставляет мощные средства для работы с типами данных. Основной метод здесь — использование функции ТипЗнч() или оператора ЕСТЬ.

При работе с переменными типа ДокументСсылка важно различать общий тип документа и конкретный вид документа. Сравнение типа переменной с конкретным типом документа позволяет отфильтровать нужные объекты. Это особенно актуально при обработке журналов документов или универсальных списков.

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

Если ТипЗнч(ТекущийДокумент) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда

// Обработка документа реализации

ОбработатьРеализацию(ТекущийДокумент);

ИначеЕсли ТипЗнч(ТекущийДокумент) = Тип("ДокументСсылка.ПоступлениеТоваровУслуг") Тогда

// Обработка документа поступления

ОбработатьПоступление(ТекущийДокумент);

КонецЕсли;

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

⚠️ Внимание: Использование строкового представления типа (как в примере выше) может замедлить выполнение кода при частых вызовах. Для часто используемых типов целесообразно сохранять значение типа в переменную при инициализации модуля.

Кроме того, платформа позволяет использовать оператор ЕСТЬ для проверки соответствия типа непосредственно в условиях отбора запроса, если вы работаете с таблицей значений или универсальным запросом. Это дает гибкость при построении динамических выборок, где вид документа может определяться пользователем в runtime.

📊 Какой способ отбора вы используете чаще?
В языке запросов (ВидОперации)
Во встроенном языке (ТипЗнч)
Через СКД в отчете
Через стандартные формы
Затрудняюсь ответить

Настройка отборов в СКД для отчетов

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

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

Список доступных действий при настройке отбора в СКД:

  • 📊 Выбор поля «ВидОперации» из дерева доступных полей набора данных.
  • 🔍 Установка условия сравнения «В списке» или «Равно» в зависимости от задачи.
  • ✅ Добавление конкретных значений перечисления в список отбора.
  • 💾 Сохранение варианта отчета для повторного использования пользователями.

Преимущество СКД заключается в возможности предоставления пользователю выбора на форме настройки. Вы можете сделать поле отбора видимым, позволяя пользователю самому решить, какие виды документов попадут в итоговую таблицу. Это снижает нагрузку на разработчика, которому не нужно создавать отдельный отчет для каждого сценария.

Метод отбора Где применяется Сложность внедрения Гибкость
Язык запросов Обработки, фоновые задания Средняя Высокая
Встроенный язык Обработка событий, циклы Высокая Максимальная
СКД Отчеты, печатные формы Низкая Средняя
Стандартные формы Журналы документов Низкая Низкая

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

Секрет быстрой работы СКД

Если отчет формируется долго, попробуйте добавить отбор по периоду. Даже если вам нужны все документы, ограничение периода (например, 10 лет) часто помогает оптимизатору запросов выбрать более эффективный план выполнения.

Работа с перечислениями видов операций

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

Каждый элемент перечисления имеет уникальное имя, синоним и внутреннюю ссылку. При программировании мы обращаемся именно к имени элемента. Важно учитывать, что в разных конфигурациях 1С одни и те же бизнес-процессы могут быть реализованы через разные виды операций. Например, в «УТ 11» и «ERP» логика может отличаться.

Для получения списка всех возможных видов операций конкретного документа можно использовать следующий код:

МассивВидов = Перечисления.ВидыОперацийДокументаРеализацияТоваровУслуг.ПолучитьМассив();

Для каждого Элемента Из МассивВидов Цикл

Сообщить(Элемент.Наименование);

КонецЦикла;

Этот прием полезен при динамическом формировании интерфейсов или при необходимости проверить, существует ли определенный вид операции в текущей версии конфигурации. Метаданные системы могут изменяться при обновлениях, и жесткая привязка к конкретным значениям без проверки может привести к ошибкам.

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

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

Отбор в стандартных формах и журналах

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

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

Однако, если стандартные возможности не удовлетворяют требованиям бизнеса, разработчик может программно установить отбор в модуле формы. Это делается через свойство Отбор формы списка.

Пример установки отбора при открытии формы:

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

// Устанавливаем отбор только на реализации с видом "Продажа"

Объект.Отбор.ВидОперации.Установить(Перечисления.ВидыОперацийДокументаРеализацияТоваровУслуг.Продажа);

КонецПроцедуры

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

☑️ Проверка настройки формы

Выполнено: 0 / 4

Не забывайте проверять права доступа. Если пользователь не имеет права читать определенные виды документов (например, закрытые перемещения между складами), то даже при отсутствии отбора они не отобразятся в списке. Сочетание отборов и прав доступа — мощный инструмент безопасности.

Типичные ошибки и производительность

При реализации отборов по типу документа разработчики часто сталкиваются с проблемами производительности и логическими ошибками. Одна из самых распространенных ошибок — попытка сравнить строковое представление типа вместо самого типа данных. Это приводит к тому, что запрос не использует индексы и выполняет полное сканирование таблицы.

Другой частой ошибкой является игнорирование иерархии документов. Если в конфигурации используется общий вид документа, а отбор ставится по конкретному виду, убедитесь, что вы обращаетесь к правильному регистру или таблице. В некоторых случаях данные могут дублироваться или храниться в разрезе разных измерений.

Советы по оптимизации:

  • 🚀 Используйте параметры в запросах вместо констант для лучшей компиляции плана выполнения.
  • 📉 Избегайте функций в левой части условия отбора (например, Строка(ВидОперации)), это отключает индексы.
  • 🗄️ Проверяйте наличие индексов по полям, участвующим в отборе, в режиме предприятия или через анализ запросов.

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

⚠️ Внимание: Детали реализации механизмов блокировок и индексации могут меняться в новых версиях платформы 1С. Рекомендуется сверять технические особенности работы с СУБД в официальной документации фирмы «1С» для вашей версии платформы.

💡

Главный вывод: Правильный отбор по типу документа — это не только вопрос корректности данных, но и ключевой фактор производительности всей системы. Всегда отдавайте предпочтение отборам на стороне СУБД (в запросе), а не в коде 1С.

Часто задаваемые вопросы (FAQ)

Можно ли сделать отбор по типу документа, если у него не задан вид операции?

Если у документа в метаданных не определено перечисление видов операций, то свойство ВидОперации у него отсутствовать будет. В этом случае отбор можно сделать только по типу ссылки (например, ДокументСсылка.ЗаказКлиента) используя оператор ЕСТЬ в запросе или функцию ТипЗнч во встроенном языке.

Почему отбор по виду операции работает медленно на больших базах?

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

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

Для этого нужно создать запрос к регистру документов или непосредственно к таблице документа, добавив условия по полям Дата (между началом и концом периода) и ВидОперации (равно нужному значению перечисления).

Отличается ли синтаксис отбора в 1С 8.2 и 1С 8.3?

Базовый синтаксис работы с типами и перечислениями остался неизменным. Однако в версии 8.3 появились улучшения в оптимизаторе запросов и новые возможности СКД, которые позволяют делать более сложные отборы визуально без написания кода.

Можно ли использовать отбор по типу в консоли запросов?

Да, консоль запросов (например, внешняя обработка или встроенная в конфигуратор) полностью поддерживает синтаксис сравнения с перечислениями. Вам нужно лишь убедиться, что перечисление доступно в контексте выполнения запроса.