СКД: расшифровка данных по всей строке

20.12.16

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Пример отчета для УПП
.erf 13,80Kb
14
14 Скачать (1 SM) Купить за 1 850 руб.

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

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

Например, если вам нужно по данным расшифровки создать новый элемент справочника, или открыть существующий. При создании нового элемента справочника нужно заполнить его реквизиты данными из отчета.

На просторах интернета ни чего подходящего не нашел и сделал в лоб. Посмотрел структуру ДанныеРасшифровки.Элементы, нашел логику, вытащил данные строки.

И так, для получения всей строки нам понадобится немного лука, морковки и имя первого поля (столбца) строки отчета:

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

Для этого пройдемся по структуре ДанныеРасшифровки.Элементы, начиная с начала отчета, и найдем первую расшифровку поля, имя которое совпадает с выделенной ячейкой. Запомним его индекс и пойдем в обратную сторону до "группового элемента" или пока не вернемся к началу отчета. Все, имя первого элемента строки (в переделах текущего уровня группировки) мы знаем.

Имя первого поля в строке нам понадобится, чтобы получить всю строку в текущей группировке, но, сперва нужно получить расшифровку в старших группировках:

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

Рекурсивная функция. С помощью метода ПолучитьРодителей() мы переходим к родительской группировке, после чего, шагая к началу отчета, находим повторяющийся "элемента поля". Он обозначает конец группировки. После выполнения этой функции данные по расшифровкам полей в группировках у нас есть.

Ну и основная функция, которая производит вышеописанные действия:

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

Также функция считывает данные расшифровки текущей строки, начиная с выделенной ячейки, к началу отчета, пока не дойдем до первого поля, и к концу отчета, пока поля не начнут повторяться.

Дополнительные функции:

Функция ИмяСв(Текст)
	Возврат СтрЗаменить(Текст, "." , "_");
КонецФункции

Процедура СообщениеОтладки(ТекстСообщения)
#Если Клиент Тогда
	ОтладкаВключена = Ложь;
	Если ОтладкаВключена Тогда
		Сообщить(ТекстСообщения);
	КонецЕсли;
#КонецЕсли
КонецПроцедуры

Расшифровка хорошо работает, если иерархия отчета настроена в виде цепочки. Пример обработки приложен.

ЗЫ: Пользуйтесь кодом на здоровье, дорабатывайте, критикуйте его, предлагайте свои «правильные» решения и не будьте жадинами, делитесь кодом)

СКД отчет расшифровка по строке строка всей строки расшифровка данных структура данных слепцов

См. также

SALE! %

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

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

12000 10000 руб.

02.09.2020    164816    914    402    

889

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

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

8400 руб.

20.08.2024    9812    81    35    

90

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

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

22200 руб.

06.10.2023    16231    39    9    

75

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

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

9360 руб.

17.05.2024    24906    81    48    

125

SALE! %

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

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

15000 10000 руб.

10.11.2023    11012    40    27    

66

SALE! %

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

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

4800 3840 руб.

14.01.2013    189390    1146    0    

916

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

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

2220 руб.

21.02.2023    8283    8    38    

24

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

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

5000 руб.

07.02.2018    103526    244    100    

306
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Alien_job 190 20.12.16 13:17 Сейчас в теме
Имхо, так делать не надо - такой подход блокирует возможность пользовательской настройки отчета. А еще пользователи захотят увидеть в отчете что они изменили и нужно будет редактировать ячейки ТабличногоДокумента, в общем нужно рисовать форму с табличной частью и не парить мозг "исследованиями"

Тут писал то же что и у вас вроде http://infostart.ru/public/383839/
после этого тот отчет сильно оброс требованиями, и выполнять их неудобно т.к. это отчет. Для тех кто всё равно будет есть кактус:

Можно создать макеты полей отчета и указать им в ПараметрРасшифровки всё что нужно (в том числе имя ячейки чтоб потом менять значение в ней). Так стабильнее


	Расшифровка = ТабличныйДокумент.ПолучитьОбласть(ИмяЯчейки).ТекущаяОбласть.Расшифровка;
	Поле = ДанныеРасшифровки.Элементы[Расшифровка];
	КоллекцияПолейРасшифровки = ПрочитатьПараметрыРасшифровки(Поле.ПолучитьПоля());

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

Показать
Прикрепленные файлы:
2. info_AlexS 11 20.12.16 14:53 Сейчас в теме
(1)
такой подход блокирует возможность пользовательской настройки отчет

Такой подход наоборот не блокирует возможность пользовательской настройки отчета. Поясните что именно? А вот если "рисовать форму с табличной частью и не парить мозг исследованиями", то точно никакой пользовательской настройки не будет.
Странно что я не увидел вашу статью, хотя заголовок почти такой же)
С макетами я не очень разобрался, но попробую. Спасибо!

3. Alien_job 190 20.12.16 15:11 Сейчас в теме
(2)Если пользователь начнет скрывать ненужные ему колонки и группировки на которые завязано заполнение справочника то нужных данных в расшифровке не станет. Если он поменяет группировки местами и вы будете обрабатывать расшифровку более "верхнего" элемента, то нужных данных в расшифровке не будет. Поэтому вместе с отчетом нужно передавать пользователю инструкцию - здесь трогай, сюда не нажимай.
4. rus128 2 21.12.16 13:48 Сейчас в теме
Заметил опечатку ("неободимые") и ошибку (в русском языке нет слова "ни чего").
5. fomix 33 26.10.17 12:40 Сейчас в теме
Почитал весь этот бред и вот вам верное решение: http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=631983&threadtype=0.
Читаем тут: "В скд есть закладка Макеты. Создаете макеты для нужных полей - в свойствах указываете параметр расшифровки, а в параметрах макета (левая нижняя тч) присваиваете параметру расшифровки выражение - имя поля, содержащее ссылку на документ.". Там и пример есть!
6. sokir 2 06.06.18 14:47 Сейчас в теме
(5) Это самое не верное и трудоемкое решение.
Не мог не написать, что бы никто не дай бог в макеты не полез.
То что предлагает автор - очень громоздкое. Описывать что надо делать не буду, т.к. просто полно примеров.
7. Alien_job 190 06.06.18 18:32 Сейчас в теме
(6) Это самый не верный и бессодержательный комментарий в этой теме.
Не мог не написать, чтобы никто не дай бог не полез искать "полно примеров" неизвестно чего.
Комментарий выше - ошибочен. Указывать на ошибки не буду, т.к. автор не потрудился предложить решение.
user602678_maxipunchik; +1 Ответить
8. sokir 2 06.06.18 20:48 Сейчас в теме
Я конечно не люблю когда отвечают гугли, но я сам в прошлом месяце находил полно примеров расшифровок на любой вкус.
Смысла давать ссылки, тем более на другие ресурсы (наверняка запрещено правилами) я не вижу - они живые.
И да - с учет всей строки, и да - с учетом всех группировок.

И мой ответ больше касался ответа по макету.
А по решению просто реально очень много не нужного кода - поэтому не рекомендую для других.
Я скопипастил заметно меньше.
Без обид.
9. Strady 31.01.22 18:41 Сейчас в теме
Спасибо за идею. Правда чтобы получать значения всех группировок мне пришлось поправить:
В процедуре ПолучитьРасшифровкуВГруппировках заменить строку
Индекс = Число(МассивРодителейЭлементаРасшифровки[0].Идентификатор) - 1;
на строку
Индекс = Число(ЭлементРасшифровки.Идентификатор)-1;
AnimusKsy; +1 Ответить
10. shanginre 01.12.23 07:00 Сейчас в теме
Для управляемых форм работает вот так. Сразу скажу, код делал под мою задачу с выводом плоской таблицы. В варианте с хитрыми группировками могут быть нюансы :)

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



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

КонецФункции

&НаСервере
Функция ЭтоЭлементРасшифровкиКомпоновкиДанныхПоля(ЭлементРасшифровки)

	Возврат ТипЗнч(ЭлементРасшифровки) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля");

КонецФункции

&НаСервере
Функция ИдентификаторНачалаДанныхВГруппировке(ДанныеРасшифровкиОтчета, ТекущийИдентификаторРасшифровки)

	ДанныеРодителейРасшифровки = ДанныеРасшифровкиОтчета.Элементы.Получить(ТекущийИдентификаторРасшифровки).ПолучитьРодителей();
	
	Возврат ДанныеРодителейРасшифровки[0].Идентификатор + 1;
	
КонецФункции

&НаСервере
Функция КоличествоПолейВСтрокеОтчета(ДанныеРасшифровкиОтчета, ТекущийИдентификаторРасшифровки)

	ИдентификаторНачалаДанныхВГруппировке = 
		ИдентификаторНачалаДанныхВГруппировке(ДанныеРасшифровкиОтчета, ТекущийИдентификаторРасшифровки);
		
	ИмяПервогоПоляДанных = ДанныеПоляРасшифровки(ДанныеРасшифровкиОтчета, ИдентификаторНачалаДанныхВГруппировке).Поле;
	
	ТекущийИдентификаторПоля = ИдентификаторНачалаДанныхВГруппировке;
	Пока Истина Цикл 
		ТекущийИдентификаторПоля = ТекущийИдентификаторПоля + 1;
		
		ЭлементРасшифровки = ДанныеРасшифровкиОтчета.Элементы.Получить(ТекущийИдентификаторПоля);
		Если Не ЭтоЭлементРасшифровкиКомпоновкиДанныхПоля(ЭлементРасшифровки)
			Или ТекущийИдентификаторПоля >= ДанныеРасшифровкиОтчета.Элементы.Количество() Тогда
			
			Прервать;
		КонецЕсли; 
			
		Если ИмяПервогоПоляДанных = ДанныеПоляРасшифровки(ДанныеРасшифровкиОтчета, ТекущийИдентификаторПоля).Поле Тогда
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
	Возврат ТекущийИдентификаторПоля - ИдентификаторНачалаДанныхВГруппировке;
	
КонецФункции

&НаСервере
Функция ДанныеПоляРасшифровки(ДанныеРасшифровкиОтчета, ИдентификаторРасшифровки)
	
	ПоляЭлементаРасшифровки = ДанныеРасшифровкиОтчета.Элементы.Получить(ИдентификаторРасшифровки).ПолучитьПоля()[0];
	
	Возврат Новый Структура("Поле, Значение", ПоляЭлементаРасшифровки.Поле, ПоляЭлементаРасшифровки.Значение);
	
КонецФункции

&НаСервере
Функция ИдентификаторНачалаТекущейСтрокиОтчета(ДанныеРасшифровкиОтчета, ТекущийИдентификаторРасшифровки, КоличествоПолейВСтрокеОтчета)

	ИдентификаторНачалаДанныхВГруппировке = 
		ИдентификаторНачалаДанныхВГруппировке(ДанныеРасшифровкиОтчета, ТекущийИдентификаторРасшифровки);
		
	СмещениеНачалаТекущейСтроки = КоличествоПолейВСтрокеОтчета 
		* Цел((ТекущийИдентификаторРасшифровки - ИдентификаторНачалаДанныхВГруппировке) / КоличествоПолейВСтрокеОтчета);
		
	Возврат ИдентификаторНачалаДанныхВГруппировке + СмещениеНачалаТекущейСтроки;

КонецФункции

&НаСервере
Функция ИдентификаторОкончанияТекущейСтрокиОтчета(ИдентификаторНачалаТекущейСтрокиОтчета, КоличествоПолейВСтрокеОтчета)

	Возврат ИдентификаторНачалаТекущейСтрокиОтчета + КоличествоПолейВСтрокеОтчета - 1;

КонецФункции


Показать
tema018; chemezov; +2 Ответить
13. chemezov 48 04.09.24 16:05 Сейчас в теме
(10) Спасибо. Идеально работает. Ничего даже переделывать под свой код не понадобилось.
11. BBAlien 1 30.05.24 11:03 Сейчас в теме
Спасибро. Реально танцы с бубном с этой расшифровкой. Твоя функция упрощает жизнь.
12. user675089_geb86x 22.08.24 06:17 Сейчас в теме
(1) а теперь попробуйте в настройках отчета добавить группировку "ЧПУПрограммаГотова", как с этим быть ?
Оставьте свое сообщение