1с как в скд вывести множественные значения в одну строку через запятую в таблицу

Обновлено: 04.07.2024

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

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

Трюк №1. Многоликость правого значения.

Итак, для разогрева начнём с чего-нибудь попроще. В таких механизмах СКД, как "Отбор" или "Условное форматирование" вы наверняка сталкивались с колонками "Поле" (или "Левое значение") и "Значение" (или "Правое значение"). Профессионалы, наверняка знают этот трюк, но начинающим не всегда легко догадаться, что поле компоновки данных можно использовать как слева, так и справа (т.е. сравнивать не только заданные фиксированные значения, но и другие поля СКД в пределах одной строки). Для этого достаточно в поле правого значения зайти в режим редактирования, нажать кнопку очистки значения ("кретик"), затем нажать появившуюся кнопку выбора типа (буква "Т") и выбрать тип "Поле компоновки данных".

Пример.
В качестве примера я не стал изобретать велосипед, а взял самую обычную оборотно-сальдовую ведомость по счету 60 из демо-версии 1С:Бухгалтерии (я использую ред. 2.0.). Кто не знает, начиная с редакции 2.0 этот отчёт сделан на базе СКД.

Итак, зададим прямо в ней отбор для строк с условием "БУ Дт (оборот)" Равно "БУ Кт (оборот)", а также применим к отчёту условное оформление, подсветив жёлтым цветом ячейки строк, где "БУ Кт (кон. сальдо)" Больше "БУ Кт (оборот)". Если кто не знает, как включить панель "Оформление" - найдите кнопку "Параметры панели настроек" справа от надписи "Панель настроек".

Конечный результат должен получиться примерно таким:



Трюк №2. Отбор на группировках.

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

Пример.
Цель примера: отобразить ОСВ, в которой для взаиморасчетных счетов (60,62,76) показать расшифровку по контрагентам, а для затратных (20,23,25,26) - по статьям затрат.

Сама СКД реализована в виде набора данных, где используется запрос к виртуальной таблице остатков и оборотов регистра бухгалтерии "Хозрасчетный".
Размещаем вложенные группировки "Организация" и "Счет". В группировке "Счет" параллельно размещаем 2 группировки "Субконто1" и "Субконто2", для которых задаем соответствующие отборы.
Иллюстрацию настройки привожу в скриншоте:



Если в основных настройках отчёта на закладке "Другие настройки" вы не отключали вывод отборов, то это обязательно нужно будет сделать в "других настройках" наших группировок "Субконто1" и "Субконто2"

Трюк №3. Шапка-невидимка

Следующий трюк можно представить, как продолжение предыдущего. Если вы обратили внимание, в получившемся отчёте несмотря на то, что фактически у нас выводится только одно субконто, в шапку попадают оба (и "Субконто1" и "Субконто2"). К сожалению разработчики СКД не предусмотрели возможность регулирования видимостью шапки или использования какого-нибудь служебного символа, при установке которого в качестве заголовка, шапка поля бы не формировалась. Но, как вы уже, наверное, догадались есть трюк, который в какой-то степени поможет обойти данное ограничение.

При разработке схемы в предопределённом макете оформления добавьте макет группировки, с определением по имени группировки "Невидимка" так, как показано на скриншоте. Обратите внимание, что поле "Область" должно остаться пустым!


А затем задайте для группировки "Субконто2" имя "Невидимка":


И вуаля. шапка группировки "Субконто2" исчезает, а отчёт становится вот таким:


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

Да, есть ещё один ньюанс этого трюка: учитывайте, что "шапка-невидимка" накрывает не только эту группировку, но и все нижестоящие! Т.е. если вы назначите имя "Невидимка" группировке "Субконто1", то в шапке не будет видно ни "Субконто1", ни "Субконто2"!

Трюк №4. Называй меня как хочешь

Большинство разработчиков СКД знают, как можно задать заголовок поля запроса. На закладке СКД "Наборы данных", достаточно поставить галочку отмены автозаголовка и внести в поле "Заголовок" необходимый текст. Минус состоит в том, что в пользовательском режиме, этот способ недоступен, а переименовать заголовок хочется не прибегая к помощи конфигуратора. Так вот в настройках вариантов отчёта есть не только способ переименовать заголовки полей, но и "накрыть" их группировочной "шапкой". Для этого на закладке "Выбранные поля" необходимо выделить нужные поля и нажать правую кнопку мыши. Как видно на скриншоте для полей доступны опции "Установить заголовок" и "Сгруппировать поля".
Обратите внимание, что для полей группировок установку заголовка необходимо делать также именно через закладку "Выбранные поля", а не через контекстное меню "Установить имя" в верхней (структурной) части настройки варианта!




После всех настроек вариант отчёта выглядит вот так:




P.S.
Небольшая подсказка для тех, кто будет качать схему. Схема - одна, но все трюки выполнены в виде отдельных вариантов настроек отчёта этой схемы:

Пример того как можно получить поля предыдущей записи в группировке и не только. Удобно для вычисления разницы значений предыдущей цены и текущей.

