Как разделить поля на форме 1С, если они ссылаются на один справочник и дублируют значения?

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

В практике разработки на платформе 1С:Предприятие 8.3 часто возникает ситуация, когда на одной форме необходимо разместить несколько полей, ссылающихся на один и тот же справочник. Типичный пример — выбор «Покупателя» и «Поставщика» в одном документе, где оба значения выбираются из справочника Контрагенты. Начинающие разработчики часто сталкиваются с проблемой: при выборе значения в одном поле, во втором автоматически появляется то же самое значение. Рассмотрим подробно, почему так происходит и как правильно настроить элементы формы.

Разберем причину возникновения проблемы

Ситуация, когда два поля на форме ведут себя «зеркально», практически всегда связана с неправильной настройкой свойства Путь к данным (DataPath). Проанализируем стандартный сценарий: разработчик создает поле «Покупатель», привязывает его к соответствующему реквизиту, а затем, для экономии времени, просто копирует этот элемент управления (используя Ctrl+C / Ctrl+V), чтобы создать поле «Поставщик».

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

Шаг 1. Проверка наличия разных реквизитов в объекте

Прежде всего, проанализируем структуру самого объекта (документа или справочника). Если мы хотим, чтобы данные о покупателе и поставщике сохранялись в базе данных независимо друг от друга, у объекта должны существовать два разных реквизита.

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

  1. Реквизит Покупатель с типом СправочникСсылка.Контрагенты.
  2. Реквизит Поставщик с тем же типом СправочникСсылка.Контрагенты.

Если же вы используете реквизиты, созданные непосредственно в форме (на вкладке «Реквизиты» в редакторе формы), убедитесь, что там также добавлены две отдельные строки с уникальными именами.

Шаг 2. Настройка свойства «Путь к данным»

Теперь перейдем к визуальному редактору формы. Рассмотрим по шагам процесс правильной привязки:

  1. Выделим на форме поле, предназначенное для выбора поставщика.
  2. Откроем палитру свойств (F4).
  3. Найдем строку Путь к данным.
  4. Нажмем на кнопку выбора (три точки) или выберем из выпадающего списка нужный реквизит. Если первое поле связано с Объект.Покупатель, то второе ОБЯЗАТЕЛЬНО должно быть связано с Объект.Поставщик.

Важный момент: если вы создали реквизиты на форме, а не в объекте, путь будет выглядеть просто как имя реквизита, например, КонтрагентДляФильтра.

Шаг 3. Анализ программного кода в обработчиках событий

Если реквизиты разные и пути к данным настроены верно, но значения все равно синхронизируются, проанализируем программный код модуля формы. Часто разработчики копируют процедуры-обработчики, забывая изменить имена переменных.

Посмотрим на пример ошибочного кода в событии ПриИзменении:


&НаКлиенте
Процедура ПокупательПриИзменении(Элемент)
    // Ошибочное присвоение, которое синхронизирует поля
    Объект.Поставщик = Объект.Покупатель; 
КонецПроцедуры

Такой код может остаться от старой логики или быть результатом поспешного копирования. Необходимо тщательно проверить все процедуры, связанные с событиями ПриИзменении, АвтоПодбор и ОбработкаВыбора для обоих элементов формы.

Шаг 4. Использование параметров выбора для удобства пользователя

После того как мы разделили поля, логично будет настроить их так, чтобы пользователь не мог ошибиться при выборе. Рассмотрим, как ограничить список контрагентов в каждом поле.

Для поля Покупатель в свойствах можно установить Параметры выбора. Это позволяет наложить статический отбор без написания кода. Например, мы можем указать: Отбор.Покупатель(Истина). Аналогично для поля поставщика установим Отбор.Поставщик(Истина).

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

Дополнительные нюансы управляемых форм

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

Проанализируем также свойство Выбор из списка. Если вы хотите, чтобы пользователь выбирал значения не из всего справочника, а из ограниченного набора, который вы подготовили программно, установите это свойство в значение Да и заполните список в процедуре ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Элементы.Поставщик.СписокВыбора.Добавить(ПредопределенноеЗначение("Справочник.Контрагенты.ОсновнойПоставщик"));
    Элементы.Поставщик.СписокВыбора.Добавить(Параметры.ВажныйКонтрагент);
КонецПроцедуры

Резюме

Чтобы значения в двух полях, ссылающихся на один справочник, были разными, необходимо выполнить три условия:

  1. Разные источники данных: убедиться, что в объекте или форме создано два независимых реквизита (например, Покупатель и Поставщик).
  2. Корректная визуальная привязка: проверить свойство ПутьКДанным у каждого элемента формы, чтобы они не ссылались на один и тот же реквизит.
  3. Чистота кода: исключить программное присвоение одного реквизита другому в процедурах ПриИзменении.

Соблюдение этих простых правил гарантирует корректную работу интерфейса и отсутствие путаницы при вводе данных пользователями.

← На главную