Контекстное меню и перемещение строк.
В итоге либо строки не двигаются, либо происходит бесконечное зацикливание и выкидывает с 1с. Так же стандартные кнопки перемещения( контектсное меню) не отрабатывают.
КоллекцияСтрокДереваЗначений.Сдвинуть (ValueTreeRowCollection.Move)
Синтаксис:
Сдвинуть(, )
Параметры:
(обязательный)
Тип: Число.
Индекс строки, которую надо сдвинуть.
(обязательный)
Тип: Число.
Количество строк, на которые необходимо сдвинуть строку. Положительное смещение обозначает увеличение текущего индекса (сдвиг к концу коллекции), отрицательное — уменьшение текущего индекса (сдвиг к началу коллекции).
Описание:
Сдвигает строку на указанное количество позиций в коллекции строк данного уровня дерева значений.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Пример:
// сдвинем первую строку на следующую позицию
СтрокиСостава.Сдвинуть(0, 1);
// сдвинем вторую строку на предыдущую позицию
СтрокиСостава.Сдвинуть(1, -1);
Использование в версии:
Доступен, начиная с версии 8.0.
(4) для примера я повесил событие на свою кнопку. То есть при нажатии на кнопку мы смотрим какая сейчас активная строка дерева. Берем строку родителя. А дальше у Строки родителя у реквизита «Строки» вызываем метод «Сдвинуть», в параметрах которого указываем строку, которую хотим подвинуть(нашу текущую строку) и то на сколько ее нужно переместить. Только надо еще проверки какие-нибудь чтобы не улететь за границы.
//В примере на гифке Строка2 и Строка3 подчинены Строка1
(5)
1. Первую строку не сдвинуть,так как родитель отсуствтует.
2. Выход за границы индексов таблицы: «неправильное смещение внутри коллекции».
(6) «Первую строку не сдвинуть». Попробуй напрямую обратиться к строкам верхнего уровня дерева ИмяТвоегоДерева.Строки.Сдвинуть(НужнаяСтрока, Смещение)
(9) Все, что связано с деревьями, не только понимать, но и объяснять сложно) Сейчас попробую перефразировать. Если у строки нет родителя, то это строка первого уровня, а коллекция строк первого уровня, на сколько я помню, это просто ИмяТвоегоДерева.Строки. Вот именно у этой коллекции и вызывай метод Сдвинуть() чтобы подвигать строку
(10) А ну и перед делать проверку на то, что это первая строка ?
А по поводу метода количества() как проверять ?
Да, проверять, что у нее нет родителя
Если мы хотим двинуться вниз по дереву, то Примерно следующее:
ИндексТекущейСтроки = РодительТекущейСтроки.Строки.Индекс(ТекущаяСтрока); Если ИндексТекущейСтроки < РодительТекущейСтроки.Строки Тогда РодительТекущейСтроки.Строки.Сдвинуть(ТекущаяСтрока); Иначе Сообщить("Мы в конце уровня дерева. Вниз двигаться нельзя"); КонецЕсли;
Аналогично при движении наверх
ТекущаяСтрока = ЭлементыФормы.ГруппировкиНаПечать.ТекущаяСтрока; РодительТекущейСтроки = ТекущаяСтрока.Родитель; ЭлементыФормы.ГруппировкиНаПечать.ТекущиеДанные.Родитель.Строки.Сдвинуть(ТекущаяСтрока,1); ИндексТекущейСтроки = РодительТекущейСтроки.Строки.Индекс(ТекущаяСтрока); Если ИндексТекущейСтроки < РодительТекущейСтроки.Строки Тогда РодительТекущейСтроки.Строки.Сдвинуть(ТекущаяСтрока); Иначе Сообщить("Мы в конце уровня дерева. Вниз двигаться нельзя"); КонецЕсли;
Вот так ?
Всё равно ловлю ошибку "неправильное смещение внутри коллекци"
И ИндексТекущейСтроки < РодительТекущейСтроки.Строки это число и колеекциястрок. как их сравнивать..
Количество() я пропустил, когда Вам ответ писал.
Я еще только не проверял индекс с 0 начинается или с 1. Так что в отладчике проверьте и если что код на Количество()-1 подкорректируйте
(13)Сначала проверки, потом сдвиги, а то Вы сначала сдвиг делаете, а потом идете проверку делать и если она проходит, то еще один сдвиг. Примерно так должно быть:
ТекущаяСтрока = ЭлементыФормы.ГруппировкиНаПечать.ТекущаяСтрока; РодительТекущейСтроки = ТекущаяСтрока.Родитель; Если РодительТекущейСтроки = Неопределено Тогда РодительТекущейСтроки = ГруппировкиНаПечать; КонецЕсли; ИндексТекущейСтроки = РодительТекущейСтроки.Строки.Индекс(ТекущаяСтрока); Если ИндексТекущейСтроки < РодительТекущейСтроки.Строки.Количество() Тогда РодительТекущейСтроки.Строки.Сдвинуть(ТекущаяСтрока); Иначе Сообщить("Мы в конце уровня дерева. Вниз двигаться нельзя"); КонецЕсли;
(16)Скиньте Ваш код как он есть сейчас, я попробую у себя внешнюю обработку сделать и смоделировать чтобы все работало
ТекущаяСтрока = ЭлементыФормы.ГруппировкиНаПечать.ТекущаяСтрока; РодительТекущейСтроки = ТекущаяСтрока.Родитель; Если РодительТекущейСтроки = Неопределено Тогда РодительТекущейСтроки = ГруппировкиНаПечать; КонецЕсли; ИндексТекущейСтроки = РодительТекущейСтроки.Строки.Индекс(ТекущаяСтрока); Если ИндексТекущейСтроки < РодительТекущейСтроки.Строки.Количество() Тогда РодительТекущейСтроки.Строки.Сдвинуть(ТекущаяСтрока,1); Иначе Сообщить("Мы в конце уровня дерева. Вниз двигаться нельзя"); КонецЕсли;
(16)Вот код и пример обработки. У меня работает:
Процедура КнопкаВнизНажатие(Элемент) ТекущаяСтрока = ЭлементыФормы.ГруппировкиНаПечать.ТекущаяСтрока; РодительТекущейСтроки = ТекущаяСтрока.Родитель; Если РодительТекущейСтроки = Неопределено Тогда РодительТекущейСтроки = ГруппировкиНаПечать; КонецЕсли; ИндексТекущейСтроки = РодительТекущейСтроки.Строки.Индекс(ТекущаяСтрока); Если ИндексТекущейСтроки < РодительТекущейСтроки.Строки.Количество() - 1 Тогда РодительТекущейСтроки.Строки.Сдвинуть(ТекущаяСтрока, 1); Иначе Сообщить("Мы в конце уровня дерева. Вниз двигаться нельзя"); КонецЕсли; КонецПроцедуры Процедура КнопкаВВерхНажатие(Элемент) ТекущаяСтрока = ЭлементыФормы.ГруппировкиНаПечать.ТекущаяСтрока; РодительТекущейСтроки = ТекущаяСтрока.Родитель; Если РодительТекущейСтроки = Неопределено Тогда РодительТекущейСтроки = ГруппировкиНаПечать; КонецЕсли; ИндексТекущейСтроки = РодительТекущейСтроки.Строки.Индекс(ТекущаяСтрока); Если ИндексТекущейСтроки <>0 Тогда РодительТекущейСтроки.Строки.Сдвинуть(ТекущаяСтрока, -1); Иначе Сообщить("Мы в начале уровня дерева. Вверх двигаться нельзя"); КонецЕсли; КонецПроцедуры
(19) Открыл у себя. Попадаю в сообщение() всегда..
Плюс у Вас не программно стоят колонки и иеархия отсуствтует видимая.
(20)Строки дерева добавь в таком порядке. Добавь первую строку. Встань на нее фокусом и добавь вторую строку. Потом опять встань на первую строку фокусом и добавь третью строку. Вторая и третья строка у тебя окажутся подчинены первой. Затем попробую подвигать вторую и третью строки местами. Лень было реализовывать полноценный инструмент добавления строк ради демки.
Разве это важно для демонстрации перемещения строк? По моему нет, я сделал просто демку, которая показывает как работает перемещение, то что это действительно дерево видно в конфигураторе, то, что строки подчинены друг другу если их корректно внести тоже можно увидеть в конфигураторе
Если ГруппировкиНаПечать.Колонки.Количество() = 0 Тогда ГруппировкиНаПечать.Колонки.Добавить("Использовать", Новый ОписаниеТипов("Булево")); ГруппировкиНаПечать.Колонки.Добавить("Группировка", Новый ОписаниеТипов("Строка")); ГруппировкиНаПечать.Колонки.Добавить("Значение", Новый ОписаниеТипов("СписокЗначений")); Иначе Если ГруппировкиНаПечать.Колонки.Найти("Значение") = Неопределено Тогда ГруппировкиНаПечать.Колонки.Добавить("Значение", Новый ОписаниеТипов("СписокЗначений")); КонецЕсли; КонецЕсли; ЭлементыФормы.ГруппировкиНаПечать.СоздатьКолонки(); ЭлементыФормы.ГруппировкиНаПечать.ЧередованиеЦветовСтрок = Истина; ЭлементыФормы.ГруппировкиНаПечать.Колонки.Использовать.ДанныеФлажка = ЭлементыФормы.ГруппировкиНаПечать.Колонки.Использовать.Данные; ЭлементыФормы.ГруппировкиНаПечать.Колонки.Использовать.Данные = ""; ЭлементыФормы.ГруппировкиНаПечать.Колонки.Использовать.РежимРедактирования = РежимРедактированияКолонки.Непосредственно; ЭлементыФормы.ГруппировкиНаПечать.Колонки.Группировка.ЭлементУправления.КнопкаСпискаВыбора = Истина; ЭлементыФормы.ГруппировкиНаПечать.Колонки.Группировка.ЭлементУправления.РежимВыбораИзСписка = Истина; ЭлементыФормы.ГруппировкиНаПечать.Колонки.Группировка.ЭлементУправления.СписокВыбора.ДоступныеЗначения = ПолучитьСписокКолонокТаблицыТовары(); ЭлементыФормы.ГруппировкиНаПечать.Колонки.Группировка.ЭлементУправления.СписокВыбора = ПолучитьСписокКолонокТаблицыТовары(); ЭлементыФормы.ГруппировкиНаПечать.Колонки.Группировка.РежимРедактирования = РежимРедактированияКолонки.Непосредственно; ЭлементыФормы.ГруппировкиНаПечать.Колонки.Группировка.ЭлементУправления.РежимВыбораНезаполненного = РежимВыбораНезаполненного.ПриАктивизации; ЭлементыФормы.ГруппировкиНаПечать.Колонки.Значение.РежимРедактирования = РежимРедактированияКолонки.Вход; ЭлементыФормы.ГруппировкиНаПечать.НачальноеОтображениеДерева = НачальноеОтображениеДерева.РаскрыватьВсеУровни;
Видимо из-за этого и криво работает.. То есть у меня иеарирхия, каждая строки подчинена другой..
сли ГруппировкиНаПечать.Колонки.Количество() = 0 Тогда
ГруппировкиНаПечать.Колонки.Добавить("Использовать", Новый ОписаниеТипов("Булево"));
ГруппировкиНаПечать.Колонки.Добавить("Группировка", Новый ОписаниеТипов("Строка"));
ГруппировкиНаПечать.Колонки.Добавить("Значение", Новый ОписаниеТипов("СписокЗначений"));
Если ГруппировкиНаПечать.Колонки.Найти("Значение") = Неопределено Тогда
ГруппировкиНаПечать.Колонки.Добавить("Значение", Новый ОписаниеТипов("СписокЗначений"));
Источник
8.2 + Управляемые формы + дерево значений + контекстное меню = проблемы #616888
Исходные данные: Платформа: 8.2.14.528 Режим работы: управляемое приложение, тонкий клиент Журнал документов. На форме журнала динамический список с документами и дерево значений, которое служит для отображения подчиненных документов. Задача: на дереве значений при правом клике вывести контекстное меню, которое может изменяться программно в зависимости от активного вида документа на момент клика на дереве значений. Попытка решения: Основное контекстное меню дерева значений построено в конфигураторе. При активизации строки дерева значений некоторые пункты контекстного меню перестраиваются (меняется доступность, меняются заголовки, добавляются некоторые пункты, например для ввода на основании n-ных видов документов). Изменения пунктов меню происходит где-то так: Проблема: при попытке изменить содержание контекстного меню (в процедуре ПриАктивизацииСтроки) эта же процедура отрабатывает самостоятельно вновь. И все бы ничего, но при повторной отработке текущая строка дерева значений становится всегда первой, на какой бы ветке дерева я не находился в данный момент. Соответственно, после того, как текущая строка дерева самостоятельно изменилась, процедура ПриАктивизацииСтроки отрабатывает в третий раз. Т.е. из-за такого поведения системы пользователю невозможно получить контекстное меню строк дерева значений, которые находятся ниже первой строки. Если отключить программную перестройку содержания контекстного меню, то все отрабатыват в штатном режиме. Вопрос: может быть кто-то сталкивался с подобной проблемой, и у него появились варианты обхода подобного глюка? Есть ли какие-нибудь мысли по поводу вышеизложенного? Как можно обойти данную проблему отображения не жертвуя функциональностью системы. Заранее благодарен за дельные мысли.
Похожие вопросы 1С
- Управляемые блокировки в УПП
- Где правильнее поставить управляемые блокировки
- Управляемые формы
- УТ 11 управляемые формы - добавить в таб часть колонку с остатками
- получить форму во внешней обработке (8.2 управляемые формы)
- Как программно вставить элемент формы в определённое место (управляемые формы)?
- Управляемые формы, Дерево значений, Динамический список, ОТБОРЫ
- Управляемые формы. Вызов второй формы кнопкой из первой
- Дерево значений управляемые формы. как скрыть строку ?
- Управляемые формы: Обратиться из модуля объекта к элементу формы
- Управляемые формы. Убрать заголовок формы
- Управляемые формы. Как раскрасить дерево значений?
В этой группе 1С
- Завис процесс 1с
- Как вам такой КОД .
- скд = >связи наборов данных = > список параметров
- Расчет ресурса по группировкам иерархии.
- Почему функция ВставитьОбласть недоступна в тонком клиенте? А как же SaaS?
- Precomp.dll
- v7: Как вывести остатки по 41 (номенклатура+код) счету в xml в бухгалтерии 7.7
- Списание ошибок округления при расчете себестоимости
- УНФ резервное копирование
- Печатная форма добавление строки в конец страницы
- Как в ут 11 складу установить тип Розничный
- Отбор в стандартной форме "Редактирование списка значений" - как?
- 8.2.15 При проведении не срабатывает процедура модуля объекта "ПередЗаписью"
- Выгрузка Макета в эксель
- КД. Не выгружается реквизит справочника.
- ЗУП. Расчет премии от оклада
- УТ 11 изменить значение табличной части документа УстановкаЦенНоменклатуры
- сохранение параметров отбора построителя отчета
- вывод своего макета в СКД
- v8: Не запускается служба "Агент сервера 1С Предприятия 8.1".
Источник