Система компоновки данных (СКД) в 1С:Предприятие — мощный инструмент для создания гибких отчетов, но некоторые её возможности остаются «темными лошадками» даже для опытных разработчиков. Одним из таких малоизученных, но крайне полезных элементов является условие «Недоступно». Оно позволяет управлять видимостью полей, параметров и даже целых разделов отчета в зависимости от контекста — прав пользователя, наличия данных или технических ограничений.

На практике условие «Недоступно» часто путают с «Видимость» или «Доступность», хотя его логика работы принципиально иная. Если поле просто скрыто (Видимость = Ложь), оно всё равно существует в структуре отчета и может влиять на производительность. А вот «Недоступно» полностью исключает элемент из обработки на этапе формирования запроса, что особенно критично для сложных отчетов с большими массивами данных.

В этой статье мы разберём:

- Как технически реализовано условие «Недоступно» в СКД и чем оно отличается от альтернатив.

- Практические примеры применения — от простых до сложных сценариев.

- Типичные ошибки и «подводные камни», которые приводят к некорректной работе отчетов.

- Способы оптимизации запросов с использованием этого условия.

Если вы когда-нибудь сталкивались с тем, что отчет «тормозит» из-за лишних полей или параметров, которые не должны отображаться для текущего пользователя — эта статья поможет решить проблему кардинально, а не костылями.

1. Что такое условие «Недоступно» в СКД и как оно работает

Условие «Недоступно» в системе компоновки данных — это механизм, который полностью исключает элемент (поле, параметр, группировку) из обработки на этапе формирования запроса к базе данных. В отличие от свойства «Видимость», которое лишь скрывает элемент на этапе отображения, «Недоступно» работает на уровне компоновщика данных и влияет на сам SQL-запрос.

Технически это реализовано через динамическое изменение схемы компоновки. Если для поля или параметра установлено условие «Недоступно = Истина», то:

  • 🔹 Поле не попадёт в список выбираемых колонок в запросе.
  • 🔹 Параметр не будет предложен пользователю для заполнения.
  • 🔹 Группировка не сформирует соответствующий раздел в отчёте.
  • 🔹 Ресурс не будет рассчитан, даже если он используется в выражениях.

Важно понимать, что «Недоступно» — это не просто флаг, а полноценный механизм оптимизации запросов. Например, если у вас в отчёте 20 полей, но для текущего пользователя доступны только 5, то при правильной настройке «Недоступно» запрос к базе будет содержать только эти 5 полей, а не все 20. Это особенно критично для отчетов с большими объёмами данных или сложными joins.

Синтаксически условие задаётся в свойствах элемента компоновки через выражение на встроенном языке. Пример:

Недоступно = НЕ РолиТекущегоПользователя.Содержит("Администратор")
📊 Как часто вы используете условие"Недоступно" в СКД?
Никогда не слышал о нём
Иногда, для простых случаев
Регулярно, для оптимизации отчетов
Пробовал, но возникли сложности

2. Отличия «Недоступно» от «Видимость» и «Доступность»

Многие разработчики путают эти три свойства, что приводит к неэффективным отчётам или ошибкам. Разберём ключевые различия:

Свойство Уровень применения Влияние на запрос Когда использовать
Недоступно Компоновщик данных Исключает элемент из SQL-запроса Для оптимизации производительности, когда элемент не должен участвовать в выборке
Видимость Отображение Не влияет на запрос Для скрытия элементов на форме без изменения логики
Доступность Интерфейс Не влияет на запрос Для блокировки редактирования параметров

Пример из практики: если в отчёте есть поле «Себестоимость», которое должно быть видно только бухгалтерам, то:

  • 🔴 Ошибка: Установить Видимость = Ложь для остальных пользователей. Поле всё равно будет выбрано из базы, что замедлит отчёт.
  • 🟢 Правильно: Использовать Недоступно = НЕ ТекущийПользователь.ЭтоБухгалтер. Поле не попадёт в запрос для небухгалтеров.

