Как сохранить данные формы в 1С без записи документа в базу данных?

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

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

Способ 1. Использование системного хранилища настроек данных форм

Платформа 1С предоставляет встроенный механизм ХранилищеНастроекДанныхФорм. По умолчанию он сохраняет значения простых реквизитов (строки, числа, даты), но не умеет автоматически обрабатывать табличные части. Проанализируем, как расширить этот функционал для сохранения таблиц.

Для работы с табличными частями нам потребуется использовать специальные обработчики событий формы. Рассмотрим по шагам процесс сохранения и восстановления:

  1. Сохранение данных: В модуле формы используем обработчик ПриСохраненииДанныхФормыВНастройкахНаСервере. Здесь мы вручную упаковываем табличную часть в структуру или массив.
  2. Восстановление данных: Используем обработчик ПриЗагрузкеДанныхФормыИзНастроекНаСервере, где извлекаем данные из настроек и заполняем коллекцию формы.

Пример программного кода для сохранения табличной части:


&НаСервере
Процедура ПриСохраненииДанныхФормыВНастройкахНаСервере(Настройки)
    // Преобразуем табличную часть в массив структур для сохранения
    ТаблицаДляСохранения = Новый Массив;
    Для Каждого СтрокаТЧ Из Объект.Товары Цикл
        НоваяСтрока = Новый Структура("Номенклатура, Количество, Цена");
        ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТЧ);
        ТаблицаДляСохранения.Добавить(НоваяСтрока);
    КонецЦикла;
    
    // Добавляем нашу таблицу в структуру настроек
    Настройки.Вставить("МояТаблицаТоваров", ТаблицаДляСохранения);
КонецПроцедуры

&НаСервере
Процедура ПриЗагрузкеДанныхФормыИзНастроекНаСервере(Настройки)
    Если Настройки.Свойство("МояТаблицаТоваров") Тогда
        Объект.Товары.Очистить();
        Для Каждого СтрокаДанных Из Настройки.МояТаблицаТоваров Цикл
            НоваяСтрока = Объект.Товары.Добавить();
            ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаДанных);
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры

Важный момент: Чтобы эти обработчики сработали, у формы должно быть включено свойство СохранениеДанныхВНастройках (установить значение "Использовать").

Способ 2. Репозиторий во вспомогательном Регистре Сведений

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

Чтобы избежать конфликтов, структуру регистра стоит проектировать следующим образом:

Проанализируем процесс записи в такой регистр:


&НаСервере
Процедура СохранитьДанныеВРегистр()
    // Сериализуем всю табличную часть в структуру
    ДанныеДляХранения = Новый Структура;
    ДанныеДляХранения.Вставить("Товары", Объект.Товары.Выгрузить());
    ДанныеДляХранения.Вставить("ДатаСохранения", ТекущаяДата());
    
    МенеджерЗаписи = РегистрыСведений.ВременныеДанныеФорм.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;
    МенеджерЗаписи.КлючДанных = Строка(Объект.Ссылка.УникальныйИдентификатор());
    МенеджерЗаписи.Данные = Новый ХранилищеЗначений(ДанныеДляХранения);
    МенеджерЗаписи.Записать();
КонецПроцедуры

Использование ХранилищеЗначений позволяет записывать практически любые типы данных, включая целые таблицы значений, без создания избыточного количества колонок в самом регистре.

Способ 3. Платформенное «Автосохранение»

Выясним причину, по которой многие разработчики забывают про штатную опцию. В свойствах управляемой формы существует флаг Автосохранение. Если установить его в значение Использовать, система сама будет периодически сохранять состояние формы.

Особенности этого метода:

Способ 4. Сериализация в JSON (продвинутый уровень)

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

Разберем по шагам, как превратить данные формы в строку JSON:


&НаСервере
Функция ПолучитьДанныеФормыВФорматеJSON()
    // Конвертируем ДанныеФормыКоллекция в обычную таблицу значений
    Таблица = Объект.Товары.Выгрузить();
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, Таблица);
    Возврат ЗаписьJSON.Закрыть();
КонецФункции

Такую строку можно хранить в текстовом реквизите любого вспомогательного объекта или даже передавать через параметры навигационной ссылки.

Способ 5. Паттерн «Статус Черновик»

В крупных типовых решениях (например, 1С:ERP или 1С:УХ) часто применяется архитектурный подход, при котором документ записывается в базу, но не проводится и помечается специальным статусом Черновик.

Почему это часто лучше, чем попытки сохранить данные "вне документа"?

  1. Ссылочная целостность: Вы можете ссылаться на этот документ из других объектов.
  2. Стандартные механизмы: Работают все типовые отчеты, журналы и роли доступа.
  3. Блокировки: Платформа сама позаботится о том, чтобы два пользователя не редактировали один и тот же "черновик" одновременно.

Для того чтобы черновики не мешали обычным пользователям, достаточно настроить фильтрацию в динамических списках журналов документов, скрывая объекты со статусом "Черновик".

Резюме и рекомендации

Подведем итоги нашего анализа. Выбор метода зависит от ваших целей:

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

← На главную