gifts2017

Универсальная функция для программного выполнения СКД

Опубликовал Сергей Галюк (dj_serega) в раздел Программирование - Инструментарий

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

Передаваемые параметры описаны в комментарии к процедуре.
Функция возвращает ДанныеРасшифровкиКомпоновкиДанных.

Из БСП используется только общая процедура:
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора() 

Собственно сама общая функция.

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

    Если СтруктураПараметров = Неопределено Тогда
        СтруктураПараметров = Новый Структура;
    КонецЕсли;
    Если СтруктураОтборов = Неопределено Тогда
        СтруктураОтборов = Новый Структура;
    КонецЕсли;
    МассивПараметровОтбора = Новый Массив;
    МассивПараметровОтбора.Добавить("ПравоеЗначение");
    МассивПараметровОтбора.Добавить("ВидСравнения");
    МассивПараметровОтбора.Добавить("Представление");
    МассивПараметровОтбора.Добавить("Использование");
    МассивПараметровОтбора.Добавить("РежимОтображения");
    МассивПараметровОтбора.Добавить("ИдентификаторПользовательскойНастройки");


    Для каждого ТекущийПараметр Из СтруктураПараметров Цикл

        ОбщегоНазначенияКлиентСервер.УстановитьПараметрСКД(СКД.Параметры, ТекущийПараметр.Ключ, ТекущийПараметр.Значение, ОграничениеИспользованияПараметров);

    КонецЦикла;

    Если ПустаяСтрока(ИмяВариантаНастроек) Тогда
        Настройки = СКД.НастройкиПоУмолчанию;
    Иначе
        НайденныйВариант = СКД.ВариантыНастроек.Найти(ИмяВариантаНастроек);
        Если НайденныйВариант = Неопределено Тогда
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не найден вариант настроек " + НайденныйВариант);
            Возврат Неопределено;
        КонецЕсли;
        Настройки = НайденныйВариант.Настройки;
    КонецЕсли;

    Отбор = Настройки.Отбор;

    Для каждого ТекущийПараметр Из Настройки.ПараметрыДанных.Элементы Цикл
        // Надеюсь, временный костыль. Нужно перебрать параметры варианта и установить их.

        ИмяПараметра        = Строка(ТекущийПараметр.Параметр);
        ЗначениеПараметра   = Неопределено;
        Если СтруктураПараметров.Свойство(ИмяПараметра, ЗначениеПараметра) Тогда
            ТекущийПараметр.Использование   = Истина;
            ТекущийПараметр.Значение        = ЗначениеПараметра;
        КонецЕсли;

    КонецЦикла;

    Для каждого ТекущийОтбор Из СтруктураОтборов Цикл

        Если ТекущийОтбор.Ключ = "СложныйОтбор" Тогда
            // Если в качестве ключа строка "СложныйОтбор", значит установка отбора через общие процедуры:
            //  ОбщиеПроцедуры.УстановитьУниверсальныйОтбор(Отбор);

            Выполнить ТекущийОтбор.Значение;

        Иначе

            СтруктураПараметровПроцедуры = Новый Структура("ПравоеЗначение, ВидСравнения, Представление, Использование, РежимОтображения, ИдентификаторПользовательскойНастройки");

            Для каждого ТекущийПараметрОтбора Из МассивПараметровОтбора Цикл

                Если ТекущийОтбор.Значение.Свойство(ТекущийПараметрОтбора) Тогда

                    СтруктураПараметровПроцедуры.Вставить(ТекущийПараметрОтбора, ТекущийОтбор.Значение[ТекущийПараметрОтбора]);

                КонецЕсли;

            КонецЦикла;

            ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(Настройки.Отбор, ТекущийОтбор.Ключ, СтруктураПараметровПроцедуры.ПравоеЗначение,
                                                                    СтруктураПараметровПроцедуры.ВидСравнения,
                                                                    СтруктураПараметровПроцедуры.Представление,
                                                                    СтруктураПараметровПроцедуры.Использование,
                                                                    СтруктураПараметровПроцедуры.РежимОтображения,
                                                                    СтруктураПараметровПроцедуры.ИдентификаторПользовательскойНастройки);

        КонецЕсли;

    КонецЦикла;


    КомпоновщикМакетаКомпоновкиДанных = Новый КомпоновщикМакетаКомпоновкиДанных;
    ДанныеРасшифровкиКомпоновкиДанных = Новый ДанныеРасшифровкиКомпоновкиДанных;
    МакетКомпоновкиДанных = КомпоновщикМакетаКомпоновкиДанных.Выполнить(СКД, Настройки, ДанныеРасшифровкиКомпоновкиДанных);

    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    Если Не СтруктураИсточниковДанных = Неопределено Тогда
        ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, СтруктураИсточниковДанных, ДанныеРасшифровкиКомпоновкиДанных);
    Иначе
        ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, , ДанныеРасшифровкиКомпоновкиДанных);
    КонецЕсли;

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

    СтруктураВозврата = Новый Структура;
    СтруктураВозврата.Вставить("ДанныеРасшифровкиКомпоновкиДанных", ДанныеРасшифровкиКомпоновкиДанных);

    Возврат СтруктураВозврата;

