Редактирование табличной части объекта с помощью СКД

12.07.21

Разработка - Инструментарий разработчика

Тема не нова - похожие решения были и на 8.0. К написанию статьи меня подтолкнул коллега, т.к. я это чудом не считаю. Несколько раз я видел тонны сложнейшего, и посему нерабочего кода, целью которого было сделать нечто похожее средствами, которые для этого не предназначены. В статье дан простейший пример, показывающий, как можно применять средства СКД для редактирования сложной структуры данных, например, табличных частей документов. В частности, рассмотрена работа с набором данных типа "Объект" и событием "Обработка расшифровки"

Скачать файлы

Наименование Файл Версия Размер
Обработка "Редактирование табличной части в поле табличного документа"
.epf 25,49Kb
150
.epf 1.0 25,49Kb 150 Скачать

Описание проблемы и предпосылки

Периодически приходится решать задачи удобного ввода информации пользователем по образу Excel, например, самый простой "План продаж" по месяцам, в котором горизонтально по колонкам расположены месяцы, а вертикально - некая аналитика. Раньше в типовых конфигурациях 1С данная задача не была решена вообще никак. Пользователю предлагалось заполнить обычную табличную часть вручную, добавляя строки и заполняя их датами и необходимой аналитикой. Весь ужас такого ввода объяснять не нужно. Потом разработчики отраслевых решений в "доэскадэшную" эпоху догадались использовать всю мощь макета табличного документа и в "Подрядчик строительства" от "Импульс ИВЦ" уже можно было наблюдать весьма недурное решение в блоке Бюджетирование. Но код был неуниверсальный, сложный и крайне тяжело переносился на другие похожие задачи. В данной статье я постараюсь показать, как решить эту задачу быстро, красиво и с минимальными затратами по времени. Также код, который вы напишете, используя этот пример, вы сможете легко переносить на другие свои решения.

Реализация задачи

Описана для обычных форм, но обработка содержит и УФ без использования модальности. 

Нам понадобится: сам объект редактирования (в данном случае табличная часть), макет СКД, компоновщик настроек компоновки данных, элемент управления "поле табличного документа", обработчик "Обработка расшифровки".

Макет СКД представляет собой соединение двух наборов данных, каждый из которых имеет тип "Набор данных - объект":

 

 

Настройки вывода просты и примитивны - это обычная таблица с итогами:

 

В форме необходимо разместить следующие реквизиты:


 

Основная идея:

В обработчике расшифровки должен быть размещен отказ от стандартной обработки, а также описание набора действий, которые необходимо совершить, когда пользователь кликает по ячейке двойным кликом.

Данный код позволяет определить по какой именно ячейке кликнул пользователь. Далее, зная значение Номенклатуры и Периода можно найти соответствующую строку в табличной части и присвоить в ней реквизиту "Сумма" нужное значение, после можно программно нажать на кнопку "Обновить".

 

СтандартнаяОбработка = Ложь;

ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаСКД));

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

 

Производительность

Существует 2 способа непосредственного ввода значения при двойном клике по ячейки:

1) Через диалоговое окно методами ВвестиЗначение() или ВвестиЧисло()

- этот способ применен в данном примере.

Преимущества: не усложняет код, высокая производительность.

Недостатки: вылетает дополнительное окно ввода.

При таком способе ввода в каждой ячейке, как и при формировании обычного отчета на СКД, содержится лишь некий объект типа "ИдентификаторРасшифровкиКомпоновкиДанных", который по сути представляет собой число.

2) Непосредственно в ячейку, как в Excel.

Данный способ с применением СКД можно увидеть в ERP 2.0.

Преимущества: очень красиво, у неискушенных вызывает мгновенный вау-эффект, окон не вылетает.

Недостатки: низкая производительность, усложняет код. Нужно понимать, что при таком способе ввода в каждую ячейку придется помещать элемент управления "Поле ввода". Ячеек в поле табличного документа может быть несколько тысяч, т.е. несколько тысяч полей ввода. Вывод этого всего в поле табличного документа не будет быстрым даже в толстом клиенте.

 

Особенности работы в тонком клиенте без использования режима модальности.

Для работы в тонком клиенте необходимо помещать схему СКД и Данные расшифровки во временное хранилище. Хранить полученные адреса удобно в реквизитах формы.

 

Записываем адреса хранилищ в обработчике ПриСозданииНаСервере()
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

