Как программно получить ссылку на значения из справочника в 1С:Предприятие 8

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

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

Разница между Ссылкой и Выборкой: фундаментальные понятия

Для начала проанализируем ситуацию, описанную в исходном вопросе. Когда мы пишем Справочники.ФизическиеЛица.Выбрать(), система возвращает объект типа СправочникВыборка. Это не конкретное значение, а своеобразный "курсор", который позволяет последовательно просматривать элементы справочника. Попытка напрямую обратиться к свойствам выборки (например, Выборка.Наименование) без перехода к первой записи выдаст ошибку или пустое значение.

Ссылка (тип СправочникСсылка) — это "адрес" конкретного элемента в базе данных. Именно ссылку нужно записывать в реквизиты документов или колонок ТЧ, если они имеют ссылочный тип. Если же колонка имеет тип Строка, то в нее записывается текстовое представление (наименование).

Способ 1: Использование методов поиска ссылки

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

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

Разберем пример программного получения ссылки по наименованию и заполнения строки табличной части:


&НаСервере
Процедура ЗаполнитьОтветственногоНаСервере(ИмяФизЛица)
    // Ищем ссылку на элемент справочника
    НайденнаяСсылка = Справочники.ФизическиеЛица.НайтиПоНаименованию(ИмяФизЛица);
    
    // Проверяем, найден ли элемент
    Если Не НайденнаяСсылка.Пустая() Тогда
        // Предположим, мы работаем с текущей строкой ТЧ "ИсторияИзменения"
        НоваяСтрока = Объект.ИсторияИзменения.Добавить();
        НоваяСтрока.Ответственный = НайденнаяСсылка;
    Иначе
        Сообщить("Физическое лицо с таким именем не найдено!");
    КонецЕсли;
КонецПроцедуры

Способ 2: Обход справочника через Выборку

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


&НаСервере
Функция ПолучитьВсехФизЛиц()
    Результат = "";
    Выборка = Справочники.ФизическиеЛица.Выбрать();
    
    // Цикл будет продолжаться, пока в справочнике есть элементы
    Пока Выборка.Следующий() Цикл
        // Теперь внутри цикла мы можем обращаться к данным конкретной записи
        Результат = Результат + Выборка.Наименование + Символы.ПС;
        // Если нужна ссылка текущего элемента в цикле:
        ТекущаяСсылка = Выборка.Ссылка;
    КонецЦикла;
    
    Возврат Результат;
КонецФункции

Важный момент: метод Следующий() обязателен. Он позиционирует выборку на следующую запись. Без него данные получить невозможно.

Способ 3: Использование запросов (рекомендуемый подход)

В современной разработке на 1С для получения данных из справочников предпочтительнее использовать запросы. Это работает значительно быстрее, особенно если в справочнике тысячи записей, так как запрос выполняется на стороне сервера СУБД и извлекает только необходимые поля.

Рассмотрим, как получить список ссылок всех физических лиц через запрос:


&НаСервере
Процедура ПолучитьДанныеЧерезЗапрос()
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ФизическиеЛица.Ссылка КАК Ссылка,
        |   ФизическиеЛица.Наименование КАК Наименование
        |ИЗ
        |   Справочник.ФизическиеЛица КАК ФизическиеЛица";
    
    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        // Обрабатываем данные
        Сообщить(ВыборкаДетальныеЗаписи.Наименование);
    КонецЦикла;
КонецПроцедуры

Оптимизация работы с табличной частью на форме

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

Выясним, как это сделать правильно:

  1. Откройте конфигуратор и найдите ваш документ.
  2. Перейдите на закладку Данные и найдите вашу табличную часть (например, ИсторияИзменения).
  3. У реквизита (колонки) Ответственный установите Тип — СправочникСсылка.ФизическиеЛица.
  4. На форме документа убедитесь, что элементу управления "Поле ввода" для этой колонки назначены верные данные.

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

Важные технические нюансы

Рассмотрим несколько критических моментов, которые часто упускают новички:

1. Проверка на пустую ссылку. Когда вы используете методы поиска (НайтиПоНаименованию и др.), система всегда возвращает объект. Если объект не найден, будет возвращена пустая ссылка. Проверить это можно методом Ссылка.Пустая(). Никогда не забывайте делать эту проверку перед использованием результата поиска.

2. Клиент-серверное взаимодействие. Помните, что поиск в справочниках (через менеджер Справочники) возможен только &НаСервере. На клиенте вы можете работать только с уже полученными ссылками или данными, которые находятся в реквизитах формы.

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

4. Представление ссылки. Если вам нужно получить строку (текст) из ссылки для вывода пользователю, используйте обращение Ссылка.Наименование (на сервере) или функцию Строка(Ссылка) (работает и на клиенте, возвращает основное представление объекта).

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

← На главную