Ещё один нюанс: «Недоступно» может конфликтовать с Использование (свойство поля). Если поле отмечено как «Использование = Всегда», то условие «Недоступно» игнорируется. Это частая причина, почему отчёт «не слушается» настройки.

💡

Перед использованием"Недоступно" проверьте, не установлено ли для поля свойство"Использование = Всегда". В этом случае условие не сработает, и поле всё равно попадёт в запрос.

3. Практические примеры использования условия «Недоступно»

Рассмотрим реальные сценарии, где условие «Недоступно» решаетные задачи оптимизации и безопасности.

3.1. Ограничение доступа к конфиденциальным данным

Допустим, в отчёте «Продажи по менеджерам» есть поле «ЗарплатаМенеджера», которое должно быть видно только руководителям отдела. Решение:

Недоступно = НЕ ТекущийПользователь.ВходитВГруппу("РуководителиОтделаПродаж")

Эффект: поле не попадёт в запрос для рядовых пользователей, что:

  • 🔒 Исключает утечку данных.
  • ⚡ Ускоряет формирование отчёта (не выбираются лишние колонки).

3.2. Динамическое управление группировками

В отчёте «Остатки товаров» нужно показывать группировку по «Складам» только если пользователь выбрал несколько складов в параметрах. Решение:

Недоступно = Параметры.Склады.Количество = 1

Результат: при выборе одного склада группировка исчезнет из отчёта, упростив его восприятие.

3.3. Условное отображение параметров

Параметр «ДатаНачала» должен появляться только если пользователь выбрал тип отчёта «Динамика». Решение:

Недоступно = Параметры.ТипОтчета <> Перечисление.ТипыОтчетов.Динамика

Это избавляет от необходимости проверять параметры в коде формы.

3.4. Оптимизация отчётов с большими данными

В отчёте «Анализ продаж за 5 лет» есть 50 полей, но для операторов call-центра нужны только 5. Решение:

Недоступно = НЕ ТекущийПользователь.ЭтоОператорCallЦентра И НЕ ИмяПоля В ("Дата","Сумма","Клиент","Менеджер","Статус")

Эффект: запрос к базе будет содержать только 5 полей вместо 50, что ускорит его выполнение в 10 раз.

Убедиться, что поле не отмечено как"Использование = Всегда"|Проверить, что условие не конфликтует с другими настройками СКД|Тестировать отчёт под разными ролями пользователей|Оценить влияние на производительность до и после применения-->

4. Типичные ошибки и как их избежать

Неправильное использование условия «Недоступно» может привести к неожиданным результатам — от «падения» отчёта до утечки данных. Разберём самые распространённые ошибки:

4.1. Циклические зависимости

Если условие «Недоступно» для поля А зависит от поля Б, а поле Б в свою очередь зависит от А, компоновщик данных «зависнет» при формировании схемы. Пример:

// Поле"Прибыль"

Недоступно = НЕ ПоказыватьФинансы

// Поле"ПоказыватьФинансы" (вычисляемое)

Выражение = ЕСТЬNULL(Прибыль, 0) > 0

🔥 Решение: Разрывайте зависимости, вынося логику в отдельные функции или параметры.

4.2. Конфликт с «Использование = Всегда»

Как упоминалось ранее, если поле отмечено как обязательное для использования, условие «Недоступно» проигнорируется. Это частая причина, почему отчёт «не слушается» настройки.

🔍 Как проверить: Откройте схему компоновки в режиме редактирования и найдите свойство «Использование» для проблемного поля.

4.3. Ошибки в выражениях

Если в условии «Недоступно» используется некорректное выражение (например, обращение к несуществующему параметру), компоновщик данных может:

  • 💥 Выдать ошибку при открытии отчёта.
  • 🐢 Замедлить формирование из-за проверок на каждом этапе.

Пример ошибочного кода:

Недоступно = Параметры.НесуществующийПараметр = Истина

Решение: Всегда проверяйте выражения на наличие опечаток и существование ссылаемых объектов.

4.4. Неучтённые права доступа

