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

12.07.21

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Обработка "Редактирование табличной части в поле табличного документа"
.epf 25,49Kb ver:1.0
153
153 Скачать (2 SM) Купить за 2 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) Можно и нужно использовать всю мощь СКД и возможностей условного оформления.

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

См. также

SALE! 15%

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

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

10000 руб.

02.09.2020    159668    875    399    

862

SALE! 15%

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

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя.

8400 7140 руб.

20.08.2024    7874    58    23    

69

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

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.

9360 руб.

17.05.2024    23498    68    45    

117

SALE! 15%

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

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

10000 8500 руб.

10.11.2023    10463    36    25    

61

SALE! 15%

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

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

22200 19980 руб.

06.10.2023    15433    35    7    

70

SALE! 35%

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

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

4800 3120 руб.

14.01.2013    188055    1140    0    

912

SALE! 15%

Инструментарий разработчика Программист 8.3.14 1С:Конвертация данных Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

15000 12750 руб.

07.10.2021    17319    6    32    

42

Инструментарий разработчика Программист Платные (руб)

Менеджер конфигураций 1С — альтернативный стартер информационных баз 1С:Предприятие.

1800 руб.

21.02.2023    7719    8    35    

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

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

3) Итоги рассчитывает СКД. Я просто вызываю процедуру вывода результата в табличный документ после каждого ввода значения.
3. German_Tagil 43 21.09.16 05:32 Сейчас в теме
4. fomix 33 21.09.16 09:44 Сейчас в теме
К чему все это? Если только для какого-то извращения с расчетами в ТЧ, то понятно. А так... Может не так понял автора...
15. vasilev2015 2723 21.09.16 13:08 Сейчас в теме
(4) fomix, если ищете извращений, посмотрите типовой документ "табель" в ЗУП. Там бы это пригодилось. )))
5. Lukich66 83 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 536 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. Трактор 1254 21.09.16 10:20 Сейчас в теме
>> Ячеек в поле табличного документа может быть несколько тысяч, т.е. несколько тысяч полей ввода
Я эту проблему решил так. Добавляю поле ввода в ячейку в момент активизации ячейки. Тормозов практически нет.
Alien_job; st4rk; TreeDogNight; qwinter; afanasko; monkbest; ARL; Hatson; cleaner_it; +9 Ответить
14. Hatson 536 21.09.16 12:21 Сейчас в теме
(7) Трактор, понравилась идея. Пример кода можешь кинуть?
8. drmaxart 149 21.09.16 11:21 Сейчас в теме
Самое очевидное применение - удобное редактирование подчиненных по ключам связи табличных частей
9. Lancelot-2M 115 21.09.16 11:36 Сейчас в теме
Я такую тему делал) С копированием и добавлением строк и даже прямоугольных областей - вау-эффект был у моего начальника, а юзеры не пользуются)))

13. Hatson 536 21.09.16 12:17 Сейчас в теме
(9) Lancelot-2M, надо было сразу статью зафигачить )
10. gubanoff 63 21.09.16 12:10 Сейчас в теме
Создаем на форме таблицу значений (ТЗ), которую программно формируем как хотим. Нужно добавить только две процедуры - при открытии документа загрузить в эту ТЗ данные из ТЧ, при записи документа сохранить данные из ТЧ в ТЗ. Не очень сложная задача. В результате пользователь работает с привычной ему ТЧ (хотя на самом деле это ТЗ на форме, но визуально пользователь разницы не видит). Плюс в ТЗ можно добавлять обработчики событий изменения реквизитов, итоги по колонкам, подбор при вводе значений и т.п., т.е. будет полный аналог ТЧ.
12. Hatson 536 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 114 21.10.16 12:28 Сейчас в теме
В ЗУП 3.0 так реадктируется документ Табель при включенной функциАнальной опции наличия территорий выполнения работ. В этом случае там помимо 31 колонки на каждый день для ввода буквы и часов надо еще рисовать поля для указания периоды пребывания на удаленной территории. Т.е. информация мягко говоря не укалдывающаяся в ТЧ из за разнородности.

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

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


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

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

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

//...

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

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

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

Показать


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

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

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

1. ТабДок, Данные
2. ТабДок, В его ячеках содержатся ссылки на зависимые ячейки
3. ТабДок формулы

Меняем в ТабДоке1 значение в А1, алгоритм обращается к ячейке А1 в ТабДоке2 смотрит зависимые ячейки (например А2), в ТабДоке3 обращается, рассчитывает формулу в ячейке А2

Далее опять смотрит есть ли зависимости у ячейки А2, и рекурсивный паровозик поехал
Но, было недовольство, так как зависимостей могло быть сотни, какдый раз рекурсивно все это считать по тысяче обращений к ТабДокам, все это работало медленно, не как в Экселе, поэтому...

На форме расчета сделал двумерный массив где дублировал все значения ТабДока1 с данными
Регистр в который закинул полный алгоритм рассчета каждой ячейки, он тоже при открытии подгружается в массив, типа кэш, и вуаля

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

Но возникает вопрос, какую последовательность выполнять в 1 очередь. Например если от ячейки А1 зависят данные в В1 и В2 можно сначала рассчитать В1, потом В2, потом вычислить зависимые от них ячейки, но в фото, пример 2 в этом случае ошибка. Есть шанс каждый при каждом вычислении что уйдет в исключение, не обновит данные. Можно вычислять рекурсивно А1 потом В1 потом D1, потом B2, тогда пример 2 работает ок, но теперь в примере 1 ошибка.

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

До этого подобную задачу решал еще более криво, стандартно расчеты Excel надо было перенести в 1С, там расчет лизнга, куева туча входных параметров, листов, расчетов, в общем полный ужс, в этом только создать разберется, поэтому при создании каждого документа для расчета, подгружал эту рыбу эксель в память, транслировал изменения ТабДока в эксель, из эксель обратно в ТабДок, и как то работало.
Прикрепленные файлы:
Оставьте свое сообщение