При разработке внешних обработок в 1С часто возникает задача: пользователь ввел данные в табличную часть, закрыл окно, а при следующем открытии хочет видеть те же самые данные. Платформа 1С:Предприятие предлагает для этого несколько встроенных механизмов. Давайте разберем, как реализовать сохранение данных профессионально и надежно.
Это классический и наиболее распространенный способ. Мы используем объект ОбщегоНазначения для записи и чтения данных пользователя. Основная идея заключается в преобразовании табличной части в Соответствие или ТаблицаЗначений, которые затем сохраняются в хранилище.
Рассмотрим реализацию сохранения:
&НаСервере
Процедура СохранитьНастройки()
КлючНастроек = "МояУникальнаяОбработка";
Настройки = Новый Соответствие;
Настройки.Вставить("МояТЧ", Объект.ИмяВашейТабличнойЧасти.Выгрузить());
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ИмяОбъекта", КлючНастроек, Настройки);
КонецПроцедуры
Теперь рассмотрим восстановление данных при открытии обработки:
&НаСервере
Процедура ВосстановитьНастройки()
КлючНастроек = "МояУникальнаяОбработка";
ЗначениеНастроек = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ИмяОбъекта", КлючНастроек);
Если ТипЗнч(ЗначениеНастроек) = Тип("Соответствие") Тогда
ДанныеТЧ = ЗначениеНастроек.Получить("МояТЧ");
Объект.ИмяВашейТабличнойЧасти.Загрузить(ДанныеТЧ);
КонецЕсли;
КонецПроцедуры
Важно: Если вы хотите, чтобы настройки были общими для всех пользователей (или привязаны к конкретному ключу), используйте дополнительные параметры процедуры сохранения, передав туда строку идентификатора пользователя или общее имя настройки.
В управляемых формах платформа предоставляет специальные обработчики, которые вызываются автоматически при сохранении или загрузке настроек формы. Это позволяет писать меньше кода и делать решение более поддерживаемым.
Разберем реализацию по шагам:
ПриСохраненииДанныхВНастройкахНаСервере для выгрузки данных.ПередЗагрузкойДанныхИзНастроекНаСервере для обратной загрузки.СохраняемыеВНастройкахДанныеМодифицированы = Истина, чтобы платформа поняла, что нужно выполнить сохранение.
&НаСервере
Процедура ПриСохраненииДанныхВНастройкахНаСервере(Настройки)
Настройки.Вставить("МояТЧ", Объект.ИмяВашейТабличнойЧасти.Выгрузить());
КонецПроцедуры
&НаСервере
Процедура ПередЗагрузкойДанныхИзНастроекНаСервере(Настройки)
Попытка
Объект.ИмяВашейТабличнойЧасти.Загрузить(Настройки.Получить("МояТЧ"));
Исключение
// Данных в настройках еще нет, пропускаем
КонецПопытки;
КонецПроцедуры
Иногда программисты используют методы ЗначениеВСтрокуВнутр и ЗначениеИзСтрокиВнутр. Этот метод позволяет превратить таблицу значений в строку неограниченной длины и записать её в какой-либо реквизит или регистр сведений.
Преимущество: Строки можно сравнивать, что позволяет сохранять данные только в случае их изменения, экономя ресурсы базы данных.
Недостаток: При изменении структуры табличной части (добавлении или удалении колонок) данные могут перестать корректно загружаться из старых записей.
Анализируя ситуацию, мы рекомендуем придерживаться следующих правил:
Попытка...Исключение при загрузке данных, так как при самом первом запуске обработки никаких настроек в базе еще не существует.ХранилищеЗначений — он оптимизирован платформой именно для этих целей.Wscript.Shell), так как это не будет работать в клиент-серверном режиме или при использовании веб-клиента.Выбирая между предложенными методами, мы советуем отдавать предпочтение второму варианту с использованием стандартных обработчиков событий формы — это наиболее "чистый" с точки зрения архитектуры платформы подход.