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

20.12.16

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

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

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

Наименование Файл Версия Размер
Пример отчета для УПП
.erf 13,80Kb
13
.erf 13,80Kb 13 Скачать

СКД это способ написания отчетов в 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;
	КонецЦикла;
	
	Возврат РасшифровкаСтроки;
	
КонецФункции

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

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

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

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

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

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

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

См. также

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

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

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

13000 руб.

02.09.2020    119910    656    389    

701

Infostart PrintWizard

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

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

18000 руб.

06.10.2023    7007    20    6    

37

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

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

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

10000 руб.

10.11.2023    3244    10    1    

31

SALE! 30%

PowerTools

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

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

3600 2520 руб.

14.01.2013    177341    1070    0    

846

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

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

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

5000 руб.

07.02.2018    99203    239    97    

296

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

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

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

3000 руб.

27.08.2019    17910    6    8    

38

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

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

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

2040 руб.

27.12.2017    27945    3    10    

14

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

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

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

2400 руб.

24.09.2019    23488    15    15    

31
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
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;

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


Показать
Оставьте свое сообщение