Как найти ссылку в таблице значений по строковому представлению из внешнего источника

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

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

В этой статье мы подробно разберем несколько стратегий решения этой задачи: от самых простых «обходных» путей до наиболее производительных и методологически верных подходов.

Вариант 1. Использование вспомогательной колонки со строковым представлением

Это наиболее часто используемый и простой в реализации метод, который был предложен участниками форума. Если нам нужно сопоставить строку из Excel с данными в нашей ТЗ, мы можем временно привести все ссылки в таблице к строковому виду.

Рассмотрим по шагам, как это реализовать:

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

Проанализируем пример кода для реализации этого метода:


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

// Заполняем колонку данными
Для Каждого СтрокаТЗ Из ТаблицаЗначений Цикл
    СтрокаТЗ.ПартияСтрокой = Строка(СтрокаТЗ.Партия);
КонецЦикла;

// Теперь мы можем легко найти нужную строку
ПараметрыОтбора = Новый Структура("ПартияСтрокой", ЗначениеИзExcel);
НайденныеСтроки = ТаблицаЗначений.НайтиСтроки(ПараметрыОтбора);

Если НайденныеСтроки.Количество() > 0 Тогда
    // Объект найден, работаем с ним
    НужнаяСсылка = НайденныеСтроки[0].Партия;
КонецЕсли;

Важное замечание: Метод Строка(Ссылка) возвращает основное представление объекта (обычно это Наименование или Код/Номер). Помните, что если в конфигураторе изменить основное представление объекта, этот код может начать работать некорректно.

Вариант 2. Предварительный поиск ссылки в базе данных

Вместо того чтобы адаптировать таблицу значений под строку, мы можем сделать наоборот — превратить строку из Excel в ссылку. Если в строке содержится уникальный идентификатор (например, номер документа или код справочника), правильнее сначала найти объект в базе данных.

Разберем ситуацию, когда в переменной содержится номер партии (документа):


// Предположим, ПеременнаяИзExcel содержит строку "000000123"
СсылкаНаОбъект = Документы.Партия.НайтиПоНомеру(ПеременнаяИзExcel, ДатаПартии);

Если Не СсылкаНаОбъект.Пустая() Тогда
    // Теперь, когда у нас есть Ссылка, поиск в ТЗ будет мгновенным
    ПараметрыОтбора = Новый Структура("Партия", СсылкаНаОбъект);
    НайденныеСтроки = ТаблицаЗначений.НайтиСтроки(ПараметрыОтбора);
КонецЕсли;

Этот метод считается более «чистым», так как он исключает ошибки, связанные с неверным строковым представлением, и использует индексированные поля базы данных для первичного поиска.

Вариант 3. Использование уникального идентификатора (GUID)

Если ваша выгрузка в Excel настроена профессионально и содержит UUID (Уникальный Идентификатор) объекта, то это самый надежный способ. UUID гарантирует 100% точность сопоставления.

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


Попытка
    УИД = Новый УникальныйИдентификатор(СтрокаИдентификаторИзExcel);
    СсылкаНаОбъект = Документы.Партия.ПолучитьСсылку(УИД);
    
    // Проверим, существует ли такой объект в базе на самом деле
    // (ПолучитьСсылку всегда возвращает ссылку, даже если объекта нет)
    Если СсылкаНаОбъект.ПолучитьОбъект() = Неопределено Тогда
        Сообщить("Объект с таким ID не найден в базе данных");
    Иначе
        // Ищем в нашей ТЗ по полноценной ссылке
        СтрокаПоиска = ТаблицаЗначений.Найти(СсылкаНаОбъект, "Партия");
    КонецЕсли;
Исключение
    Сообщить("Некорректный формат UUID");
КонецПопытки;

Вариант 4. Оптимизация поиска через индексацию

Если ваша таблица значений содержит десятки или сотни тысяч строк, обычный поиск по строковой колонке (Вариант 1) будет работать медленно, так как платформа будет выполнять линейный перебор всех записей. Чтобы ускорить процесс, необходимо использовать индексацию.

Посмотрим, как добавить индекс в таблицу значений:


// Добавляем индекс по колонке, по которой будет идти поиск
ТаблицаЗначений.Индексы.Добавить("ПартияСтрокой");

// Теперь метод НайтиСтроки() будет работать в разы быстрее
НайденныеСтроки = ТаблицаЗначений.НайтиСтроки(Новый Структура("ПартияСтрокой", ИскомоеЗначение));

Важный момент: Индексация имеет смысл только для больших объемов данных. На маленьких таблицах (до 1000 строк) затраты времени на создание индекса могут превысить выигрыш от его использования.

Вариант 5. Использование запроса к временной таблице

Если данных действительно много, а сопоставление нужно выполнить сложное (например, по нескольким полям представления), наиболее эффективным методом будет использование механизма запросов. Мы можем передать ТЗ в запрос, превратить её во временную таблицу и выполнить соединение или поиск с использованием функции ПРЕДСТАВЛЕНИЕ.

Проанализируем этот алгоритм:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    ТЗ.Партия КАК Ссылка,
    |    ПРЕДСТАВЛЕНИЕ(ТЗ.Партия) КАК ПартияПредставление
    |ПОМЕСТИТЬ ВТ_Данные
    |ИЗ
    |    &ТЗ КАК ТЗ
    |;
    |
    |ВЫБРАТЬ
    |    ВТ.Ссылка
    |ИЗ
    |    ВТ_Данные КАК ВТ
    |ГДЕ
    |    ВТ.ПартияПредставление ПОДОБНО &СтрокаПоиска";

Запрос.УстановитьПараметр("ТЗ", ТаблицаЗначений);
Запрос.УстановитьПараметр("СтрокаПоиска", "%" + ПеременнаяИзExcel + "%");

РезультатЗапроса = Запрос.Выполнить();

Использование запросов позволяет гибко настраивать условия поиска, использовать операторы ПОДОБНО, а также работать с составными типами данных, если в колонке «Партия» могут находиться ссылки на разные типы документов.

Резюме и рекомендации

Выбор конкретного метода зависит от ваших условий:

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

← На главную