ПоляНабораДанныхМакетаКомпоновкиДанных.Вставить

Методы · Insert

Добавляет элемент в заданную позицию.

Синтаксис

Вставить(<Индекс>)
Полное описание, параметры и ограничения

ПоляНабораДанныхМакетаКомпоновкиДанных.Вставить (DataCompositionTemplateDataSetFields.Insert)

ПоляНабораДанныхМакетаКомпоновкиДанных (DataCompositionTemplateDataSetFields)

Вставить (Insert)

Доступен, начиная с версии 8.1.

Синтаксис:
Вставить(<Индекс>)
Параметры:

<Индекс> (обязательный)
Тип: Число.
Расположение элемента в коллекции.
Возвращаемое значение:
Тип: ПолеНабораДанныхМакетаКомпоновкиДанных.

Описание:

Добавляет элемент в заданную позицию.

Доступность:

Сервер, толстый клиент, внешнее соединение.

Использование в версии:

Доступен, начиная с версии 8.1.

Методическая информация

Практические примеры

Редактор источников макета: менять только независимый черновик и восстановить полный рабочий план

Создаём полный собственный макет, переносим его в собственную XML-строку, упражняемся с реальными фабриками запросных наборов и полей только в отдельном черновике. Неполный черновик не исполняется; исходный и полностью восстановленный макеты дают одинаковые настоящие две строки.

Где и как запускать

Полный серверный общий модуль УчебныеИсточникиМакета85 собственной новой базы. Отдельный полный модуль Пульт ниже; без реального запуска.

Подготовка

  1. НОВАЯ отдельная файловая база 8.5.1.1343: имя конфигурации УчебныеИсточникиМакета85, совместимость НеИспользовать, управляемое приложение. Без рабочих справочников/документов/регистров, расширений, обменов или внешних действий. Здесь ничего не запускалось: runtimeVerifiedScenarios=0.

  2. Создайте серверный общий модуль УчебныеИсточникиМакета85: Сервер=Да, Клиент=Нет, Вызов сервера=Нет, Глобальный=Нет, Привилегированный=Нет. Вставьте ВЕСЬ основной модуль одного урока. Не объединяйте уроки с одинаковыми именами процедур и не добавляйте свою внешнюю обёртку.

  3. Создайте собственную обработку УчебныйПросмотрИсточников85 → управляемая форма Пульт → команда Выполнить и её кнопка. Действие команды — Выполнить. Отдельный полный модуль Пульт ниже; он вызывает общий модуль через свой серверный обработчик. F7, обновите только новый учебный стенд.

  4. Четыре исходные колонки: Наименование/Количество/Цена/Сумма. Книга 3 × 250 = 750, Ручка 1 × 50 = 50, итог количества 4 и суммы 800. Запрос содержит только константы; объектные варианты получают только собственные ТаблицаЗначений в памяти.

  5. Макет компилируется генератором для коллекции значений. В настройках только детальные записи без таблиц/диаграмм, поэтому настоящий вывод в ТаблицаЗначений допустим. Таблицы и макеты остаются на сервере; не возвращайте их в тонкий клиент.

  6. В четвёртом уроке полный собственный макет переносится в XML-строку через XDTO и читается обратно только из этой своей строки. Файлы, архивы и резервные копии на диске не создаются. Неполный черновик каталога намеренно не исполняется; реально выводятся исходный и полностью восстановленный макеты.

  7. Поставьте серверную точку останова перед последней проверкой и смотрите реальные наборы/поля и таблицу Результат внутри ПроверитьСвойПолныйВывод. Будущий ручной тест требуется отдельно: статические проверки не подтверждают фактическую компиляцию или вывод в 1С.

