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

20.05.15

Разработка - Универсальные функции

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

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

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

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

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

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


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

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

    КонецЦикла;

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

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

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

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

    КонецЦикла;

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

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

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

        Иначе

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

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

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

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

                КонецЕсли;

            КонецЦикла;

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

        КонецЕсли;

    КонецЦикла;


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

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

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

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

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

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

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

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

СКД Программное создание Схема Компновки Данных

См. также

GUID в 1С 8.3 - как с ними быть

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    4340    atdonya    22    

41

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    3886    ke.92@mail.ru    16    

60

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8564    YA_418728146    6    

139

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2023    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16017    131    sapervodichka    112    

129

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7201    quazare    8    

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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


И кому оно надо?
17. akor77 197 22.11.15 22:08 Сейчас в теме
(5) не поддавайся на провокации!
Процветай и преуспевай!
http://www.scientology.ru/videos/category/twth/twth-film-precept-21.html#/videos/category/twth/twth-film-precept-21
Вспомни, как меня на корню хотел один тип задавить.
Начал, продолжай, развивай!
dj_serega; +1 Ответить
11. Yashazz 4707 22.05.15 16:34 Сейчас в теме
Вообще, тенденция пугающая. Стабильно большой популярностью пользуются куцые, слабо структурированные, откровенно копипащенные, мутно и отрывочно изложенные "публикации", выложенные средненько знающими для совсем слабо знающих. За счёт рейтинга такие горе-публикации легко обходят действительно профессиональные разработки, стоившие несоизмеримо больше ресурсов их авторам. Энтузиазм профи-авторов, таким образом, не получает должной оценки. Так на первый план ИС выходят не профессиональные разработки, как хотелось бы, а убогие исходники или псевдо-учебные фрагменты (редко-редко можно видеть действительно качественный учебник, буде то справочник или пошаговик). В результате ИС становится "лягушатником" для начинающих, которые и жёлтых книжек-то не читали, не то что материалов ИТС, а в "лучших" публикациях болтается такое позорище, что уж не знаю, как Доржи перед 1С не стыдно.

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

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

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

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

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

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

Я ничего кроме как выполнить запрос через ком и подставь в таблицу набора не придумал.
16. tristarr1 58 08.09.15 09:03 Сейчас в теме
(15) IamIvan, А данные нужны с расшифровками? если без, то можно выполнять их и передавать табличный документ.
Оставьте свое сообщение