К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как сохранить список в 1С: код, настройки и файлы

Как сохранить список в 1С: СписокЗначений в коде, хранилище значений, сохранение пользовательских настроек списков и выгрузка в файл. Примеры кода и ошибки.

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

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

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

Определите, какой именно список нужно сохранить

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

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

Маршрут решения

Как выбрать способ сохранения

Нужно сохранить СписокЗначений между сеансами в базе данныхИспользуйте реквизит типа ХранилищеЗначения и поместите в него список
Нужно передать список во внешнюю систему или файлСериализуйте через ЗначениеВСтрокуВнутр, JSON или выгрузите в табличный документ
Пользователь хочет запомнить отборы и колонки списка на формеВключите автоматическое сохранение настроек формы или используйте ХранилищеПользовательскихНастроекДинамическихСписков
Нужно выгрузить список элементов в ExcelИспользуйте команду «Вывести список» в интерфейсе или метод Записать табличного документа

Сохранение СписокЗначений в хранилище значений

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

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

// Запись списка в хранилище значений

НастройкиОбъект = Справочники.НастройкиОбмена.НайтиПоКоду("ОСН").ПолучитьОбъект();

НастройкиОбъект.СохраненныйСписок = Новый ХранилищеЗначения(МойСписок);

НастройкиОбъект.Записать();

// Восстановление списка

СохраненныеДанные = НастройкиОбъект.СохраненныйСписок.Получить();

Если ТипЗнч(СохраненныеДанные) = Тип("СписокЗначений") Тогда

МойСписок = СохраненныеДанные;

КонецЕсли;

Важная деталь: проверка типа после Получить() обязательна. Если реквизит пуст или в него записали объект другого типа, метод вернёт Неопределено или неожиданное значение, и дальнейшая работа со «списком» вызовет ошибку времени выполнения. Также учитывайте, что хранилище значений сжимает данные, но большие списки (десятки тысяч элементов) всё равно увеличивают размер записи и замедляют чтение объекта.

Сохранение списка в строку и в файл

Если список нужно передать между базами, сохранить в текстовый реквизит или записать в файл, используется сериализация. Самый простой вариант — функции ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр(), которые преобразуют объект во внутренний строковый формат платформы.

// Сериализация списка в строку

СтрокаСписка = ЗначениеВСтрокуВнутр(МойСписок);

// Запись в текстовый файл

ЗаписьТекста = Новый ЗаписьТекста("C:\Temp\list.txt", КодировкаТекста.UTF8);

ЗаписьТекста.ЗаписатьСтроку(СтрокаСписка);

ЗаписьТекста.Закрыть();

// Восстановление

ЧтениеТекста = Новый ЧтениеТекста("C:\Temp\list.txt", КодировкаТекста.UTF8);

МойСписок = ЗначениеИзСтрокиВнутр(ЧтениеТекста.ПрочитатьСтроку());

ЧтениеТекста.Закрыть();

У внутреннего формата есть ограничение: он понятен только платформе 1С и может меняться между версиями. Если список должен читаться внешней системой, сериализуйте его в JSON: пройдите циклом по элементам, соберите массив или структуру и запишите через ЗаписьJSON. Для простых списков из одних значений достаточно соединить их через разделитель функцией СтрСоединить с последующим СтрРазделить при загрузке.

Сохранение настроек динамического списка пользователем

Когда речь о списке документов или справочников на форме, пользователю обычно нужно не содержимое, а внешний вид: установленные отборы, сортировка, группировка колонок. В управляемых формах платформа сохраняет эти настройки автоматически — для этого у формы должно быть включено свойство АвтоматическоеСохранениеДанныхВНастройках и задан ключ сохранения.

Пользователь может управлять настройками вручную через меню «Ещё» формы списка: пункт «Сохранить настройки» (или «Настроить список» с возможностью сохранения варианта). Сохранённые варианты отборов доступны при следующем открытии формы. Если настройки «слетают», чаще всего причина в том, что форма программно устанавливает отбор при каждом открытии и затирает восстановленные значения, либо изменился ключ сохранения после доработки конфигурации.

Разработчик может работать с настройками программно через хранилище ХранилищеПользовательскихНастроекДинамическихСписков: методы Сохранить и Загрузить принимают ключ объекта, ключ настроек и сами настройки. Это удобно для переноса типовых настроек новым пользователям при внедрении.

Выгрузка списка элементов в файл

Третий сценарий — получить список элементов (номенклатуры, контрагентов, документов за период) в виде файла для передачи коллеге или загрузки в другую программу. В типовых конфигурациях для этого не нужен код: откройте список, при необходимости установите отбор, затем выберите «Ещё» → «Вывести список». Платформа сформирует табличный документ, который можно сохранить в формате Excel (xlsx), mxl, ods или текстовом виде через «Файл» → «Сохранить как».