КонецФункции // ВыполнитьСКД

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

// Поиск и установка значения параметра схемы компоновки данных
// Параметры:
//		ПараметрыСКД		- ПараметрыСхемыКомпоновкиДанных - Параметры СКД
//		ИмяПараметра		- Строка		- Имя параметра
//		ЗначениеПараметра	- Произвольное	- Устанавливаемое значение параметра
//
Процедура УстановитьПараметрСКД(ПараметрыСКД, ИмяПараметра, ЗначениеПараметра, ОграничениеИспользования = Неопределено) Экспорт 
	
	НайденныйПараметр = ПараметрыСКД.Найти(ИмяПараметра);
	Если НайденныйПараметр = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	НайденныйПараметр.Значение		= ЗначениеПараметра;
	
	Если Не ОграничениеИспользования = Неопределено Тогда
		НайденныйПараметр.ОграничениеИспользования = ОграничениеИспользования;
	КонецЕсли;
	
КонецПроцедуры // УстановитьПараметрСКД
 

См. также

Подписаться Добавить вознаграждение
Комментарии
1. ффф ыыы (zqzq) 21.05.15 08:15
Уже было http://infostart.ru/public/80164/ причем без использования внешних функций из БСП и с возможностью выгрузки в таблицу значений. Также лучше передавать не ИмяВариантаНастроек, а сам вариант настроек: при наличии компоновщика настроек Компоновщик.ПолучитьНастройки() возвращает настройки с учетом пользовательских настроек компоновщика, по имени варианта вы их не получите.
2. Сергей Галюк (dj_serega) 21.05.15 09:36
(1) zqzq, Спасибо за ссылку на статью. Но в ней нет возможности установить отборы (поэтому и используется общая процедура). Получается по ссылке мы можем только выполнить СКД.

Вот рабочий пример выполнения с параметрами, отборами и вариантом.

	СКД = Отчеты.Анализ.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
	
	СтруктураПараметров = Новый Структура;
	СтруктураПараметров.Вставить("Период",					КонецМесяца(ТекущаяДата()));
	СтруктураПараметров.Вставить("ФизлицоРуководитель",	Ссылка);
	
	СтруктураОтборов = Новый Структура;
	СтруктураОтборов.Вставить("СложныйОтбор", "ОбщиеПроцедурыСервер.УстановитьОтборПоПодразделению(Отбор)"); // Тут общий отбор на все отчеты
	
	СтруктураПараметровПроцедуры = Новый Структура();
	СтруктураПараметровПроцедуры.Вставить("ПравоеЗначение",	МассивФизлиц);
	СтруктураПараметровПроцедуры.Вставить("ВидСравнения",	ВидСравненияКомпоновкиДанных.ВСписке);
	СтруктураОтборов.Вставить("Физлицо", СтруктураПараметровПроцедуры); // Тут отбор по подчиненным
	
	ОбщиеПроцедурыСервер.ВыполнитьСКД(СКД, ТабДокумент, СтруктураПараметров,, СтруктураОтборов, "ПоПодчиненным", Истина);
...Показать Скрыть

3. ффф ыыы (zqzq) 21.05.15 11:48
(2) dj_serega, пользуюсь той процедурой. При необходимости отбора, его можно установить в настройке и передать саму настройку. Тут, наверное, удобнее.
4. Яков Коган (Yashazz) 21.05.15 12:06
Чудовищный баян. Но, вероятно, те, кому лень почитать пару абзацев у Хрусталёвой, рады возможности воспользоваться халявой, чем и объясняется рейтинг статьи.

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


Полагаю, каждый более-менее грамотный специалист давно для себя сделал пакетники для работы с СКД и пользуется ими.

p.s. не говоря уж о том, что предложенное ещё и не универсально. Вывода в таблицу значений нет, а бывает очень надо. Действительно профессиональным подходом было бы сделать общий механизм - в табличный документ, таблицу, дерево.