Процедура ВыполнитьПример() Экспорт
    ПроверитьСвойКонтекст();
    Схема = Новый СхемаКомпоновкиДанных;
    Источник = Схема.ИсточникиДанных.Добавить();
    Источник.Имя = "УчебныйИсточник";
    Источник.ТипИсточникаДанных = "Local";
    Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
    Набор.Имя = "УчебныеТовары";
    Набор.ИсточникДанных = Источник.Имя;
    Набор.АвтоЗаполнениеДоступныхПолей = Истина;
    Набор.Запрос = "ВЫБРАТЬ
    |    ""Книга"" КАК Наименование,
    |    3 КАК Количество,
    |    250 КАК Цена,
    |    750 КАК Сумма
    |ОБЪЕДИНИТЬ ВСЕ
    |ВЫБРАТЬ ""Ручка"", 1, 50, 50";
    Настройки = Схема.НастройкиПоУмолчанию;
    Для Каждого ИмяПоля Из СтрРазделить("Наименование,Количество,Цена,Сумма", ",") Цикл
        Выбранное = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
        Выбранное.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
        Выбранное.Использование = Истина;
    КонецЦикла;
    Детали = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
    Детали.Использование = Истина;
    АвтоВыбор = Детали.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
    АвтоВыбор.Использование = Истина;
    Компоновщик = Новый КомпоновщикМакетаКомпоновкиДанных;
    Макет = Компоновщик.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
    ПоказатьСвоиИсточники(Макет.НаборыДанных);
    ИсходныйНабор = ПолучитьСвойОжидаемыйНабор(Макет, Тип("НаборДанныхЗапросМакетаКомпоновкиДанных"));
    ПроверитьСвойПолныйВывод(Макет, Неопределено);
    ТекстМакета = СвойМакетВСтроку(Макет);
    Черновик = СвойМакетИзСтроки(ТекстМакета);
    Каталог = Черновик.НаборыДанных;
    Если Каталог.Количество() <> 1 Тогда
        ВызватьИсключение "Полная независимая копия должна сохранить единственный исходный набор";
    КонецЕсли;
    Первый = Каталог.Добавить(Тип("НаборДанныхЗапросМакетаКомпоновкиДанных"));
    ЗаполнитьСвойЧерновойЗапрос(Первый, "ПервыйЧерновой85", ИсходныйНабор.ИсточникДанных);
    Второй = Каталог.Вставить(0, Тип("НаборДанныхЗапросМакетаКомпоновкиДанных"));
    ЗаполнитьСвойЧерновойЗапрос(Второй, "ВторойЧерновой85", ИсходныйНабор.ИсточникДанных);
    Если Каталог.Количество() <> 3 Или Каталог.Индекс(Первый) <> 2 Или Каталог.Получить(0) <> Второй Тогда
        ВызватьИсключение "Добавление и вставка двух черновиков должны сохранить исходный набор и порядок";
    КонецЕсли;
    Каталог.Сдвинуть(Первый, -2);
    Если Каталог.Индекс(Первый) <> 0 Или Каталог.Получить(0) <> Первый Или Каталог.Получить(1) <> Второй Тогда
        ВызватьИсключение "Сдвигается тот же собственный элемент, не строка имени или набор другой модели";
    КонецЕсли;
    Каталог.Удалить(Второй);
    Если Каталог.Количество() <> 2 Или Каталог.Найти("ВторойЧерновой85") <> Неопределено Тогда
        ВызватьИсключение "Удалён только свой второй черновой набор";
    КонецЕсли;
    Каталог.Очистить();
    Если Каталог.Количество() <> 0 Тогда
        ВызватьИсключение "Очищается только каталог независимого черновика";
    КонецЕсли;
    Если Макет.НаборыДанных.Количество() <> 1 Или Макет.НаборыДанных.Получить(0) <> ИсходныйНабор Тогда
        ВызватьИсключение "Редактирование и очистка копии не должны менять исходный полный макет";
    КонецЕсли;
    Восстановленный = СвойМакетИзСтроки(ТекстМакета);
    ПоказатьСвоиИсточники(Восстановленный.НаборыДанных);
    ВосстановленныйНабор = ПолучитьСвойОжидаемыйНабор(Восстановленный, Тип("НаборДанныхЗапросМакетаКомпоновкиДанных"));
    Если ВосстановленныйНабор.Имя <> ИсходныйНабор.Имя
        Или ВосстановленныйНабор.ИсточникДанных <> ИсходныйНабор.ИсточникДанных
        Или ВосстановленныйНабор.Запрос <> ИсходныйНабор.Запрос Тогда
        ВызватьИсключение "Восстановление полного макета должно сохранить настоящие определения и ссылки";
    КонецЕсли;
    ПроверитьСвойПолныйВывод(Восстановленный, Неопределено);
    ПроверитьСвойПолныйВывод(Макет, Неопределено);
    Сообщить("Черновой редактор проверен. Неполный черновик не исполнялся; восстановленный и исходный полные макеты оба дают настоящие две строки и 800.");
КонецПроцедуры

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

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

Функция ПолучитьСвойОжидаемыйНабор(Макет, ОжидаемыйТип)
    Если Макет.НаборыДанных.Количество() <> 1 Тогда
        ВызватьИсключение "В корне своего макета нужен один полный набор";
    КонецЕсли;
    Набор = Макет.НаборыДанных.Получить(0);
    Если ТипЗнч(Набор) <> ОжидаемыйТип Тогда
        ВызватьИсключение "Не получен нужный настоящий скомпилированный тип: " + Строка(ОжидаемыйТип);
    КонецЕсли;
    Возврат Набор;
КонецФункции

Процедура ПроверитьСвойПолныйВывод(Макет, ВнешниеДанные)
    Процессор = Новый ПроцессорКомпоновкиДанных;
    Процессор.Инициализировать(Макет, ВнешниеДанные);
    Вывод = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    Приемник = Новый ТаблицаЗначений;
    Вывод.ОтображатьПроцентВывода = Ложь;
    Вывод.УстановитьОбъект(Приемник);
    Результат = Вывод.Вывести(Процессор, Ложь);
    Если ТипЗнч(Результат) <> Тип("ТаблицаЗначений") Или Результат.Количество() <> 2
        Или Результат.Колонки.Количество() <> 4 Тогда
        ВызватьИсключение "Настоящий вывод должен дать две строки и четыре колонки";
    КонецЕсли;
    Для Каждого ИмяПоля Из СтрРазделить("Наименование,Количество,Цена,Сумма", ",") Цикл
        Если Результат.Колонки.Найти(ИмяПоля) = Неопределено Тогда
            ВызватьИсключение "Потеряна ожидаемая колонка реального вывода " + ИмяПоля;
        КонецЕсли;
    КонецЦикла;
    Книга = Результат.Найти("Книга", "Наименование");
    Ручка = Результат.Найти("Ручка", "Наименование");
    Если Книга = Неопределено Или Ручка = Неопределено Тогда
        ВызватьИсключение "Не найдены обе реальные исходные строки результата";
    КонецЕсли;
    Если Книга.Количество <> 3 Или Книга.Цена <> 250 Или Книга.Сумма <> 750
        Или Ручка.Количество <> 1 Или Ручка.Цена <> 50 Или Ручка.Сумма <> 50
        Или Результат.Итог("Количество") <> 4 Или Результат.Итог("Сумма") <> 800 Тогда
        ВызватьИсключение "Потеряны или изменены реальные ячейки собственного полного вывода";
    КонецЕсли;
    Сообщить("Настоящий вывод проверен: Книга 3 × 250 = 750, Ручка 1 × 50 = 50; количество 4, сумма 800.");
КонецПроцедуры

Функция СвойМакетВСтроку(Макет)
    Запись = Новый ЗаписьXML;
    Запись.УстановитьСтроку();
    СериализаторXDTO.ЗаписатьXML(Запись, Макет);
    Возврат Запись.Закрыть();
КонецФункции

Функция СвойМакетИзСтроки(СтрокаXML)
    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(СтрокаXML);
    Попытка
        Макет = СериализаторXDTO.ПрочитатьXML(Чтение, Тип("МакетКомпоновкиДанных"));
    Исключение
        Чтение.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    Чтение.Закрыть();
    Если ТипЗнч(Макет) <> Тип("МакетКомпоновкиДанных") Тогда
        ВызватьИсключение "XDTO должен вернуть полный настоящий макет, не текст или Неопределено";
    КонецЕсли;
    Возврат Макет;
КонецФункции

Процедура ЗаполнитьСвойЧерновойЗапрос(Набор, Имя, Источник)
    Если Набор = Неопределено Тогда
        ВызватьИсключение "Фабрика не создала допустимый элемент своего каталога";
    КонецЕсли;
    Если ТипЗнч(Набор) <> Тип("НаборДанныхЗапросМакетаКомпоновкиДанных") Тогда
        ВызватьИсключение "Нужен настоящий черновой запрос макета";
    КонецЕсли;
    Набор.Имя = Имя;
    Набор.ИсточникДанных = Источник;
    Набор.Отбор = "";
    Набор.Запрос = "ВЫБРАТЬ ""draft-1"" КАК КодТовара85, 1 КАК Сумма85";
    ПолеКода = Набор.Поля.Добавить();
    ПолеКода.Имя = "КодТовара85";
    ПолеКода.ПутьКДанным = "КодТовара85";
    ПолеСуммы = Набор.Поля.Вставить(0);
    ПолеСуммы.Имя = "Сумма85";
    ПолеСуммы.ПутьКДанным = "Сумма85";
    Если Набор.Поля.Количество() <> 2 Или Набор.Поля.Получить(0) <> ПолеСуммы
        Или Набор.Поля.Найти("КодТовара85") <> ПолеКода Тогда
        ВызватьИсключение "Черновой каталог должен иметь ровно два известных поля в заданном порядке";
    КонецЕсли;
    ПроверитьСвойКаталогПолей(Набор.Поля);
    Набор.Поля.Удалить(ПолеСуммы);
    Если Набор.Поля.Количество() <> 1 Или Набор.Поля.Найти("Сумма85") <> Неопределено Тогда
        ВызватьИсключение "По настоящему элементу удаляется только своё черновое поле";
    КонецЕсли;
    Набор.Поля.Очистить();
    Если Набор.Поля.Количество() <> 0 Тогда
        ВызватьИсключение "Очищается только свой временный каталог, не поля исходного рабочего набора";
    КонецЕсли;
КонецПроцедуры

Процедура ПроверитьСвойКонтекст()
    Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
        ВызватьИсключение "Нужен собственный стенд УчебныеИсточникиМакета85 платформы 8.5.1.1343";
    КонецЕсли;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Учебный вывод не должен выполняться внутри чужой транзакции";
    КонецЕсли;
КонецПроцедуры
УчебныйПросмотрИсточников85.Пульт

УчебныеИсточникиМакета85 → Обработки → УчебныйПросмотрИсточников85 → Формы → Пульт → Модуль

Полный модуль собственной управляемой формы Пульт; не выполнялся.

&НаКлиенте
Процедура Выполнить(Команда)
    ВыполнитьНаСервере();
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
    УчебныеИсточникиМакета85.ВыполнитьПример();
КонецПроцедуры

Разбор по шагам

  1. Схема описывает источник, поля и настройки; Компоновщик создаёт исполняемый Макет. Типы НаборДанных…Схемы и НаборДанных…Макета не взаимозаменяемы. Точный реальный тип проверяется до специального чтения свойств.

  2. Имя, ИсточникДанных и Отбор в макете — настоящие технические определения. Их диагностируем, не меняем независимо от связанных частей. ВложенныеНаборыДанных — readonly-каталог зависимостей, не то же самое, что дочерние Элементы объединения.

  3. Поля — readonly-свойство с редактируемым каталогом. Получить читает реальный элемент по индексу, Найти по его фактическому имени nullable и должен вернуть тот же объект. Имя/ПутьКДанным поля связывают набор с компоновкой; его readonly Роль является настоящим объектом, а не флагом Булево.

  4. Новые конструкторы для наборов/полей макета не выдумываются. Наборы получаются из полного реального макета после компиляции; поля — из его каталога. Полное имя поля макета формируется как ИмяНабора.ИмяПоля, не только подпись колонки.

  5. Новый процессор выводит реальные данные в собственную ТаблицаЗначений. Проверяем точный тип, две строки, все четыре колонки, каждое значение Книга/Ручка и итоги 4/800. Не заполняем результат ожидаемыми строками и не ограничиваемся количеством каталогов.

  6. XDTO сериализует весь собственный МакетКомпоновкиДанных в строку: сохраняются определения, readonly-структуры ролей/параметров и связанные части тела. ПрочитатьXML получает точный Тип макета, результат проверяется; ЧтениеXML закрывается и при исключении. Ни один файл не создаётся.

  7. Черновик получен отдельным чтением своей строки, поэтому операции каталога не относятся к исходному Макет. Добавить(Тип) nullable; Вставить(0,Тип) создаёт второе настоящее определение перед исходным. Оба черновых запроса имеют свои имена и собственный буквальный текст.

  8. Поля чернового запроса создаются через настоящий Добавить() и Вставить(0), без аргумента Тип. Меняем только допустимые Имя/ПутьКДанным на КодТовара85/Сумма85; проверяем типы, Найти/Получить и порядок. Удалить получает настоящий ПолеНабораДанныхМакета…, затем Очистить обнуляет только временный каталог.

  9. Наборы каталога отличаются от полей: их Добавить/Вставить требуют Тип. Индекс/Получить проверяют настоящий элемент и позицию; Сдвинуть(Первый,-2) меняет его место, Удалить(Второй) удаляет только второй свой черновик.

  10. Очистить относится к независимому черновому каталогу. Из него больше нельзя формировать отчёт: тело ещё ссылается на удалённые определения. Поэтому неполный черновик НЕ запускается и не выдаётся за исправный новый источник.

  11. Восстанавливаем не отдельные поля наугад, а весь полный макет новым чтением исходной своей XML-строки. Сверяем реальные Имя/ИсточникДанных/Запрос; новый процессор проверяет все восемь ячеек полного результата. Последний отдельный процессор повторно проверяет неизменённый исходный макет.

Как проверить результат

  1. Будущий ручной тест: F7 → собственный Пульт → Выполнить. Должен обнаружиться точный заявленный тип набора, а не только совпасть текст имени.

  2. В реальном Результат две строки и ровно четыре колонки. Книга: 3/250/750, Ручка: 1/50/50; итоги количества 4, суммы 800. Потеря строки/поля или подмена значения вызывает явное исключение.

  3. Технические имена, текст скомпилированного запроса, каталоги и роли смотрите фактически в отладчике. Эти значения генератора не угадываются и не объявляются одинаковыми у всех конфигураций.

  4. В черновике количество наборов меняется 1 → 2 → 3 → 2 → 0; полевая фабрика каждого временного набора проверяет 2 → 1 → 0. Исходный макет весь опыт сохраняет один первоначальный набор.

  5. Восстановленный и первоначальный полные макеты каждый дают реальные две строки и 800. XML-строка не читается из чужого файла/сети. Работа неполного черновика не заявляется и не проверяется запуском.

Ожидаемый результат

Будущий результат: настоящие определения скомпилированных источников и полный проверенный вывод двух строк, количества 4 и суммы 800. Здесь в 1С не запускалось.

На что обратить внимание

  1. У источников схемы и макета разные классы и контракты. Не присваивайте readonly Поля/ВложенныеНаборыДанных/Роль вместо изменения допустимого собственного дочернего объекта.

  2. Отбор готового макета — язык выражений СКД, не произвольная вставка текста SQL/BSL. Для рабочего изменения фильтра предпочтительнее менять настройки и перекомпилировать полный макет.

  3. Native Индекс/Сдвинуть каталога полей называют в параметре коллекцию Поля…, а не элемент Поле…. Эти два несогласованных метода не вызываются и не помечаются покрытыми; не добавляем угадывания ради счётчика.

  4. Сигнатуры сверены с установленной справкой 8.5.1.1343, но компиляция/вывод не запускались. runtimeVerifiedScenarios=0; проверки ожидаемые для своего стенда, не обещание работы на произвольной конфигурации.

  5. Это полный учебный редактор чернового каталога с откатом, а не пример ручного добавления готового исполняемого источника в произвольный промышленный макет. Чтобы включить новый источник в вывод, нужны согласованные поля, зависимости и тело; предпочтительнее менять схему и пересобирать.

  6. Роль поля readonly; в ней есть readonly Обязательное. Не копируйте роль частично присваиванием случайных флагов. Полное XDTO-чтение собственного макета сохраняет связанную структуру вместо такого угадывания.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.