Как добавить реквизит неограниченной длины в Универсальный отчет 1С?

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

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

Разберем причины возникновения этой ошибки и пошагово реализуем корректное добавление поля в текст запроса и программную структуру Универсального отчета.

Почему возникает ошибка при работе с полями неограниченной длины?

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

  1. Их нельзя использовать в предложениях СГРУППИРОВАТЬ ПО (GROUP BY), ИТОГИ ПО и УПОРЯДОЧИТЬ ПО (ORDER BY).
  2. Их нельзя использовать в условиях соединения таблиц и проверках на равенство.

Когда мы выбираем поле через разыменование ссылки в Универсальном отчете, ПостроительОтчета автоматически модифицирует исходный текст запроса, добавляя выбранное поле во внутренние группировки и секции итогов. Чтобы обойти это ограничение, строковое значение необходимо явно привести к строке фиксированной длины.

Шаг 1. Корректировка текста запроса в процедуре УстановитьТекстЗапроса

Для ограничения длины строки в языке запросов 1С используется функция ВЫРАЗИТЬ(Поле КАК СТРОКА(Длина)). Обратите внимание, что максимальная длина строки для приведения составляет 1024 символа.

Рассмотрим, как модифицировать исходный запрос отчета. Нам необходимо объявить новое поле в блоках выборки Построителя отчета (заключенных в фигурные скобки {}) для каждого подзапроса объединения, чтобы построитель корректно подхватил его как доступное поле.

Откроем модуль отчета, найдем процедуру УстановитьТекстЗапроса и внесем изменения в секции расширения построителя:


// В секции основного выбора построителя:
{ВЫБРАТЬ
    Организация.* КАК Организация,
    Контрагент.* КАК Контрагент,
    ДоговорКонтрагента.* КАК ДоговорКонтрагента,
    Сделка.* КАК Сделка,
    ДокументРасчетовСКонтрагентом.* КАК ДокументРасчетовСКонтрагентом,
    ВалютаВзаиморасчетов.* КАК ВалютаВзаиморасчетов,
    Регистратор.* КАК Регистратор,
    Период,
    ПериодДень,
    ПериодНеделя,
    ПериодДекада,
    ПериодМесяц,
    ПериодКвартал,
    ПериодПолугодие,
    ПериодГод,
    СуммаВзаиморасчетовНачальныйОстаток,
    СуммаВзаиморасчетовКонечныйОстаток,
    СуммаВзаиморасчетовПриход,
    СуммаВзаиморасчетовРасход,
    СуммаУпрНачальныйОстаток,
    СуммаУпрКонечныйОстаток,
    СуммаУпрПриход,
    СуммаУпрРасход,
    ВЫРАЗИТЬ(Сделка.Комментарий КАК СТРОКА(200)) КАК СделкаКомментарий
}

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


// Во вложенных ветках объединения построителя:
{ВЫБРАТЬ
    Организация.* КАК Организация,
    Контрагент.* КАК Контрагент,
    ДоговорКонтрагента.* КАК ДоговорКонтрагента,
    Сделка.* КАК Сделка,
    // ... остальные поля ...
    ВЫРАЗИТЬ(Сделка.Комментарий КАК СТРОКА(200)) КАК СделкаКомментарий
}

Шаг 2. Регистрация поля в процедуре УстановитьНачальныеНастройки

Чтобы поле стало доступно пользователю в диалоге настройки отчета с понятным наименованием, его необходимо зарегистрировать в объекте УниверсальныйОтчет.

Перейдем в процедуру УстановитьНачальныеНастройки модуля отчета и добавим описание нового поля в структуру представлений и список дополнительных полей:


// Указываем пользовательское представление для поля
УниверсальныйОтчет.мСтруктураПредставлениеПолей.Вставить("СделкаКомментарий", "Комментарий по сделке");

// Устанавливаем связь подчиненного поля с группировкой, к которой оно относится
УниверсальныйОтчет.УстановитьСвязьПолей("СделкаКомментарий", "Сделка");

// При необходимости добавляем поле в состав дополнительных полей по умолчанию
УниверсальныйОтчет.ДобавитьДополнительноеПоле("СделкаКомментарий");

Шаг 3. Настройка вывода поля в отдельную колонку

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

  1. Связь полей: Метод УстановитьСвязьПолей("СделкаКомментарий", "Сделка") определяет, к какой именно строке группировки привязывается реквизит. Если ошибочно связать комментарий сделки с ДокументРасчетовСКонтрагентом, данные будут выводиться только на детальном уровне расчетов.
  2. Тип размещения: В настройках универсального отчета на вкладке «Дополнительные поля» проверьте колонку «Размещение». Значение В отдельной колонке выведет комментарий в самостоятельный столбец таблицы.
  3. Сброс сохраненных настроек: Если после изменения программного кода отчет продолжает выдавать ошибку или не видит поле, необходимо восстановить стандартные настройки отчета в режиме 1С:Предприятие (кнопка «Восстановить настройки»), так как в кэше пользователя могут сохраняться старые схемы запроса.

Альтернативные подходы к решению задачи

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

  1. Левое соединение в запросе: Вместо разыменования через точку (Сделка.Комментарий) можно соединить результат с таблицей документа сделки по ссылке через ЛЕВОЕ СОЕДИНЕНИЕ, сразу обрезав поле через ВЫРАЗИТЬ. Это позволяет оптимизировать выполнение запроса при работе с большими базами данных.
  2. Ограничение длины в конфигураторе: Если комментарий к сделке не предполагает хранения длинных текстов, целесообразно в дереве метаданных установить реквизиту Комментарий фиксированную длину (например, 250 или 500 знаков). Это автоматически снимет ограничения на группировку во всех отчетах системы.
  3. Использование Системы компоновки данных (СКД): При разработке новых отчетов рекомендуется использовать СКД вместо классического Построителя отчета. СКД автоматически управляет полями неограниченной длины и не включает их в секции GROUP BY, если они выводятся как детальные записи или поля ресурса.
← На главную