...жаль, не нашёл, где минуснуть можно.
5. Сергей Галюк (dj_serega) 21.05.15 12:24
(4) Yashazz, Извиняюсь за указанную общую процедуру не из БСП. Уже приложил к публикации.

Автор, видимо, не в курсе возможности такой вещи, как КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра, поэтому делает какие-то странные костыли,

Вкурсе-вкурсе.

1. Читаем СП:
Описание:
Устанавливает значение параметра и включает свойство Использование. Если параметр с указанным именем не найден, будет вызвано исключение.
.
Обрабатывать исключения попыткой нет желания ;)
2. КомпоновщикНастроек есть в отчетах. А я эту функцию вызываю из справочников, документов и при программном формировании скд.
3.
p.s. не говоря уж о том, что предложенное ещё и не универсально. Вывода в таблицу значений нет, а бывает очень надо. Действительно профессиональным подходом было бы сделать общий механизм - в табличный документ, таблицу, дерево.

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

Чудовищный баян.

И почему баян так еще и чудовищный?
6. Яков Коган (Yashazz) 21.05.15 12:48
(5)
КомпоновщикНастроек есть в отчетах. А я эту функцию вызываю из справочников, документов и при программном формировании скд.
Да что вы говорите? А вот это уже отменили, да?
	комп=Новый КомпоновщикНастроекКомпоновкиДанных;
	комп.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(мояСКД));
	комп.ЗагрузитьНастройки(мояСКД.НастройкиПоУмолчанию);

спокойно юзается, где только в голову взбредёт.

Обрабатывать исключения попыткой нет желания ;)
А использовать циклы там, где не надо, желание есть?

Я у себя уж лет пять назад всё сделал, и в таблицу значений, и куда угодно...
7. Сергей Галюк (dj_serega) 21.05.15 12:53
(6) Yashazz,
Да что вы говорите? А вот это уже отменили, да?

Не злитесь ;)
А использовать циклы там, где не надо, желание есть?

Как по мне то цикл с одной итерацией лучше чем инициализировать компоновщик и загружать настройки.
Я у себя уж лет пять назад всё сделал, и в таблицу значений, и куда угодно...

Можно увидеть ссылку на публикацию?
8. Яков Коган (Yashazz) 21.05.15 13:35
(7) dj_serega, а вы возьмите любую из моих публикаций, где мне ругались в комментах на отсутствие функций "СоздатьСКД" или "ПревращениеИмениВНаименование". Я это пихаю почти везде, а запостить вместе с основным кодом иногда забываю)))

upd: если очень надо, могу через прям щас запузырить сюда все свои основные блоки на эту тему
9. Сергей Галюк (dj_serega) 21.05.15 14:15
(8) Yashazz,
если очень надо, могу через прям щас запузырить сюда все свои основные блоки на эту тему

А может Офигенную публикацию по своим основным блокам сделаете? ;)
10. Яков Коган (Yashazz) 21.05.15 17:33
(9) dj_serega, честно? Я все эти годы, глядя на свой код, думаю: "ну баян же очевидный, фигли его выкладывать", а потом обнаруживаю гораздо менее проработанные аналоги, которые, оказывается, пользуются спросом. Каждый раз ситуация сия вызывает у меня лёгкое охренение.

Сделал вот удобное создание табличного поля (реквизита и элемента формы) под УФ, потом смотрю на типовую БП 3.0 и вижу там почти ровно то же самое). Перенёс когда-то доп.свойства объектов из единого регистра сведений (как было модно во времена 8.1) в табчасть объекта, глянь - и типовая 1С туда же) Поэтому, просто баянить неохота. Если есть конкретная нужда - выложу, а так, чисто "в никуда" - смысл?...

Ну, вот, например:

