При разработке конфигураций в среде 1С:Предприятие разработчики часто сталкиваются с ситуацией, когда пользователь выбирает значение из списка выбора в форме документа, оно визуально отображается на форме, но после проведения или сохранения документа поле снова становится пустым. Разберем причинно-следственные связи этой проблемы и выясним, как правильно организовывать программное заполнение списка выбора.
Рассмотрим распространенный сценарий: на форме документа создано поле ввода, связанное с реквизитом объекта Сотрудник, имеющим тип ссылки на справочник (СправочникСсылка.Сотрудники). Разработчик программно заполняет список выбора элемента формы, используя следующий подход:
СЗ = Новый Массив;
Пока ВыборкаСотрудников.Следующий() Цикл
СЗ.Добавить(ВыборкаСотрудников.Наименование);
КонецЦикла;
Элементы.Сотрудник.СписокВыбора.ЗагрузитьЗначения(СЗ);
При таком подходе выпадающий список в интерфейсе заполняется текстовыми строками (наименованиями сотрудников). Пользователь может успешно выбрать текстовую строку из списка, и она отобразится в поле ввода. Однако при записи или проведении документа реквизит очищается.
Проанализируем, почему платформа 1С ведет себя подобным образом. В конфигураторе реквизит документа Сотрудник имеет ссылочный тип данных (например, СправочникСсылка.Сотрудники). В приведенном выше коде в список выбора были помещены объекты типа Строка (значение ВыборкаСотрудников.Наименование).
Когда пользователь выбирает наименование, в реквизит формы помещается текстовая строка. При выполнении операции записи документа платформа пытается записать значение реквизита в базу данных. Поскольку реквизит ожидает объект типа Ссылка, а получает значение типа Строка, возникает несоответствие типов данных. В результате платформа 1С не может привести строку к ссылке и сбрасывает значение реквизита в незаполненное состояние.
Разберем по шагам, как правильно заполнить коллекцию СписокВыбора элемента формы. Чтобы выбранное значение корректно сохранялось в базе данных, в список необходимо помещать ссылки на элементы справочника, а не их наименования.
Ссылка.СписокВыбора элемента формы. Платформа 1С автоматически отобразит наименования объектов в интерфейсе для пользователя, но при выборе установит полноценную ссылку в реквизит объекта.Посмотрим на исправленный вариант кода:
СЗ = Новый Массив;
Пока ВыборкаСотрудников.Следующий() Цикл
// Добавляем ссылку на элемент справочника, а не его наименование
СЗ.Добавить(ВыборкаСотрудников.Ссылка);
КонецЦикла;
Элементы.Сотрудник.СписокВыбора.ЗагрузитьЗначения(СЗ);
Если требуется вывести в выпадающем списке особое представление, отличное от стандартного наименования, можно использовать метод Добавить коллекции СписокВыбора, передавая ссылку в качестве значения и нужный текст в качестве представления:
Элементы.Сотрудник.СписокВыбора.Очистить();
Пока ВыборкаСотрудников.Следующий() Цикл
Элементы.Сотрудник.СписокВыбора.Добавить(ВыборкаСотрудников.Ссылка, ВыборкаСотрудников.Наименование);
КонецЦикла;
Выясним дополнительные нюансы, которые необходимо учитывать при работе со списками выбора на управляемых формах:
СписокВыбора принадлежит элементу формы и не сохраняется в базе данных. Ее заполнение необходимо выполнять в серверных обработчиках формы, таких как ПриСозданииНаСервере или ПриЧтенииНаСервере. Если список не будет сформирован при открытии существующего документа, платформа не сможет сопоставить сохраненную ссылку с элементами списка и визуально очистит поле.Компания или Подразделение), рекомендуется настраивать свойство СвязиПараметровВыбора у реквизита в конфигураторе. Это позволит избежать написания ручного кода по заполнению списков выбора.РежимВыбораИзСписка, пользователь сможет выбирать только те значения, которые присутствуют в СписокВыбора. Следите за тем, чтобы сохраненное значение реквизита всегда присутствовало в загруженном списке.