Что-то вроде FAQ

Как объединить заголовки колонок в таблице

Отзывов (5)FavoriteLoadingВ закладки

Данный пост родился в результате поиска решения проблемы из поста http://1cskd.ru/2010/07/kak-v-skd-nakryt-kolonki-shapkoj/

Имеем отчет вида:

:

Настройки отчета:

Необходимо одинаковые заголовки группировок объединить.

Данный пост родился в результате поиска решения проблемы из поста http://1cskd.ru/2010/07/kak-v-skd-nakryt-kolonki-shapkoj/ Имеем отчет вида: : Настройки отчета: Необходимо одинаковые заголовки группировок объединить. Предлагаю данную операцию произвести над сформированным табличным документом, используя следующий код: // Проверка двух смежных ячеек на идентичночность Функция ОбъединятьЯчейки(ТабДок, индСтр, индКол) Ячейка = ТабДок.Область(индСтр, индКол); ЯчейкаСлед = ТабДок.Область(индСтр, индКол+1); Если ПустаяСтрока(Ячейка.Текст) Тогда Возврат ложь ИначеЕсли //Проверяем на соответствие заголовка Ячейка.Текст = ЯчейкаСлед.Текст // Проверяем на соответствие имени (отсеиваем уже объединенные ячейки) и Ячейка.Имя = "R"+индСтр+"C"+индКол Тогда Возврат Истина; Иначе Возврат ложь КонецЕсли; КонецФункции // Обработка заголовков таблицы // // Параметры // Табл - < Тип.ТабличныйДокумент> - Табличный документ формы Процедура ОбработатьЗаголовки(ТабДок) ОбъединяемаяОбласть = Неопределено; //Для оптимизации здесь нужно будет ограничить высоту таблицы Для индСтр=1 По ТабДок.ВысотаТаблицы Цикл НачальнаяКолонка = 0; Для индКол=1 По ТабДок.ШиринаТаблицы Цикл // определяем начало объединения Если ОбъединятьЯчейки(ТабДок, индСтр, индКол) Тогда Если не НачальнаяКолонка Тогда НачальнаяКолонка = индКол; КонецЕсли; ИначеЕсли НачальнаяКолонка Тогда // завершаем объединение ТекстЗаголовка = ТабДок.Область(индСтр, индКол).Текст; ОбъединяемаяОбласть = ТабДок.Область(индСтр, НачальнаяКолонка, индСтр, индКол); ОбъединяемаяОбласть.Объединить(); ОбъединяемаяОбласть.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр; ОбъединяемаяОбласть.Текст = ТекстЗаголовка; НачальнаяКолонка = 0; Иначе НачальнаяКолонка = 0; КонецЕсли; КонецЦикла; // Если нашли в строке области для объединения, то прекращаем дальнейшие поиски Если не ОбъединяемаяОбласть = Неопределено Тогда возврат; КонецЕсли; КонецЦикла; КонецПроцедуры Вставляем вызов после формирования табличного документа: Результат представлен ниже: Главный недостаток этого способа, трудно заранее определить начальную и конечную область поиска, т. к. функция может отработать  и объединить любые другие смежные идентичные ячейки. Если есть идеи как однозначно идентифицировать ячейки заголовка группировок пишите. А пока этот код можно использовать с некоторыми изменения в каждом  конкретном случае....

Далее

Срез последних на каждую дату в СКД

Отзывов (29)FavoriteLoadingВ закладки

С задачей получения среза последних на каждую дату рано или поздно сталкиваются все. Безусловно, это задача достаточно просто решается запросом с соединением по максимальной дате из меньших или равных дат. Но эту же задачу можно решить и с помощью компоновки данных. Не будем рассуждать о том, какой из способов более производителен, все может зависеть от конкретной задачи.