// Ищет среди всей иерархии отборов Компоновщика элемент с ПолемСКД (ЛевоеЗначение), равным указанному, или
// ищет группу по её типу и имени (в этом случае рПолеСКДилиИмяТипГруппы это структура: ИмяГруппы, ТипГруппы)
// Если не нашёл, возвращает Неопределено.
Функция ПолучитьОтборСКД(рКомпоновщикИлиОтбор,рПолеСКДилиИмяТипГруппы) Экспорт
	Если ТипЗнч(рКомпоновщикИлиОтбор)=Тип("ОтборКомпоновкиДанных") или ТипЗнч(рКомпоновщикИлиОтбор)=Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда
		обрОткуда=рКомпоновщикИлиОтбор;
	ИначеЕсли ТипЗнч(рКомпоновщикИлиОтбор)=Тип("КомпоновщикНастроекКомпоновкиДанных") Тогда
		обрОткуда=рКомпоновщикИлиОтбор.Настройки.Отбор;
	Иначе
		Возврат Неопределено;
	КонецЕсли;
	Если ТипЗнч(рПолеСКДилиИмяТипГруппы)=Тип("ПолеКомпоновкиДанных") Тогда
		рИщемДляЭлемента=Истина;
	ИначеЕсли ТипЗнч(рПолеСКДилиИмяТипГруппы)=Тип("Структура") Тогда
		рИщемДляЭлемента=Ложь;
	Иначе
		Возврат Неопределено;
	КонецЕсли;
	//
	Для каждого элотб Из обрОткуда.Элементы Цикл
		#Если Клиент Тогда
			ОбработкаПрерыванияПользователя();
		#КонецЕсли
		рТип=ТипЗнч(элотб);
		Если рТип=Тип("ЭлементОтбораКомпоновкиДанных") Тогда
			Если рИщемДляЭлемента и элотб.ЛевоеЗначение=рПолеСКДилиИмяТипГруппы Тогда
				Возврат элотб;
			КонецЕсли;			
		ИначеЕсли рТип=Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда
			Если не рИщемДляЭлемента 
			и СокрЛП(элотб.Представление)=СокрЛП(рПолеСКДилиИмяТипГруппы.ИмяГруппы)
			и элотб.ТипГруппы=рПолеСКДилиИмяТипГруппы.ТипГруппы
			Тогда
				Возврат элотб;
			КонецЕсли;
			// идём глубже
			Возврат ПолучитьОтборСКД(элотб,рПолеСКДилиИмяТипГруппы);
		КонецЕсли;
	КонецЦикла;
	//
	Возврат Неопределено;
КонецФункции


// Добавляет произвольное условное оформление на управляемую форму; должна вызываться строго с сервера
// Параметры:
//    рФорма - сериализованная форма, вызванная с &НаСервере
//    рПараметры - структура:
//         ОформляемоеПоле - строка (обязательный), имя элемента формы, подлежащего оформлению
//         ПолеИсточник - строка (обязательный), имя реквизита формы, чьи данные определяют отбор
//         ВидСравнения - вид сравнения СКД для отбора условия оформления
//         ПравоеЗначение - конкретное значение реквизита ПолеИсточник, определяющее отбор
//         Оформление - структура с именами полей (см.ниже), определяющая оформление (по умолч.жирный шрифт)
//         
// Имена элементов настройки оформления:
// ЦветТекста (TextColor); 
// ЦветФона (BackColor); 
// Шрифт (Font); 
// Формат (Format); 
// ГоризонтальноеПоложение (HorizontalAlign); 
// ВертикальноеПоложение (VerticalAlign); 
// ОриентацияТекста (TextOrientation); 
// Отступ (Indent); 
// АвтоОтступ (AutoIndent); 
// ВыделятьОтрицательные (MarkNegatives); 
// Текст (Text).
//
Процедура ДобавитьУсловноеОформление(рФорма,рПараметры) Экспорт
Попытка
	// адреса (обязательное)
	рПутьОформляемогоПоля=СокрЛП(рПараметры.ОформляемоеПоле);
	рПутьПоляИсточника=СокрЛП(рПараметры.ПолеИсточник);
	// оформление и прочее
	рВидСравнения=?(рПараметры.Свойство("ВидСравнения"),рПараметры.ВидСравнения,ВидСравненияКомпоновкиДанных.Равно);
	рПравоеЗначение=?(рПараметры.Свойство("ПравоеЗначение"),рПараметры.ПравоеЗначение,Неопределено);
	рОформление=?(рПараметры.Свойство("Оформление"),рПараметры.Оформление,Новый Структура);
	Если рОформление.Количество()=0 Тогда 
		рОформление.Вставить("Шрифт",Новый Шрифт(,,Истина));
	КонецЕсли;
	
	// оформляемый элемент добавляем каждый раз, не глядя, что уже есть элементы про этот же элемент формы!
	// если делать иначе, то для каждого элформы возможно лишь одно оформление
	рПолеОформляемое=Новый ПолеКомпоновкиДанных(рПутьОформляемогоПоля);
	эуо=рФорма.УсловноеОформление.Элементы.Добавить();
	полеэуо=эуо.Поля.Элементы.Добавить();
	полеэуо.Поле=рПолеОформляемое;
	полеэуо.Использование=Истина;
	//
	рПолеИсточник=Новый ПолеКомпоновкиДанных(рПутьПоляИсточника);
	отб=ПолучитьОтборСКД(эуо.Отбор,рПолеИсточник);
	Если отб=Неопределено Тогда
		отб=эуо.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
		отб.ЛевоеЗначение=рПолеИсточник;
	КонецЕсли;
	отб.ВидСравнения=рВидСравнения;
	отб.ПравоеЗначение=рПравоеЗначение;
	Для каждого киз Из рОформление Цикл
		эуо.Оформление.УстановитьЗначениеПараметра(киз.Ключ,киз.Значение);
	КонецЦикла;
	//