//Фрагмент обработчика

	АдреcМакетСКД = ПоместитьВоВременноеХранилище(РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет"), УникальныйИдентификатор);;

	ДанныеРасшифровки = Неопределено;

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

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

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

	ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

	АдресДанныеРасшифровки = ПоместитьВоВременноеХранилище(ДанныеРасшифровки, Новый УникальныйИдентификатор);

КонецПроцедуры
 
Обработчики событий Поля табличного документа и асинхронные вызовы

Обратите внимание, что во все конструкторы объектов СКД передаются сохраненные адреса  АдресДанныеРасшифровкиАдреcМакетСКД. И почти все процедуры работают на клиенте. Но к сожалению не только лишь все могут работать на клиенте на клиенте реализованы не все объекты СКД. Иногда придется нырнуть на сервер, например для работы с объектом типа ДанныеРасшифровкиКомпоновкиДанных

Обработчик ПолеТабличногоДокументаПредставлениеПриАктивизацииОбласти необходим для того, чтобы редактировать число(показатель) можно было  непосредственно в ячейке, без использования дополнительных диалоговых окон.

 

 

&НаКлиенте
Процедура ПолеТабличногоДокументаПредставлениеОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)

//Фрагмент обработчика
	ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(АдресДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдреcМакетСКД));

	ПредметРедактирования = ПолучитьИмяТекущегоПоляРедактирования(Расшифровка, АдресДанныеРасшифровки); //ПолучитьПредметРедактирования

	ОбработкаРасшифровки.ПоказатьВыборДействия(
		Новый ОписаниеОповещения("ОбработкаРасшифровкиПоказатьВыборДействияЗавершение", ЭтотОбъект, ДополнительныеПараметры), 
		Расшифровка,
		ДоступныеДействия, 
		ДополнительныеПунктыМеню,,);


КонецПроцедуры


&НаКлиенте
Процедура ПолеТабличногоДокументаПредставлениеПриИзмененииСодержимогоОбласти(Элемент, Область)

//Фрагмент обработчика	

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


&НаКлиенте
Процедура ПолеТабличногоДокументаПредставлениеПриАктивизацииОбласти(Элемент)

//Фрагмент обработчика

	ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(АдресДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдреcМакетСКД));


КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьИмяТекущегоПоляРедактирования(Расшифровка, АдресДанныеРасшифровки)
	
	//тип ДанныеРасшифровкиКомпоновкиДанных // Сервер, толстый клиент, внешнее соединение
	ДанныеРасшифровки = ПолучитьИзВременногоХранилища(АдресДанныеРасшифровки); //ДанныеРасшифровкиКомпоновкиДанных // Сервер, толстый клиент, внешнее соединение
	
	ЗначенияПолейРасшифровки = ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля();
	
	Если ЗначенияПолейРасшифровки.Количество() = 0 ИЛИ ЗначенияПолейРасшифровки[0].Значение = NULL Тогда
		Возврат "";
	КонецЕсли;
	
	ИмяПоля = ЗначенияПолейРасшифровки[0].Поле;
	
	Возврат ИмяПоля;
		
КонецФункции // ()

 

 

Что еще?

UPD 07.07.2021 Добавлена реализация для тонкого клиента на управляемой форме без использования модальности.

1) Никто не запрещает размещать на форме стандартные настройки компоновщика настроек.

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

3) Группировка данных в таблице также может быть сколь угодно сложной, в зависимости от решаемой задачи.

4) Можно и нужно использовать всю мощь СКД и возможностей условного оформления.

Обработка табличная часть СКД

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 руб.

02.09.2020    119956    656    389    

701

Infostart PrintWizard

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

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

18000 руб.

06.10.2023    7015    20    6    

37

Infostart УДиФ: Управление данными и формами

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

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

10000 руб.

10.11.2023    3253    10    1    

31

SALE! 30%

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

3600 2520 руб.

14.01.2013    177350    1071    0    

846

Многопоточность. Универсальный «Менеджер потоков» 2.1

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99206    239    97    

296

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    17920    6    8    

38

1С HTML Шаблоны / HTML Templates

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    27948    3    10    

14

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

В процессе работы в 1С часто возникает потребность получить данные из другой базы.  Обычно это делается через COM-соединение, и время выполнения запроса при этом оставляет желать лучшего. В данной публикации представлено универсальное решение, позволяющее практически моментально выполнить произвольный код или запрос с параметрами в другой информационной базе через Web-сервис.

2400 руб.

24.09.2019    23492    15    15    