Если условие «Недоступно» основано на ролях пользователя, но роли неверно настроены в , это может привести к:

  • 👁️‍🗨️ Показу конфиденциальных данных не тем пользователям.
  • 🚫 Блокировке критичных полей для администраторов.

🔐 Рекомендация: Тестируйте отчёты под разными учётными записями, включая гостевые.

Что будет, если в условии"Недоступно" использовать рекурсивную ссылку?

Если поле А в своём условии"Недоступно" ссылается на поле Б, а поле Б в своём выражении зависит от поля А, компоновщик данных попадёт в бесконечный цикл при попытке сформировать схему. В лучшем случае это приведёт к зависанию отчёта, в худшем — к аварийному завершению сеанса 1С.

5. Оптимизация запросов с помощью «Недоступно»

Главное преимущество условия «Недоступно» — возможность динамически сокращать SQL-запросы, исключая ненужные колонки и joins. Это особенно важно для:

  • 📊 Отчётов с десятками полей, из которых пользователю нужны 1-2.
  • 🔗 Сложных запросов с множеством таблиц (например, аналитика по продажам с привязкой к контрагентам, договорам и складам).
  • 🕒 Отчётов, формируемых по расписанию (где каждая секунда на счету).

Рассмотрим пример оптимизации. Допустим, у нас есть отчёт «Дебиторская задолженность», который содержит 30 полей, но:

  • Бухгалтеры видят все поля.
  • Менеджеры — только «Контрагент», «Сумма долга» и «Срок просрочки».
  • Руководители — дополнительно «Ответственный менеджер».

Без «Недоступно» запрос будет выглядеть так (упрощённо):

ВЫБРАТЬ

Контрагент,

СуммаДолга,

СрокПросрочки,

ОтветственныйМенеджер,

ДатаДоговора,

НомерДоговора,

ВалютаДолга,

... // ещё 23 поля

ИЗ

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

...

С «Недоступно» для менеджера запрос сократится до:

ВЫБРАТЬ

Контрагент,

СуммаДолга,

СрокПросрочки

ИЗ

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

...

📉 Результат: Уменьшение объёма передаваемых данных в 10 раз и ускорение формирования отчёта на 30-70% (зависит от структуры БД).

Для максимального эффекта комбинируйте «Недоступно» с:

  • 🔄 Динамическими параметрами: когда список доступных полей зависит от выбранных пользователем критериев.
  • 🔒 Ролевой моделью: права доступа определяют, какие данные можно показывать.
  • 📈 Кэшированием: если отчёт часто запрашивается с одинаковыми параметрами.
💡

Условие"Недоступно" — единственный механизм в СКД, который позволяет сократить SQL-запрос на этапе его формирования. Все альтернативы (например,"Видимость") работают уже после получения данных из базы.

6. Расширенные сценарии: динамические схемы и программное управление

Для сложных задач стандартных настроек «Недоступно» в конструкторе может быть недостаточно. В таких случаях приходит на помощь программное управление схемой компоновки через встроенный язык.

6.1. Динамическое изменение схемы перед выполнением

Можно модифицировать схему компоновки непосредственно перед формированием отчёта. Пример:

Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)

Схема = КомпоновщикДанных.ПолучитьСхемуКомпоновкиДанных;

// Скрываем поле"Себестоимость" для небухгалтеров

Если НЕ ТекущийПользователь.ЭтоБухгалтер Тогда

ПолеСебестоимость = Схема.Поля.Найти("Себестоимость");

ПолеСебестоимость.Недоступно = Истина;

КонецЕсли;

КомпоновщикДанных.УстановитьСхемуКомпоновкиДанных(Схема);

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

6.2. Использование внешних параметров

Если логика доступности полей зависит от внешних данных (например, настроек пользователя в другой системе), можно передавать параметры через УстановитьПараметр:

КомпоновщикДанных.УстановитьПараметр("ПоказыватьФинансы", Ложь);

КомпоновщикДанных.Выполнить;

А в схеме компоновки использовать:

