При настройке типовых отчетов на базе Построителя отчета (например, «Ведомость по взаиморасчетам с контрагентами» в «1С:Управление торговлей 10.3») часто возникает необходимость вывести строковый реквизит документа — такой как Комментарий. Однако при попытке добавить поле вида Сделка.Комментарий в группировки или дополнительные поля система возвращает ошибку о невозможности использования полей неограниченной длины в группировках или операциях сравнения.
Разберем причины возникновения этой ошибки и пошагово реализуем корректное добавление поля в текст запроса и программную структуру Универсального отчета.
В реляционных СУБД строковые данные неограниченной длины хранятся в специализированных структурах (LOB/BLOB). По этой причине на уровне базы данных и платформы 1С:Предприятие на такие поля накладываются строгие ограничения:
СГРУППИРОВАТЬ ПО (GROUP BY), ИТОГИ ПО и УПОРЯДОЧИТЬ ПО (ORDER BY).Когда мы выбираем поле через разыменование ссылки в Универсальном отчете, ПостроительОтчета автоматически модифицирует исходный текст запроса, добавляя выбранное поле во внутренние группировки и секции итогов. Чтобы обойти это ограничение, строковое значение необходимо явно привести к строке фиксированной длины.
Для ограничения длины строки в языке запросов 1С используется функция ВЫРАЗИТЬ(Поле КАК СТРОКА(Длина)). Обратите внимание, что максимальная длина строки для приведения составляет 1024 символа.
Рассмотрим, как модифицировать исходный запрос отчета. Нам необходимо объявить новое поле в блоках выборки Построителя отчета (заключенных в фигурные скобки {}) для каждого подзапроса объединения, чтобы построитель корректно подхватил его как доступное поле.
Откроем модуль отчета, найдем процедуру УстановитьТекстЗапроса и внесем изменения в секции расширения построителя:
// В секции основного выбора построителя:
{ВЫБРАТЬ
Организация.* КАК Организация,
Контрагент.* КАК Контрагент,
ДоговорКонтрагента.* КАК ДоговорКонтрагента,
Сделка.* КАК Сделка,
ДокументРасчетовСКонтрагентом.* КАК ДокументРасчетовСКонтрагентом,
ВалютаВзаиморасчетов.* КАК ВалютаВзаиморасчетов,
Регистратор.* КАК Регистратор,
Период,
ПериодДень,
ПериодНеделя,
ПериодДекада,
ПериодМесяц,
ПериодКвартал,
ПериодПолугодие,
ПериодГод,
СуммаВзаиморасчетовНачальныйОстаток,
СуммаВзаиморасчетовКонечныйОстаток,
СуммаВзаиморасчетовПриход,
СуммаВзаиморасчетовРасход,
СуммаУпрНачальныйОстаток,
СуммаУпрКонечныйОстаток,
СуммаУпрПриход,
СуммаУпрРасход,
ВЫРАЗИТЬ(Сделка.Комментарий КАК СТРОКА(200)) КАК СделкаКомментарий
}
Важный момент: если запрос содержит конструкцию ОБЪЕДИНИТЬ ВСЕ с несколькими вложенными подзапросами (например, выборка по документам расчетов и выборка по управленческому учету), поле должно присутствовать во всех ветках объединения построителя. В тех ветках, где реквизит неприменим, передаем NULL с тем же псевдонимом или сохраняем идентичное выражение.
// Во вложенных ветках объединения построителя:
{ВЫБРАТЬ
Организация.* КАК Организация,
Контрагент.* КАК Контрагент,
ДоговорКонтрагента.* КАК ДоговорКонтрагента,
Сделка.* КАК Сделка,
// ... остальные поля ...
ВЫРАЗИТЬ(Сделка.Комментарий КАК СТРОКА(200)) КАК СделкаКомментарий
}
Чтобы поле стало доступно пользователю в диалоге настройки отчета с понятным наименованием, его необходимо зарегистрировать в объекте УниверсальныйОтчет.
Перейдем в процедуру УстановитьНачальныеНастройки модуля отчета и добавим описание нового поля в структуру представлений и список дополнительных полей:
// Указываем пользовательское представление для поля
УниверсальныйОтчет.мСтруктураПредставлениеПолей.Вставить("СделкаКомментарий", "Комментарий по сделке");
// Устанавливаем связь подчиненного поля с группировкой, к которой оно относится
УниверсальныйОтчет.УстановитьСвязьПолей("СделкаКомментарий", "Сделка");
// При необходимости добавляем поле в состав дополнительных полей по умолчанию
УниверсальныйОтчет.ДобавитьДополнительноеПоле("СделкаКомментарий");
Если поле выводится внутри группировки или сворачивается вместе с ней, а требуется разместить его в отдельном столбце отчета, необходимо обратить внимание на параметры метода ДобавитьДополнительноеПоле или интерактивные настройки в пользовательском режиме:
УстановитьСвязьПолей("СделкаКомментарий", "Сделка") определяет, к какой именно строке группировки привязывается реквизит. Если ошибочно связать комментарий сделки с ДокументРасчетовСКонтрагентом, данные будут выводиться только на детальном уровне расчетов.Проанализируем альтернативные способы работы с подобными реквизитами:
Сделка.Комментарий) можно соединить результат с таблицей документа сделки по ссылке через ЛЕВОЕ СОЕДИНЕНИЕ, сразу обрезав поле через ВЫРАЗИТЬ. Это позволяет оптимизировать выполнение запроса при работе с большими базами данных.Комментарий фиксированную длину (например, 250 или 500 знаков). Это автоматически снимет ограничения на группировку во всех отчетах системы.GROUP BY, если они выводятся как детальные записи или поля ресурса.