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