К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как объединить структуры в 1С

Способы объединения структур в 1С: метод Вставить, цикл по ключам, ЗаполнитьЗначенияСвойств. Примеры кода, обработка дублей ключей, типичные ошибки.

Структура в 1С — один из самых используемых типов для передачи наборов именованных значений: параметров отчётов, настроек обработки, реквизитов документа. Рано или поздно возникает задача слить две структуры в одну — например, дополнить параметры по умолчанию пользовательскими значениями или собрать итоговый набор данных из нескольких источников.

Встроенного метода «Объединить» у типа Структура нет, поэтому объединение выполняется вручную: перебором ключей, через метод Вставить или с помощью типовых процедур БСП. Каждый подход отличается поведением при совпадении ключей, скоростью и читаемостью кода.

Ниже разобраны рабочие способы объединения структур с примерами кода, правила выбора в зависимости от ситуации, обработка конфликтов ключей и типичные ошибки, которые приводят к потере данных или исключениям в runtime.

Что такое структура и когда требуется объединение

Структура — это коллекция пар «ключ — значение», где ключ всегда строка, соответствующая правилам именования переменных. Создаётся конструктором Новый Структура("Имя,Организация", Значение1, Значение2) или пустой с последующим добавлением свойств через Вставить.

Объединение требуется в типовых сценариях: слияние параметров по умолчанию с переданными извне, сборка данных для заполнения документа из нескольких источников, формирование параметров открытия формы, аккумулирование результатов нескольких функций. Во всех случаях логика одна: перенести свойства одной структуры в другую с заданным правилом обработки дублей.

Важно понимать: структура передаётся по ссылке. Если присвоить одну переменную другой (Структура2 = Структура1), обе переменные будут указывать на один объект, и изменения отразятся в обеих. Это не объединение и не копирование — частая причина трудноуловимых ошибок.

Базовый способ: объединение циклом с методом Вставить

Универсальный приём — перебрать источник через Для Каждого и вставить каждое свойство в приёмник. Метод Вставить(ИмяСвойства, Значение) создаёт свойство, если его нет, или перезаписывает существующее.

Функция ОбъединитьСтруктуры(Приемник, Источник)

Для Каждого КлючИЗначение Из Источник Цикл

Приемник.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение);

КонецЦикла;

Возврат Приемник;

КонецФункции

Такой вариант реализует правило «источник побеждает»: при совпадении ключей значение из источника заменит значение приёмника. Если нужен обратный приоритет — поменяйте аргументы местами или проверяйте наличие ключа перед вставкой.

Для проверки существования ключа используйте метод Свойство(Имя, Значение): он возвращает Истина, если свойство найдено, и при этом помещает значение во второй параметр. Прямое обращение через точку к несуществующему свойству вызовет исключение «Поле объекта не обнаружено».

Объединение без перезаписи существующих значений

Часто требуется дополнить структуру только недостающими ключами — например, применить значения по умолчанию, не затирая то, что передал пользователь. Для этого перед вставкой проверяют наличие свойства.

Функция ДополнитьСтруктуру(Приемник, ЗначенияПоУмолчанию)

Для Каждого КлючИЗначение Из ЗначенияПоУмолчанию Цикл

НайденноеЗначение = Неопределено;

Если НЕ Приемник.Свойство(КлючИЗначение.Ключ, НайденноеЗначение) Тогда

Приемник.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение);

КонецЕсли;

КонецЦикла;

Возврат Приемник;

КонецФункции

Обратите внимание на тонкость: проверка через Свойство отличает отсутствие ключа от ключа со значением Неопределено. Если свойство существует, но равно Неопределено, оно не будет заменено значением по умолчанию. Если такая замена нужна — добавьте проверку НайденноеЗначение = Неопределено в условие.

Маршрут решения

Как выбрать правило слияния

Пользовательские параметры важнее настроек по умолчаниюДополняйте пользовательскую структуру значениями по умолчанию без перезаписи существующих ключей
Новые данные должны заменить старыеПеребирайте источник и вставляйте в приёмник через Вставить — совпадающие ключи перезапишутся
Конфликт ключей недопустим и означает ошибку логикиПеред вставкой проверяйте Свойство и вызывайте исключение при совпадении

Типовые средства БСП: ДополнитьСтруктуру и ОбщегоНазначения

В конфигурациях на базе Библиотеки стандартных подсистем писать собственный цикл не нужно — есть готовые процедуры. Основная из них: ОбщегоНазначения.ДополнитьСтруктуру(Приемник, Источник, Заменять). Третий параметр управляет перезаписью: Истина — значения источника заменяют существующие, Ложь — добавляются только недостающие ключи.

ПараметрыФормы = Новый Структура("РежимВыбора", Истина);

ОбщегоНазначения.ДополнитьСтруктуру(ПараметрыФормы, ДополнительныеПараметры, Ложь);

Использование типовой процедуры предпочтительнее собственных велосипедов: код короче, поведение задокументировано, а при обновлении БСП логика останется совместимой. Перед вызовом убедитесь, что общий модуль ОбщегоНазначения доступен в контексте (клиент/сервер) — в клиентских процедурах используйте ОбщегоНазначенияКлиент при необходимости.

Если конфигурация самописная и БСП не внедрена, добавьте в общий модуль собственную функцию объединения из примеров выше — это избавит от дублирования циклов по всему коду.

Копирование структуры перед объединением

Чтобы не испортить исходные данные, создайте копию приёмника. Простой способ — перебрать структуру и вставить все свойства в новую:

Функция СкопироватьСтруктуру(Исходная)