Программно та же задача решается формированием табличного документа и его записью. Метод Записать табличного документа принимает имя файла и тип файла — ТипФайлаТабличногоДокумента.XLSX, MXL, ODS и другие.

ТабДок = Новый ТабличныйДокумент;

НомерСтроки = 1;

Для Каждого Элемент Из МойСписок Цикл

ТабДок.Область(НомерСтроки, 1).Текст = Строка(Элемент.Значение);

НомерСтроки = НомерСтроки + 1;

КонецЦикла;

ТабДок.Записать("C:\Temp\Список.xlsx", ТипФайлаТабличногоДокумента.XLSX);

При выгрузке больших списков помните, что табличный документ целиком строится в памяти. Для выгрузки сотен тысяч строк надёжнее писать построчно в CSV через ЗаписьТекста — это быстрее и не приводит к нехватке памяти на сервере.

Если список сохраняется регулярно и в одном формате, оформите выгрузку отдельной командой на форме с явным выбором пути сохранения. Жёстко прописанные пути вроде C:\Temp часто недоступны на сервере или у других пользователей, и выгрузка молча падает с ошибкой прав доступа.
ПЗ
Практическое замечание

Типичные ошибки и как их проверить

Большинство проблем с сохранением списков сводится к нескольким повторяющимся причинам. Их легко диагностировать, если знать, где искать.

Типичные ошибки
01
Запись СписокЗначений напрямую в строковый реквизит без сериализации — в базе окажется строка «СписокЗначений» вместо данных
02
Отсутствие проверки типа после ХранилищеЗначения.Получить() — ошибка времени выполнения при пустом реквизите
03
Хранение ссылок на удаляемые объекты — после чистки базы в восстановленном списке появляются битые ссылки
04
Программная установка отбора в ПриСозданииНаСервере без условия — затирает сохранённые пользовательские настройки списка
05
Выгрузка большого списка через табличный документ — перерасход памяти и аварийное завершение сеанса
06
Использование ЗначениеВСтрокуВнутр для обмена с другой базой — ссылки не сопоставляются и теряют смысл

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

Контрольные точки

Как проверить результат

Восстановленный список после перезапуска сеанса
Норма

Количество и порядок элементов совпадают с сохранёнными

Тревожный признак

Список пуст, Неопределено или содержит меньше элементов

Ссылки в восстановленном списке
Норма

Все элементы открываются и показывают корректное представление

Тревожный признак

Часть элементов отображается как «Объект не найден»

Настройки динамического списка
Норма

После переоткрытия формы отборы и колонки на месте

Тревожный признак

Форма открывается с настройками по умолчанию

Файл выгрузки
Норма

Файл открывается в Excel, строки и кодировка читаются корректно

Тревожный признак

Кракозябры вместо кириллицы или пустой файл

Часто задаваемые вопросы

Можно ли сохранить СписокЗначений в реквизит формы без записи в базу?

Можно, но такой список проживёт только пока открыта форма. Для передачи между серверными вызовами в управляемой форме список нужно либо хранить в реквизите формы, либо помещать во временное хранилище через ПоместитьВоВременноеХранилище и работать по адресу. После закрытия формы данные будут потеряны, поэтому для долговременного хранения нужна запись в базу.

Чем отличается ХранилищеЗначения от обычного строкового реквизита?

ХранилищеЗначения сохраняет объект целиком в сериализованном бинарном виде: типы данных, структуру и вложенные коллекции. Строковый реквизит хранит только текст — чтобы положить туда список, его нужно преобразовать функцией ЗначениеВСтрокуВнутр или в JSON, а при чтении обратно распарсить. Для сложных структур хранилище значений надёжнее, для обмена с внешними системами удобнее строка в JSON.

Почему после обновления конфигурации пропали сохранённые настройки списков?

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

Как сохранить список, чтобы его прочитала другая программа, не 1С?

Используйте открытые форматы: CSV для плоских списков, JSON для структурированных данных, XLSX через табличный документ, если нужен готовый для пользователя файл. Внутренний формат ЗначениеВСтрокуВнутр для этого не подходит — его понимает только платформа 1С. При выгрузке кириллицы в CSV явно указывайте кодировку UTF-8.

Есть ли ограничение на размер списка в хранилище значений?

Жёсткого лимита на количество элементов нет, ограничивает физический размер записи в базе и разумное время чтения. Практически списки из тысяч элементов со ссылками хранятся без проблем, но десятки тысяч элементов с представлениями уже заметно раздувают запись. Если данных много, рассмотрите хранение в табличной части объекта или регистре сведений вместо сериализации.

Итог

Что важно запомнить

Сначала определите тип задачи: программный СписокЗначений сохраняют через ХранилищеЗначения или сериализацию в строку, настройки динамического списка — штатным механизмом настроек формы, выгрузку в файл — командой «Вывести список» или записью табличного документа. Всегда проверяйте восстановление данных после перезапуска сеанса и остерегайтесь хранения ссылок на удаляемые объекты.