Часто при разработке печатных форм в 1С перед программистом встает задача: вывести данные так, чтобы записи, относящиеся к одному сотруднику, но имеющие разные значения (например, разные даты или количество часов), отображались не отдельными строками, а были сгруппированы в одну ячейку. Поскольку язык запросов 1С не поддерживает прямое объединение строк (подобно операторам GROUP_CONCAT в SQL), давайте разберем, как реализовать это правильно без использования СКД.
Важно помнить, что язык запросов 1С предназначен для получения данных, а не для их сложного форматирования. Операция «склеивания» строк (конкатенации) нескольких записей в одну — это задача уровня представления данных. Поэтому, когда вы получаете результат запроса, у вас есть два основных пути решения проблемы: использование механизма ИТОГИ или постобработка выборки в коде 1С.
Если вам необходимо сгруппировать данные по сотруднику, чтобы вывести их в печатную форму, ИТОГИ ПО — это ваш лучший инструмент в запросе. Этот метод позволяет системе 1С автоматически разделять данные на группы, что упрощает дальнейший обход выборки.
Рассмотрим структуру запроса:
ВЫБРАТЬ
Сотрудники.Сотрудник,
Сотрудники.Дата,
Сотрудники.ОтработаноЧасов
ПОМЕСТИТЬ ВТ_Данные
ИЗ
Документ.РаботаВВыходныеИПраздничныеДни.Сотрудники КАК Сотрудники
ГДЕ
Сотрудники.Ссылка = &Ссылка
;
ВЫБРАТЬ
*
ИЗ
ВТ_Данные КАК ВТ_Данные
ИТОГИ
СУММА(ОтработаноЧасов)
ПО
Сотрудник
При обходе результата такого запроса с помощью метода Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам), вы сначала получаете запись по сотруднику, а внутри нее — все детальные записи. Это позволяет при выводе в ТабличныйДокумент последовательно заполнять области макета или накапливать значения в переменную.
Это самый гибкий способ, который позволяет полностью контролировать формат вывода. Суть метода заключается в обходе выборки запроса и формировании итоговой строки (например, через запятую или символ переноса строки) непосредственно перед передачей в параметр макета.
Давайте проанализируем алгоритм действий:
ТаблицаЗначений или обходим его с помощью ВыборкаРезультатаЗапроса.Рассмотрим пример логики на коде 1С:
Выборка = Запрос.Выполнить().Выбрать();
СтекДанных = "";
ПредыдущийСотрудник = Неопределено;
Пока Выборка.Следующий() Цикл
Если ПредыдущийСотрудник <> Выборка.Сотрудник Тогда
// Здесь мы выводим предыдущего сотрудника в макет с накопленными данными
СтекДанных = "";
КонецЕсли;
СтекДанных = СтекДанных + Формат(Выборка.Дата, "ДЛФ=Д") + " (" + Выборка.ОтработаноЧасов + "ч)" + Символы.ПС;
ПредыдущийСотрудник = Выборка.Сотрудник;
КонецЦикла;
Использование постобработки дает вам неограниченные возможности:
Символы.ПС (перенос строки) внутри одной ячейки.ТабличныйДокумент, если это необходимо.Чтобы ваша работа была структурированной, всегда придерживайтесь следующих правил:
ТабличномДокументе, куда будут выводиться данные. Не пытайтесь уместить логику объединения внутри текста запроса — это приведет к трудночитаемому и неоптимальному коду.Запрос с ИТОГИ ПО, это позволит эффективно обходить данные по иерархии, не перебирая всю таблицу целиком при каждом сравнении.Используя описанные методы, вы сможете легко решить задачу любой сложности по выводу данных в печатные формы, сохраняя при этом чистоту и читаемость вашего кода без необходимости использования СКД.