Разработка и Конфигурация · 11 мин
Как объединить структуры в 1С
Способы объединения структур в 1С: метод Вставить, цикл по ключам, ЗаполнитьЗначенияСвойств. Примеры кода, обработка дублей ключей, типичные ошибки.
Структура в 1С — один из самых используемых типов для передачи наборов именованных значений: параметров отчётов, настроек обработки, реквизитов документа. Рано или поздно возникает задача слить две структуры в одну — например, дополнить параметры по умолчанию пользовательскими значениями или собрать итоговый набор данных из нескольких источников.
Встроенного метода «Объединить» у типа Структура нет, поэтому объединение выполняется вручную: перебором ключей, через метод Вставить или с помощью типовых процедур БСП. Каждый подход отличается поведением при совпадении ключей, скоростью и читаемостью кода.
Ниже разобраны рабочие способы объединения структур с примерами кода, правила выбора в зависимости от ситуации, обработка конфликтов ключей и типичные ошибки, которые приводят к потере данных или исключениям в runtime.
Что такое структура и когда требуется объединение
Структура — это коллекция пар «ключ — значение», где ключ всегда строка, соответствующая правилам именования переменных. Создаётся конструктором Новый Структура("Имя,Организация", Значение1, Значение2) или пустой с последующим добавлением свойств через Вставить.
Объединение требуется в типовых сценариях: слияние параметров по умолчанию с переданными извне, сборка данных для заполнения документа из нескольких источников, формирование параметров открытия формы, аккумулирование результатов нескольких функций. Во всех случаях логика одна: перенести свойства одной структуры в другую с заданным правилом обработки дублей.
Важно понимать: структура передаётся по ссылке. Если присвоить одну переменную другой (Структура2 = Структура1), обе переменные будут указывать на один объект, и изменения отразятся в обеих. Это не объединение и не копирование — частая причина трудноуловимых ошибок.
Базовый способ: объединение циклом с методом Вставить
Универсальный приём — перебрать источник через Для Каждого и вставить каждое свойство в приёмник. Метод Вставить(ИмяСвойства, Значение) создаёт свойство, если его нет, или перезаписывает существующее.
Функция ОбъединитьСтруктуры(Приемник, Источник)
Для Каждого КлючИЗначение Из Источник Цикл
Приемник.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение);
КонецЦикла;
Возврат Приемник;
КонецФункции
Такой вариант реализует правило «источник побеждает»: при совпадении ключей значение из источника заменит значение приёмника. Если нужен обратный приоритет — поменяйте аргументы местами или проверяйте наличие ключа перед вставкой.
Для проверки существования ключа используйте метод Свойство(Имя, Значение): он возвращает Истина, если свойство найдено, и при этом помещает значение во второй параметр. Прямое обращение через точку к несуществующему свойству вызовет исключение «Поле объекта не обнаружено».
Объединение без перезаписи существующих значений
Часто требуется дополнить структуру только недостающими ключами — например, применить значения по умолчанию, не затирая то, что передал пользователь. Для этого перед вставкой проверяют наличие свойства.
Функция ДополнитьСтруктуру(Приемник, ЗначенияПоУмолчанию)
Для Каждого КлючИЗначение Из ЗначенияПоУмолчанию Цикл
НайденноеЗначение = Неопределено;
Если НЕ Приемник.Свойство(КлючИЗначение.Ключ, НайденноеЗначение) Тогда
Приемник.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение);
КонецЕсли;
КонецЦикла;
Возврат Приемник;
КонецФункции
Обратите внимание на тонкость: проверка через Свойство отличает отсутствие ключа от ключа со значением Неопределено. Если свойство существует, но равно Неопределено, оно не будет заменено значением по умолчанию. Если такая замена нужна — добавьте проверку НайденноеЗначение = Неопределено в условие.
Как выбрать правило слияния
Типовые средства БСП: ДополнитьСтруктуру и ОбщегоНазначения
В конфигурациях на базе Библиотеки стандартных подсистем писать собственный цикл не нужно — есть готовые процедуры. Основная из них: ОбщегоНазначения.ДополнитьСтруктуру(Приемник, Источник, Заменять). Третий параметр управляет перезаписью: Истина — значения источника заменяют существующие, Ложь — добавляются только недостающие ключи.
ПараметрыФормы = Новый Структура("РежимВыбора", Истина);
ОбщегоНазначения.ДополнитьСтруктуру(ПараметрыФормы, ДополнительныеПараметры, Ложь);
Использование типовой процедуры предпочтительнее собственных велосипедов: код короче, поведение задокументировано, а при обновлении БСП логика останется совместимой. Перед вызовом убедитесь, что общий модуль ОбщегоНазначения доступен в контексте (клиент/сервер) — в клиентских процедурах используйте ОбщегоНазначенияКлиент при необходимости.
Если конфигурация самописная и БСП не внедрена, добавьте в общий модуль собственную функцию объединения из примеров выше — это избавит от дублирования циклов по всему коду.
Копирование структуры перед объединением
Чтобы не испортить исходные данные, создайте копию приёмника. Простой способ — перебрать структуру и вставить все свойства в новую:
Функция СкопироватьСтруктуру(Исходная)
Копия = Новый Структура;
Для Каждого КлючИЗначение Из Исходная Цикл
Копия.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение);
КонецЦикла;
Возврат Копия;
КонецФункции
Учитывайте, что это поверхностное копирование: если значением свойства является другая структура, массив или объект, в копии останется ссылка на тот же вложенный объект. Глубокое копирование потребует рекурсивного обхода. Для большинства прикладных задач (параметры, отборы, реквизиты) поверхностной копии достаточно.
Альтернатива — сериализация: ЗначениеВСтрокуВнутр и обратно ЗначениеИзСтрокиВнутр дают полную независимую копию, но работают медленнее и требуют, чтобы все значения были сериализуемыми. Использовать этот приём в циклах и массовых операциях не рекомендуется.
Объединение трёх и более структур
Когда источников несколько, последовательно применяйте тот же приём: порядок вызовов определяет приоритет. При правиле «перезаписывать» последний источник побеждает, при правиле «только недостающие» — первый.
ИтоговыеПараметры = Новый Структура;
ДополнитьСтруктуру(ИтоговыеПараметры, ПараметрыПользователя); // высший приоритет
ДополнитьСтруктуру(ИтоговыеПараметры, ПараметрыИзНастроек);
ДополнитьСтруктуру(ИтоговыеПараметры, ПараметрыПоУмолчанию); // низший приоритет
Такая цепочка с «дополнением без перезаписи» читается легко: чем выше строка, тем важнее источник. Явно документируйте приоритет комментарием — через полгода это избавит от вопросов, почему настройка из справочника «не применяется».
- 1Определите, какая структура будет приёмником, и нужно ли сохранять её исходное состояние
- 2Выберите правило при совпадении ключей: перезапись или сохранение существующих значений
- 3Используйте ОбщегоНазначения.ДополнитьСтруктуру при наличии БСП либо собственную функцию с циклом
- 4При нескольких источниках выстройте порядок вызовов по приоритету
- 5Проверьте результат: количество свойств и значения ключевых параметров
Проверка результата и типичные ошибки
Простейшая проверка — сравнить количество свойств: Итоговая.Количество() должно быть не меньше количества свойств каждого источника. Для контроля конкретных значений используйте Свойство или отладчик с просмотром структуры в табло.
Типичные ошибки при объединении структур:
- присваивание вместо копирования — обе переменные ссылаются на один объект, и изменение «копии» портит оригинал;
- неявный приоритет — разработчик не задумывается, чьи значения побеждают при конфликте, и получает непредсказуемое поведение;
- обращение к несуществующему свойству через точку после объединения — если источник оказался пустым, код падает с исключением;
- ожидание глубокого копирования — вложенные структуры остаются общими ссылками, и правка вложенного объекта затрагивает обе «версии»;
- использование фиксированной структуры (ФиксированнаяСтруктура) как приёмника — она неизменяема, Вставить вызовет ошибку.
Производительность и ограничения
Перебор ключей — операция линейная по числу свойств, для типовых прикладных структур (десятки-сотни элементов) накладные расходы несущественны. Проблемы начинаются при объединении внутри циклов по строкам таблиц значений: там стоит заранее выносить неизменную часть параметров за пределы цикла и дополнять только переменные ключи.
Помните об ограничениях типа: ключи должны быть допустимыми идентификаторами (нельзя создать ключ с пробелом или начинающийся с цифры через конструктор строкой), структура не упорядочена — порядок обхода не гарантирует порядок вставки. Если порядок важен, используйте Соответствие или массив структур.
Сравнение подходов
Универсально, работает в любой конфигурации; требует явного кода проверки дублей
Коротко и стандартно, но требует внедрённой БСП и доступности модуля в текущем контексте
Даёт полную независимую копию, но медленнее и не работает с несериализуемыми значениями
Частые вопросы
Есть ли в 1С встроенный метод объединения структур?
Нет, у типа Структура нет метода вида «Объединить». Объединение выполняется перебором ключей с методом Вставить или типовой процедурой ОбщегоНазначения.ДополнитьСтруктуру из БСП.
Что будет, если в обеих структурах есть одинаковый ключ?
Метод Вставить перезапишет существующее значение новым. Чтобы сохранить исходное значение, перед вставкой проверяйте наличие свойства методом Свойство или используйте ДополнитьСтруктуру с параметром Заменять = Ложь.
Как объединить структуры, не изменяя исходные?
Создайте новую пустую структуру и последовательно перенесите в неё свойства обеих. Так как структуры передаются по ссылке, любое «объединение в одну из них» изменит оригинал.
Можно ли объединить ФиксированнуюСтруктуру с обычной?
Фиксированную структуру изменить нельзя, но её можно использовать как источник: создайте новую обычную структуру, перенесите в неё свойства фиксированной, затем дополните вторым источником.
Чем объединение структур отличается от объединения соответствий?
Приём тот же — перебор с Вставить. Разница в типе: у Соответствия ключом может быть значение любого типа, а не только строка-идентификатор, и доступ к значениям идёт через квадратные скобки, а не через точку.
Как проверить, что объединение прошло корректно?
Сравните Количество() результата с ожидаемым числом уникальных ключей и проверьте значения критичных параметров через Свойство. В отладчике структуру удобно просматривать в табло целиком.
Что важно запомнить
Объединение структур в 1С делается перебором ключей с методом Вставить или процедурой ОбщегоНазначения.ДополнитьСтруктуру из БСП. Заранее определите правило для совпадающих ключей, помните о передаче по ссылке и при необходимости делайте копию приёмника. Фиксированные структуры изменять нельзя — только читать из них.