Почему не сохраняется выбранное значение реквизита документа в 1С?

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

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

Разбор ситуации и описание проблемы

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


СЗ = Новый Массив;

Пока ВыборкаСотрудников.Следующий() Цикл
    СЗ.Добавить(ВыборкаСотрудников.Наименование);        
КонецЦикла;

Элементы.Сотрудник.СписокВыбора.ЗагрузитьЗначения(СЗ);

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

Причина нестыковки типов данных

Проанализируем, почему платформа 1С ведет себя подобным образом. В конфигураторе реквизит документа Сотрудник имеет ссылочный тип данных (например, СправочникСсылка.Сотрудники). В приведенном выше коде в список выбора были помещены объекты типа Строка (значение ВыборкаСотрудников.Наименование).

Когда пользователь выбирает наименование, в реквизит формы помещается текстовая строка. При выполнении операции записи документа платформа пытается записать значение реквизита в базу данных. Поскольку реквизит ожидает объект типа Ссылка, а получает значение типа Строка, возникает несоответствие типов данных. В результате платформа 1С не может привести строку к ссылке и сбрасывает значение реквизита в незаполненное состояние.

Способ решения: передача ссылок в список выбора

Разберем по шагам, как правильно заполнить коллекцию СписокВыбора элемента формы. Чтобы выбранное значение корректно сохранялось в базе данных, в список необходимо помещать ссылки на элементы справочника, а не их наименования.

  1. При выборке элементов справочника обращайтесь к полю Ссылка.
  2. Загрузите массив ссылок в свойство СписокВыбора элемента формы. Платформа 1С автоматически отобразит наименования объектов в интерфейсе для пользователя, но при выборе установит полноценную ссылку в реквизит объекта.

Посмотрим на исправленный вариант кода:


СЗ = Новый Массив;

Пока ВыборкаСотрудников.Следующий() Цикл
    // Добавляем ссылку на элемент справочника, а не его наименование
    СЗ.Добавить(ВыборкаСотрудников.Ссылка);        
КонецЦикла;

Элементы.Сотрудник.СписокВыбора.ЗагрузитьЗначения(СЗ);

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


Элементы.Сотрудник.СписокВыбора.Очистить();

Пока ВыборкаСотрудников.Следующий() Цикл
    Элементы.Сотрудник.СписокВыбора.Добавить(ВыборкаСотрудников.Ссылка, ВыборкаСотрудников.Наименование);        
КонецЦикла;

Важные особенности работы со свойствами элементов формы

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

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