При проектировании конфигураций 1С иногда возникает вопрос: можно ли в одной константе сохранить не одно, а сразу два или более значений (например, два числа, пару настроек или структуру параметров)? В этой статье разберем, как устроена константа на уровне метаданных, почему напрямую поместить в нее массив или структуру нельзя, а также рассмотрим рабочие способы реализации этой задачи и правильные архитектурные альтернативы.
Проанализируем природу константы в платформе 1С:Предприятие. В структуре базы данных таблица константы хранит ровно одну строку и одну колонку для значения. Коллекции значений платформы — такие как Массив, Структура, СписокЗначений или ТаблицаЗначений — существуют только в оперативной памяти во время выполнения сеанса. Их невозможно выбрать в конфигураторе в качестве типа значения для константы.
Напрямую разработчику доступны только примитивные типы (Число, Строка, Дата, Булево), ссылочные типы и специальный тип — ХранилищеЗначения. Рассмотрим подробнее, как обойти это ограничение.
Это классический способ, который широко применяется во многих типовых конфигурациях и библиотеках (например, в Библиотеке Стандартных Подсистем — БСП). Мы упаковываем нужные данные в коллекцию (например, в Структура или Массив), помещаем ее в объект ХранилищеЗначения и записываем в константу.
Разберем по шагам, как настроить и реализовать этот вариант:
МояКонстанта) и указываем для нее тип Хранилище значения.ХранилищеЗначения и вызываем метод Установить() менеджера константы.Получить() и извлекаем сохраненную структуру.Посмотрим на пример программного кода для записи и последующего чтения значений:
// 1. Формируем структуру с двумя числами и строкой
МояСтруктура = Новый Структура("Строка1,Число1,Число2", "123", 123, 456);
// 2. Упаковываем структуру в ХранилищеЗначения и записываем
МоеХЗ = Новый ХранилищеЗначения(МояСтруктура);
Константы.МояКонстанта.Установить(МоеХЗ);
// 3. Считываем данные обратно
ХЗизКонстанты = Константы.МояКонстанта.Получить();
Если ХЗизКонстанты <> Неопределено Тогда
СтруктураИзХЗ = ХЗизКонстанты.Получить();
Строка1 = СтруктураИзХЗ.Строка1;
Число1 = СтруктураИзХЗ.Число1;
Число2 = СтруктураИзХЗ.Число2;
КонецЕсли;
Важные нюансы работы с ХранилищемЗначения:
ХранилищеЗначения невозможно обращаться внутри языка запросов 1С для фильтрации или соединения. Получить данные можно только объектным методом через встроенный язык.ХранилищеЗначения. На форме создаются вспомогательные реквизиты, а распаковка и запаковка данных выполняются вручную в процедурах ПриСозданииНаСервере и ПередЗаписьюНаСервере.Если требуется сохранить два простых значения без использования бинарного хранилища, создадим константу с типом Строка (неограниченной длины или с достаточным запасом символов).
Выясним причину популярности этого способа: текст в строковой константе доступен для быстрого просмотра и анализа, а также легко сериализуется стандартными платформенными функциями ЗначениеВ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 и Число2). Такой регистр всегда хранит строго одну запись, полноценно читается быстрыми запросами и поддерживает автогенерацию стандартных форм редактирования.