Как сохранить несколько значений в одной константе 1С?

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

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

Особенности объекта метаданных Константа

Проанализируем природу константы в платформе 1С:Предприятие. В структуре базы данных таблица константы хранит ровно одну строку и одну колонку для значения. Коллекции значений платформы — такие как Массив, Структура, СписокЗначений или ТаблицаЗначений — существуют только в оперативной памяти во время выполнения сеанса. Их невозможно выбрать в конфигураторе в качестве типа значения для константы.

Напрямую разработчику доступны только примитивные типы (Число, Строка, Дата, Булево), ссылочные типы и специальный тип — ХранилищеЗначения. Рассмотрим подробнее, как обойти это ограничение.

Способ 1: Использование типа ХранилищеЗначения

Это классический способ, который широко применяется во многих типовых конфигурациях и библиотеках (например, в Библиотеке Стандартных Подсистем — БСП). Мы упаковываем нужные данные в коллекцию (например, в Структура или Массив), помещаем ее в объект ХранилищеЗначения и записываем в константу.

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

  1. В конфигураторе создаем константу (например, с именем МояКонстанта) и указываем для нее тип Хранилище значения.
  2. Программно формируем структуру со всеми необходимыми значениями.
  3. Оборачиваем структуру в ХранилищеЗначения и вызываем метод Установить() менеджера константы.
  4. Для чтения получаем объект константы методом Получить() и извлекаем сохраненную структуру.

Посмотрим на пример программного кода для записи и последующего чтения значений:


// 1. Формируем структуру с двумя числами и строкой
МояСтруктура = Новый Структура("Строка1,Число1,Число2", "123", 123, 456);

// 2. Упаковываем структуру в ХранилищеЗначения и записываем
МоеХЗ = Новый ХранилищеЗначения(МояСтруктура);
Константы.МояКонстанта.Установить(МоеХЗ);

// 3. Считываем данные обратно
ХЗизКонстанты = Константы.МояКонстанта.Получить();
Если ХЗизКонстанты <> Неопределено Тогда
    СтруктураИзХЗ = ХЗизКонстанты.Получить();
    
    Строка1 = СтруктураИзХЗ.Строка1;
    Число1  = СтруктураИзХЗ.Число1;
    Число2  = СтруктураИзХЗ.Число2;
КонецЕсли;

Важные нюансы работы с ХранилищемЗначения:

  1. Невозможность работы в запросах: К полям с типом ХранилищеЗначения невозможно обращаться внутри языка запросов 1С для фильтрации или соединения. Получить данные можно только объектным методом через встроенный язык.
  2. Отображение на управляемых формах: Элемент управления формы нельзя напрямую связать с реквизитом типа ХранилищеЗначения. На форме создаются вспомогательные реквизиты, а распаковка и запаковка данных выполняются вручную в процедурах ПриСозданииНаСервере и ПередЗаписьюНаСервере.
  3. Контроль ссылочной целостности: Если внутри упакованной структуры хранятся ссылки на справочники или документы, стандартный механизм поиска ссылок платформы не сможет их отследить. При удалении помеченных объектов контроль ссылочной целостности не сработает.

Способ 2: Сериализация в строковую константу (JSON или разделители)

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

Выясним причину популярности этого способа: текст в строковой константе доступен для быстрого просмотра и анализа, а также легко сериализуется стандартными платформенными функциями ЗначениеВJSON и ЗначениеИзJSON.

Рассмотрим пример сохранения двух числовых значений в JSON-строку:


// Запись данных в виде JSON-строки
Настройки = Новый Структура;
Настройки.Вставить("Число1", 100500);
Настройки.Вставить("Число2", 100800);

ПараметрыЗаписи = Новый ПараметрыЗаписиJSON;
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Настройки);
СтрокаJSON = ЗаписьJSON.Закрыть();

Константы.МояСтроковаяКонстанта.Установить(СтрокаJSON);

// Чтение данных из JSON-строки
СтрокаКонстанты = Константы.МояСтроковаяКонстанта.Получить();
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаКонстанты);
ПрочитанныеНастройки = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();

Число1 = ПрочитанныеНастройки.Число1;
Число2 = ПрочитанныеНастройки.Число2;

Для простых ситуаций также можно использовать конкатенацию с разделителем (например, "100500;100800") или сериализацию таблицы в XML через СериализаторXDTO.

Рекомендуемые архитектурные альтернативы

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

  1. Создание двух отдельных констант: Самый простой и правильный путь по стандартам разработки 1С. Каждое значение хранится в своей константе со строгой типизацией. Обе константы можно вывести на одну общую форму настроек рядом друг с другом, благодаря чему интерфейс останется удобным, а код — простым и прозрачным.
  2. Непериодический регистр сведений без измерений: Если настройки логически связаны, создаем регистр сведений, не добавляя в него ни одного измерения. В ресурсы добавляем нужные реквизиты (например, Число1 и Число2). Такой регистр всегда хранит строго одну запись, полноценно читается быстрыми запросами и поддерживает автогенерацию стандартных форм редактирования.
← На главную