Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Хранение для сортировки

Хранение для сортировки
Я
   withoutname
 
06.02.20 - 10:12
Обычные формы. Имеется документ с ТЧ. На форме ТЧ преобразуется в Дерево значений (ДЗ). У строк ДЗ имеется список вида
Раздел 1.
  1.1.
  1.2.
Раздел 2.
  2.1.
    2.1.1.
...
Порекомендуйте как организовать хранение данного списка?
В дальнейшем потребуется выводить такую же иерархию в отчетах

Сейчас ДЗ постоянно перенумеровывается при добавлении строк, перестановки.
Возможно это хранение поможет сократить затраты на перенумерацию
   Ненавижу 1С
 
1 - 06.02.20 - 10:16
заполнять (возможно программно) служебное поле-шаблон для упорядочивания фиксированного типа:

01.000.000 Раздел 1.
01.001.000  1.1.
01.002.000  1.2.
02.000.000 Раздел 2.
02.001.000  2.1.
02.001.001  2.1.1.

но нужно знать заранее глубину вложенности
можно еще организовать технологией "вложенные множества", но там сложнее
   artemis
 
2 - 06.02.20 - 10:33
(0) Хранить в справочнике.
   withoutname
 
3 - 06.02.20 - 10:48
(1) заполняю программно. ну вот примерно так я и думал )
вложенность ограничена всего 3я уровнями
   withoutname
 
4 - 06.02.20 - 10:54
не пойму как мне обработать строку верхнего уровня, при добавлении подчиненного.
   withoutname
 
5 - 06.02.20 - 10:57
и соответственно назначать этот шаблон - при добавлении или изменять - при перестановке
   Ненавижу 1С
 
6 - 06.02.20 - 11:07
(4) зачем обрабатывать строку верхнего уровня при добавлении подчиненного?
   withoutname
 
7 - 06.02.20 - 11:14
(6) допустим я сформировал поле-шаблон 001.000.000, далее добавляю подчиненную строку, мне необходимо получить ...
а, ну все правильно, мне просто со строки родителя надо взять первый разряд, посчитать количество строк у родителя и установить 001.[кол-во строк в формате разряда].000
3й уровень также...
вроде пока всё складывается )
   polosov
 
8 - 06.02.20 - 11:23
(7) Зачем такие сложности?
Добавь 1 реквизит который будет хранить номер строки "родительской" строки. Если он не заполнен, то это строка верхнего уровня, если заполнена, то значит строка подченена в дереве соответствующей строке.
   withoutname
 
9 - 06.02.20 - 11:31
(8) в принципе у меня есть такой реквизит - КлючСвязи, для построения дерева, но он присваивается только при сохранении
   withoutname
 
10 - 28.02.20 - 12:32
Забыл отписаться...
Вот что получилось в итоге
Функция юскСформироватьПорядок(Дерево, ТекущаяСтрока) Экспорт
    
    //Шаблон = "000.000.000";

    //:Дерево = Новый ДеревоЗначений

    Если ТекущаяСтрока.Уровень() = 0 Тогда
        
        ИндексСтроки = Дерево.Строки.Индекс(ТекущаяСтрока)+1;
        Порядок = Формат(ИндексСтроки, "ЧЦ=3; ЧВН=") + ".000.000";
    ИначеЕсли ТекущаяСтрока.Уровень() = 1 Тогда
        
        СтрокаРодитель = ТекущаяСтрока.Родитель;
        ПорядокРодителя = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаРодитель.Порядок, ".", Истина);
        МассивПорядка = Новый Массив;
        МассивПорядка.Добавить(ПорядокРодителя[0]);
        ИндексСтроки = СтрокаРодитель.Строки.Индекс(ТекущаяСтрока)+1;
        МассивПорядка.Добавить(Формат(ИндексСтроки, "ЧЦ=3; ЧВН="));
        МассивПорядка.Добавить("000");
        
        Порядок = СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(МассивПорядка, ".");
    ИначеЕсли ТекущаяСтрока.Уровень() = 2 Тогда
        
        СтрокаРодитель = ТекущаяСтрока.Родитель;
        ПорядокРодителя = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаРодитель.Порядок, ".", Истина);
        МассивПорядка = Новый Массив;
        МассивПорядка.Добавить(ПорядокРодителя[0]);
        МассивПорядка.Добавить(ПорядокРодителя[1]);
        ИндексСтроки = СтрокаРодитель.Строки.Индекс(ТекущаяСтрока)+1;
        МассивПорядка.Добавить(Формат(ИндексСтроки, "ЧЦ=3; ЧВН="));
        
        Порядок = СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(МассивПорядка, ".");
    КонецЕсли;
    
    Возврат Порядок;
КонецФункции


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.