Как объединить строки с разными значениями в одну ячейку без использования СКД?

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

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

Понимание ограничений языка запросов

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

Способ №1: Использование механизма «ИТОГИ ПО»

Если вам необходимо сгруппировать данные по сотруднику, чтобы вывести их в печатную форму, ИТОГИ ПО — это ваш лучший инструмент в запросе. Этот метод позволяет системе 1С автоматически разделять данные на группы, что упрощает дальнейший обход выборки.

Рассмотрим структуру запроса:


ВЫБРАТЬ
    Сотрудники.Сотрудник,
    Сотрудники.Дата,
    Сотрудники.ОтработаноЧасов
ПОМЕСТИТЬ ВТ_Данные
ИЗ
    Документ.РаботаВВыходныеИПраздничныеДни.Сотрудники КАК Сотрудники
ГДЕ
    Сотрудники.Ссылка = &Ссылка
;
ВЫБРАТЬ
    *
ИЗ
    ВТ_Данные КАК ВТ_Данные
ИТОГИ
    СУММА(ОтработаноЧасов)
ПО
    Сотрудник

При обходе результата такого запроса с помощью метода Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам), вы сначала получаете запись по сотруднику, а внутри нее — все детальные записи. Это позволяет при выводе в ТабличныйДокумент последовательно заполнять области макета или накапливать значения в переменную.

Способ №2: Постобработка результата запроса в коде 1С

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

Давайте проанализируем алгоритм действий:

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

Рассмотрим пример логики на коде 1С:


Выборка = Запрос.Выполнить().Выбрать();
СтекДанных = "";
ПредыдущийСотрудник = Неопределено;

Пока Выборка.Следующий() Цикл
    Если ПредыдущийСотрудник <> Выборка.Сотрудник Тогда
        // Здесь мы выводим предыдущего сотрудника в макет с накопленными данными
        СтекДанных = ""; 
    КонецЕсли;
    
    СтекДанных = СтекДанных + Формат(Выборка.Дата, "ДЛФ=Д") + " (" + Выборка.ОтработаноЧасов + "ч)" + Символы.ПС;
    ПредыдущийСотрудник = Выборка.Сотрудник;
КонецЦикла;

Почему постобработка — это предпочтительный вариант?

Использование постобработки дает вам неограниченные возможности:

Рекомендации по реализации

Чтобы ваша работа была структурированной, всегда придерживайтесь следующих правил:

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

← На главную