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