Автор данного вопроса хотел посчитать отклонение текущей цены от предыдущей. Мое решение выглядит так:


Суть решения заключается в использовании функции языка выражений СКД ВычислитьВыражение() в добавленном вычисляемом поле, которое я назвал Дельта. У функции следующие параметры:

Нас интересует 4 и 5 параметр (Начало и Конец). Выражение будет выглядеть следующим образом:

- здесь вычисляем предыдущее значение поля Цена и из него вычитаем текущее значение поля Цена. Естественно, для первой записи предыдущее значение не будет вычислено и результат вычитания со значением текущего поля будет Null, поэтому что бы все было «чисто» используем функцию isNULL(естьNull), чтобы преобразовать Null в число ноль.


Поместить таблицу значений в ячейку табличного документа

Иногда бывает необходимо поместить табличную часть документа или данные, которые представляют собой строки табличной части в одну ячейку табличного документа, например так:


Для этого необходимо воспользоваться функцией: ВычислитьВыражениеСГруппировкойТаблицаЗначений(), у которой есть параметры:

  • Выражение - выражение, которое нужно вычислить. Тип Строка. В строке может быть перечислено несколько выражений через запятую. После каждого выражения может быть необязательное ключевое слово КАК и имя колонки таблицы значений. Например: "Контрагент, Сумма(СуммаОборот) Как ОбъемПродаж".
  • ВыраженияПолейГруппировки - выражения полей группировки, перечисленные через запятую. Например, "Контрагент, Партия";
  • ОтборЗаписей - выражение, применяемое к детальным записям. Например, "ПометкаУдаления = Ложь";
  • ОтборГруппировок - отбор, применяемый к групповым записям. Например: "Сумма(СуммаОборот) > &Параметр1".

Для этого создаем вычисляемое поле, в которое будем выводить получившуюся таблицу, затем помещаем это поле в ресурсы с выражением


Пронумеровать колонки

Пример того как можно пронумеровать колонки в СКД.


  1. Создаем запрос, в котором нумеруем строки результата запроса в пределах определенного подчинения
  2. Выводим результат в кросс-таблицу

ВАЖНО!

После того как строки в запросе пронумерованы их необходимо поместить в ВТ и потом из этой ВТ выбирать, иначе СКД сделает все по-своему и в группировку попадут не те поля

Для того чтобы получить результат необходимо создать:

1. Вычисляемое поле с выражением "Сотрудник" + Формат(НПП,"ЧЦ=3; ЧВН=")
2. Вычисляемое поле ФИО, в которое просто поместить Сотрудник
3. Ресурс с выражением Максимум(ФИО) или просто ФИО – никакой разницы

Чередование групп с выделением цветом


Это достигается созданием вычисляемого поля:

Считаем количество различных "группировок" поля Номенклатура, группировки получается считать за счет установки значения параметра ОбработкаОдинаковыхЗначенийПорядка = "Вместе"

Остаток от деления на два даст понять это четная группа или нет, соответственно, создаем элемент условного оформления с условием Поле = 1

Более простое решение предложил Skillhoster:

Остатки в разрезе характеристик. Характеристики в строку с количеством в скобках


Это достигается использованием все той же функции ВычислитьВыражениеСГруппировкойМассив()

В этом примере функция выглядит так:

Третий параметр - это отбор, позволяет избежать представления пустой строки "" – соответственно вы не увидите остатков без характеристик

Соединить две таблицы с ключом Строка = Число

Или вариант как в СКД значение типа число преобразовать в строку

Периодически на форумах вижу тему вида «Как преобразовать число в строку в запросе». Если вы пишете отчет на СКД и вам необходимо выполнить подобное преобразование, то никаких хитростей в запросе писать не надо.

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

Для того чтобы преобразовать строку в число можно воспользоваться функцией Вычислить()

Сортировка по строке как по числу

В своем примере я просто выведу справочник сотрудники, отсортировав его по табельному номеру (коду)


Результат будет выглядеть следующим образом:

Это достигается, созданием вычисляемого поля и использованием функции языка выражений СКД Вычислить()

  1. Создаем вычисляемое поле ТабНомерЧисло, с выражением: Вычислить(Сотрудник.Код)
  2. Сортируем по этому полю


по сути это преобразование строки в число с помощью функции языка выражений СКД Вычислить()

Советую так же посмотреть «Видеоуроки по СКД»(легко ищется в гугле)

Добрый вечер. Понимаю, что тема заезженная, но, столкнувшись с данной задачей, возникли проблемы. Нашел множество примеров в интернете, но на моем примере они почему-то не работают. В отчет выводится регистратор и комментарий из регистра, соответственно нужно сгруппировать по регистратору, а комментарии перечислить через запятую в одной ячейки в детальной записи. Делаю поле "комментарий" ресурсом в выражение пишу "соединитьстроки(массив(комментарий))" появляется снизу колонка "итог" в которой перечислены значений комменьарьев по всем регистратором через запятую, а в детальных записях так же выводится :

регистратор1 комментарий1
регистратор1 комменьарий2
регистратор1 комменьарий3
Итог : комменьарий1, комменьарий2, комментарий3