31
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. json 3294 16.09.16 17:33 Сейчас в теме
Есть несколько вопросов:
1. При редактировании тч необходимо иметь возможность добавлять и удалять строки. В данной схеме это предусмотрено?
2. При обновлении курсор в табличном документе позиционируется на верхний левый угол. С этим что-нибудь делаете?
3. Обновляете ли итоги в подвале при вводе числовых значений?
2. Hatson 528 19.09.16 10:10 Сейчас в теме
(1) yurii_host,
1) Добавлять и удалять строки можно. Для этого придется реализовать простую кнопку. В данном примере такой кнопки нет, чтобы не захламлять код.

2) Это не так. Курсор остается на той ячейке, которую редактировали.

3) Итоги рассчитывает СКД. Я просто вызываю процедуру вывода результата в табличный документ после каждого ввода значения.
3. German_Tagil 42 21.09.16 05:32 Сейчас в теме
4. fomix 33 21.09.16 09:44 Сейчас в теме
К чему все это? Если только для какого-то извращения с расчетами в ТЧ, то понятно. А так... Может не так понял автора...
15. vasilev2015 2677 21.09.16 13:08 Сейчас в теме
(4) fomix, если ищете извращений, посмотрите типовой документ "табель" в ЗУП. Там бы это пригодилось. )))
5. Lukich66 82 21.09.16 09:57 Сейчас в теме
"как можно применять средства СКД для редактирования сложной структуры данных, например, табличных частей документов. "
Я увидел только редактирование табличного документа, а не табличной части(Товары,Услуги) документа
6. Diego_Iv 34 21.09.16 10:03 Сейчас в теме
При внедрении блока бюджетирования тоже встречался с подобной задачей. В табличную часть документа (бюджетная операция) необходимо было вводить следующие данные по периодам: Статья бюджета - Проект - Контрагент - Договор - Номенклатура - Сумма операции.
Хотелось чтобы суммы можно было вводить по колонкам, как в экселе. Причем количество периодов в документе могло быть неограниченным (7 дней недели, 30 дней месяца или все 365 дней года).
Предложенное решение с табличным документом, аналогичное упомянутому "Подрядчику строительства" заказчику не понравилось. Табличное поле документа не похожа на обычное в других документах 1С, не работают автоподборы и т.д.

Удалось решить так. По табличной части документа строил таблицу значений с нужным количеством колонок для каждого периода и эту ТЗ выводил в табличное поле документа.



TreeDogNight; Hatson; monkbest; Vlad_2008; gubanoff; +5 Ответить
11. Hatson 528 21.09.16 12:10 Сейчас в теме
(6) Diego_Iv, приложенные картинки не открываются. Может я не туда тыкаю?
16. Diego_Iv 34 21.09.16 13:20 Сейчас в теме
(11) ПКМ - Открыть изображение.

(10) Какие "группировочки и условное оформление" в табличном поле документа? Все эти украшательства решаются печатными формами и отчетами
gubanoff; +1 Ответить
20. Diego_Iv 34 21.10.16 13:23 Сейчас в теме
Попиарюсь...
Описанное в (6) выложил в виде отдельной публикации
http://infostart.ru/public/553075/
7. Трактор 1246 21.09.16 10:20 Сейчас в теме
>> Ячеек в поле табличного документа может быть несколько тысяч, т.е. несколько тысяч полей ввода
Я эту проблему решил так. Добавляю поле ввода в ячейку в момент активизации ячейки. Тормозов практически нет.
Alien_job; st4rk; TreeDogNight; qwinter; afanasko; monkbest; ARL; Hatson; cleaner_it; +9 Ответить
14. Hatson 528 21.09.16 12:21 Сейчас в теме
(7) Трактор, понравилась идея. Пример кода можешь кинуть?
8. drmaxart 145 21.09.16 11:21 Сейчас в теме
Самое очевидное применение - удобное редактирование подчиненных по ключам связи табличных частей
9. Lancelot-2M 115 21.09.16 11:36 Сейчас в теме
Я такую тему делал) С копированием и добавлением строк и даже прямоугольных областей - вау-эффект был у моего начальника, а юзеры не пользуются)))