Недоступно = НЕ Параметры.ПоказыватьФинансы

6.3. Условная компоновка для разных типов отчётов

Если один и тот же отчёт используется для разных целей (например, «Продажи» и «Закупки»), можно динамически переключать доступные поля:

Если Параметры.ТипОтчета = Перечисление.ТипыОтчетов.Продажи Тогда

Схема.Поля.Найти("Поставщик").Недоступно = Истина;

Схема.Поля.Найти("Покупатель").Недоступно = Ложь;

ИначеЕсли Параметры.ТипОтчета = Перечисление.ТипыОтчетов.Закупки Тогда

Схема.Поля.Найти("Поставщик").Недоступно = Ложь;

Схема.Поля.Найти("Покупатель").Недоступно = Истина;

КонецЕсли;

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

6.4. Интеграция с правами доступа 1С

Для автоматизации можно привязать «Недоступно» к ролям пользователей через функцию:

Функция ПользовательИмеетРоль(ИмяРоли)

Возврат ТекущийПользователь.Роли.Найти(ИмяРоли) <> Неопределено;

КонецФункции

// В схеме компоновки:

Недоступно = НЕ ПользовательИмеетРоль("РольДляПросмотраФинансов")

📊 Какой способ управления"Недоступно" вы используете чаще?
Настройки в конструкторе СКД
Программное изменение схемы
Комбинация обоих
Не использую

7. Производительность: когда «Недоступно» работает, а когда нет

Несмотря на очевидные преимущества, условие «Недоступно» не всегда даёт ожидаемый прирост производительности. Разберём, в каких случаях оно эффективно, а где лучше использовать альтернативы.

7.1. Когда «Недоступно» даёт максимальный эффект

  • 🟢 Отчёты с широкими таблицами (20+ полей), где пользователю нужна только часть данных.
  • 🟢 Сложные joins: если поле требует соединения с дополнительными таблицами (например, справочниками), его исключение сокращает время выполнения запроса.
  • 🟢 Вычисляемые поля с тяжёлыми формулами: если поле не нужно, его расчёт не выполняется.
  • 🟢 Отчёты с большим количеством группировок, где часть из них можно отключить.

7.2. Когда «Недоступно» не помогает

  • 🔴 Простые отчёты с 3-5 полями: выигрыш в производительности будет минимальным.
  • 🔴 Поля, которые всё равно используются в выражениях (например, для расчёта других полей).
  • 🔴 Отчёты с кэшированием: если данные уже закешированы, исключение полей не ускорит повторное формирование.
  • 🔴 Случаи, когда условие само по себе сложное (например, требует дополнительных запросов к базе для проверки прав).

📊 Тест производительности: На отчёте с 50 полями и 100 000 строк исключение 40 полей через «Недоступно» сократило время формирования с 12 до 4 секунд (тестировалось на 1С:Предприятие 8.3.20 с PostgreSQL).

⚠️ Внимание: В некоторых конфигурациях (особенно с большим количеством ролей) проверка условий «Недоступно» может сама по себе замедлять формирование отчёта. Всегда тестируйте на реальных данных!

Сценарий Эффект от"Недоступно" Рекомендация
Отчёт с 50 полями, пользователю нужны 5 ⚡ Ускорение в 3-5 раз Обязательно использовать
Отчёт с 5 полями 🐢 Минимальный эффект Лучше обойтись"Видимостью"
Поле требует join с большой таблицей ⚡ Значительное ускорение Использовать"Недоступно"
Условие проверяет сложные права 🔄 Может замедлить формирование Кэшировать результаты проверок

8. Альтернативы и когда их применять

Условие «Недоступно» — не единственный способ управлять видимостью элементов в СКД. Рассмотрим альтернативы и их ниши применения.

8.1. Свойство «Видимость»

🔹 Когда использовать:

  • 🎨 Для косметических изменений интерфейса (скрыть ненужные колонки в таблице).
  • 🔄 Когда логика видимости зависит от данных, которые уже загружены (например, скрыть пустые строки).

