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