13. Hatson 528 21.09.16 12:17 Сейчас в теме
(9) Lancelot-2M, надо было сразу статью зафигачить )
10. gubanoff 63 21.09.16 12:10 Сейчас в теме
Создаем на форме таблицу значений (ТЗ), которую программно формируем как хотим. Нужно добавить только две процедуры - при открытии документа загрузить в эту ТЗ данные из ТЧ, при записи документа сохранить данные из ТЧ в ТЗ. Не очень сложная задача. В результате пользователь работает с привычной ему ТЧ (хотя на самом деле это ТЗ на форме, но визуально пользователь разницы не видит). Плюс в ТЗ можно добавлять обработчики событий изменения реквизитов, итоги по колонкам, подбор при вводе значений и т.п., т.е. будет полный аналог ТЧ.
12. Hatson 528 21.09.16 12:14 Сейчас в теме
(10) gubanoff, да, такими решениями кишат старые УТ. Всё здорово, только много говнокода и если пользователь попросит группировочки с итогами, условное оформление и т.д., то "добрый вечер".
21. user702069_savel777v2 03.03.17 15:54 Сейчас в теме
(12) Присоединяюсь.... Изначально сделал на ТЗ по найденной идее http://infostart.ru/public/547892/
Всё бы хорошо... но попросили Итоги по ТЗ.... вот тут я и встрял.. Потому оказалось проще переписать всё на СКД, как Hatson и предложил
немного возни с обработчиками, зато потом в доработке - сказка.... Внешний вид правил многократно, что на ТЗ вылилось бы в килотонны кода.
А на счет обработчиков сначала сделал в виде ВвестиЗначение, а завершилось вообще все на ФормеВвода...
Потому Автору - большая благодарность за идею!
17. Vlad_2008 16 21.09.16 13:38 Сейчас в теме
Во-во, а уж если нужны группировочки, то для этого есть Дерево и УО (в УФ)
gubanoff; +1 Ответить
18. simon_simon 1 26.09.16 09:40 Сейчас в теме
Немного не по теме статьи, но не так давно пришлось делать внешнюю печатную форму с использованием СКД. Данная печатная форма разработана для документа "Пересчет товаров" Розница, редакция 2.1 (2.1.9.20) . Не знаю как у кого, но у меня возникли проблемы найти пример в сети. Везде денег хотели.
По сути печатной формы: По заданию пользователей необходимо было сделать печатную форму с группировками по виду номенклатуры. Внутри группировок непосредственно сами номенклатурные позиции.
Прикрепленные файлы:
ВПФИнвентаризационнаяВедомостьУП.epf
19. monkbest 115 21.10.16 12:28 Сейчас в теме
В ЗУП 3.0 так реадктируется документ Табель при включенной функциАнальной опции наличия территорий выполнения работ. В этом случае там помимо 31 колонки на каждый день для ввода буквы и часов надо еще рисовать поля для указания периоды пребывания на удаленной территории. Т.е. информация мягко говоря не укалдывающаяся в ТЧ из за разнородности.

Второе ТабДок поддрежывает отображение тысяч строк и сотен колонок, а табличная часть в УФ умирает, а в веб-клиенте вообще падает со свякими ошибками javaSript`а
22. lopatin 678 14.03.17 16:45 Сейчас в теме
Есть пример редактирования прямо в ячейке? Без вывода окна?
23. sailor-cat 6 31.07.18 13:24 Сейчас в теме
(22)при активизации области:

Область = ТабличныйДокумент.ТекущаяОбласть;
Область.СодержитЗначение = Истина;
Область.ТипЗначения = ОписаниеТипов;
Область.УстановитьЭлементУправления(Тип("ПолеВвода"));


Но вот как назначить элементу обработчики события, пока не могу сообразить.
24. lopatin 678 08.08.18 05:45 Сейчас в теме
(23) Я делал не при активизации, а обрабатывал табличный документ перед выводом на форму, в частности обходил все ячейки находил нужные мне и проставлял признак содержит значение:

Функция ОбновитьПредставлениеОтчета(ДанныеОтчета, ИсточникНастроек, ПредставлениеДанныхОтчета, УникальныйИдентификаторФормы) Экспорт

	//Получаем схему из макета
	СхемаКомпоновкиДанных = ПолучитьОбщийМакет("СКДВыводаОтчетности");
	
	//Из схемы возьмем настройки по умолчанию
	Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
	
	Показатели = ДанныеОтчета.ВыгрузитьКолонку("Показатель");
	
	ДобавитьОформлениеПоказателей(Настройки, ИсточникНастроек, Показатели);
	
	//Помещаем в переменную данные о расшифровке данных
	ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
	
	//Формируем макет, с помощью компоновщика макета
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	
	//Передаем в макет компоновки схему, настройки и данные расшифровки
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
	
	ВнешниеНаборыДанных = Новый Структура("ДанныеОтчета", ДанныеОтчета);
	
	//Выполним компоновку с помощью процессора компоновки
	ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);
	
	//Очищаем поле табличного документа
	ПредставлениеДанныхОтчета.Очистить();
	
	//Выводим результат в табличный документ
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ПредставлениеДанныхОтчета);
	
	ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
	
	КЧ = Новый КвалификаторыЧисла(15,3, ДопустимыйЗнак.Любой);
	ОписаниеТипаЧисло = Новый ОписаниеТипов("Число",,,КЧ);
	
	Для Строка = ПредставлениеДанныхОтчета.ФиксацияСверху + 1 По ПредставлениеДанныхОтчета.ВысотаТаблицы Цикл
		Для Колонка = ПредставлениеДанныхОтчета.ФиксацияСлева + 1 По ПредставлениеДанныхОтчета.ШиринаТаблицы Цикл
			
			ТекущаяОбласть = ПредставлениеДанныхОтчета.Область(Строка, Колонка, Строка, Колонка);
			Если ТекущаяОбласть.Расшифровка = Неопределено Тогда
				Продолжить;
			КонецЕсли; 
			
			ЗначенияРасшифровки = ПолучитьВсеЗначенияРасшифровки(ДанныеРасшифровки.Элементы[ТекущаяОбласть.Расшифровка]);
			ЗначенияГруппировок = ПолучитьВсеЗначенияГруппировок(ДанныеРасшифровки, ТекущаяОбласть.Расшифровка, "Значение", Новый Структура("Показатель,Период"));
			Если ЗначенияРасшифровки.Свойство("Значение") Тогда
				
				ТекущаяОбласть.СодержитЗначение = Истина;
				ТекущаяОбласть.ТипЗначения = ОписаниеТипаЧисло;
				ТекущаяОбласть.Защита = Ложь;
				
				ТекущаяОбласть.Значение = ЗначениеПоказателяИзДанныхОтчета(ДанныеОтчета, ЗначенияГруппировок);
				
			Иначе				
				ТекущаяОбласть.Расшифровка = Неопределено;
			КонецЕсли; 
		КонецЦикла;
	КонецЦикла;
	
	Возврат ПоместитьВоВременноеХранилище(ДанныеРасшифровки, УникальныйИдентификаторФормы);
	
КонецФункции

//...

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

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

	Возврат ЗначенияГруппировок;
	
КонецФункции // ПолучитьВсеЗначенияГруппировокОтчета()

Показать


В самом макете СКД надо области задать вывод расшифровки(см. вложенную картинку)
Прикрепленные файлы:
25. lopatin 678 08.08.18 05:48 Сейчас в теме
(23) Соответственно, чтобы отловить момент изменения значения и записать его в нужное место, определил событие табличного поля на форме - ПриИзмененииСодержимогоОбласти, проверяю расшифровку и если область та что мне нужна записываю значение:

&НаКлиенте
Процедура ПредставлениеДанныхОтчетаПриИзмененииСодержимогоОбласти(Элемент, Область)
	ПредставлениеДанныхОтчетаПриИзмененииСодержимогоОбластиНаСер­вере(Область.Расшифровка, Область.Значение);
КонецПроцедуры

&НаСервере
Процедура ПредставлениеДанныхОтчетаПриИзмененииСодержимогоОбластиНаСер­вере(Расшифровка, Значение)
	Если НЕ Расшифровка = Неопределено Тогда
		Данные = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
		ЗначенияРасшифровки = ВыводФинансовыхОтчетов.ПолучитьВсеЗначенияРасшифровки(Данные.Элементы[Расшифровка]);		
		ЗначенияГруппировок = ВыводФинансовыхОтчетов.ПолучитьВсеЗначенияГруппировок(Данные, Расшифровка, "Значение", Новый Структура("Показатель,Период"));
		Если ЗначенияРасшифровки.Свойство("Значение") Тогда
			ЗаписатьЗначениеПоказателя(ЗначенияГруппировок.Показатель, Значение);
		КонецЕсли; 
	КонецЕсли; 
КонецПроцедуры
Показать
26. sailor-cat 6 08.08.18 06:41 Сейчас в теме
(25) Согласен, можно и так, но:
1. Как отмечалось выше, добавлять элементы при компоновке результата может быть весьма "дорого".
2. Меня интересовали обработчики других событий, например "Начало выбора". Поэтому и пытался все перенести на форму.
30. Hatson 528 12.07.21 16:03 Сейчас в теме
27. Hatson 528 12.09.18 19:52 Сейчас в теме
Добавил кнопку "Добавить строку" и обработка подорожала ))
28. palax 17.06.21 09:39 Сейчас в теме
Отличное решение. Только жаль, что выполнено для обычных формах, а не управляемых..
29. Hatson 528 07.07.21 17:45 Сейчас в теме
31. Briss 29.06.23 12:57 Сейчас в теме
Интересное решение.
Возьму на заметку.
Оставьте свое сообщение