Почему не добавляется строка в дерево значений в 1С 8.3.14 и как это исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке на платформе 1С:Предприятие 8.3 многие программисты сталкиваются с ситуацией, когда код, годами работавший в старых версиях или режимах совместимости, внезапно перестает функционировать. Одной из таких классических проблем является добавление строк в дерево значений (ДЗ) на управляемой форме. Особенно часто это проявляется при переходе с режима совместимости 8.3.12 на более новые версии, такие как 8.3.14 и выше.

В этой статье мы подробно разберем, почему привычный метод ДобавитьСтроку() может перестать работать, проанализируем разницу между интерактивными и программными методами манипуляции данными и найдем наиболее надежные способы решения этой задачи.

Разбор ситуации: почему метод ДобавитьСтроку() дает сбой

Рассмотрим стандартную ситуацию. У нас есть элемент формы типа ТаблицаФормы, отображающий дерево значений. В коде вызывается метод:


ГридДереваЗапросов = Элементы.ДеревоЗапросов;
ГридДереваЗапросов.ДобавитьСтроку();

Проанализируем причину сбоя. Метод ДобавитьСтроку() относится к расширению таблицы формы. Важно понимать, что он по своей сути имитирует интерактивное действие пользователя (нажатие кнопки «Добавить» в командной панели). Начиная с версии платформы 8.3.13–8.3.14, механизмы контроля состояния интерфейса стали значительно строже.

Если система считает, что в данный момент команда добавления недоступна (например, не выбран родительский узел или установлены ограничивающие свойства оформления), программный вызов этого метода просто игнорируется без вывода ошибки. Выясним основные причины такого поведения:

  1. Свойство «Изменять состав строк»: Это наиболее вероятная причина. Если в свойствах таблицы на форме флаг «Изменять состав строк» установлен в значение «Нет», метод ДобавитьСтроку() не будет выполнять никаких действий.
  2. Отсутствие фокуса: Для добавления «братской» строки методу нужно понимать контекст — где именно находится текущий курсор. Если дерево пустое или фокус сбит, метод может не сработать.
  3. Режим «Только просмотр»: Проверьте иерархию ограничений: свойство всей формы, самой таблицы или конкретных реквизитов.

Решение №1: Настройка свойств элемента формы

Если вы хотите продолжать использовать метод ДобавитьСтроку(), необходимо убедиться, что интерфейс позволяет это действие. Проделаем следующие шаги:

  1. Откроем управляемую форму в конфигураторе.
  2. Найдем элемент формы (Таблицу), которая отображает дерево значений.
  3. В палитре свойств найдем раздел «Использование».
  4. Установим свойство «Изменять состав строк» в значение Истина (флажок должен стоять).

Как показывает практика, именно это изменение часто возвращает работоспособность коду при переходе на новые режимы совместимости. Платформа в режиме 8.3.14 начинает жестко проверять доступность команд интерфейса перед их выполнением.

Решение №2: Программное добавление через объектные данные (Рекомендуемое)

Рассмотрим более надежный и профессиональный подход, который не зависит от настроек визуального интерфейса и фокуса элементов. Вместо того чтобы просить «таблицу» добавить строку, мы будем работать напрямую с данными (реквизитом формы), к которым эта таблица привязана.

Проанализируем пример кода, который гарантированно работает вне зависимости от режима совместимости:


&НаКлиенте
Процедура ДобавитьЗапрос(Команда)
    // 1. Получаем доступ к визуальному элементу и данным
    ГридДереваЗапросов = Элементы.ДеревоЗапросов;
    
    // 2. Находим идентификатор текущей строки, чтобы понять, куда добавлять подчиненный элемент
    ИдентификаторТекущейСтроки = ГридДереваЗапросов.ТекущаяСтрока;
    
    Если ИдентификаторТекущейСтроки <> Неопределено Тогда
        // 3. Получаем объект данных строки по её идентификатору
        ТекущаяСтрокаДанных = ДеревоЗапросов.НайтиПоИдентификатору(ИдентификаторТекущейСтроки);
        
        // 4. Добавляем новую строку в коллекцию подчиненных элементов (вглубь дерева)
        НоваяСтрока = ТекущаяСтрокаДанных.ПолучитьЭлементы().Добавить();
        
        // 5. Инициализируем данные новой строки
        НоваяСтрока.Наименование = "<без названия>";
        
        // 6. Устанавливаем фокус на новую строку для удобства пользователя
        ГридДереваЗапросов.ТекущаяСтрока = НоваяСтрока.ПолучитьИдентификатор();
        
        Модифицированность = Истина;
    Иначе
        ПоказатьПредупреждение(, "Пожалуйста, выберите родительский узел в дереве!");
    КонецЕсли;
КонецПроцедуры

Сравнение подходов: Данные против Интерфейса

Разберем подробнее, почему работа через ПолучитьЭлементы().Добавить() лучше:

Посмотрим на важный нюанс: когда мы добавляем строку через данные, нам необходимо вызвать метод ПолучитьИдентификатор(), чтобы передать его обратно в свойство ТекущаяСтрока таблицы формы. Это обеспечит автоматический скроллинг и выделение новой строки для пользователя.

Дополнительные рекомендации при работе с Деревом Значений

Выясним еще несколько моментов, которые помогут избежать ошибок в будущем:

  1. Обновление интерфейса: В редких случаях, при сложной программной обработке дерева, интерфейс может не сразу «увидеть» изменения. Если вы добавили данные, но дерево на экране пустое, попробуйте вызвать ОповеститьОбИзменении(Тип("СправочникСсылка.ВашОбъект")) или просто убедитесь, что дерево привязано к правильному реквизиту формы.
  2. Использование метода Добавить() на верхнем уровне: Если нужно добавить строку в корень дерева, используйте ДеревоЗапросов.ПолучитьЭлементы().Добавить() без поиска родителя.
  3. Модифицированность формы: Не забывайте устанавливать Модифицированность = Истина, чтобы платформа предложила пользователю сохранить изменения при закрытии формы.

Подводя итог, можно сказать, что переход на новые версии платформы 1С требует от разработчика более строгого разделения между данными и их представлением. Использование методов коллекции данных вместо методов элементов формы делает ваш код устойчивым к изменениям в логике интерфейсных команд 1С.

← На главную