1с скд соединить строки не работает
Конкатена́ция — это операция склеивания объектов линейной структуры. В 1С конкатенации (+ или &) используется для того, чтобы присоединить одну строку к другой. В результате использования конкатенации значений длина строки получается равна сумме длин соединяемых строк. Если типы данных второго или последующих операндов со строковым типом не совпадают, их значение преобразуется к строковому типу переменных (т.е., например, число автоматически будет преобразовано к типу переменной, указанной слева от оператора +).
ФИОГР=Имя+ “ “ +Отчество+ “ “ +Фамилия + “ гр- “ + 1987;
//получим Остап Ибрагимович Бендер гр-1987
Если нужно из некоторой коллекции строк получить одну единую, это можно сделать в цикле:
ИтогСтрока = Строка + ЭлементКоллекции;
Работа функции конкатенации не вызывает проблем с производительностью, когда обрабатывается небольшое количество данных. Производительность может упасть, когда счет строк идет на тысячи.
Есть несколько вариантов получения строки из коллекции.
Первый – с помощью текстового документа. В этом случае все составные части будут идти отдельными строками. При использовании функции ПолучитьТекст(), нужно будет сделать замену символов переноса строк в коде на пустую строку, а после получения результата использовать метод обратного преобразования.
Другой способ – занести все подстроки в массив, который преобразуется в текстовое представление с помощью функции ЗначениеВСтрокуВнутр(), а далее лишнее очищается.
При массовых операциях конкатенации строк можно использовать методы платформы СтрРазделить и СтрСоединить.
ИзвТекст= Новый Массив;
Для НомерКолонки = 1 По Макет.ШиринаТаблицы Цикл
ИзвТекст.Добавить(ТекстОбласти);
…
РезультатТекст = СтрСоединить(ИзвТекст, Символы.ПС);
Еще один способ операции конкатенации строк — использование объекта ЗаписьXML. У этого объекта можно использовать метод ЗаписатьБезОбработки() для «сборки» документа в том виде, какой подается на вход, т.е. без лишних тегов.
2. Конкатенация в запросах
Конкатенация в запросах может использоваться при программной "сборке" текста запроса. Пример:
Пример изменения имени таблицы в запросе:
"ВЫБРАТЬ
|ТаблицаСправочника.Наименование КАК Наименование,
|ТаблицаСправочника.Код КАК КодСправочника
|ИЗ
|&ТабСправочника КАК ТаблицаСправочника";
ТекстЗапроса = СтрЗаменить(ТекстЗапроса , "&ТабСправочника", "Справочник." + ИмяСправочника);
Также к данной функции можно прибегнуть, когда нужно сложить части строки, чтобы результат мог потом стать проверяемым параметром.
ВЫРАЗИТЬ(ВЫРАЗИТЬ("123" КАК Строка(3))+ВЫРАЗИТЬ("789" КАК Строка(3))
КАК Строка(6)) КАК Результат
Справочник.Номенклатура КАК Номенклатура
Специалист компании «Кодерлайн»
Вас могут заинтересовать следующие статьи:
Есть запрос на СКД.
Нужно, при формировании документа-результата, обращаться к каждой текущей строке выборки и, проверяя значения на соответствие условиям, выводить определенные данные в свой макет группировки. Кроме того по каждой строке нужно в переменную записывать по условию сумму значений (т.е. из одной строки сумму включать в переменную, из другой нет), а затем выводить ее в свой макет общих итогов (стандартные общие итоги не считают по такому алгоритму).
Подскажите, как это можно сделать?
а в других процедурах (ПриКомпоновкеРезультата или других) нельзя отловить каждую текущую строку выборки?
(9) нет, пробовал их.
у меня так(результат запроса):
Договор____СуммаДоговора____Документ
1__________5000_____________Док1
1__________5000_____________Док2
1__________5000_____________Док3
1__________5000_____________Док4
В общих итогах по полю Договор выводит 20000, хотя сумма по договору=5000 и надо выводить 5000.
Поэтому думал как-то программно проверять на значение текущей строки в выборке и суммировать в какую-то переменную реальную сумму по договору(5000) и потом значение этой переменной выводить в общие итоги.
(11)так я и суммирую только по договору. Договор есть в четырех документах, соответственно 5000*4=20000. А сумма по договору=5000.
т.е. надо так сделать:
Договор____СуммаДоговора____Документ__СуммаДока
1__________5000_____________Док1_______100
1__________5000_____________Док2_______5600
1__________5000_____________Док3_______4500
1__________5000_____________Док4_______1200
2__________3000_____________Док1_______500
2__________3000_____________Док2_______1600
2__________3000_____________Док3_______2500
2__________3000_____________Док4_______1250
Итого______8000________________________ХХХ
т.е. чтобы итоговая сумма по всем договорам была равна 8000
(10) Я так понял группировка Документ самая нижняя. Добавь в запросе еще одно поле для счетчика документов. На закладке ресурсы добавь еще один ресурс СуммаДоговора рассчитывать по договору, в выражении Сумма(СуммаДоговора)/Сумма(ПолеСчетчикаДокументов) и есстественно через выбор для проверки Сумма(ПолеСчетчикаДокументов) <> 0. Как-то так. Это если структура группировок жесткая.
(16) пробовал этот вариант: для отдельного договора считает сумму по договору правильно, для общих итогов неправильно. Для примера (14) итог по сумме договора посчитает 32000/8=4000, а надо 8000
(17) В общем-то можно в форму добавить новую кнопку "Сформировать" и прописать алгоритм формирования отчета через СКД. Если надо, я могу алгоритм обработки скинут
(21) подскажите, как там проверить, какая группировка там текущая и в зависимости от этого выводить свой определенный макет вместо стандартного.
(14) У тебя не правильно построен запрос. необходимо в компоновке создать два набора данных "Договор" и "Документы" и связать их на закладке "Связи наборов данных" и ВСЕ.
(23) так то же самое получится. Для одного договора (и его суммы) есть несколько документов. При Левом соединениии (все договоры и документы удовлетворяющие условию связи по договору) будет таблица как в (14), т.е. суммы договоров будут повторяться для каждого документа. Далее в итогах они будут увеличиваться в столько раз, сколько документов по договору.
(24) Есть еще вариант, не знаю, будет ли тебе это сложновато?
В СКД есть возможность импользовать "Вложенные схемы".
Суть в том, чтоб строку с итогами выводить отдельной схемой
(28) Не путай человека.
(27) Если в СКД применять несколько наборов данных, то итоги рассчитываются в каждом из них отдельно.
(31) Все зависит от задачи. Ты можешь написать сколь угодно сложные запросы в наборах, а компоновка будет обрабатывать уже готовые наборы. В том числе и при помощи описания связей.
еще вопрос в тему: если в какую-то колонку (поле) в скд нужно будет выводить результат выборки строк какой-то таблицы (прямо через запятую последовательно значения строк выборки), то как это можно сделать?
т.е. примерно так (характеристики):
Договор____СуммаДоговора_____Характеристики_______Документ
1__________5000_______________доп.согл1,допсогл2___Док1___
1__________5000_______________доп.согл1,допсогл2___Док2___
1__________5000_______________доп.согл1,допсогл2___Док3___
1__________5000_______________доп.согл1,допсогл2___Док4___
2__________3000_______________доп.согл1,допсогл2___Док1___
2__________3000_______________доп.согл1,допсогл2___Док2___
2__________3000_______________доп.согл1,допсогл2___Док3___
2__________3000_______________доп.согл1,допсогл2___Док4___
Итого______8000___________________________________________
(36) т.е. так же отдельным набором данных присоединить таблицу характеристик к таблице договоров по условию совпадения по договору, а как потом перебрать все значения таблицы характеристик по договору и вставить их в одну ячейку?
(38) неправильно написал: в поле характеристики через запятую надо вывести значения строк регистра сведений по каждому договору.
(39) Сворачивание нескольких строк в одну отдельная задача.
А в данном случае не понял структуру характеристик. "доп.согл." - это значение характеристики? Тип какой? Сколько может быть характеристик? Подозрение, что не совсем верно организовано хранение данных. Если доп.согл. - это документы, то лучше бы добавить в них реквизит с ссылкой на договор. В общем не понятно.
(40) мне как раз и нужно несколько строк в одну свернуть.Это можно сделать с помощью конструктора скд?
Характеристики - это периодический регистр сведений для договора. Хранит номера, даты, названия доп. соглашений с опред. даты. Нужно перебрать все строки регистра по договору, и вывести их результат через запятую в одном поле скд.
(41) СКД такой вопрос не решает. Можно при помощи запроса (много раз обсуждалось) или при помощи предварительной обработки характеристик - создаем программно ТЗ с колонками "Договор" и "Характеристики" (уже свернутые) и передаем в СКД как объект.
я как раз запросом и пытаюсь сделать - добавил для характеристик набор-запрос, а как в одну строку-то свернуть?
Кстати. В 8.2.14 появилась в СКД функция ВычислитьВыражение, которая, если я правильно понял, может делать тоже самое, что и запрос из (46).
(46) а если у меня для объекта может быть 1 св-во, а может быть и 20, то тогда надо добавлять 20 полей?
КАК Свойство1
.
КАК Свойство20
(48) Ну если кому то нужен отчет, в ячейке которого через запятую будет перечислено 20 свойств - пиши "КАК Свойство20".
А в приведенный запрос будет отображать первые четыре даже если реально 20.
(49) имел ввиду нет ли чего более универсального, т.к. хранить во врем. таблице 20 полей, которые не всегда будут использованы.
Функция возвращает массив, каждый элемент которого содержит результат вычисления выражения для группировки по указанному полю.
Строка() - Если в качестве параметра передан массив, то функция возвращает строку, содержащую строковые представления всех элементов массива, разделенных символами "; ".
(67) через Строка пробовал, но в тексте запроса это не работает, опять же непонятно, как какой-то тип (число, дата) преобразовать в строку в самом запросе
(69) в вычисляемых полях нельзя использовать в выражении вычисляемые поля. У меня нужно сначала к дате добавить символ (", "), затем сложить несколько таких полей. Т.е. поле с датой и с символом(",") должно быть готовое уже в запросе, а потом в вычисляемом поле уже несколько таких полей сложить.
В запросе получаешь поля Т.Свойство1 . Т.Свойство20.
в вычисляемом поле пишешь
Формат(Свойство1,"ДЛФ=D") + ", " + . + Формат(Свойство20,"ДЛФ=D")
(71) я именно так и сделал. Не устраиваю лишние запятые в случае пустых значений. Поэтому нужна предварительная обработка, чтобы "Свойство1" уже содержало текст "Свойство1, " в случае наличия, и текст "" в случае отсутствия текста в "Свойство1".
можно ли менять размер колонок в скд, не используя макеты? Потому как слишком широкие стандартные колонки.
(83) Колонка "Оформление" в описании полей на закладках "Наборы данных" и "Вычисляемые поля".
Или постобработка табличного документа.
ВычислитьВыражениеСГруппировкойМассив пока оставлю. Попробую еще вариант сделать то же через внешний набор данных.
Шрифт заголовков можно изменить в "Макете оформления компоновки данных". Выбор макета осуществляется в настройках компоновки на закладке "Другие настройки". Создать свой макет можно либо в общих макетах ветки конфигурации. либо в другом объекте где возможно создание макетов. При создании макета надо указать тип макета - "Макет оформления компоновки данных". В открывшемся окне редактора макета, за основу возможно взять один из стандартных макетов и отредактировать его.
В какой процедуре нужно этот макет оформления (созданный на основе стандартного) привязывать к компоновщику макета? При нажатии на кнопку "сформировать"? т.е. надо свою кнопку "сформировать" с обработчиком делать?
(92) это стандартный макет. Я так понял, чтобы изменить шрифт заголовков полей группировок, нужно создать свой макет оформления и в нем изменить шрифт. А потом программно его подвязать к компоновщику макета. Если не так, поясните.
(29) Вы писали, что если в СКД применять несколько наборов данных, то итоги рассчитываются в каждом из них отдельно.
Подскажите, если делать не через скд, а просто запросом в модуле отчета, то как результат запроса можно привести к виду (т.е. чтобы итоговая сумма по всем договорам была равна 8000)?
таб1:
Договор____СуммаДоговора____Документ__СуммаДока
1__________5000_____________Док1_______100
1__________5000_____________Док2_______5600
1__________5000_____________Док3_______4500
1__________5000_____________Док4_______1200
2__________3000_____________Док1_______500
2__________3000_____________Док2_______1600
2__________3000_____________Док3_______2500
2__________3000_____________Док4_______1250
Итого______8000________________________ХХХ
т.е. чтобы итоговая сумма по всем договорам была равна 8000.
Я кроме как объединением таблиц не знаю. В случае объединения будет так (таб2):
Договор____СуммаДоговора____Документ__СуммаДока
1__________5000_____________""_________0
1__________0________________Док1_______5600
1__________0________________Док2_______4500
1__________0________________Док3_______1200
2__________3000_____________""_________0
2__________0________________Док1_______1600
2__________0________________Док2_______2500
2__________0________________Док3_______1250
Итого______8000________________________ХХХ
Подскажите, можно ли такое сделать через соединение, т.к. в 1-ом результате (таб1) если делать итоги по сумме договора, получится 32000.
(94)-(95). Создал в разделе макетов отчета макет с типом "Макет оформления компоновки данных". В нем загрузил стандартный макет. Изменил его. Сохранил. Макет в настройках не появился.
+(98)
Подвязал этот макет к компоновщику макета:
После этого отчет выводится через этот макет. Но в настройках его не нашел, поясните.
Объединение строк в СКД СоединитьСтроки
у меня возникли иные проблемы с отчетом. оказывается наш отчет показывает не совсем правильные данные и я незнаю почему. помогите пожалуйста. заранее спасибо. я приложил скриншоты где описал и показал всю проблему надеюсь поймете. ЗАпрос проверил в консоли,все правильно
на закладке Ресурсы :
Поле ДатаДиска - Выражение Выбор Когда ЗначениеЗаполнено(Сумма(Ко личествоНеОтгруженных)) Тогда СоединитьСтроки(Формат(Дат аДиска, "ДФ=MM.yy"),",") Иначе "" Конец ;
Поле КоличествоНеОтгруженных - Выражение Сумма(КоличествоНеОтгруже� �ных) ;
Поле ДатаДиска - Выражение Null , Расчитывать по . Общий итог
В Настройках отчета :
вывод виде группировки по всем полям
ВЫБРАТЬ
ИТС_ПодпискиСрезПоследних. Организация,
ИТС_ПодпискиСрезПоследних. Контрагент КАК Контрагент,
ИТС_ПодпискиСрезПоследних. ВидПодписки,
ИТС_ПодпискиСрезПоследних. ДатаНачала,
ИТС_ПодпискиСрезПоследних. ДатаЗавершения,
ИТС_ПодпискиСрезПоследних. Контрагент.ОсновноеКонтак� �ноеЛицо,
ИТС_ПодпискиСрезПоследних. СостояниеЗаявки,
ИТС_ПодпискиСрезПоследних. Заявка.РегНомер КАК РегистрационныйНомер,
ИТС_ПодпискиСрезПоследних. Заявка
ПОМЕСТИТЬ ВТ_ИТСПодпискиСрезПоследн� �х
ИЗ
РегистрСведений.ИТС_Подпис ки.СрезПоследних(&Дата, Организация = &Организация) КАК ИТС_ПодпискиСрезПоследних
ИНДЕКСИРОВАТЬ ПО
Контрагент
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_ИТСПодпискиСрезПоследн� �х.Организация,
ВТ_ИТСПодпискиСрезПоследн� �х.Контрагент,
ВТ_ИТСПодпискиСрезПоследн� �х.ВидПодписки,
ВТ_ИТСПодпискиСрезПоследн� �х.ДатаНачала,
ВТ_ИТСПодпискиСрезПоследн� �х.ДатаЗавершения,
МАКСИМУМ(ВЫБОР
КОГДА НЕ ЕСТЬNULL(КонтактнаяИнформац� �я.Поле6, "") = ""
ТОГДА "Ул. " + КонтактнаяИнформация.Поле6 + ВЫБОР
КОГДА НЕ ЕСТЬNULL(КонтактнаяИнформац� �я.Поле7, "") = ""
ТОГДА ", Дом " + КонтактнаяИнформация.Поле7 + ВЫБОР
КОГДА НЕ ЕСТЬNULL(КонтактнаяИнформац� �я.Поле8, "") = ""
ТОГДА ", " + КонтактнаяИнформация.Поле8 + ВЫБОР
КОГДА НЕ ЕСТЬNULL(КонтактнаяИнформац� �я.Поле9, "") = ""
ТОГДА ", " + КонтактнаяИнформация.Поле9
ИНАЧЕ ""
КОНЕЦ
ИНАЧЕ ""
КОНЕЦ
ИНАЧЕ ""
КОНЕЦ
ИНАЧЕ ""
КОНЕЦ) КАК Адрес,
МАКСИМУМ(КонтактнаяИнформ� �ция.Поле3) КАК Телефон,
ВТ_ИТСПодпискиСрезПоследн� �х.Контрагент.ОсновноеКонт� �ктноеЛицо,
ВТ_ИТСПодпискиСрезПоследн� �х.СостояниеЗаявки,
ВТ_ИТСПодпискиСрезПоследн� �х.Заявка.РегНомер КАК РегистрационныйНомер,
ВТ_ИТСПодпискиСрезПоследн� �х.Заявка КАК Заявка
ПОМЕСТИТЬ ПодпискиИТС
ИЗ
ВТ_ИТСПодпискиСрезПоследн� �х КАК ВТ_ИТСПодпискиСрезПоследн� �х
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Контактна� �Информация КАК КонтактнаяИнформация
ПО (ВТ_ИТСПодпискиСрезПоследн их.Контрагент = (ВЫРАЗИТЬ(КонтактнаяИнформ ация.Объект КАК Справочник.Контрагенты)))
И (КонтактнаяИнформация.Вид В (ЗНАЧЕНИЕ(Справочник.ВидыК� �нтактнойИнформации.ЮрАдре сКонтрагента), ЗНАЧЕНИЕ(Справочник.ВидыКо нтактнойИнформации.Телефо� �Контрагента)))
СГРУППИРОВАТЬ ПО
ВТ_ИТСПодпискиСрезПоследн� �х.ВидПодписки,
ВТ_ИТСПодпискиСрезПоследн� �х.Организация,
ВТ_ИТСПодпискиСрезПоследн� �х.Контрагент,
ВТ_ИТСПодпискиСрезПоследн� �х.ДатаНачала,
ВТ_ИТСПодпискиСрезПоследн� �х.ДатаЗавершения,
ВТ_ИТСПодпискиСрезПоследн� �х.СостояниеЗаявки,
ВТ_ИТСПодпискиСрезПоследн� �х.Заявка,
ВТ_ИТСПодпискиСрезПоследн� �х.Контрагент.ОсновноеКонт� �ктноеЛицо,
ВТ_ИТСПодпискиСрезПоследн� �х.Заявка.РегНомер
ИНДЕКСИРОВАТЬ ПО
Заявка
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ИТС_ДискиСрезПоследних.Зая вка КАК Заявка,
СУММА(ВЫБОР
КОГДА ИТС_ДискиСрезПоследних.Сос тояниеДиска = ЗНАЧЕНИЕ(Перечисление.ИТС_� �идыСостоянийДисков.Получе н)
ТОГДА 1
КОНЕЦ) КАК КоличествоНеОтгруженных,
ДОБАВИТЬКДАТЕ(ИТС_ДискиСре зПоследних.Заявка.ДатаНача ла, МЕСЯЦ, ИТС_ДискиСрезПоследних.Зая вка.ВидПодписки.Периодично сть * (ИТС_ДискиСрезПоследних.Но� �ерПериода - 1)) КАК ДатаДиска
ПОМЕСТИТЬ ДискиИТС
ИЗ
РегистрСведений.ИТС_Диски.� �резПоследних КАК ИТС_ДискиСрезПоследних
СГРУППИРОВАТЬ ПО
ИТС_ДискиСрезПоследних.Зая вка,
ДОБАВИТЬКДАТЕ(ИТС_ДискиСре зПоследних.Заявка.ДатаНача ла, МЕСЯЦ, ИТС_ДискиСрезПоследних.Зая вка.ВидПодписки.Периодично сть * (ИТС_ДискиСрезПоследних.Но� �ерПериода - 1))
ИНДЕКСИРОВАТЬ ПО
Заявка
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПодпискиИТС.Организация,
ПодпискиИТС.Контрагент,
ПодпискиИТС.ВидПодписки,
ПодпискиИТС.ДатаНачала,
ПодпискиИТС.ДатаЗавершени� �,
ПодпискиИТС.Адрес,
ПодпискиИТС.Телефон,
ПодпискиИТС.КонтрагентОсн� �вноеКонтактноеЛицо,
ПодпискиИТС.СостояниеЗаяв� �и,
ПодпискиИТС.Регистрационн� �йНомер,
ДискиИТС.КоличествоНеОтгр� �женных,
ДискиИТС.ДатаДиска
ИЗ
ПодпискиИТС КАК ПодпискиИТС
ЛЕВОЕ СОЕДИНЕНИЕ ДискиИТС КАК ДискиИТС
ПО ПодпискиИТС.Заявка = ДискиИТС.Заявка
В данной статье будет рассмотрено как реализовано соединение строк / строки с числом внутри запроса системы 1С, и как производится соединение полей с различными типами в строку СКД. Кроме того, поговорим о массовой конкатенации строк в 1С.
1. Соединение строк
Пусть у нас имеется какое-то количество строк, с которыми нужно сделать группировку строк, как в примере таблицы ниже:
Рис. 1 Строки до соединения
Необходимо провести группировку так, чтобы результат выглядел следующим образом:
Рис. 2 Результат соединения строк
Для этого нужно обратиться к полю «Строковое число», после чего привить его к ресурсам, используя следующее выражение: «СоединитьСтроки(строковое_поле)».
Как было в примере до каких-либо действий:
Рис. 3 Пример до соединения
И вот какой результат получился после первых манипуляций:
Рис. 4 После использования поля Строковое число
В данном примере «Информация» – это вычисляемое поле, но вместо него может быть использован любой иной вид поля.
2. Соединение полей в строку в запросе в системе компоновки данных
Пусть необходимо создать строку путем сложения трёх различных полей (Поле1, Поле2 и Поле3) в системе компоновки данных. Но не у всех полей тип соответствует типу «Строка».
В таком случае наиболее очевидное действие – это преобразование численного типа в строчный тип внутри запроса. Для этого надо использовать оператор «Представление(Числовое_поле)», но это не будет полноценной строкой, следовательно, объединение строк не сможет быть осуществлено, то есть будет возникать ошибка, как показано на скриншоте с примером ниже:
Рис. 5 Ошибка при соеднинении строк
Внутри запроса поля не следует трогать, а чтобы произвести объединение строк воспользуемся разделом «Вычисляемые поля», после чего всё становится реализуемым, как показано ниже:
Рис. 6 Объединение строк с использованием Вычисляемых полей
То есть решением будет форматирование исходного типа с данными в строчный тип, это можно делать при помощи оператора «Формат» для придания необходимого вида, например, удалив разделители, как демонстрируется в примере ниже:
Рис. 7 Результат форматирования данных в строчный тип
3. Массовая конкатенация строк в 1С
Операция конкатенации может применяться как в управляемом приложении, так и в обычном, и в мобильном приложениях.
Для того чтобы произвести массовую конкатенацию строк в 1С, необходимо воспользоваться методами «СтрРазделить» и «СтрСоединить». Например, соединение строк будет выглядеть следующим образом:
Рис. 8 Операция конкатенации
Подобная обработка данных имеет довольно быстрое исполнение, а также уменьшает нагрузку и потребление оперативной памяти.
Замечание: данная операция используется при 1000 и более строк, либо при меньшем количестве строк, но большой их длине.
В СКД есть возможность соединять между собой разные наборы данных. Такая же возможность есть в Запросах. Какое соединение предпочтительнее: соединение наборов данных в СКД или соединение в Запросе внутри одного набора данных? Универсального алгоритма нет, но есть ключевые принципы, которые нужно учесть при выборе метода.
· Если есть возможность получить все данные в одном запросе, то это – более приоритетный вариант, чем соединение наборов данных в СКД:
- Запросы выполняются на сервере СУБД, а не на сервере 1С: Предприятие 8;
- У современных СУБД есть оптимизатор запросов, что способствует большей производительности при формировании отчета.
· Если нет возможности получить данные в одном запросе, то нужно использовать соединение наборов данных в СКД:
- Соединение разнородных наборов: Набор данных Запрос – Набор данных Объект, Набор данных Запрос – Набор данных Объединение, Набор данных Объект – Набор данных Объединение.
· Если текст запроса в одном наборе получается слишком длинным, сложным для отладки, то возможно лучше разбить этот запрос на несколько отдельных наборов данных. Иногда, когда это не критично, лучше пожертвовать производительностью для отладки и дальнейшего сопровождения системы.
1. Тип соединение наборов данных в СКД
Соединение наборов данных всегда левое внешнее. Что это значит? Предположим, у нас есть два набора данных: А и Б. Нам нужно соединить эти наборы по определенному условию и в результате получить 3 поля из набора А, и 1 поле из набора Б.
Пример соединения наборов данных
В результате внешнего левого соединения мы получим все строки из набора А. Из набора Б в результат попадут только те строки, которые соответствуют условию связей этих наборов. Таким образом из левого набора (Набор А) попадут все строки, а из правого (Набор Б) – только некоторые строки.
2. Чем соединение отличается от объединения набора данных?
Между объединением наборов данных и соединением есть большая разница. При объединении наборов данных в итоговую таблицу попадают все записи первого набора и все записи из второго набора данных в СКД. Это можно отобразить на схеме.
Объединение наборов данных
В отличии от Запросов, в объединении наборов данных количество полей может не совпадать. Например, в Наборе А всего 3 поля, а в Наборе Б – 4 поля. Такое объединение корректно отработает.
3. Настройка соединения наборов данных
Настройка связей наборов данных в СКД настраивается на вкладке «Связи наборов данных».
Связи наборов данных
Источник связи – это первый набор данных, из которого будут отобраны все строки. Приемник связи – это второй набор данных, из которого будут присоединены только те строки, которые соответствуют условию связи. Выражение источник и Выражение приемник – это поля наборов данных, по которым будет установлена связь между наборами. В СКД есть возможность передавать параметры из левого набора данных в правый. Параметр – это параметр из второго (правого) набора данных, которому присваивается значение из поля Выражение источник.
Потребность в передаче параметра данных может возникнуть при выводе отчета по продажам за каждый день с конечным остатком на день продажи или отчета о продажах за каждый день с установленной ценой на этот день.
При использовании параметров в связях наборов данных фактически получается, что второй (правый) набор данных формируется в цикле. Для оптимизации в такой ситуации можно установить галочку «Список параметров». В этом случае данные из второго (правого) набор будут получаться порциями по 1000 строк. Благодаря этому можно оптимизировать вывод отчета.
Связи наборов данных в СКД – удобный инструмент, но важно хорошо понимать, в каком случае его использовать. Если у Вас возникли вопросы, будем рады помочь!
Специалист компании «Кодерлайн»
Вас могут заинтересовать следующие статьи:
94 [PROP_CODE] => TAGS2 [TITLE] => Вас могут заинтересовать следующие семинары: ) --> 95 [PROP_CODE] => TAGS [TITLE] => Вас могут заинтересовать следующие вебинары: ) -->
Вас могут заинтересовать следующие вебинары:
Читайте также: