Вставить, переместить и удалить собственную строку: ведущие виды

Учебные задачи

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

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

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Создайте НОВУЮ пустую файловую базу, имя корня УчебныеРасчеты85. Не изменяйте рабочие ЗУП/КА2/УНФ/УТ/БП. Пример технический: зарплата, налоги и выплаты не рассчитываются.

  2. Планы видов расчёта → Добавить: УчебныеНачисления85. ТипКода Строка, ДлинаКода 10, ДлинаНаименования 100. ИспользованиеПериодаДействия включено; ЗависимостьОтВидовРасчета=ПоПериодуДействия.

  3. В настройке базовых планов видов расчёта выберите только сам УчебныеНачисления85. Это позволяет учебным видам ссылаться на другие виды того же плана. Предопределённые виды, пользовательские реквизиты и табличные части не создавайте.

  4. Модули объекта/менеджера оставьте пустыми, регистры расчёта и бизнес-алгоритмы не добавляйте. Обновите конфигурацию БД и создайте серверный ВыполнитьПример() Экспорт собственной обработки.

  5. Фрагмент вставляется внутрь процедуры. Все виды и строки зависимостей создаются только в памяти; Записать, блокировки, удаления объектов и привилегированный режим не вызываются.

  6. Случайные ссылки зависимостей — ПЛАНОВЫЕ идентификаторы, соответствующих сохранённых видов нет. Они нужны для разбора типизированных списков, а не для запуска расчёта.

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

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

  1. Добавить помещает первую строку в конец. Вставить(0) ставит вторую перед ней.

  2. Индекс начинается с 0, а НомерСтроки с 1. После перемещения позицию вычисляем заново, не храним устаревший индекс.

  3. Сдвинуть принимает саму строку и отрицательное смещение к началу. Перемещение не меняет ссылку ВидРасчета.

  4. Предопределенный проверяем до удаления. У собственных добавленных строк он Ложь; у строк конфигурации может быть Истина.

  5. Удалить получает строку этой же коллекции. Удаляется только зависимость в памяти, не вид расчёта в базе.

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

  1. Девять логических сообщений дают Истина; остаётся одна строка с ПервыйВид.

  2. В сохранённых видах и расчётных регистрах нет новых данных. Новое определение не записывалось.

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

Разобраны позиция, номер строки, перемещение и безопасная граница удаления строки зависимости.

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

  1. Мутирующие методы недоступны у частей, полученных из ссылки или выборки: нужен объект.

  2. Удаление предопределённой строки может сделать запись вида невозможной. Не экспериментируйте на рабочем объекте.

  3. Плановые ссылки не соответствуют сохранённым начислениям; этот пример не рассчитывает деньги.

  4. Зависимости перерасчёта: изменение ведущего вида может потребовать перерасчёта зависимого, но этот пример не запускает его.

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

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

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

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

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