С задачей получения среза последних на каждую дату рано или поздно сталкиваются все. Безусловно, это задача достаточно просто решается запросом с соединением по максимальной дате из меньших или равных дат. Но эту же задачу можно решить и с помощью компоновки данных. Не будем рассуждать о том, какой из способов более производителен, все может зависеть от конкретной задачи. Первый набор данных: В качестве примера, создадим отчет по продажам, в котором отдельной колонкой будем выводить цену из прайса на дату продажи. Создадим набор данных-запрос “ПродажиОбороты”: ВЫБРАТЬ ПродажиОбороты.Период КАК Дата, ПродажиОбороты.Контрагент КАК Контрагент, ПродажиОбороты.Номенклатура КАК Номенклатура, ПродажиОбороты.КоличествоОборот КАК Количество, ПродажиОбороты.СтоимостьОборот КАК Стоимость {ВЫБРАТЬ Дата, Контрагент.*, Номенклатура.*, Количество, Стоимость} ИЗ РегистрНакопления.Продажи.Обороты({(&НачалоПериода)}, {(&КонецПериода)}, День, ) КАК ПродажиОбороты {ГДЕ ПродажиОбороты.Период, ПродажиОбороты.Контрагент.*, ПродажиОбороты.Номенклатура.*, ПродажиОбороты.КоличествоОборот, ПродажиОбороты.СтоимостьОборот} Сейчас наш отчет будет иметь следующий вид: Теперь необходимо добавить в отчет колонку “Цена по прайсу”, которая будет подтягиваться из регистра сведений “Цены номенклатуры” на дату продажи. Второй набор данных: Добавим второй набор данных-запрос “Цены”, цены будем брать для фиксированного типа цен: ВЫБРАТЬ &Дата КАК Дата, ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура, ЦеныНоменклатурыСрезПоследних.Цена КАК Цена {ВЫБРАТЬ Дата, Номенклатура.*, Цена} ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних( &Дата, Номенклатура = &Номенклатура И ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних {ГДЕ (&Дата), ЦеныНоменклатурыСрезПоследних.Номенклатура.*, ЦеныНоменклатурыСрезПоследних.Цена} В данном наборе данных три параметра: Дата, Номенклатура и тип цен. Из низ самые интересные Дата и Номенклатура. Они будут использованы при соединении наборов данных, причем параметр данных присутствует как в параметрах виртуальной таблицы, так и в выбранных полях. Соединения наборов: Приступим к основной “фишке” данного метода – соединениям наборов: Здесь самое основное правильно настроить параметры. Если указан параметр,то  СКД передает в приемник связи параметры, указанные в соединении. Значениями этих параметров будут значения соответствующих полей источника связи. Далее добавим поле цена в ресурсы и в выбранные поля. Результат: Теперь можно формировать отчет. Проверим правильность работы отчета на примере “Дивана для отдыха”. В запросе: По просьбе andreo рассмотрим решение этой же задачи в запросе. Данная задача может быть решена как с использованием вложенных запросов, так и с помощью. временных таблиц. Попробуем решить задачу, используя временные таблицы. Сначала приведем весь текст запроса, а потом кратко разберем по частям принцип его работы. Текст запроса: ВЫБРАТЬ ПродажиОбороты.Период КАК Дата, ПродажиОбороты.Контрагент КАК Контрагент, ПродажиОбороты.Номенклатура КАК Номенклатура, СУММА(ПродажиОбороты.КоличествоОборот) КАК Количество, СУММА(ПродажиОбороты.СтоимостьОборот) КАК Стоимость ПОМЕСТИТЬ втБезЦены ИЗ РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, День, ) КАК ПродажиОбороты СГРУППИРОВАТЬ ПО ПродажиОбороты.Период, ПродажиОбороты.Контрагент, ПродажиОбороты.Номенклатура ИНДЕКСИРОВАТЬ ПО Номенклатура, Дата, Контрагент ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ втБезЦены.Дата КАК Дата, втБезЦены.Контрагент КАК Контрагент, втБезЦены.Номенклатура КАК Номенклатура, втБезЦены.Количество, втБезЦены.Стоимость, МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период ПОМЕСТИТЬ втМаксПериод ИЗ втБезЦены КАК втБезЦены ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры ПО втБезЦены.Номенклатура = ЦеныНоменклатуры.Номенклатура И втБезЦены.Дата >= ЦеныНоменклатуры.Период СГРУППИРОВАТЬ ПО втБезЦены.Дата, втБезЦены.Контрагент, втБезЦены.Номенклатура, втБезЦены.Количество, втБезЦены.Стоимость ИНДЕКСИРОВАТЬ ПО Номенклатура, Дата, Контрагент, Период ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ втМаксПериод.Дата, втМаксПериод.Контрагент, втМаксПериод.Номенклатура, втМаксПериод.Количество, втМаксПериод.Стоимость, ЦеныНоменклатуры.Цена ИЗ втМаксПериод КАК втМаксПериод ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры ПО втМаксПериод.Номенклатура = ЦеныНоменклатуры.Номенклатура И втМаксПериод.Период...

Далее

Индикатор в строке состояния с помощью СКД

Ваш отзывFavoriteLoadingВ закладки

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

ПроцессорКомпоновки = Новый ПроцессорВыводаРезультатаКомпоновкиДанных
ВТабличныйДокумент;
ПроцессорКомпоновки.ОтображатьПроцентВывода = Истина ;
ЭлементКомпоновки = Новый ЭлементРезультатаКомпоновкиДанных;

ПроцессорКомпоновки.НачатьВывод();
//Считаем проценты по своему алгоритму, для примера:
Для Сч = 1 По 100 Цикл
   ЭлементКомпоновки.ПроцентВывода = Сч;
   ПроцессорКомпоновки.ВывестиЭлемент(ЭлементКомпоновки);
КонецЦикла;
ПроцессорКомпоновки.ЗакончитьВывод();
Иногда хочется видеть подобие индикатора, но в строке состояния. Это можно сделать только с помощью СКД, и то есть небольшой минус: невозможно убрать или изменить надпись “Вывод отчета”. Сделать это можно примерно следующим образом: ПроцессорКомпоновки = Новый ПроцессорВыводаРезультатаКомпоновкиДанных ВТабличныйДокумент; ПроцессорКомпоновки.ОтображатьПроцентВывода = Истина ; ЭлементКомпоновки = Новый ЭлементРезультатаКомпоновкиДанных; ПроцессорКомпоновки.НачатьВывод(); //Считаем проценты по своему алгоритму, для примера: Для Сч = 1 По 100 Цикл ЭлементКомпоновки.ПроцентВывода = Сч; ПроцессорКомпоновки.ВывестиЭлемент(ЭлементКомпоновки); КонецЦикла; ПроцессорКомпоновки.ЗакончитьВывод(); Перейти к...

Далее

Внешние функции – программное подключение

Ваш отзывFavoriteLoadingВ закладки

При программном запуске отчета (например, с другой схемой компоновки) могут не работать внешние функции.

По простой причине – возможность их подключения надо явно указать .

ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки,
 ВнешниеНаборыДанных,,Истина);

Синтаксис:
Инициализировать(<Макет>, <Внешние наборы данных>, <Данные расшифровки>, <Возможность использования внешних функций>)

Спасибо Garkin с Волшебного форума – http://www.forum.mista.ru/topic.php?id=428529, а также см. ИТС

При программном запуске отчета (например, с другой схемой компоновки) могут не работать внешние функции. По простой причине – возможность их подключения надо явно указать . ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных,,Истина); Синтаксис: Инициализировать(<Макет>, <Внешние наборы данных>, <Данные расшифровки>, <Возможность использования внешних функций>) Спасибо Garkin с Волшебного форума – http://www.forum.mista.ru/topic.php?id=428529, а также см. ИТС Перейти к...

Далее

Стандартный параметр &Период и проблемы в использовании

Отзывов (4)FavoriteLoadingВ закладки

Создадим отчет с одни набором данных запрос:

ВЫБРАТЬ
    ТоварыНаСкладахОстатки.Склад,
    ТоварыНаСкладахОстатки.Номенклатура,
    ТоварыНаСкладахОстатки.КоличествоОстаток
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(&МояДата, )
                               КАК ТоварыНаСкладахОстатки
 
Создадим отчет с одни набором данных запрос: ВЫБРАТЬ ТоварыНаСкладахОстатки.Склад, ТоварыНаСкладахОстатки.Номенклатура, ТоварыНаСкладахОстатки.КоличествоОстаток ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(&МояДата, )  КАК ТоварыНаСкладахОстатки Теперь перейдем на вкладку параметры и увидим что система, помимо нашего параметра &МояДата создала еще и параметр &Период. Для того, чтобы наглядно наблюдать за периодами, создадим основную форму отчета и поместим на нее табличное поле с данными: КомпоновщикНастроек.Настройки.ПараметрыДанных Сохраним отчет и откроем его в предприятии. В табличном поле с параметры отображается только параметр &Период: Соответственно, любое изменение этого параметра не даст нужного результата. Почему недоступен параметр &МояДата? Конечно же потому что на вкладке параметры у него установлена галку Ограничение доступности. Снимаем галку. Теперь в доступных параметрах видим оба. Только при формировании отчета увидим, что отчет реагирует на параметр &Период, а не на &МояДата. В данном примере самое простое переименовать в запросе параметр &МояДата на &Период и добиться нужного результата. Но может быть у Вас запрос, в котором уже использовался параметр &Период, или Ваши религиозные взгляды не разрешают Вам использовать этот параметр, в любом случае можно решить проблему так: ВЫБРАТЬ ТоварыНаСкладахОстатки.Склад, ТоварыНаСкладахОстатки.Номенклатура, ТоварыНаСкладахОстатки.КоличествоОстаток ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки({&МояДата}, ) КАК ТоварыНаСкладахОстатки UPD от пользователя Boo: Главная проблема при использовании «стандартных» (добавляемых системой) параметров в том что при использовании в отчете нескольких виртуальных таблиц, в случае определения этого параметра, его значение будет использоваться во всех остальных случаях взамен «собственных». Приведу пример: ВЫБРАТЬ РаботникиСП.Сотрудник, РаботникиСП.ПричинаИзмененияСостояния, РаботникиСП.Период, РаботникиСПДругаяДата.Период КАК Период2, РаботникиСПДругаяДата.ПричинаИзмененияСостояния КАК ПричинаИзмененияСостояния2 ИЗ РегистрСведений.РаботникиОрганизаций.СрезПоследних(&Период, Сотрудник = &Сотрудник) КАК РаботникиСП ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаботникиОрганизаций.СрезПоследних(&ДругаяДата, ) КАК РаботникиСПДругаяДата ПО РаботникиСП.Сотрудник = РаботникиСПДругаяДата.Сотрудник Во втором подзапросе, в качестве параметра даты среза будет использовано значение «стандартного» параметра ПЕРИОД, а не значение ДругаяДата. Данный «глюк» будет наблюдаться даже в том случае если второй подзапрос вывести во второй набор данных и связать уже средствами СКД. Вариант с использованием во втором запросе ваыражения типа «ДОБАВИТЬКДАТЕ(&Период, МЕСЯЦ, -1) » тоже не сработает, месяц не вычтется. А вот переименование в запросе параметра «Период» в, например, «ПерваяДата», решает эту проблему. Кстати, точно такая же проблема наблюдается с виртуальными таблицами регистров накопления и бухгалтерии, используемыми для получения, например, оборотов. Там система добавляет параметры «НачалоПериода» и «КонецПериода». Так что в случае запросов даже чуть повышенной сложности, есть смысл выключать доступность и использование «стандартных периодов»....

Далее

Использование нескольких схем компоновки данных в одном отчете

Отзывов (13)FavoriteLoadingВ закладки

Одному отчету может принадлежать несколько схем компоновки данных. Но по какой из них тогда он будет формироваться?

Имеем отчет по продажам:

Одному отчету может принадлежать несколько схем компоновки данных. Но по какой из них тогда он будет формироваться? Имеем отчет по продажам: Добавим в него еще один макет с типом Схема компоновки данных. В схеме опишем какой-нибудь произвольный набор данных и настройки. Ну допустим получение остатка на складах. Откроем отчет в предприятии и сформируем. Что мы видим? Что отчет сформировался по основной схеме компоновки данных. Как же сделать чтобы отчет формировался по Схеме_2. Откроем основную форму отчета и добавим кнопку Переключить схему. Для данной кнопки напишем следующую процедуру-обработчик: Список = Новый СписокЗначений; Список.Добавить("ОсновнаяСхемаКомпоновкиДанных", "Продажи"); Список.Добавить("Схема_2", "Остатки"); ВыбЭлемент = Список.ВыбратьЭлемент(); Если ВыбЭлемент <> Неопределено Тогда СхемаКомпоновкиДанных = ПолучитьМакет(ВыбЭлемент.Значение); КонецЕсли; //Из схемы возьмем настройки по умолчанию Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию; //Помещаем в переменную данные о расшифровке данных ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных; //Формируем макет, с помощью компоновщика макета КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; //Передаем в макет компоновки схему, настройки и данные расшифровки МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки); //Выполним компоновку с помощью процессора компоновки ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки,, ДанныеРасшифровки); //Очищаем поле табличного документа Результат = ЭлементыФормы.Результат; Результат.Очистить(); //Выводим результат в табличный документ ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанных ВТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(Результат); ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных); Теперь при нажатии на кнопку открывается выбор схемы, после чего происходит формирование отчета....

Далее
Страница 3 из 612345...Последняя »

Авторизация

Логин:
Пароль:
Регистрация

Архивы

Закладки

  • Your favorites will be here.