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