Код 1C v 8.х
Функция НеобходимостьПерерасчета(Регистратор) Экспорт
Запрос = Новый Запрос( "ВЫБРАТЬ ПЕРВЫЕ 1
| Перерасчет.ФизЛицо
|ИЗ
| (ВЫБРАТЬ ПЕРВЫЕ 1
| Перерасчет.ФизЛицо КАК ФизЛицо
| ИЗ
| РегистрРасчета.ОсновныеНачисленияРегл.ПерерасчетОсновныхНачислений
| КАК Перерасчет
| ГДЕ
| Перерасчет.ОбъектПерерасчета = &Регистратор
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ ПЕРВЫЕ 1
| Перерасчет.ФизЛицо
| ИЗ
|РегистрРасчета.ДополнительныеНачисленияРегл.ПерерасчетДополнительныхНачислений
| КАК Перерасчет
| ГДЕ
| Перерасчет.ОбъектПерерасчета = &Регистратор) КАК Перерасчет" ) ;
Запрос. УстановитьПараметр( "Регистратор" , Регистратор) ; Если Запрос. Выполнить( ) . Пустой( ) Тогда
Возврат Ложь ;
Иначе
Возврат Истина ;
КонецЕсли ;
КонецФункции
Данная функция возвращает значение Истина, если хотя бы в одной из таблиц перерасчета есть хотя бы одна запись по данному документу. Если таких записей нет, то функция вернет значение Ложь, и перерассчитывать записи этого документа не нужно.
Собственно перерасчет записей, как и их расчет, рекомендуется выполнять в процедуре общего модуля по тем же причинам, что и расчет. Процедура перерасчета отличается от процедуры расчета только тем, что в расчете участвуют не все записи документа, а только удовлетворяющие усло- виям проводимого перерасчета. Например, только записи по конкретным сотрудникам и конкретным видам расчета.
Наконец, после того как нужные записи перерассчитаны, необхо- димо средствами встроенного языка удалить соответствующие записи из таблицы перерасчета, так как перерасчет больше не требуется.
Процедуру перерасчета записей документа рекомендуется помещать в модуле этого документа как экспортную процедуру. В этом случае она может быть вызвана из других модулей, в том числе из обработки перерасчета, описанной в предыдущем разделе. В качестве параметров в процедуру должна передаваться информация о том, какие именно записи документа необходимо перерассчитать. Ниже приведен пример такой процедуры, где в качестве параметра используется список сотрудников, по которым необходимо выполнить перерасчет.
Процедура перерасчета записей документа
Код 1C v 8.х Процедура Перерассчитать(Физлица = Неопределено) Экспорт
Если Не Расчеты. НеобходимостьПерерасчета( Ссылка) Тогда
Возврат ; КонецЕсли ;
Расчеты. ПерерассчитатьЗаписиРегистраРасчета( "ОсновныеНачисленияРегл" , Движения. ОсновныеНачисленияРегл, ОсновныеНачисления, Физлица) ;
Движения. ОсновныеНачисленияРегл. Записать( Истина , Истина ) ;
Расчеты. ПерерассчитатьЗаписиРегистраРасчета( "ДополнительныеНачисленияРегл" , Движения. ДополнительныеНачисленияРегл, ДополнительныеНачисления, Физлица) ;
Движения. ДополнительныеНачисленияРегл. Записать( Истина , Истина ) ;
Если Н = 1 Тогда
НаборЗаписей = РегистрыРасчета. ОсновныеНачисленияРегл.
Перерасчеты. ПерерасчетОсновныхНачислений. СоздатьНаборЗаписей( ) ;
НаборЗаписей. Записать( ) ; КонецЦикла ;
КонецПроцедуры
Процедуры общего модуля, выполняющие непосредственный перерасчет записей, по алгоритму схожи с процедурами расчета. Основное отличие состоит в том, что в процедурах перерасчета происходит расчет только тех записей, которые удовлетворяют заданным условиям. В данном случае это записи по заданному списку сотрудников. Также при перерасчете не нужно производить предварительную запись набора с формированием
фактического периода действия, так как набор уже записан в регистр (перерассчитываемый документ всегда проведен). Ниже приведен пример процедур
ПерерассчитатьЗаписиРегистраРасчета() и ПерерассчитатьНаборЗаписей() . Эти процедуры используют вызов тех же самых процедур и функций, которые используются при расчете.
Процедуры перерасчета записей
Код 1C v 8.х Процедура ПерерассчитатьНаборЗаписей(НаборЗаписей, Приоритет, ТабличнаяЧасть = Неопределено, ФизЛица = Неопределено)
Для каждого Запись из НаборЗаписей Цикл
Если Запись. ВидРасчета. Приоритет = Приоритет Тогда
Если НЕ ФизЛица. НайтиПоЗначению( Запись. Физлицо) = Неопределено Тогда
ДанныеДляРасчета = ПолучитьДанныеДляРасчета( Запись) ;
Иначе
НаборЗаписей = РегистрыРасчета. ДополнительныеНачисленияРегл.
Перерасчеты. ПерерасчетДополнительныхНачислений. СоздатьНаборЗаписей( ) ;
КонецЕсли ;
НаборЗаписей. Отбор. ОбъектПерерасчета. Значение = Ссылка; Если Физлица < > НеОпределено Тогда
НаборЗаписей. Прочитать( ) ; СтрокиКУдалению = Новый Массив;
Для Каждого СтрокаПерерасчета из НаборЗаписей Цикл
Если Физлица. НайтиПоЗначению( СтрокаПерерасчета. Физлицо) < > НеОпределено Тогда СтрокиКУдалению. Добавить( СтрокаПерерасчета) ;
КонецЕсли ; КонецЦикла ;
Для Каждого Строка Из СтрокиКУдалению Цикл
НаборЗаписей. Удалить( Строка) ; КонецЦикла ;
КонецЕсли ;
СтрокаТабличнойЧасти = ТабличнаяЧасть. Получить( Запись. НомерСтроки- 1 ) ;
СтрокаТабличнойЧасти. Результат = Запись. Результат; КонецЕсли ;
КонецЕсли ; КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
Процедура ПерерассчитатьЗаписиРегистраРасчета(ИмяРегистра,
НаборЗаписей, ТабличнаяЧасть = Неопределено, Физлица = Неопределено) Экспорт
Регистратор = НаборЗаписей. Отбор. Регистратор. Значение;
Запрос = Новый Запрос; Запрос. Текст = "
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| " + ИмяРегистра + ".ВидРасчета.Приоритет КАК Приоритет
|ИЗ
| РегистрРасчета." + ИмяРегистра + " КАК " + ИмяРегистра + "
|ГДЕ
| ФизЛицо В (&СписокФизлиц) И Регистратор = &Регистратор
|УПОРЯДОЧИТЬ ПО
| Приоритет
|ИТОГИ ПО
| " + ИмяРегистра + ".ВидРасчета.Приоритет" ;
Запрос. УстановитьПараметр( "СписокФизлиц" , Физлица) ; Запрос. УстановитьПараметр( "Регистратор" , Регистратор) ;
ВыборкаПриоритетов = Запрос. Выполнить( ) .
Выбрать( ОбходРезультатаЗапроса. ПоГруппировкам) ;
ПерерассчитатьНаборЗаписей( НаборЗаписей, ВыборкаПриоритетов. Приоритет, ТабличнаяЧасть, Физлица) ;
КонецЦикла ;
КонецПроцедуры
Как настроить Универсальный отчет?
Все настройки
универсального отчета описываются в процедуре
УстановитьНачальныеНастройки :
Код 1C v 8.х Процедура УстановитьНачальныеНастройки(ДополнительныеПараметры = Неопределено) Экспорт
УниверсальныйОтчет. ВариантОформления = СтандартноеОформление. Песок;
УниверсальныйОтчет. мНазваниеОтчета = СокрЛП( ЭтотОбъект. Метаданные( ) . Синоним) ;
УниверсальныйОтчет. мВыбиратьИмяРегистра = Ложь ;
УниверсальныйОтчет. ИмяРегистра = "-" ;
УниверсальныйОтчет. ОтрицательноеКрасным = Истина ;
УниверсальныйОтчет. ВыводитьОбщиеИтоги = Истина ;
УниверсальныйОтчет. ВыводитьДетальныеЗаписи = Ложь ;
УниверсальныйОтчет. мВыбиратьИспользованиеСвойств = Истина ;
ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
| CRM_ПредложенияОбороты.Номенклатура КАК Номенклатура,
| ПРЕДСТАВЛЕНИЕ(CRM_ПредложенияОбороты.Номенклатура) КАК НоменклатураПредставление,
| CRM_ПредложенияОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
| ПРЕДСТАВЛЕНИЕ(CRM_ПредложенияОбороты.ХарактеристикаНоменклатуры) КАК ХарактеристикаНоменклатурыПредставление,
| CRM_ПредложенияОбороты.Контрагент КАК Контрагент,
| ПРЕДСТАВЛЕНИЕ(CRM_ПредложенияОбороты.Контрагент) КАК КонтрагентПредставление,
| CRM_ПредложенияОбороты.ДокументПредложения КАК Документ,
| ПРЕДСТАВЛЕНИЕ(CRM_ПредложенияОбороты.ДокументПредложения) КАК ДокументПредставление,
| CRM_ПредложенияОбороты.ДокументПредложения.Ответственный КАК Ответственный,
| ПРЕДСТАВЛЕНИЕ(CRM_ПредложенияОбороты.ДокументПредложения.Ответственный) КАК ОтветственныйПредставление,
| CRM_ПредложенияОбороты.КоличествоОборот КАК КоличествоОборот,
| CRM_ПредложенияОбороты.СтоимостьОборот КАК СтоимостьОборот,
| 0 КАК СкидкаОборот,
| 1 КАК Количество,
| CRM_ПредложенияОбороты.СтоимостьБезСкидокОборот КАК СтоимостьБезСкидокОборот
| //ПОЛЯ_СВОЙСТВА
| //ПОЛЯ_КАТЕГОРИИ
|{ВЫБРАТЬ
| Контрагент.*,
| Номенклатура.*,
| ХарактеристикаНоменклатуры.*,
| Ответственный.*,
| Документ.*,
| КоличествоОборот,
| СтоимостьОборот,
| СкидкаОборот,
| Количество,
| (ЕСТЬNULL(ИсточникиИнформацииПриОбращении.ИсточникИнформации,ЗНАЧЕНИЕ(Справочник.ИсточникиИнформацииПриОбращенииПокупателей.ПустаяСсылка))).* КАК ИсточникИнформации
| //ПСЕВДОНИМЫ_СВОЙСТВА
| //ПСЕВДОНИМЫ_КАТЕГОРИИ
|}
|ИЗ
| РегистрНакопления.CRM_Предложения.Обороты(&ДатаНач, &ДатаКон, , ) КАК CRM_ПредложенияОбороты
|{ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИсточникИнформацииПриОбращении.СрезПоследних(&ДатаКон) КАК ИсточникиИнформацииПриОбращении
|ПО CRM_ПредложенияОбороты.Контрагент = ИсточникиИнформацииПриОбращении.Контрагент}
|//СОЕДИНЕНИЯ
|{ГДЕ
| CRM_ПредложенияОбороты.Контрагент.* КАК Контрагент,
| CRM_ПредложенияОбороты.Номенклатура.* КАК Номенклатура,
| CRM_ПредложенияОбороты.ХарактеристикаНоменклатуры.* КАК ХарактеристикаНоменклатуры,
| CRM_ПредложенияОбороты.ДокументПредложения.Ответственный.* КАК Ответственный,
| CRM_ПредложенияОбороты.ДокументПредложения.* КАК Документ,
| (ЕСТЬNULL(ИсточникиИнформацииПриОбращении.ИсточникИнформации,ЗНАЧЕНИЕ(Справочник.ИсточникиИнформацииПриОбращенииПокупателей.ПустаяСсылка))).* КАК ИсточникИнформации
| //УСЛОВИЯ_СВОЙСТВА
| //УСЛОВИЯ_КАТЕГОРИИ
|}
|{УПОРЯДОЧИТЬ ПО
| Контрагент.*,
| Номенклатура.*,
| ХарактеристикаНоменклатуры.*,
| Ответственный.*,
| Документ.*,
| (ЕСТЬNULL(ИсточникиИнформацииПриОбращении.ИсточникИнформации,ЗНАЧЕНИЕ(Справочник.ИсточникиИнформацииПриОбращенииПокупателей.ПустаяСсылка))).* КАК ИсточникИнформации
| //ПСЕВДОНИМЫ_СВОЙСТВА
| //ПСЕВДОНИМЫ_КАТЕГОРИИ
|}
|
|ИТОГИ
| СУММА(КоличествоОборот),
| СУММА(СтоимостьОборот),
| СУММА(СтоимостьБезСкидокОборот - СтоимостьОборот) КАК СкидкаОборот,
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ(Документ)) КАК Количество
|ПО
| ОБЩИЕ
|{ИТОГИ ПО
| Контрагент.*,
| Номенклатура.*,
| ХарактеристикаНоменклатуры.*,
| Ответственный.*,
| Документ.*,
| (ЕСТЬNULL(ИсточникиИнформацииПриОбращении.ИсточникИнформации,ЗНАЧЕНИЕ(Справочник.ИсточникиИнформацииПриОбращенииПокупателей.ПустаяСсылка))).* КАК ИсточникИнформации,
| НАЧАЛОПЕРИОДА(CRM_ПредложенияОбороты.ДокументПредложения.Дата, ДЕНЬ) КАК ПериодДень,
| НАЧАЛОПЕРИОДА(CRM_ПредложенияОбороты.ДокументПредложения.Дата, НЕДЕЛЯ) КАК ПериодНеделя,
| НАЧАЛОПЕРИОДА(CRM_ПредложенияОбороты.ДокументПредложения.Дата, МЕСЯЦ) КАК ПериодМесяц,
| НАЧАЛОПЕРИОДА(CRM_ПредложенияОбороты.ДокументПредложения.Дата, КВАРТАЛ) КАК ПериодКвартал,
| НАЧАЛОПЕРИОДА(CRM_ПредложенияОбороты.ДокументПредложения.Дата, ГОД) КАК ПериодГод
| //ПСЕВДОНИМЫ_СВОЙСТВА
| //ПСЕВДОНИМЫ_КАТЕГОРИИ
|}" ;
Если УниверсальныйОтчет. ИспользоватьСвойстваИКатегории Тогда
УниверсальныйОтчет. ДобавитьСвойстваИКатегорииДляПоля( "CRM_ПредложенияОбороты.Номенклатура" , "Номенклатура" , "Номенклатура" , ПланыВидовХарактеристик. НазначенияСвойствКатегорийОбъектов. Справочник_Номенклатура) ;
УниверсальныйОтчет. ДобавитьСвойстваИКатегорииДляПоля( "CRM_ПредложенияОбороты.ХарактеристикаНоменклатуры" , "ХарактеристикаНоменклатуры" , "Характеристика номенклатуры" , ПланыВидовХарактеристик. НазначенияСвойствКатегорийОбъектов. Справочник_Номенклатура) ;
УниверсальныйОтчет. ДобавитьСвойстваИКатегорииДляПоля( "CRM_ПредложенияОбороты.Контрагент" , "Контрагент" , "Контрагент" , ПланыВидовХарактеристик. НазначенияСвойствКатегорийОбъектов. Справочник_Номенклатура) ;
УниверсальныйОтчет. ДобавитьСвойстваИКатегорииДляПоля( "CRM_ПредложенияОбороты.ДокументПредложения" , "Документ" , "Коммерческое предложение" , ПланыВидовХарактеристик. НазначенияСвойствКатегорийОбъектов. Документ_CRM_КоммерческоеПредложение) ;
УниверсальныйОтчет. ДобавитьВТекстЗапросаСвойстваИКатегории( ТекстЗапроса) ;
КонецЕсли ;
УниверсальныйОтчет. ПостроительОтчета. Текст = ТекстЗапроса;
УниверсальныйОтчет. мСтруктураПредставлениеПолей. Вставить( "ХарактеристикаНоменклатуры" , "Характеристика номенклатуры" ) ;
УниверсальныйОтчет. мСтруктураПредставлениеПолей. Вставить( "Документ" , "Коммерческое предложение" ) ;
УниверсальныйОтчет. мСтруктураПредставлениеПолей. Вставить( "ИсточникИнформации" , "Источник информации при обращении покупателя" ) ;
УниверсальныйОтчет. ДобавитьПоказатель( "Количество" , "Количество документов" , Истина , "ЧЦ = 15 ; ЧДЦ = 3" ) ;
УниверсальныйОтчет. ДобавитьПоказатель( "КоличествоОборот" , "Количество номенклатуры" , Истина , "ЧЦ = 15 ; ЧДЦ = 3" , , ) ;
УниверсальныйОтчет. ДобавитьПоказатель( "СтоимостьОборот" , "Сумма" , Истина , "ЧЦ = 15 ; ЧДЦ = 2" ) ;
УниверсальныйОтчет. ДобавитьПоказатель( "СкидкаОборот" , "Скидка" , Истина , "ЧЦ = 15 ; ЧДЦ = 2" , , ) ;
УниверсальныйОтчет. ДобавитьИзмерениеСтроки( "Контрагент" ) ;
УниверсальныйОтчет. ДобавитьИзмерениеСтроки( "Номенклатура" ) ;
УниверсальныйОтчет. ДобавитьОтбор( "Контрагент" ) ;
УниверсальныйОтчет. ДобавитьОтбор( "Номенклатура" ) ;
УниверсальныйОтчет. ДобавитьОтбор( "Ответственный" ) ;
УниверсальныйОтчет. ДобавитьОтбор( "Документ" ) ;
УниверсальныйОтчет. УстановитьПредставленияПолей( УниверсальныйОтчет. мСтруктураПредставлениеПолей, УниверсальныйОтчет. ПостроительОтчета) ;
УниверсальныйОтчет. УстановитьТипыЗначенийСвойствДляОтбора( ) ;
УниверсальныйОтчет. УстановитьНачальныеНастройки( Ложь ) ;
УниверсальныйОтчет. ДобавитьОтбор( "Контрагент" ) ;
УниверсальныйОтчет. ДобавитьОтбор( "Номенклатура" ) ;
УниверсальныйОтчет. ДобавитьОтбор( "Ответственный" ) ;
УниверсальныйОтчет. ДобавитьОтбор( "Документ" ) ;
УниверсальныйОтчет. мСтруктураФорматаПолей. Вставить( "ДатаВыполнения" , "ДЛФ=DDT" ) ;
УниверсальныйОтчет. мСтруктураФорматаПолей. Вставить( "ДатаФактическогоВыполнения" , "ДЛФ=DDT" ) ;
УниверсальныйОтчет. мМинимальнаяШиринаКолонкиПоказатель = 10 ;
УниверсальныйОтчет. мМаксимальнаяШиринаКолонки = 80 ;
КонецПроцедуры
Как настроить условное оформление в Универсальном отчете?
Выравнивание значений влево :
Код 1C v 8.х ЭлементОформления = УниверсальныйОтчет. ПостроительОтчета. УсловноеОформление. Добавить( "Номенклатура" , "Номенклатура" ) ;
ЭлементОформления. Область. Добавить( "Номенклатура" , "Номенклатура" , ТипОбластиОформления. Поле) ;
ЭлементОформления. Оформление. ГоризонтальноеПоложение. Значение = ГоризонтальноеПоложение. Лево;
ЭлементОформления. Оформление. ГоризонтальноеПоложение. Использование = Истина ;
ЭлементОформления. Использование = Истина ;
ЭлементОформления = УниверсальныйОтчет. ПостроительОтчета. УсловноеОформление. Добавить( "ХарактеристикаНоменклатуры" , "ХарактеристикаНоменклатуры" ) ;
ЭлементОформления. Область. Добавить( "ХарактеристикаНоменклатуры" , "ХарактеристикаНоменклатуры" , ТипОбластиОформления. Поле) ;
ЭлементОформления. Оформление. ГоризонтальноеПоложение. Значение = ГоризонтальноеПоложение. Лево;
ЭлементОформления. Оформление. ГоризонтальноеПоложение. Использование = Истина ;
ЭлементОформления. Использование = Истина ;
УниверсальныйОтчет. мМинимальнаяШиринаКолонкиПоказатель = 7 ;
УниверсальныйОтчет. мМаксимальнаяШиринаКолонки = 50 ;
Изменение цвета текста и т.д.
Код 1C v 8.х
ЭлементОформления = УниверсальныйОтчет. ПостроительОтчета. УсловноеОформление. Добавить( "ТребуетсяЗаказать" , "Требуется заказать" ) ;
ЭлементОформления. Область. Добавить( "Состояние" , "Состояние" , ТипОбластиОформления. Поле) ;
ЭлементОтбора = ЭлементОформления. Отбор. Добавить( "Состояние" ) ;
ЭлементОтбора. ВидСравнения = ВидСравнения. Равно;
ЭлементОтбора. Значение = 0 ;
ЭлементОтбора. Использование = Истина ;
ЭлементОформления. Оформление. ЦветТекста. Значение = WebЦвета. Красный;
ЭлементОформления. Оформление. ЦветТекста. Использование = Истина ;
ЭлементОформления. Оформление. Текст. Значение = "Требуется заказать" ;
ЭлементОформления. Оформление. Текст. Использование = Истина ;
ЭлементОформления. Использование = Истина ;
ЭлементОформления = УниверсальныйОтчет. ПостроительОтчета. УсловноеОформление. Добавить( "РекомендуетсяЗаказать" , "Рекомендуется заказать" ) ;
ЭлементОформления. Область. Добавить( "Состояние" , "Состояние" , ТипОбластиОформления. Поле) ;
ЭлементОтбора = ЭлементОформления. Отбор. Добавить( "Состояние" ) ;
ЭлементОтбора. ВидСравнения = ВидСравнения. Равно;
ЭлементОтбора. Значение = 1 ;
ЭлементОтбора. Использование = Истина ;
ЭлементОформления. Оформление. ЦветТекста. Значение = WebЦвета. Коричневый;
ЭлементОформления. Оформление. ЦветТекста. Использование = Истина ;
ЭлементОформления. Оформление. Текст. Значение = "Рекомендуется заказать" ;
ЭлементОформления. Оформление. Текст. Использование = Истина ;
ЭлементОформления. Использование = Истина ;
ЭлементОформления = УниверсальныйОтчет. ПостроительОтчета. УсловноеОформление. Добавить( "НеТребуетсяЗаказывать" , "Не требуется заказывать" ) ;
ЭлементОформления. Область. Добавить( "Состояние" , "Состояние" , ТипОбластиОформления. Поле) ;
ЭлементОтбора = ЭлементОформления. Отбор. Добавить( "Состояние" ) ;
ЭлементОтбора. ВидСравнения = ВидСравнения. Равно;
ЭлементОтбора. Значение = 2 ;
ЭлементОтбора. Использование = Истина ;
ЭлементОформления. Оформление. ЦветТекста. Значение = WebЦвета. Зеленый;
ЭлементОформления. Оформление. ЦветТекста. Использование = Истина ;
ЭлементОформления. Оформление. Текст. Значение = "Не требуется заказывать" ;
ЭлементОформления. Оформление. Текст. Использование = Истина ;
ЭлементОформления. Использование = Истина ;
ЭлементОформления = УниверсальныйОтчет. ПостроительОтчета. УсловноеОформление. Добавить( "ЗонаПоСумме" , "Зона По Сумме" ) ;
ЭлементОформления. Область. Добавить( "ЗонаПоСумме" , "ЗонаПоСумме" , ТипОбластиОформления. Поле) ;
ЭлементОтбора = ЭлементОформления. Отбор. Добавить( "ЗонаПоСумме" ) ;
ЭлементОтбора. ВидСравнения = ВидСравнения. Равно;
ЭлементОтбора. Значение = "крас" ;
ЭлементОтбора. Использование = Истина ;
ЭлементОформления. Оформление. ЦветФона. Значение = WebЦвета. Красный;
ЭлементОформления. Оформление. ЦветФона. Использование = Истина ;
ЭлементОформления. Оформление. Текст. Значение = "" ;
ЭлементОформления. Оформление. Текст. Использование = Истина ;
ЭлементОформления. Использование = Истина ;
ЭлементОформления = УниверсальныйОтчет. ПостроительОтчета. УсловноеОформление. Добавить( "ЗонаПоСумме" , "Зона По Сумме" ) ;
ЭлементОформления. Область. Добавить( "ЗонаПоСумме" , "ЗонаПоСумме" , ТипОбластиОформления. Поле) ;
ЭлементОтбора = ЭлементОформления. Отбор. Добавить( "ЗонаПоСумме" ) ;
ЭлементОтбора. ВидСравнения = ВидСравнения. Равно;
ЭлементОтбора. Значение = "зелн" ;
ЭлементОтбора. Использование = Истина ;
ЭлементОформления. Оформление. ЦветТекста. Значение = WebЦвета. Зеленый;
ЭлементОформления. Оформление. ЦветТекста. Использование = Истина ;
ЭлементОформления. Оформление. Шрифт. Значение = Новый Шрифт( , , Истина ) ;
ЭлементОформления. Оформление. Шрифт. Использование = Истина ;
ЭлементОформления. Оформление. Текст. Значение = "|||||||||||||||||" ;
ЭлементОформления. Оформление. Текст. Использование = Истина ;
ЭлементОформления. Использование = Истина ;
Для типа «Дата»:
Код 1C v 8.х ЭлементОформления = УниверсальныйОтчет. ПостроительОтчета. УсловноеОформление. Добавить( "ДатаЗаписи" , "Дата записи" ) ;
ЭлементОформления. Область. Добавить( "ДатаЗаписи" , "Дата записи" , ТипОбластиОформления. Поле) ;
ЭлементОформления. Оформление. Формат. Значение = "ДФ=dd.MM.yyyy" ;
ЭлементОформления. Оформление. Формат. Использование = Истина ;
ЭлементОформления. Использование = Истина ;
Для типа «Булево»:
Код 1C v 8.х ЭлементОформления = УниверсальныйОтчет. ПостроительОтчета. УсловноеОформление. Добавить( "Печать" , "Печать" ) ;
ЭлементОформления. Область. Добавить( "Печать" , "Печать" , ТипОбластиОформления. Поле) ;
ЭлементОформления. Оформление. ГоризонтальноеПоложение. Значение = ГоризонтальноеПоложение. Центр;
ЭлементОформления. Оформление. Формат. Значение = «БЛ= Нет; БИ= Напечатан»;
ЭлементОформления. Оформление. ГоризонтальноеПоложение. Использование = Истина ;
ЭлементОформления. Использование = Истина ;
Виртуальная таблица "
РегистрРасчета.<ИмяРегистра>.ДанныеГрафика " определена для тех регистров расчета, которые
поддерживают период действия . При конфигурировании с таким регистром расчета необходимо связать непериодический регистр сведений который и будет поставлять информацию о графике.
Для более удобного получения данных графика в системе определена виртуальная таблица, которая помимо прочих полей содержит виртуальные поля:
* <Имя ресурса графика>БазовыйПериод;
* <Имя ресурса графика>ПериодДействия;
* <Имя ресурса графика>ПериодРегистрации;
* <Имя ресурса графика>ФактическийПериодДействия.
То есть для каждого числового ресурса регистра сведений, назначенного регистру расчета в качестве графика, можно получить для строк регистра расчета его сумму с учетом базового периода строки регистра расчета, периода действия, периода регистрации и
фактического периода действия.
При построении виртуальной таблицы данных графика происходит соединение таблиц регистра расчета, регистра сведений, а в случае получения поля "<Имя ресурса графика>ФактическийПериодДействия" - еще и таблицы
фактического периода действия регистра расчета. Так как данные для всех четырех перечисленных полей получаются путем соединения с таблицей регистра сведений по разным условиям, это значит, что в общем случае будет выполнено четыре соединения с таблицей регистра сведений.
При получении виртуальных таблиц система старается действовать оптимально, в частности, выполняется только то количество соединений, которое необходимо для получения полей виртуальной таблицы перечисленных в разделе "ВЫБРАТЬ".
Следствием этого является то, что при составлении текста запроса не следует выбирать поля данной виртуальной таблицы "про запас". Эта рекомендация может показаться общей, но следует помнить, что, как правило, получение "ненужного" поля в запросе к реальным таблицам или другим виртуальным таблицам приводит к некоторому увеличению сетевого трафика и, в общем случае, весьма незначительному снижению производительности. Ясно, что получение в запросе пяти полей регистра мало чем отличается от получения в запросе еще одного, шестого поля, если речь не идет о "больших" полях. Но в случае виртуальной таблицы данных графика появление еще одного виртуального поля из ряда перечисленных выше изменяет ситуацию принципиально. Время выполнения запроса может измениться в разы. То есть рекомендация составлять запросы оптимально по части числа выбираемых полей принимает особый смысл для данной виртуальной таблицы.
Следует также заметить, что принципиальное влияние на производительность запроса к виртуальной таблице данных графика оказывает не столько число виртуальных полей, сколько число их различных "видов".
Рассмотрим пример. В регистре сведений, назначенном в качестве графика, есть ресурсы "ЧислоДней" и "ЧислоЧасов". Рассмотрим три запроса.
Код 1C v 8.х
1 .
ВЫБРАТЬ
ЧислоДнейПериодРегистрации
ИЗ
РегистрРасчета. Зарплата. ДанныеГрафика( Организация = &Организация)
2 .
ВЫБРАТЬ
ЧислоДнейПериодРегистрации,
ЧислоЧасовПериодРегистрации
ИЗ
РегистрРасчета. Зарплата. ДанныеГрафика( Организация = &Организация)
3 .
ВЫБРАТЬ
ЧислоДнейПериодРегистрации,
ЧислоЧасовПериодДействия
ИЗ
РегистрРасчета. Зарплата. ДанныеГрафика( Организация = &Организация)
При сопоставлении времени выполнения этих запросов мы обнаружим, что второй запрос при прочих равных условиях выполняется почти то же время, что и первый запрос, несмотря на появление еще одного виртуального поля. А вот третий запрос исполняется заметно дольше (возможно, в несколько раз), чем второй, несмотря на одинаковое число выбираемых виртуальных полей.
Это связано с тем, что для получения полей "ЧислоДнейПериодРегистрации" и "ЧислоЧасовПериодРегистрации" выполняется одно соединение с регистром сведений по значению поля "ПериодРегистрации" регистра расчета (сколько бы ресурсов регистра при этом не пришлось суммировать). А при получении еще и поля "ЧислоЧасовПериодДействия", выполняется еще одно соединение с регистром сведений, которое выполняется по значению поля "ПериодДействия".