1с массив в параметрах скд
Дабы избежать комментариев типа "тоже мне открытие!", оговорюсь сразу: статья рассчитана на неискушённых СКД-разработчиков, тем кто это и так знает не обязательно высказывать своё "фи!", поймите, то что очевидно для вас - не всегда бывает очевидно остальным.
Для наглядного представления реализации части трюков я сделал небольшие заготовки в виде внешних схем СКД. Описание трюков и скриншоты постарался делать так, чтобы суть и техника реализации трюка были понятны без необходимости скачивания схем. Для кого-то этого будет вполне достаточно, но если что-то непонятно, то всегда можно скачать соответствующую схему и посмотреть непосредственно реализацию.
Трюк №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.
Небольшая подсказка для тех, кто будет качать схему. Схема - одна, но все трюки выполнены в виде отдельных вариантов настроек отчёта этой схемы:
Определение ресурсов в схеме компоновки данных 1С
В компоновке данных настройка итогов выглядит несколько иначе, чем в запросах. Определим в системе компоновки данных набор данных «Запрос».
В ресурсах можно указывать и нечисловые поля. Например, если выбрать реквизит «Ссылка», то система подсчитает количество документов в наших группировках. Эта информация тоже может быть полезной. Итак, в схеме компоновки мы определяем только ресурсы, а сами группировки настраиваются на уровне варианта отчёта. Так же пользователь сам может создать группировки, которые хочет видеть в своей настройке варианта отчёта. Создадим стандартную настройку компоновки данных. Нажмём на кнопку «Открыть конструктор настроек».
Выберем все поля и переместим поле контрагент на самую верхнюю позицию. Нажмём кнопку «Далее».
Выберем все поля и переместим поле контрагент на самую верхнюю позицию. Нажмём кнопку «OK».
Получилась следующая настройка:
Как видно, в настройке варианта отчёта ресурсы выделяются зелёной пиктограммой, чтобы можно было их быстро отличить от других полей.
Если открыть наш отчёт в режиме 1С:Предприятие и сформировать его, то мы увидим, что формируются итоговые данные на уровне группировок. Итоги по номенклатуре и по контрагентам.
Настройка ресурсов в схеме компоновки данных 1С
Теперь обратим внимание на настройки, которые существуют у ресурсов. В поле «Выражение» мы можем указать агрегатную функцию, по которой можно получить значение ресурса. В выпадающем списке можно увидеть ряд стандартных функций, но не все. Например, нет функций Массив (Array) и СоединитьСтроки (JoinStrings).
Здесь в поле «Выражение» мы можем написать и своё собственное выражение.
В поле «Выражение» мы можем обращаться и к функциям общих модулей.
Если сформируем отчёт, то увидим, что итоги по количеству считаются только по номенклатуре, а по контрагентам итоги количества пустые.
Возможности при описании ресурсов в схеме компоновки данных 1С
Давайте рассмотрим ряд неочевидных особенностей связанных с описанием ресурсов.
- Каждый ресурс можно определить несколько раз. Но это имеет смысл лишь в том случае, если ресурс будет рассчитываться по разным уровням группировок. Например, если количество, в одном случае суммируется для номенклатуры, а по контрагентам получаем минимальное значение.
Если сформируем отчёт, то увидим, что по контрагенту «Дерия» минимальная закупка составляет пять единиц номенклатуры «Бумага самоклеющаяся».
- В поле «Выражение», кроме написания формулы, можно использовать специальную функцию компоновки данных которая называется «Вычислить». Эта функция позволяет вычислить какое-то итоговое значение по определённой формуле. Например, по каждому контрагенту необходимо знать процент закупки в натуральных единицах относительно общего объёма. Но как получить общий объём закупок по количеству? Для этого воспользуемся функцией «Вычислить» и запишем следующее выражение в поле «Выражение»:
Как видно, все параметры функции «Вычислить» являются строковыми. Чтобы поле количество отображалось в отчёте красиво, настроим его на вкладке «Наборы данных». В строке количество найдём поле «Параметры редактирования». Откроем диалог, отыщем строку «Формат» и отредактируем в нём форматную строку, поставив на вкладке «Число», значение «Точность» равным двум.
Запустим отчёт и увидим результат вычисления процента закупки по контрагенту «АУПП КОС ТОО» относительно общего объёма:
Также у вас есть возможность скачать книгу по основам СКД
В конце статьи можете посмотреть небольшое видео (7 минут), которое поможет вам еще эффективнее решать задачи по СКД:
1. Вычислить (Eval) - предназначена для вычисления выражения в контексте некоторой группировки. Функция используется для совместимости с предыдущими версиями платформы. Вместо неё рекомендуется использовать функцию ВычислитьВыражение.
Синтаксис :
Вычислить(Выражение, Группировка, ТипРасчета)
- Выражение (Строка). Cодержит вычисляемое выражение;
- Группировка (Строка). Содержит имя группировки, в контексте которой необходимо вычислить выражение. В случае если в качестве имени группировки используется пустая строка, вычисление будет выполнено в контексте текущей группировки. В случае если в качестве имени группировки будет использована строка ОбщийИтог, вычисление будет выполнено в контексте общего итога. В остальных случаях вычисление будет выполняться в контексте родительской группировки с таким именем.
Например:
Сумма(Продажи.СуммаОборот) / Вычислить("Сумма(Продажи.СуммаОборот)", "ОбщийИтог").
В данном примере в результате получится отношение суммы по полю "Продажи.СуммаОборот" записи группировки к сумме того же поля во всей компоновке. - ТипРасчета (Строка). В случае если данный параметр имеет значение "ОбщийИтог", выражение будет вычисляться для всех записей группировки. В случае если значение параметра "Группировка", значения будут вычисляться для текущей групповой записи группировки.
Синтаксис :
ВычислитьВыражение(Выражение, Группировка, ТипРасчета, Начало, Конец, Сортировка, ИерархическаяСортировка, ОбработкаОдинаковыхЗначенийПорядка)
В данном примере вычисляется значение текущей иерархии:
Выбор
Когда Уровень() > 0
Тогда ВычислитьВыражение("Ссылка", , "Иерархия")
Иначе Null
Конец
Примечания :
Функция учитывает отбор группировок, но не учитывает иерархические отборы. Функция не может применяться к группировке в групповом отборе этой группировки. Например, в отборе группировки Номенклатура нельзя использовать выражение ВычислитьВыражение("Сумма(СуммаОборот)", , "ОбщийИтог") > 1000 . Но такое выражение можно использовать в иерархическом отборе. Если конечная запись предшествует начальной, то считается, что записи для расчета детальных данных и расчета агрегатных функций отсутствуют. При расчете интервальных выражений для общего итога (параметр Группировка имеет значение "ОбщийИтог") считается, что записи для расчета детальных данных и расчета агрегатных функций отсутствуют. Компоновщик макета при генерации выражения функции ВычислитьВыражение, в случае если выражение упорядочивания содержит поля, которые не могут быть использованы в группировке, заменяет функцию ВычислитьВыражение на NULL.
3. ВычислитьВыражениеСГруппировкойМассив (EvalExpressionWithGroupArray) - функция возвращает массив, каждый элемент которого содержит результат вычисления выражения для группировки по указанному полю.
Синтаксис :
ВычислитьВыражениеСГруппировкойМассив (Выражение, ВыраженияПолейГруппировки, ОтборЗаписей, ОтборГруппировок)
- Выражение (Строка) - выражение, которое нужно вычислить. Например, "Сумма(СуммаОборот)";
- ВыраженияПолейГруппировки - выражения полей группировки, перечисленные через запятую. Например, "Контрагент, Партия";
- ОтборЗаписей - выражение, применяемое к детальным записям. Например, "ПометкаУдаления = Ложь". Если в данном параметре используется агрегатная функция, то при выполнении компоновки данных возникнет ошибка;
- ОтборГруппировок - отбор, применяемый к групповым записям. Например: "Сумма(СуммаОборот) > &Параметр1".
Компоновщик макета при генерации макета преобразовывает параметры функции в термины полей макета компоновки данных. Например, поле Контрагент будет конвертировано в НаборДанных.Контрагент.
Компоновщик макета при генерации выражений для вывода пользовательского поля, в выражении которого присутствует только функция ВычислитьМассивСГруппировкой генерирует выводимое выражение таким образом, чтобы данные выводить представления и данные были упорядочены.
Например, для пользовательского поля с выражением:
ВычислитьВыражениеСГруппировкойМассив("Сумма(СуммаОборот)", "Контрагент")
компоновщик макета сгенерирует для вывода следующее выражение:
СоединитьСтроки(Массив(Упорядочить(ВычислитьВыражениеСГруппировкойТаблицаЗначений ("Представление(Сумма(НаборДанных.СуммаОборот)), Сумма(НаборДанных.СуммаОборот)", "НаборДанных.Контрагент"), "2")))
4. ВычислитьВыражениеСГруппировкойТаблицаЗначений (EvalExpressionWithGroupValueTable) - функция возвращает таблицу значений, каждый элемент которого содержит результат вычисления выражения для группировки по указанному полю.
Синтаксис :
ВычислитьВыражениеСГруппировкойТаблицаЗначений (Выражение, ВыраженияПолейГруппировки, ОтборЗаписей, ОтборГруппировок)
- Выражение (Строка) - выражение, которое нужно вычислить. В строке может быть перечислено несколько выражений через запятую. После каждого выражения может быть необязательное ключевое слово КАК и имя колонки таблицы значений. Например: "Контрагент, Сумма(СуммаОборот) Как ОбъемПродаж".
- ВыраженияПолейГруппировки - выражения полей группировки, перечисленные через запятую. Например, "Контрагент, Партия";
- ОтборЗаписей - выражение, применяемое к детальным записям. Например, "ПометкаУдаления = Ложь". Если в данном параметре используется агрегатная функция, то при выполнении компоновки данных возникнет ошибка;
- ОтборГруппировок - отбор, применяемый к групповым записям. Например: "Сумма(СуммаОборот) > &Параметр1".
Результатом работы данной функции будет таблица значений с колонками Контрагент и ОбъемПродаж, в которых будут находиться контрагенты с их объемами продаж.
Компоновщик макета при генерации макета преобразовывает параметры функции в термины полей макета компоновки данных. Например, поле Контрагент будет конвертировано в НаборДанных.Контрагент.
Например, пользовательского поля с выражением:
ВычислитьВыражениеСГруппировкойТаблицаЗначений ("Контрагент, Сумма(СуммаОборот)", "Контрагент")
Компоновщик макета сгенерирует для вывода следующее выражение:
СоединитьСтроки(ПолучитьЧасть(Упорядочить(ВычислитьВыражениеСГруппировкойТаблицаЗначений ("НаборДанных.Контрагент, НаборДанных.КонтрагентПредставление, Сумма(НаборДанных.СуммаОборот), Представление(НаборДанных.СуммаОборот), НаборДанных.ПолеУпорядочивание", "НаборДанных.Контрагент"), "5, 1, 3"), "2, 4"))
5. Уровень (Level) - функция предназначена для получения текущего уровня записи.
6. НомерПоПорядку (SequenceNumber) - получить следующий порядковый номер.
7. НомерПоПорядкуВГруппировке (SequenceNumberInGrouping) - возвращает следующий порядковый номер в текущей группировке.
8. Формат (Format) - получить отформатированную строку переданного значения.
Синтаксис :
Формат(Значение, ФорматнаяСтрока)
- Значение - выражение, которое требуется отформатировать;
- ФорматнаяСтрока - форматная строка задается в соответствии с форматной строкой 1С:Предприятие.
9. НачалоПериода (BeginOfPeriod) - функция предназначена для выделения определенной даты из заданной даты.
Синтаксис :
НачалоПериода(Дата, ТипПериода)
- Дата (Дата). Заданная дата;
- ТипПериода (Строка). Содержит одно из значений: Минута; Час; День; Неделя; Месяц; Квартал; Год; Декада; Полугодие.
10. КонецПериода (EndOfPeriod) - функция предназначена для выделения определенной даты из заданной даты.
Синтаксис :
КонецПериода(Дата, ТипПериода)
- Дата (Дата). Заданная дата;
- ТипПериода (Строка). Содержит одно из значений: Минута; Час; День; Неделя; Месяц; Квартал; Год; Декада; Полугодие.
11. ДобавитьКДате (DateAdd) - функция предназначена для прибавления к дате некоторой величины.
Синтаксис :
ДобавитьКДате(Выражение, ТипУвеличения, Величина)
- Выражение (Дата). Исходная дата;
- ТипУвеличения (Строка). Содержит одно из значений: Минута; Час; День; Неделя; Месяц; Квартал; Год; Декада; Полугодие.
- Величина (Число). На сколько необходимо увеличить дату, дробная часть игнорируется.
12. РазностьДат (DateDifference) - функция предназначена для получения разницы между двумя датами.
Синтаксис :
РазностьДат(Выражение1 , Выражение2 , ТипРазности)
- Выражение1 (Дата). Вычитаемая дата;
- Выражение2 (Дата). Исходная дата;
- ТипРазности (Строка). Содержит одно из значений: Секунда; Минута; Час; День; Месяц; Квартал; Год.
13. Подстрока (Substring) - данная функция предназначена для выделения подстроки из строки.
Синтаксис :
Подстрока(Строка, Позиция, Длина)
- Строка (Строка). Строка, из которой выделяют подстроку;
- Позиция (Число). Позиция символа, с которого начинается выделяемая из строки подстрока;
- Длина (Число). Длина выделяемой подстроки.
14. ДлинаСтроки (StringLength) - функция предназначена для определения длины строки.
- Строка (Строка). Строка, длину которой определяют.
15. Год (Year) - данная функция предназначена для выделения года из значения типа Дата.
- Дата (Дата). Дата, по которой определяют год.
16. Квартал (Quarter) - данная функция предназначена для выделения номера квартала из значения типа Дата. Номер квартала в норме находится в диапазоне от 1 до 4.
- Дата (Дата). Дата, по которой определяют квартал
17. Месяц (Month) - данная функция предназначена для выделения номера месяца из значения типа Дата. Номер месяца в норме находится в диапа-зоне от 1 до 12.
- Дата (Дата). Дата, по которой определяют месяц.
18. ДеньГода (DayOfYear) - данная функция предназначена для получения дня года из значения типа Дата. День года в норме находится в диапазоне от 1 до 365(366).
- Дата (Дата). Дата, по которой определяют день года.
19. День (Day) - данная функция предназначена для получения дня месяца из значения типа Дата. День месяца в норме находится в диапазоне от 1 до 31.
- Дата (Дата). Дата, по которой определяют дня месяца.
20. Неделя (Week) - данная функция предназначена для получения номера недели года из значения типа Дата. Недели года нумеруются, начиная с 1.
- Дата (Дата). Дата, по которой определяют номера недели.
21. ДеньНедели (WeekDay) - данная функция предназначена для получения дня недели из значения типа Дата. День недели в норме находится в диапазоне от 1 (понедельник) до 7(воскресенье).
- Дата (Дата). Дата, по которой определяют день недели .
22. Час (Hour) - данная функция предназначена для получения часа суток из значения типа Дата. Час суток находится в диапазоне от 0 до 23.
- Дата (Дата). Дата, по которой определяют час суток.
23. Минута (Minute) - данная функция предназначена для получения минуты часа из значения типа Дата. Минута часа находится в диапазоне от 0 до 59.
- Дата (Дата). Дата, по которой определяют минута часа.
24. Секунда (Second) - данная функция предназначена для получения секунды минуты из значения типа Дата. Секунда минуты находится в диапазоне от 0 до 59.
- Дата (Дата). Дата, по которой определяют секунды минуты.
25. Выразить (Cast) - данная функция предназначена для выделения типа из выражения, которое может содержать составной тип. В случае, если выражение будет содержать тип, отличный от требуемого типа, будет возвращено значение NULL.
Синтаксис :
Выразить(Выражение, УказаниеТипа)
- Выражение - преобразуемое выражение;
- УказаниеТипа (Строка). Содержит строку типа. Например, "Число", "Строка" и т.п. Кроме примитивных типов данная строка может содержать имя таблицы. В этом случае будет осуществлена попытка выразить к ссылке на указанную таблицу.
26. ЕстьNull (IsNull) - данная функция возвращает значение второго параметра в случае, если значение первого параметра NULL. В противном случае будет возвращено значение первого параметра.
Синтаксис :
ЕстьNull(Выражение1, Выражение2)
- Выражение1 - проверяемое значение;
- Выражение2 - возвращаемое значение, если значение Выражение1 есть NULL.
27. ACos - вычисляет арккосинус в радианах.
- Выражение (Число). Значение косинуса (в диапазоне -1 . 1), по которому определяется угол.
- Выражение (Число). Значение синуса (в диапазоне -1 . 1), по которому определяется угол.
- Выражение (Число). Значение тангенса, по которому определяется угол.
- Выражение (Число). Исходное число, больше 0.
- Выражение (Число). Исходное число, больше 0.
Синтаксис :
Pow(Основание, Показатель)
- Основание (Число). Основание операции возведения в степень.
- Показатель (Число). Показатель степени.
- Выражение (Число). Значение синуса, по которому определяется угол.
Синтаксис :
Окр(Выражение, Разрядность)
- Выражение (Число). Исходное число;
- Разрядность (Число). Число знаков дробной части, до которых производится округление.
Выражение механизма компоновки данных может содержать вызовы функций глобальных общих модулей конфигурации. Никакого дополнительно синтаксиса для вызова таких функций не требуется.
Пример :
СокращенноеНаименование(Документы.Ссылка, Документы.Дата, Документы.Номер)
В данном примере будет осуществлен вызов функции "СокращенноеНаименование" из общего модуля конфигурации.
Отметим, что использование функций общих модулей разрешено только при указании соответствующего параметра процессора компоновки данных.
Кроме того, функции общих модулей не могут быть использованы в выражениях пользовательских полей.
41. Представление (Resentation) - данная функция возвращает строковое представление переданного значения не примитивного типа. Для значений примитивного типа возвращает само значение.
Если в качестве параметра используется массив или таблица значений, то функция возвращает строку, содержащую строковые представление всех элементов массива, разделенных символами "; ". Если у какого либо элемента строковое представление пустое, то вместо его представления выводится строка "<Пустое значение>".
42. Строка (String) - данная функция преобразует переданное значение в строку.
Если в качестве параметра используется массив или таблица значений, то функция возвращает строку, содержащую строковые представление всех элементов массива, разделенных символами "; ". Если у какого либо элемента строковое представление пустое, то вместо его представления выводится строка "<Пустое значение>".
43. ЗначениеЗаполнено (ValueIsFilled)
Для значений NULL, Неопределено всегда возвращает Ложь.
Для значений Булево всегда возвращает Истину.
Для остальных типов возвращает Истину, если значение отличается от значения по умолчанию для данного типа.
44. УровеньВГруппировке (LevelInGroup) - данная функция получает текущий уровень записи относительно группировки.
Может быть использована для получения уровня вложенности записи в иерархической группировке.
Первый подход условно назовем "Две схемы". Суть в том, что в отчете создаются две схемы компоновки данных. Первая строится на основе запроса и выгружается в ТаблицуЗначений (или ДеревоЗначений), вторая - схема на основе объекта. В неё помещается эта самая ТаблицаЗначений, которую предварительно модифицируем по своему усмотрению. С первой схемой все понятно, рассмотрим вторую схему подробнее:
Обратите внимание, что в этой схеме набор данных - Объект и все поля создаются вручную. Также обязательно нужно указать типы полей компоновки, иначе отбор по ссылочным типам работать не будет. И еще эта схема является основной схемой отчета, т.е. в ней мы создаем макет, отборы и т.д.
Обратим внимание на один важный момент. Схемы мы используем две, а настройка отчета - одна.
На примере: допустим мы отбираем группу Номенклатуры "Продукты". Сначала отрабатывает первая схема по своим типовым настройкам, т.е. в таблицу значений выгружается вся номенклатура без отбора по "Продуктам". Затем вторая схема получает всю таблицу значений и уже в ней отбираются продукты. Для ускорения процесса очень не помешало бы и в первой схеме использовать тот же самый отбор. Для этого можно поступить следующим образом: вместо строки кода
получаем настройки не из первой схемы, а из отчета:
А затем отключаем в отборе те поля, которые будут изменяться. Ведь если мы их не отключим и сделаем отбор по такому полю, то отбор сработает уже в первой схеме, где поле заполнено совсем другим значением или не заполнено вовсе:
Второй подход, назовем "Подстановка", заключается в том, что вывод результата компоновки происходит в цикле построчно и в этот момент заменяются значения элемента результата на произвольные.
Схема используется одна, особенность только в том, что в обработчик модуля объекта отчета ПриКомпоновкеРезультата подставляется следующий код:
Для этого кода требуются пояснения. Есть один неприятный момент. Поле "Ссылка", которое мы замечательно получили в запросе с типом Справочник.Номенклатура.Ссылка компоновка легко и непринужденно превратила в поле "СсылкаПредставление" уже строкового типа, а саму ссылку запихнула куда-то в расшифровку. Поэтому возникает вопрос: как получить ссылку из её строкового представления. В данном примере это сделано примитивно:
Однако если ссылка - Документ, то это уже сложнее. Хотя, если документ известного типа, то представление легко парсится в ссылку с помощью типовых строковых функций УТ11 (если нужно - выложу функцию). Но если ссылка с составным типом, то даже не знаю как получить из представления ссылки неизвестного типа саму ссылку. Возможно, кто-то знает как достать ссылку из расшифровки, поделитесь плиз.
Итак, у каждого из подходов есть свои плюсы и минусы.
Подход "Две схемы"
- Плюсы:
- Более полные возможности интерактивной компоновки: измененные данные можно полноценно фильтровать, группировать и т.д.
- Нет проблем с получением ссылочных типов данных
- Медленно формируется (выгрузка в таблицу значений, перебор, обратная загрузка)
- Возможны трудности с отбором по изменяемым полям, поскольку настройка одна, а схемы две и нужно понимать что и как будет отбираться
- Вторую схему нужно делать вручную - прописывать поля и их типы. Если полей много, то можно выгрузить первую схему в xml, слегка модифицировать и загрузить во вторую
- Плюсы:
- Быстрота формирования отчета (нет никаких промежуточных схем и выгрузов в таблицы значений)
- Не нужно заботиться о пользовательском отборе, поскольку схема одна - настройка одна. Нужно только помнить, что нельзя отбирать по изменяемым полям
- Меньше возможности интерактивной компоновки: измененные данные нельзя отбирать, группировать и т.д., поскольку замена значений происходит уже после всех процедур компоновки в момент вывода данных
- Возможны проблемы с получением ссылок данных из их представления
Я использую в практике отчеты с обоими вариантами замены значений. Подстановка намного быстрее работает, но не всегда ее можно применить.
Надеюсь, что пост получилось написать понятным языком и кому-нибудь пригодится.
Читайте также: