В практике разработки на платформе 1С:Предприятие 8.3 часто возникает ситуация, когда на одной форме необходимо разместить несколько полей, ссылающихся на один и тот же справочник. Типичный пример — выбор «Покупателя» и «Поставщика» в одном документе, где оба значения выбираются из справочника Контрагенты. Начинающие разработчики часто сталкиваются с проблемой: при выборе значения в одном поле, во втором автоматически появляется то же самое значение. Рассмотрим подробно, почему так происходит и как правильно настроить элементы формы.
Ситуация, когда два поля на форме ведут себя «зеркально», практически всегда связана с неправильной настройкой свойства Путь к данным (DataPath). Проанализируем стандартный сценарий: разработчик создает поле «Покупатель», привязывает его к соответствующему реквизиту, а затем, для экономии времени, просто копирует этот элемент управления (используя Ctrl+C / Ctrl+V), чтобы создать поле «Поставщик».
При таком копировании новое поле полностью наследует все свойства оригинала, включая ПутьКДанным. В результате оба визуальных элемента на форме отображают содержимое одной и той же ячейки памяти (одного реквизита). Программа воспринимает это как два разных «окна», смотрящих на один и тот же объект данных. Выясним, как это исправить.
Прежде всего, проанализируем структуру самого объекта (документа или справочника). Если мы хотим, чтобы данные о покупателе и поставщике сохранялись в базе данных независимо друг от друга, у объекта должны существовать два разных реквизита.
Например, в дереве конфигурации для нашего документа должны быть созданы:
Покупатель с типом СправочникСсылка.Контрагенты.Поставщик с тем же типом СправочникСсылка.Контрагенты.Если же вы используете реквизиты, созданные непосредственно в форме (на вкладке «Реквизиты» в редакторе формы), убедитесь, что там также добавлены две отдельные строки с уникальными именами.
Теперь перейдем к визуальному редактору формы. Рассмотрим по шагам процесс правильной привязки:
Объект.Покупатель, то второе ОБЯЗАТЕЛЬНО должно быть связано с Объект.Поставщик.Важный момент: если вы создали реквизиты на форме, а не в объекте, путь будет выглядеть просто как имя реквизита, например, КонтрагентДляФильтра.
Если реквизиты разные и пути к данным настроены верно, но значения все равно синхронизируются, проанализируем программный код модуля формы. Часто разработчики копируют процедуры-обработчики, забывая изменить имена переменных.
Посмотрим на пример ошибочного кода в событии ПриИзменении:
&НаКлиенте
Процедура ПокупательПриИзменении(Элемент)
// Ошибочное присвоение, которое синхронизирует поля
Объект.Поставщик = Объект.Покупатель;
КонецПроцедуры
Такой код может остаться от старой логики или быть результатом поспешного копирования. Необходимо тщательно проверить все процедуры, связанные с событиями ПриИзменении, АвтоПодбор и ОбработкаВыбора для обоих элементов формы.
После того как мы разделили поля, логично будет настроить их так, чтобы пользователь не мог ошибиться при выборе. Рассмотрим, как ограничить список контрагентов в каждом поле.
Для поля Покупатель в свойствах можно установить Параметры выбора. Это позволяет наложить статический отбор без написания кода. Например, мы можем указать: Отбор.Покупатель(Истина). Аналогично для поля поставщика установим Отбор.Поставщик(Истина).
Если же нам нужно динамически изменять список выбора в зависимости от других условий на форме, воспользуемся свойством Связи параметров выбора. Это мощный инструмент, позволяющий, например, показывать только тех контрагентов, которые входят в определенную группу, выбранную в другом поле.
Рассмотрим ситуацию, когда данные не нужно записывать в базу. В этом случае мы работаем исключительно с Реквизитами формы. Помните, что при создании нового реквизита на форме 1С автоматически не создает элемент управления (поле). Вам нужно перетащить созданный реквизит из правой колонки (список реквизитов) в левую (дерево элементов формы). В этом случае платформа сама установит правильный ПутьКДанным, и ошибки дублирования не возникнет.
Проанализируем также свойство Выбор из списка. Если вы хотите, чтобы пользователь выбирал значения не из всего справочника, а из ограниченного набора, который вы подготовили программно, установите это свойство в значение Да и заполните список в процедуре ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Элементы.Поставщик.СписокВыбора.Добавить(ПредопределенноеЗначение("Справочник.Контрагенты.ОсновнойПоставщик"));
Элементы.Поставщик.СписокВыбора.Добавить(Параметры.ВажныйКонтрагент);
КонецПроцедуры
Чтобы значения в двух полях, ссылающихся на один справочник, были разными, необходимо выполнить три условия:
Покупатель и Поставщик).ПутьКДанным у каждого элемента формы, чтобы они не ссылались на один и тот же реквизит.ПриИзменении.Соблюдение этих простых правил гарантирует корректную работу интерфейса и отсутствие путаницы при вводе данных пользователями.