🔹 Минусы: Не влияет на производительность, так как данные всё равно выбираются из базы.

8.2. Параметры отбора

🔹 Когда использовать:

  • 🔍 Для фильтрации данных по критериям (например, показать только документы за текущий месяц).
  • 🔒 Когда нужно ограничить доступ к строкам, а не к колонкам.

🔹 Минусы: Не позволяет скрывать отдельные поля или группировки.

8.3. Разные схемы компоновки для разных ролей

🔹 Когда использовать:

  • 🛠️ Если логика отчёта принципиально различается для разных пользователей (например, бухгалтерский и управленческий варианты).
  • 📁 Когда нужно полностьюменить структуру отчёта (а не только скрывать элементы).

🔹 Минусы: Усложняет поддержку (приходится синхронизировать изменения в нескольких схемах).

8.4. Программная пост-обработка результата

🔹 Когда использовать:

  • 🔧 Если нужно динамически изменять данные после их получения (например, скрывать строки с нулевыми значениями).
  • 📊 Для сложных правил форматирования, зависящих от данных.

🔹 Минусы: Замедляет отображение отчёта, так как обработка идёт после выборки.

💡 Рекомендация: Для максимальной производительности комбинируйте «Недоступно» (для исключения ненужных данных на этапе запроса) с «Видимостью» (для финальной доводки отображения).

💡

Альтернативы"Недоступно" (например,"Видимость") не дают прироста производительности, но проще в настройке. Выбор инструмента зависит от задачи: если нужно ускорить отчёт — используйте"Недоступно"; если только скрыть элемент — хватит"Видимости".

FAQ: Частые вопросы по условию «Недоступно» в СКД

❓ Почему поле всё равно показывается, несмотря на условие «Недоступно = Истина»?

Наиболее вероятные причины:

  1. Для поля установлено свойство Использование = Всегда.
  2. Условие содержит ошибку (например, обращение к несуществующему параметру).
  3. Схема компоновки модифицируется программно после применения условия.

🔍 Как проверить: Откройте схему компоновки в режиме редактирования и убедитесь, что условие корректно сохранено.

❓ Можно ли использовать «Недоступно» для ресурсов (например, сумм)?

Да, условие работает и для ресурсов. Например, можно скрыть расчёт «Прибыль» для небухгалтеров:

Недоступно = НЕ ТекущийПользователь.ЭтоБухгалтер

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

❓ Как привязать «Недоступно» к ролям пользователя?

Можно использовать встроенные функции проверки ролей:

Недоступно = НЕ ТекущийПользователь.Роли.Содержит("РольДляПросмотраОтчета")

Или создать отдельную функцию:

Функция ПользовательИмеетРоль(ИмяРоли)

Возврат ТекущийПользователь.Роли.Найти(ИмяРоли) <> Неопределено;

КонецФункции

Недоступно = НЕ ПользовательИмеетРоль("Администратор")

❓ Влияет ли «Недоступно» на экспорт отчёта в Excel/PDF?

Да, поля, отмеченные как «Недоступно», не попадут в экспортируемые данные. Это касается всех форматов выгрузки (Excel, PDF, HTML и т.д.).

💡 Совет: Если нужно скрыть данные только в экспорте, но оставить их в предварительном просмотре, используйте «Видимость» вместо «Недоступно».

❓ Можно ли динамически менять «Недоступно» в зависимости от данных в отчёте?

Технически — да, но это требует программного вмешательства. Например, можно модифицировать схему компоновки в обработчике ПриКомпоновкеРезультата:

Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)

Схема = КомпоновщикДанных.ПолучитьСхемуКомпоновкиДанных;

Если ДанныеРасшифровки.Итоги.Сумма > 1000000 Тогда

Схема.Поля.Найти("КрупныйКлиент").Недоступно = Ложь;

Иначе

Схема.Поля.Найти("КрупныйКлиент").Недоступно = Истина;

КонецЕсли;

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

⚠️ Осторожно: Такие манипуляции могут привести к ошибкам, если данные ещё не загружены на момент проверки.