Помогите, пожалуйста, что я не так делаю?

Дело в том, что в похожих примерах в интернете в результате у всех получается такая картина

в моем же случае только итог выводится через запятую, остальная часть отчета остается прежней

(4) да уже по всякому кручу-верчу, без него точно такой же результат получается

ты комментарий откуда берешь ?

есть много вариантов извращения.
1) Можно соединить самому комментарий, а в скд передать уже таблицу значений. где комментарий будет у тебя 1, через твой разделитель.
2) Делаешь 2 набора записей и делаешь соединить строку через таблицу значений и выводишь.

(6) комментарий реквизит регистра (регистратор из него же). Но это совсем уже как-то по извращенному))
(7) тебе виднее :)
Я предложил варианты.
второй более попроще.
(8) я что-то второй не понял, 2 набора записей где делать?
первая закладка 2 набора данных. делаешь между ними соединения
(10) а, ну это тоже не подойдет - получается запрос дважды выполниться по регистру, а он огромный
покажи как ты выводишь. может действительно не нужно в нем детальные записи. да и делов то :)
(12)
у меня обычный запрос, который выбирает поля из регистра. А настройка вывода тоже самая обычная - детальные записи в которые накинуты эти поля из регистра, только вот поле комментарий дублирует некоторые записи, там где дублирует нужно в одну ячейку свернуть эти комментарии. Что значит убрать детальные записи? Мне нужно это реализовать в линейном виде без группировок

ты вообще читал про соединить строки ? что работаю только для группировок. если нет группировки. то только 2 набора данных.

Моя конфигурация - 1С Университет ПРОФ, редакция 1.1 (1.1.7.1), хотя в данном вопросе суть не в этом.

Создание отчета выполняется через систему компоновки данных.

Моя задача была вот в чем:

Отчет создается через Систему компоновки данных.

На вкладке "Связи" настраиваем связь между этими наборами данных.

Источник связи - НаборДанных1, приемник связи - НаборДанных2, Выражение источник - Ссылка из НаборДанных1, Выражение приемник - Ссылка из НаборДанных2.

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

Выбираем поле Авторы.Автор и в части "Выражение" пишем:

то есть мы указываем, что объединяем массив данных и размещаем записи через ", ".

В настройках отчета создаем группировку, я поле не выбирала, т.е. добавила ДетальныеЗаписи.

Ну, и как обычно выбираем поля, которые отчет должен отражать, и добавляем отборы.

Внешний отчет с выводом ТЧ в одну ячейку через запятую

Специальные предложения

Electronic Software Distribution

Интеграция 1С с системой Меркурий

Алкогольная декларация

Готовые переносы данных

54-ФЗ

Управление проектом на Инфостарте

Траектория обучения 1С-разработчика

Эх, стыдоба, я внешнюю функцию сделал в общем модулея для этого :)) Спасибо! Ээээ. Это ж типовая тема - ничего нового и хитрого. В мануалах все описано Удивляет, что появлении незнакомой задачи люди пытаются перерыть множество сайтов, но не документацию.

Выложить разработкой простейшее использование базовых возможностей СКД это круто.

Но раз люди плюсуют, значит, кому-то действительно полезно.

Где-то на сайте уже было описано года два назад. Я помню, потому что мы тогда делали серию похожих отчетов с выводом данных из ТЧ.

1. Адский баян.
2. Достаточно просто использовать Массив, без СоединитьСтроки, тогда ещё и расшифровка будет работать. (Если не нужны экзотические разделители.)

(6) Я бы сказал, это описано в документации по СКД (F1) N лет назад.

(10) dock, F1 в конфигураторе

"1С:Предприятие 8" - "Система компоновки данных" - "Язык выражений системы компоновки данных"

СоединитьСтроки (JoinStrings)
Предназначена для объединения строк в одну строку.
Синтаксис:
СоединитьСтроки (Значение, РазделительЭлементов, РазделителиКолонок)
Параметры:
Значение - выражения, которые нужно объединить в одну строку. Если является Массивом, то в строку будут объединяться элементы массива. Если является ТаблицаЗначений, то в строку будут объединяться все колонки и строки таблицы;
РазделительЭлементов - строка, содержащая текст, который нужно использовать в качестве разделителя между элементами массива и строками таблицы значений. По умолчанию – символ перевода строк;
РазделителиКолонок -строка, содержащая текст, который нужно использовать в качестве разделителя между колонками таблицы значений. По умолчанию "; ".
Пример:
СоединитьСтроки(ТаблицаЗначений(НомерТелефона, Адрес));

Массив (Array)
Функция формирует массив, содержащий для каждой детальной записи значение параметра.
Синтаксис:
Массив([Различные] Выражение)
В качестве параметра можно использовать таблицу значений. При этом результатом работы функции будет массив, содержащий значения первой колонки таблицы значений, переданной в качестве параметра.
Если выражение содержит функцию Массив, то считается, что данное выражение является агрегатным.
Если указано ключевое слово Различные, то получаемый массив не будет содержать дублирующихся значений.
Пример:
Массив(Контрагент)

Читайте также: