Получает идентификатор для оформления компоновки данных.
Синтаксис
ПолучитьИдентификаторПоОбъекту(<Объект>)Полное описание, параметры и ограничения
ДоступныеПоляКомпоновкиДанных.ПолучитьИдентификаторПоОбъекту (DataCompositionAvailableFields.GetIDByObject)
ДоступныеПоляКомпоновкиДанных (DataCompositionAvailableFields)
ПолучитьИдентификаторПоОбъекту (GetIDByObject)
Доступен, начиная с версии 8.2.
Синтаксис:
ПолучитьИдентификаторПоОбъекту(<Объект>)
Параметры:
<Объект> (необязательный)
Тип: ДоступноеПолеКомпоновкиДанных, ДоступноеПолеОтбораКомпоновкиДанных.
Объект, для которого требуется получить идентификатор.
Возвращаемое значение:
Тип: ИдентификаторКомпоновкиДанных, Неопределено.
Неопределено - переданный объект не является частью данного объекта.
Описание:
Получает идентификатор для оформления компоновки данных.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.2.
Методическая информация
Практические примеры
СКД: прибыль строки и прибыль группы — выражения, представления и полный результат
Полностью создаём собственную схему из трёх константных строк и пользовательские поля; проверяем редактирование, доступные поля, реальные детали и сводную прибыль. Всё только в памяти.
Где и как запускать
Полный обычный клиентский общий модуль УчебныеПользовательскиеПоляСКД85 → УчебныеПользовательскиеПоля85. Своя Local-схема и результаты в памяти, без записи/печати/сети; не выполнялся.
Подготовка
НОВАЯ отдельная файловая база 8.5.1.1343, имя конфигурации УчебныеПользовательскиеПоляСКД85, совместимость НеИспользовать, обычное приложение, толстый клиент. Нет документов, справочников, регистров, расширений, подписок, обмена или внешних источников. Запуск в 1С не выполнялся: runtimeVerifiedScenarios=0.
Общий модуль УчебныеПользовательскиеПоля85: неглобальный, Клиент (обычное приложение)=Да, Сервер=Нет, остальные клиентские флаги=Нет, Привилегированный=Нет. Полный основной модуль одного урока вставьте целиком. Не смешивайте оба урока с одинаковыми именами процедур.
Обработка УчебныеПользовательскиеПоля85 → обычная форма Пульт → кнопка Выполнить → действие ВыполнитьНажатие. Отдельный полный модуль Пульта ниже. F7, обновление только своего стенда, запуск Пульта в толстом клиенте. ТаблицаЗначений и схема здесь доступны; напрямую в тонкий клиент их не переносите.
Источник Local — запрос только собственных констант: Книга 750/500, Ручка 50/30, Книга 500/300 (выручка/затраты). Прибыль деталей 250/20/200, всего 470. По товарам Книга 450 и Ручка 20; по категориям Крупная 250 и Обычная 220.
Схема, настройки, поля и таблицы создаются заново в памяти. Готовые метаданные/макеты СКД не нужны. Внешний сервер, SQL, настоящая сеть, запись файла/БД, печать и открытие отчётных окон отсутствуют. Результаты инспектируются в отладчике или проверками кода, не отправляются клиенту как неизвестный объект.
Процедура ВыполнитьПример() Экспорт
ПроверитьСвойКонтекст();
Схема = Новый СхемаКомпоновкиДанных;
Источник = Схема.ИсточникиДанных.Добавить();
Источник.Имя = "УчебныйИсточник";
Источник.ТипИсточникаДанных = "Local";
Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
Набор.Имя = "УчебныеТовары";
Набор.ИсточникДанных = Источник.Имя;
Набор.АвтоЗаполнениеДоступныхПолей = Истина;
Набор.Запрос = "ВЫБРАТЬ ""Книга"" КАК Наименование, 750 КАК Выручка, 500 КАК Затраты
|ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""Ручка"", 50, 30
|ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""Книга"", 500, 300";
Настройки = Новый НастройкиКомпоновкиДанных;
Для Каждого ИмяПоля Из СтрРазделить("Наименование,Выручка,Затраты", ",") Цикл
Выбранное = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
Выбранное.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
Выбранное.Использование = Истина;
КонецЦикла;
Детали = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
Детали.Использование = Истина;
АвтоВыбор = Детали.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
АвтоВыбор.Использование = Истина;
Для Каждого ИмяРесурса Из СтрРазделить("Выручка,Затраты", ",") Цикл
Ресурс = Схема.ПоляИтога.Добавить();
Ресурс.ПутьКДанным = ИмяРесурса;
Ресурс.Выражение = "Сумма(" + ИмяРесурса + ")";
КонецЦикла;
Пользовательские = Настройки.ПользовательскиеПоля;
Поля = Пользовательские.Элементы;
Прибыль = Поля.Добавить(Тип("ПользовательскоеПолеВыражениеКомпоновкиДанных"));
Прибыль.Заголовок = "Учебная прибыль";
Прибыль.Использование = Истина;
Прибыль.УстановитьВыражения("Выручка - Затраты", "Сумма(Выручка)");
Если Прибыль.ПолучитьВыражениеДетальныхЗаписей() <> "Выручка - Затраты"
Или Прибыль.ПолучитьВыражениеИтоговыхЗаписей() <> "Сумма(Выручка)" Тогда
ВызватьИсключение "Первичная пара выражений собственного черновика не сохранилась";
КонецЕсли;
Прибыль.УстановитьВыражениеИтоговыхЗаписей("Сумма(Выручка) - Сумма(Затраты)");
Прибыль.УстановитьПредставлениеВыражений("Черновик прибыли строки", "Черновик общей прибыли");
Прибыль.УстановитьПредставлениеВыраженияДетальныхЗаписей("Выручка - Затраты");
Прибыль.УстановитьПредставлениеВыраженияИтоговыхЗаписей("Сумма(Выручка) - Сумма(Затраты)");
Если Прибыль.ПолучитьПредставлениеВыраженияДетальныхЗаписей() <> "Выручка - Затраты"
Или Прибыль.ПолучитьПредставлениеВыраженияИтоговыхЗаписей() <> "Сумма(Выручка) - Сумма(Затраты)"
Или Прибыль.ПолучитьВыражениеДетальныхЗаписей() <> "Выручка - Затраты"
Или Прибыль.ПолучитьВыражениеИтоговыхЗаписей() <> "Сумма(Выручка) - Сумма(Затраты)" Тогда
ВызватьИсключение "Представления непривязанного черновика и его реальные выражения проверяются отдельно";
КонецЕсли;
ПутьПрибыли = Прибыль.ПутьКДанным;
Если ТипЗнч(Прибыль) <> Тип("ПользовательскоеПолеВыражениеКомпоновкиДанных") Или ПутьПрибыли = ""
Или Прибыль.Заголовок <> "Учебная прибыль" Или Не Прибыль.Использование Тогда
ВызватьИсключение "Нужно своё реальное пользовательское поле с автоматически созданным readonly путём";
КонецЕсли;
ИдентификаторПрибыли = Пользовательские.ПолучитьИдентификаторПоОбъекту(Прибыль);
Если ИдентификаторПрибыли = Неопределено Тогда
ВызватьИсключение "Свое поле должно принадлежать своим пользовательским полям";
КонецЕсли;
Если Пользовательские.ПолучитьОбъектПоИдентификатору(ИдентификаторПрибыли) <> Прибыль Тогда
ВызватьИсключение "Обратный поиск собственного поля по его идентификатору не совпал";
КонецЕсли;
Временное = Поля.Вставить(0, Тип("ПользовательскоеПолеВыражениеКомпоновкиДанных"));
Временное.Заголовок = "Временный выключенный черновик";
Временное.Использование = Ложь;
Если Поля.Индекс(Прибыль) <> 1 Или Поля.Получить(0) <> Временное Тогда
ВызватьИсключение "Вставка должна сместить своё поле прибыли на индекс 1";
КонецЕсли;
Поля.Сдвинуть(Прибыль, -1);
Если Поля.Индекс(Прибыль) <> 0 Или Прибыль.ПутьКДанным <> ПутьПрибыли Тогда
ВызватьИсключение "Сдвиг меняет индекс, а не автоматически созданный путь поля";
КонецЕсли;
Поля.Удалить(Временное);
Если Поля.Количество() <> 1 Или Поля.Получить(0) <> Прибыль Тогда
ВызватьИсключение "Удаляется только собственный временный черновик";
КонецЕсли;
ДобавитьСвоюКолонку(Настройки, ПутьПрибыли);
Доступные = Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема);
Редактор = Новый КомпоновщикНастроекКомпоновкиДанных;
Редактор.Инициализировать(Доступные);
Редактор.ЗагрузитьНастройки(Настройки);
СвязанныеПоля = Редактор.Настройки.ПользовательскиеПоля;
ПроверитьСвоюДоступность(СвязанныеПоля.ДоступныеПоляЗначений, СвязанныеПоля.ДоступныеПоляОтбора);
Рабочие = Редактор.ПолучитьНастройки();
Результат = СформироватьСвоюТаблицу(Схема, Рабочие);
ПроверитьСвоиСтроки(Результат, ПутьПрибыли, "");
Сводные = Редактор.ПолучитьНастройки();
Сводные.Выбор.Элементы.Очистить();
ДобавитьСвоюКолонку(Сводные, "Наименование");
ДобавитьСвоюКолонку(Сводные, ПутьПрибыли);
Сводные.Структура.Очистить();
Группа = Сводные.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
Группа.Использование = Истина;
ПолеГруппы = Группа.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеГруппы.Поле = Новый ПолеКомпоновкиДанных("Наименование");
ПолеГруппы.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы;
ПолеГруппы.Использование = Истина;
АвтоВыбор = Группа.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
АвтоВыбор.Использование = Истина;
СводныйРезультат = СформироватьСвоюТаблицу(Схема, Сводные);
ПроверитьСвоиИтоги(СводныйРезультат, "Наименование", "Наименование", ПутьПрибыли, "Книга", 450, "Ручка", 20);
КопияДляОчистки = Редактор.ПолучитьНастройки();
КопияДляОчистки.ПользовательскиеПоля.Элементы.Очистить();
Если КопияДляОчистки.ПользовательскиеПоля.Элементы.Количество() <> 0
Или Редактор.Настройки.ПользовательскиеПоля.Элементы.Количество() <> 1 Тогда
ВызватьИсключение "Очищается только своя отброшенная копия, а не рабочий вариант редактора";
КонецЕсли;
Сообщить("Полностью проверены три детали, два итога и независимость копии. Ни запись, ни печать, ни файл не выполнялись.");
КонецПроцедуры
Процедура ДобавитьСвоюКолонку(Настройки, Путь)
Колонка = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
Колонка.Поле = Новый ПолеКомпоновкиДанных(Путь);
Колонка.Использование = Истина;
КонецПроцедуры
Процедура ПроверитьСвоюДоступность(Значения, Отборы)
Если Значения.НайтиПоле(Новый ПолеКомпоновкиДанных("Выручка")) = Неопределено
Или Отборы.НайтиПоле(Новый ПолеКомпоновкиДанных("Выручка")) = Неопределено Тогда
ВызватьИсключение "Привязка к своей схеме должна дать настоящее доступное поле Выручка";
КонецЕсли;
ПолеВыручки = Значения.НайтиПоле(Новый ПолеКомпоновкиДанных("Выручка"));
Идентификатор = Значения.ПолучитьИдентификаторПоОбъекту(ПолеВыручки);
Если Идентификатор = Неопределено Тогда
ВызватьИсключение "Своё доступное поле должно иметь идентификатор внутри своей коллекции";
КонецЕсли;
Если Значения.ПолучитьОбъектПоИдентификатору(Идентификатор) <> ПолеВыручки Тогда
ВызватьИсключение "Обратный поиск доступного поля должен вернуть собственный исходный объект";
КонецЕсли;
КонецПроцедуры
Функция СформироватьСвоюТаблицу(Схема, Настройки)
Компоновщик = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = Компоновщик.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(Макет);
Приемник = Новый ТаблицаЗначений;
Вывод = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
Вывод.ОтображатьПроцентВывода = Ложь;
Вывод.УстановитьОбъект(Приемник);
Результат = Вывод.Вывести(Процессор, Ложь);
Если ТипЗнч(Результат) <> Тип("ТаблицаЗначений") Тогда
ВызватьИсключение "Нужна настоящая таблица результата собственного макета";
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ИмяСвоейКолонки(Таблица, Путь, Заголовок)
Колонка = Таблица.Колонки.Найти(Путь);
Если Колонка <> Неопределено Тогда
Возврат Колонка.Имя;
КонецЕсли;
Имя = "";
Для Каждого Колонка Из Таблица.Колонки Цикл
Если Колонка.Заголовок = Заголовок Тогда
Если Имя <> "" Тогда
ВызватьИсключение "Неоднозначный заголовок собственной колонки результата";
КонецЕсли;
Имя = Колонка.Имя;
КонецЕсли;
КонецЦикла;
Если Имя = "" Тогда
ВызватьИсключение "Нет собственной колонки в реально сформированном результате";
КонецЕсли;
Возврат Имя;
КонецФункции
Процедура ПроверитьСвоиСтроки(Таблица, ПутьПрибыли, ПутьКатегории)
Размер = 4;
Если ПутьКатегории <> "" Тогда
Размер = 5;
КонецЕсли;
Если Таблица.Количество() <> 3 Или Таблица.Колонки.Количество() <> Размер Тогда
ВызватьИсключение "Проверяется полный собственный результат, не одна удобная строка";
КонецЕсли;
ИмяПрибыли = ИмяСвоейКолонки(Таблица, ПутьПрибыли, "Учебная прибыль");
ИмяКатегории = "";
Если ПутьКатегории <> "" Тогда
ИмяКатегории = ИмяСвоейКолонки(Таблица, ПутьКатегории, "Учебная категория");
КонецЕсли;
Найденные = Новый Массив;
ОбщаяПрибыль = 0;
Для Каждого СтрокаРезультата Из Таблица Цикл
Если СтрокаРезультата.Выручка = 750 Тогда
Наименование = "Книга";
Затраты = 500;
Прибыль = 250;
Категория = "Крупная";
ИначеЕсли СтрокаРезультата.Выручка = 50 Тогда
Наименование = "Ручка";
Затраты = 30;
Прибыль = 20;
Категория = "Обычная";
ИначеЕсли СтрокаРезультата.Выручка = 500 Тогда
Наименование = "Книга";
Затраты = 300;
Прибыль = 200;
Категория = "Обычная";
Иначе
ВызватьИсключение "Неизвестная строка константного учебного источника";
КонецЕсли;
Если Найденные.Найти(СтрокаРезультата.Выручка) <> Неопределено
Или СтрокаРезультата.Наименование <> Наименование Или СтрокаРезультата.Затраты <> Затраты
Или ТипЗнч(СтрокаРезультата[ИмяПрибыли]) <> Тип("Число") Или СтрокаРезультата[ИмяПрибыли] <> Прибыль Тогда
ВызватьИсключение "Не совпали все исходные и рассчитанные значения собственной строки";
КонецЕсли;
Если ПутьКатегории <> "" Тогда
Если СтрокаРезультата[ИмяКатегории] <> Категория Тогда
ВызватьИсключение "Реально рассчитанная категория не совпала с условием Выручка 700";
КонецЕсли;
КонецЕсли;
Найденные.Добавить(СтрокаРезультата.Выручка);
ОбщаяПрибыль = ОбщаяПрибыль + СтрокаРезультата[ИмяПрибыли];
КонецЦикла;
Если Найденные.Количество() <> 3 Или ОбщаяПрибыль <> 470 Тогда
ВызватьИсключение "Нужны все свои три строки и общий контроль прибыли 470";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвоиИтоги(Таблица, ПутьГруппы, ЗаголовокГруппы, ПутьПрибыли, Первый, ПерваяСумма, Второй, ВтораяСумма)
Если Таблица.Количество() <> 2 Или Таблица.Колонки.Количество() <> 2 Тогда
ВызватьИсключение "Сводный собственный результат должен содержать ровно две группы и две колонки";
КонецЕсли;
ИмяГруппы = ИмяСвоейКолонки(Таблица, ПутьГруппы, ЗаголовокГруппы);
ИмяПрибыли = ИмяСвоейКолонки(Таблица, ПутьПрибыли, "Учебная прибыль");
Найденные = Новый Массив;
Для Каждого СтрокаРезультата Из Таблица Цикл
Ключ = СтрокаРезультата[ИмяГруппы];
Если Ключ = Первый Тогда
Ожидание = ПерваяСумма;
ИначеЕсли Ключ = Второй Тогда
Ожидание = ВтораяСумма;
Иначе
ВызватьИсключение "Неизвестная сводная группа своего источника";
КонецЕсли;
Если Найденные.Найти(Ключ) <> Неопределено Или ТипЗнч(СтрокаРезультата[ИмяПрибыли]) <> Тип("Число")
Или СтрокаРезультата[ИмяПрибыли] <> Ожидание Тогда
ВызватьИсключение "Итоговое выражение должно проверить все значения своих групп";
КонецЕсли;
Найденные.Добавить(Ключ);
КонецЦикла;
КонецПроцедуры
Процедура ПроверитьСвойКонтекст()
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
ВызватьИсключение "Нужен собственный стенд УчебныеПользовательскиеПоляСКД85 платформы 8.5.1.1343";
КонецЕсли;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Учебный вывод не должен выполняться внутри чужой транзакции";
КонецЕсли;
КонецПроцедурыУчебныеПользовательскиеПоля85.Пульт
УчебныеПользовательскиеПоляСКД85 → Обработки → УчебныеПользовательскиеПоля85 → Формы → Пульт → Модуль
Полный модуль своей обычной формы; не выполнялся.
Процедура ВыполнитьНажатие(Кнопка)
УчебныеПользовательскиеПоля85.ВыполнитьПример();
КонецПроцедурыРазбор по шагам
Сначала создаём Local-схему, три исходных колонки и детальную структуру. Для выручки/затрат задаём настоящие Сумма-ресурсы; без них нельзя подменять сводный опыт простой арифметикой одной строки.
Пользовательское поле создаёт Настройки.ПользовательскиеПоля.Элементы.Добавить(Тип(...)), а не выдуманный конструктор. ПутьКДанным создаётся автоматически, readonly и используется для выбора колонки; Заголовок — отдельно редактируемая подпись.
У прибыльного поля детальное выражение Выручка - Затраты, итоговое Сумма(Выручка) - Сумма(Затраты). Сначала намеренно задано неполное итоговое Сумма(Выручка), затем исправлено отдельным setter и проверено до исполнения; неправильное выражение не используется в отчёте.
Текст выражения и пользовательское представление — разные значения. На ещё НЕ привязанных настройках проверяем пару и отдельные setter/getter представлений без изменения формулы. После привязки к источнику доступных настроек установка представления может обновлять выражение; эти гарантии непривязанного черновика туда не переносятся.
Вставка/сдвиг/получение/индекс/удаление показываются на собственном выключенном временном поле. Индекс меняется, автоматически созданный путь прибыли сохраняется. Идентификатор поля получен у собственной коллекции; обратный поиск сверяет тот же объект, а не созданный UUID.
Инициализируем собственный редактор источником доступных настроек нашей схемы, загружаем настройки и ищем реальное поле Выручка в доступных значениях/отборе. Эти readonly-свойства дают коллекции, а не право присваивать им другой источник. Для найденного доступного поля отдельно проверяем идентификатор и обратный поиск.
Выбранные колонки используют настоящий сгенерированный путь прибыли. Не подменяем его заголовком или заранее придуманным ПользовательскоеПоле1. Своя копия настроек получает сгруппированный по Наименование вариант.
Каждый полный вывод заново компилирует макет для коллекции значений, инициализирует новый процессор и получает реальную ТаблицаЗначений. Включены проверки всех размеров, исходных значений, типов прибыли и каждого рассчитанного значения. Константные ожидания не вставляются в результат вместо исполнения.
Проверяем три детали и обе сводные группы. Имя колонки прибыли/категории берётся из реальной таблицы: сначала по пути, затем по единственному своему заголовку; отсутствие/неоднозначность — ошибка, не повод подставлять ожидаемое значение.
Очистить пользовательских полей вызывается только на независимой копии после исполнения; рабочий редактор по-прежнему имеет своё одно поле прибыли. Не очищаем коллекцию ещё используемого результата.
Как проверить результат
Будущий опыт F7 и свой Пульт. Три детали, исходные выручки 750/50/500 и затраты 500/30/300; прибыли 250/20/200, общий контроль 470.
Сводные группы Книга=450 и Ручка=20: два разных книжных исходных ряда действительно агрегируются, итоговое выражение не заменено последней детальной прибылью.
Путь пользовательского поля непуст и сохраняется после сдвига; обратный поиск по собственным идентификаторам совпадает. После привязки доступная Выручка найдена в значениях и отборе.
После очистки отброшенной копии рабочий редактор сохраняет одно поле прибыли; запись или хранение пользовательских настроек не выполнялись.
Ошибка компиляции, отсутствующая/неоднозначная колонка, неправильный тип, количество строк или сумма означает НЕуспех. Здесь эти результаты ещё не получены: runtimeVerifiedScenarios=0.
Ожидаемый результат
Будущий результат: полноценные детали и сводная прибыль своего константного отчёта, сохранность рабочей настройки после операций только над своими временными объектами и копиями. Статически подготовлено; 1С не запускалась.
На что обратить внимание
У пользовательских полей, вариантов и коллекций нет использованного здесь конструктора Новый: получаем их из собственного дерева настроек. ПутьКДанным, Варианты, Отбор и доступные коллекции readonly, но их собственные вложенные элементы редактируемы.
Представление выражения не является просто синонимом его строки: при связи с источником setter представления может обновлять код выражения. Проверки равенства строк выполнены только ДО привязки.
Индекс элемента, автоматически созданный путь и ИдентификаторКомпоновкиДанных — три разных адреса. Не храните индекс как вечный идентификатор и не создавайте ID случайным UUID.
Эти >=700/<700 условия не пересекаются и покрывают собственные числовые строки. Для Null, другого типа, пересекающихся правил или рабочих данных нужна отдельная подготовка; это не универсальная классификация любой базы.
Поля и варианты очищаются только в отдельной копии. Изменение настоящих настроек чужого отчёта могло бы сломать его; такие объекты не принимаются и не изменяются.
Код выполняет вычисление СКД только при будущей ручной проверке своего стенда. Здесь нет подтверждённого runtime или доказательства визуального интерфейса/производительности.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.