8.х Добавить строку в табличную часть с упорядочиванием приоритетов

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Jestery, 1 фев 2017.

  1. TopicStarter Overlay
    Jestery
    Offline

    Jestery

    Регистрация:
    9 янв 2017
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Здравствуйте, проблема такая, УТ 10.3, есть табличная часть с колонками Контрагент и Приоритет.
    Если идет добавление в табличную часть, например добавляется контрагент с приоритетом 2 в заполненную табчасть, то необходимо сдвинуть уже имеющихся контрагентов на +1, подскажите как это можно реализовать
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.889
    Симпатии:
    1.029
    Баллы:
    204
    Либо найти место вставки строки и вставить, либо после добавления строки выполнить сортировку таблицы по приоритету.
    Все это требует навыков программирования.
    Jestery нравится это.
  3. TopicStarter Overlay
    Jestery
    Offline

    Jestery

    Регистрация:
    9 янв 2017
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Задачка была давно решена, тем не менее nomad_irk спасибо за отклик. Не поленюсь, напишу решение, может кому пригодится. Итак еще раз входные данные: есть табличная часть с двумя колонками: Контрагент и Приоритет, допустим имеем такие данные:

    № Контрагент Приоритет
    1 Завод радиоэлектроники 1
    2 ИП Петров В.И. 2
    3 Концерн "Вымпел" 3
    4 ТД "Прогресс" 4

    Стоит задача добавить в любую позицию нового контрагента с приоритетом, который при добавлении укажет пользователь в диалоге, при этом естественно если мы добавляем например в позицию с приоритетом 2, то необходимо сдвинуть уже имеющихся контрагентов на +1 , чтобы получить верную нумерацию, при этом нужно учесть, что контрагент, которого мы добавляем уже может быть в списке, дублирования допускать нельзя. В любом случае, в какую бы позицию не шло добавление, в итоге контрагенты должны выстраиваться в порядке приоритетов, не дублироваться, не перемешиваться и максимальный номер приоритета не может быть больше количества строк в таб.части. Вот весь код, получившийся в итоге:

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