Копия = Новый Структура;

Для Каждого КлючИЗначение Из Исходная Цикл

Копия.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение);

КонецЦикла;

Возврат Копия;

КонецФункции

Учитывайте, что это поверхностное копирование: если значением свойства является другая структура, массив или объект, в копии останется ссылка на тот же вложенный объект. Глубокое копирование потребует рекурсивного обхода. Для большинства прикладных задач (параметры, отборы, реквизиты) поверхностной копии достаточно.

Альтернатива — сериализация: ЗначениеВСтрокуВнутр и обратно ЗначениеИзСтрокиВнутр дают полную независимую копию, но работают медленнее и требуют, чтобы все значения были сериализуемыми. Использовать этот приём в циклах и массовых операциях не рекомендуется.

Объединение трёх и более структур

Когда источников несколько, последовательно применяйте тот же приём: порядок вызовов определяет приоритет. При правиле «перезаписывать» последний источник побеждает, при правиле «только недостающие» — первый.

ИтоговыеПараметры = Новый Структура;

ДополнитьСтруктуру(ИтоговыеПараметры, ПараметрыПользователя); // высший приоритет

ДополнитьСтруктуру(ИтоговыеПараметры, ПараметрыИзНастроек);

ДополнитьСтруктуру(ИтоговыеПараметры, ПараметрыПоУмолчанию); // низший приоритет

Такая цепочка с «дополнением без перезаписи» читается легко: чем выше строка, тем важнее источник. Явно документируйте приоритет комментарием — через полгода это избавит от вопросов, почему настройка из справочника «не применяется».

Порядок действий при объединении
  1. 1
    Определите, какая структура будет приёмником, и нужно ли сохранять её исходное состояние
  2. 2
    Выберите правило при совпадении ключей: перезапись или сохранение существующих значений
  3. 3
    Используйте ОбщегоНазначения.ДополнитьСтруктуру при наличии БСП либо собственную функцию с циклом
  4. 4
    При нескольких источниках выстройте порядок вызовов по приоритету
  5. 5
    Проверьте результат: количество свойств и значения ключевых параметров

Проверка результата и типичные ошибки

Простейшая проверка — сравнить количество свойств: Итоговая.Количество() должно быть не меньше количества свойств каждого источника. Для контроля конкретных значений используйте Свойство или отладчик с просмотром структуры в табло.

Типичные ошибки при объединении структур:

  • присваивание вместо копирования — обе переменные ссылаются на один объект, и изменение «копии» портит оригинал;
  • неявный приоритет — разработчик не задумывается, чьи значения побеждают при конфликте, и получает непредсказуемое поведение;
  • обращение к несуществующему свойству через точку после объединения — если источник оказался пустым, код падает с исключением;
  • ожидание глубокого копирования — вложенные структуры остаются общими ссылками, и правка вложенного объекта затрагивает обе «версии»;
  • использование фиксированной структуры (ФиксированнаяСтруктура) как приёмника — она неизменяема, Вставить вызовет ошибку.
Типичные ошибки
01
Присвоение Структура2 = Структура1 вместо копирования — обе переменные указывают на один объект, изменения видны в обеих
02
Попытка вставить свойство в ФиксированнуюСтруктуру — исключение, так как коллекция неизменяема
03
Отсутствие правила для дублей ключей — значения неожиданно затираются данными из источника с низким приоритетом
04
Ожидание глубокого копирования — вложенные структуры и массивы остаются общими по ссылке

Производительность и ограничения

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

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

Сравнение подходов

Цикл + Вставить

Универсально, работает в любой конфигурации; требует явного кода проверки дублей

ОбщегоНазначения.ДополнитьСтруктуру

Коротко и стандартно, но требует внедрённой БСП и доступности модуля в текущем контексте

ЗначениеВСтрокуВнутр / ЗначениеИзСтрокиВнутр

Даёт полную независимую копию, но медленнее и не работает с несериализуемыми значениями

Частые вопросы

Есть ли в 1С встроенный метод объединения структур?

Нет, у типа Структура нет метода вида «Объединить». Объединение выполняется перебором ключей с методом Вставить или типовой процедурой ОбщегоНазначения.ДополнитьСтруктуру из БСП.

Что будет, если в обеих структурах есть одинаковый ключ?

Метод Вставить перезапишет существующее значение новым. Чтобы сохранить исходное значение, перед вставкой проверяйте наличие свойства методом Свойство или используйте ДополнитьСтруктуру с параметром Заменять = Ложь.

Как объединить структуры, не изменяя исходные?

Создайте новую пустую структуру и последовательно перенесите в неё свойства обеих. Так как структуры передаются по ссылке, любое «объединение в одну из них» изменит оригинал.

Можно ли объединить ФиксированнуюСтруктуру с обычной?

Фиксированную структуру изменить нельзя, но её можно использовать как источник: создайте новую обычную структуру, перенесите в неё свойства фиксированной, затем дополните вторым источником.

Чем объединение структур отличается от объединения соответствий?

Приём тот же — перебор с Вставить. Разница в типе: у Соответствия ключом может быть значение любого типа, а не только строка-идентификатор, и доступ к значениям идёт через квадратные скобки, а не через точку.

Как проверить, что объединение прошло корректно?

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

Итог

Что важно запомнить

Объединение структур в 1С делается перебором ключей с методом Вставить или процедурой ОбщегоНазначения.ДополнитьСтруктуру из БСП. Заранее определите правило для совпадающих ключей, помните о передаче по ссылке и при необходимости делайте копию приёмника. Фиксированные структуры изменять нельзя — только читать из них.