В процессе разработки интерфейсов на платформе 1С часто возникает задача отображения одного и того же значения в разных частях формы. Например, пользователю может быть удобно видеть текущий склад и в шапке документа, и на отдельной вкладке с дополнительными параметрами. В этой статье мы подробно разберем, как реализовать автоматическую синхронизацию двух элементов управления, рассмотрим подводные камни при работе с управляемыми формами и выясним, какой метод является наиболее оптимальным с точки зрения производительности платформы.
Прежде чем приступать к написанию программного кода, давайте проанализируем возможности самой платформы 1С. Самый простой и эффективный способ синхронизации — это привязка нескольких элементов формы к одному и тому же реквизиту. В этом случае нам вообще не нужно писать код, так как платформа берет на себя все задачи по обновлению интерфейса.
Разберем по шагам, как это настроить:
ОсновнойСклад с типом СправочникСсылка.Склады.Объект.ОсновнойСклад.Проанализируем ситуацию: когда пользователь меняет значение в первом поле, платформа обновляет значение в памяти (в реквизите объекта). Как только фокус ввода покидает поле, все остальные элементы на форме, связанные с этим же путем к данным, автоматически обновляются. Это происходит на уровне ядра платформы, что исключает ошибки и лишние вызовы сервера.
Иногда возникают задачи, когда нам нужно синхронизировать два разных реквизита (например, АдресДоставки и АдресКорреспонденции), которые часто, но не всегда, должны быть одинаковыми. В этом случае использование одного пути к данным невозможно, так как это разные сущности в базе данных.
Выясним причину, почему обычное присваивание в коде может не сработать сразу. Для реализации такой связи мы будем использовать обработчик события ПриИзменении.
Рассмотрим пример кода для управляемой формы:
&НаКлиенте
Процедура Реквизит1ПриИзменении(Элемент)
// Присваиваем значение из первого реквизита во второй
Объект.Реквизит2 = Объект.Реквизит1;
КонецПроцедуры
Важно помнить, что в управляемом приложении работа с данными происходит через структуру Объект (если это форма документа или справочника) или напрямую через имя реквизита формы. Попытка обратиться к значению через Элементы.Реквизит1 будет ошибочной, так как Элементы — это визуальные объекты (кнопки, поля ввода), а не сами данные.
Сложности начинаются тогда, когда нам нужно синхронизировать не только само значение, но и доступные варианты выбора в выпадающем списке. Как было замечено в обсуждении на форуме, простая попытка присвоить один список другому через знак равенства вызовет ошибку: "Поле объекта недоступно для записи".
Разберем, почему это происходит. В управляемых формах СписокВыбора является коллекцией (типа СписокЗначений), которая доступна только для чтения в плане установки ссылки на новый объект, но доступна для изменения своего содержимого.
Посмотрим на пример правильного копирования списка выбора:
&НаКлиенте
Процедура СинхронизироватьСпискиВыбора()
// Сначала очищаем целевой список
Элементы.Реквизит2.СписокВыбора.Очистить();
// Переносим элементы из первого списка во второй
Для Каждого ЭлементСписка Из Элементы.Реквизит1.СписокВыбора Цикл
Элементы.Реквизит2.СписокВыбора.Добавить(ЭлементСписка.Значение, ЭлементСписка.Представление);
КонецЦикла;
КонецПроцедуры
В обычных формах (старые версии 1С 8.2 или 1С 7.7) ситуация была иной — там действительно можно было перезаписывать объект целиком через ЭлементыФормы, но в современном 1С мы должны работать с коллекцией методом перебора или загрузки из массива.
Нужно четко разграничивать, на какой платформе ведется разработка, так как синтаксис обращения к элементам различается:
Элементы. Данные отделены от представления. Синхронизация данных через Объект.ИмяРеквизита, синхронизация визуальных свойств — через Элементы.ИмяЭлемента.ЭлементыФормы. Здесь связь данных и элементов более тесная, и некоторые свойства, недоступные для записи в УФ, могут быть доступны в ОФ.Проанализируем ситуацию с точки зрения архитектуры базы данных. Создание двух идентичных реквизитов в одной таблице (например, Склад1 и Склад2, которые всегда равны) — это плохая практика, называемая избыточностью данных. Это усложняет поддержку кода и увеличивает размер базы.
Рекомендации по проектированию:
ПутьКДанным.ОбновлениеТекстаРедактирования, однако помните, что это может повысить нагрузку на клиентское приложение.Подводя итог, можно сказать: наиболее "чистым" решением является использование механизмов платформы (DataPath). К программному коду в событии ПриИзменении стоит прибегать только тогда, когда логика синхронизации подразумевает дополнительные условия или трансформацию данных.