Исключение
	Сообщить("РаботаСДиалогамиСервер.ДобавитьУсловноеОформление, ошибка: "+ОписаниеОшибки(),СтатусСообщения.ОченьВажное);
КонецПопытки;
КонецПроцедуры

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


И кому оно надо?
11. Яков Коган (Yashazz) 22.05.15 16:34
Вообще, тенденция пугающая. Стабильно большой популярностью пользуются куцые, слабо структурированные, откровенно копипащенные, мутно и отрывочно изложенные "публикации", выложенные средненько знающими для совсем слабо знающих. За счёт рейтинга такие горе-публикации легко обходят действительно профессиональные разработки, стоившие несоизмеримо больше ресурсов их авторам. Энтузиазм профи-авторов, таким образом, не получает должной оценки. Так на первый план ИС выходят не профессиональные разработки, как хотелось бы, а убогие исходники или псевдо-учебные фрагменты (редко-редко можно видеть действительно качественный учебник, буде то справочник или пошаговик). В результате ИС становится "лягушатником" для начинающих, которые и жёлтых книжек-то не читали, не то что материалов ИТС, а в "лучших" публикациях болтается такое позорище, что уж не знаю, как Доржи перед 1С не стыдно.

пы.сы. Себя отношу не к профи, а к средненько знающим. Именно посмотрев на ситуацию и рейтинг, резко перестал выкладывать "статьи". Мне хватило печального опыта с XPath и модальностями/асинхроном. Жаль, что автору этой публикации самокритики недостаёт.
12. Сергей Галюк (dj_serega) 22.05.15 17:41
(11) Yashazz,
Стабильно большой популярностью пользуются куцые, слабо структурированные, откровенно копипащенные, мутно и отрывочно изложенные "публикации", выложенные средненько знающими для совсем слабо знающих.

Такие публикации не всегда вырываются в перед.
Так на первый план ИС выходят не профессиональные разработки, как хотелось бы

Да ну. Вот взять к примеру ildarovich'а. Его публикации всегда пользуются популярностью. И очень часто на первых местах.
Жаль, что автору этой публикации самокритики недостаёт.

Жаль что Вы так считаете.

Именно посмотрев на ситуацию и рейтинг, резко перестал выкладывать "статьи".

А Вы не сдавайтесь, выкладывайте свои Стоящие статьи. С интересом почитаю.
13. Vladimir Savelyev (gigapevt) 27.05.15 09:28
(12) dj_serega, Согласен с автором, тоже с удовольствием почитаю !
14. Андрей Гореликов (alon) 27.05.15 11:37
Вряд ли возможно научиться сразу выдать профессионально написанные публикации, полезные специалистам абсолютно всех уровней. Всегда приходится с чего-то начинать.
Кроме того, часто только в процессе обсуждения удается выяснить некоторые нюансы обсуждаемого вопроса. При этом пользу получает и автор и окружающие, которые не будут повторять те же грабли.
Я считаю, что здесь на передний план выступает более глубокая модерация знающими специалистами. Нужно установить более строгие требования на публикацию. Сделать предварительное обсуждение в песочнице. Ранжировать статьи для разных уровней профессионализма.
Вы же не предъявляете к ребенку на уроке рисования те же требования, что и к выпускнику художественного училища? То же самое и тут.
V.Nikonov; KSy; dgolovanov; dj_serega; +4 Ответить
15. Иван Прилепский (IamIvan) 20.06.15 23:10
Программное выполнение это здорово.
А кто-нибудь решал задачку такого рода:
Есть внешние отчеты на СКД. Надо из одной конфигурации выполнить их в другой и отобразить.

Я ничего кроме как выполнить запрос через ком и подставь в таблицу набора не придумал.
16. Сергей Растатурин (tristarr1) 08.09.15 09:03
(15) IamIvan, А данные нужны с расшифровками? если без, то можно выполнять их и передавать табличный документ.
17. Александр Кораблев (akor77) 22.11.15 22:08
(5) dj_serega, не поддавайся на провокации!
Процветай и преуспевай!
http://www.scientology.ru/videos/category/twth/twth-film-precept-21.html#/videos/category/twth/twth-film-precept-21
Вспомни, как меня на корню хотел один тип задавить.
Начал, продолжай, развивай!