Как сохранить таблицу значений в 1С с использованием хранилища?

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Как сохранить таблицу значений в 1С с использованием хранилища?

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #37867
      Фото аватараOdineski
      Участник

        Процедура СохранитьСписокНазванийСчетов()
        // Константы для ключей
        КлючОбъекта = «ПоступленияГПОБелэнерго»;
        КлючНастроек = «»;
        ИмяПользователя = «»;

        ТаблицаДляСохранения = СписокНазванийСчетов.Выгрузить();

        Хранилище_Зн = Новый ХранилищеЗначения(ТаблицаДляСохранения, Новый СжатиеДанных(9));
        Хранилище_Зн.Получить();

        // Сохраняем в хранилище общих настроек
        ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастроек, Хранилище_Зн,, ИмяПользователя);
        КонецПроцедуры как происходит запись в хранилище

      • #37868
        bot_avaOdin — Одинэсник
        Участник

          Ваша процедура сохраняет данные в некий объект ХранилищеОбщихНастроек, вызывая метод Сохранить. Разберём по шагам, что происходит при записи в хранилище:

          1. Подготовка данных для сохранения
          Вы берёте объект СписокНазванийСчетов (вероятно, это ТаблицаЗначений или аналог) и вызываете у него метод Выгрузить(). Это создаёт обычную ТаблицуЗначений, пригодную для сериализации.

          2. Создание объекта ХранилищеЗначения
          Создаётся объект ХранилищеЗначения на основе таблицы с данными, с применением сжатия:

          Это упаковывает данные в бинарный формат сжатия, который можно хранить в базе.

          3. Вызов метода Получить()
          В вашем коде есть вызов Хранилище_Зн.Получить(); — он возвращает исходные данные из хранилища, но результат не используется, поэтому этот вызов избыточен и не влияет на сохранение.

          4. Сохранение в хранилище общих настроек
          Метод ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастроек, Хранилище_Зн,, ИмяПользователя); — это вызов пользовательской процедуры или метода, который реализует логику сохранения настроек в базе.

          Обычно в таких реализациях происходит следующее:
          — По ключам (КлючОбъекта, КлючНастроек, ИмяПользователя) ищется или создаётся элемент справочника или запись регистра сведений, предназначенная для хранения настроек.
          — В реквизит или ресурс с типом ХранилищеЗначения записывается объект Хранилище_Зн.
          — Запись сохраняется в базе.

          5. Где именно хранится?
          Варианты реализации:
          — В справочнике (например, «ВариантыОтчетов» или специализированном справочнике настроек).
          — В регистре сведений с реквизитом типа ХранилищеЗначения.
          — В пользовательском объекте метаданных, созданном специально для хранения настроек.

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

          ### Пример типовой реализации метода Сохранить (упрощённо):

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

          ### Итог

          — Вы создаёте сжатое хранилище значений из таблицы.
          — Вызываете метод сохранения, который записывает это хранилище в базу (справочник или регистр сведений).
          — Данные сохраняются в поле типа ХранилищеЗначения, что позволяет хранить сложные структуры.
          — При чтении из базы вы получаете объект ХранилищеЗначения, из которого можно восстановить исходные данные.

          Если у вас нет кода ХранилищеОбщихНастроек.Сохранить, то это либо внешний модуль, либо общий модуль с пользовательской реализацией. Чтобы понять точнее, нужно смотреть реализацию этого метода.

          Рекомендую посмотреть здесь, там подробно описаны разные варианты хранения настроек в базе с использованием хранилища значений и сжатия:
          https://infostart.ru/public/1330558/
          https://infostart.ru/public/22132/

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С