Разработка и Конфигурация · 12 мин
Как сохранить список в 1С: код, настройки и файлы
Как сохранить список в 1С: СписокЗначений в коде, хранилище значений, сохранение пользовательских настроек списков и выгрузка в файл. Примеры кода и ошибки.
Задача «сохранить список» в 1С возникает в трёх разных ситуациях, и важно сразу определить, какая из них ваша. Первый случай — разработчику нужно сохранить объект СписокЗначений между сеансами работы программы или передать его в другое место. Второй — пользователю нужно сохранить настройки динамического списка (отборы, сортировку, порядок колонок), чтобы форма открывалась в привычном виде. Третий — требуется выгрузить список элементов справочника или документов во внешний файл, например в Excel или текстовый формат.
Для каждого сценария платформа 1С:Предприятие предлагает свой инструмент: хранилище значений и сериализация для программных объектов, механизм пользовательских настроек для динамических списков, команды выгрузки и методы записи для файлов. Выбор неправильного подхода — частая причина потери данных: например, объект СписокЗначений нельзя просто записать в реквизит справочника без преобразования.
Ниже разобраны все три сценария с примерами кода на встроенном языке, ограничениями каждого метода и способами проверить, что данные действительно сохранились и корректно восстанавливаются.
Определите, какой именно список нужно сохранить
Прежде чем писать код, ответьте на два вопроса: где живёт список (в памяти программы, на форме, в базе данных) и кому понадобится его восстановить (тому же пользователю, другому пользователю, внешней программе). От ответов зависит весь дальнейший выбор инструментов.
Объект СписокЗначений — это временная структура в оперативной памяти. Он существует только внутри сеанса и исчезает при завершении работы. Чтобы он пережил перезапуск, его нужно сериализовать — превратить в данные, которые можно записать в базу или файл. Динамический список на форме, напротив, хранит не данные, а настройки отображения, и платформа умеет сохранять их сама. Список строк таблицы значений или выборки из запроса сохраняют либо в реквизит объекта, либо во внешний файл.
Как выбрать способ сохранения
Сохранение СписокЗначений в хранилище значений
Стандартный способ сохранить программный список в базе данных — создать у объекта конфигурации (справочника, документа, константы или регистра сведений) реквизит с типом ХранилищеЗначения. В этот реквизит можно поместить практически любой сериализуемый объект, включая СписокЗначений, таблицу значений и структуру.
Запись выглядит так: создаёте или открываете объект, присваиваете реквизиту новый объект ХранилищеЗначения, передав список в конструктор, и записываете объект. При чтении вызываете метод Получить(), который возвращает исходный список.
// Запись списка в хранилище значений
НастройкиОбъект = Справочники.НастройкиОбмена.НайтиПоКоду("ОСН").ПолучитьОбъект();
НастройкиОбъект.СохраненныйСписок = Новый ХранилищеЗначения(МойСписок);
НастройкиОбъект.Записать();
// Восстановление списка
СохраненныеДанные = НастройкиОбъект.СохраненныйСписок.Получить();
Если ТипЗнч(СохраненныеДанные) = Тип("СписокЗначений") Тогда
МойСписок = СохраненныеДанные;
КонецЕсли;
Важная деталь: проверка типа после Получить() обязательна. Если реквизит пуст или в него записали объект другого типа, метод вернёт Неопределено или неожиданное значение, и дальнейшая работа со «списком» вызовет ошибку времени выполнения. Также учитывайте, что хранилище значений сжимает данные, но большие списки (десятки тысяч элементов) всё равно увеличивают размер записи и замедляют чтение объекта.
Сохранение списка в строку и в файл
Если список нужно передать между базами, сохранить в текстовый реквизит или записать в файл, используется сериализация. Самый простой вариант — функции ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр(), которые преобразуют объект во внутренний строковый формат платформы.
// Сериализация списка в строку
СтрокаСписка = ЗначениеВСтрокуВнутр(МойСписок);
// Запись в текстовый файл
ЗаписьТекста = Новый ЗаписьТекста("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 часто недоступны на сервере или у других пользователей, и выгрузка молча падает с ошибкой прав доступа.
Типичные ошибки и как их проверить
Большинство проблем с сохранением списков сводится к нескольким повторяющимся причинам. Их легко диагностировать, если знать, где искать.
После реализации сохранения обязательно выполните полный цикл проверки: сохраните список, закройте сеанс, откройте программу заново и восстановите данные. Именно перезапуск показывает, что данные реально записаны, а не живут в памяти. Сверьте количество элементов и несколько значений выборочно.
Как проверить результат
Количество и порядок элементов совпадают с сохранёнными
Список пуст, Неопределено или содержит меньше элементов
Все элементы открываются и показывают корректное представление
Часть элементов отображается как «Объект не найден»
После переоткрытия формы отборы и колонки на месте
Форма открывается с настройками по умолчанию
Файл открывается в Excel, строки и кодировка читаются корректно
Кракозябры вместо кириллицы или пустой файл
Часто задаваемые вопросы
Можно ли сохранить СписокЗначений в реквизит формы без записи в базу?
Можно, но такой список проживёт только пока открыта форма. Для передачи между серверными вызовами в управляемой форме список нужно либо хранить в реквизите формы, либо помещать во временное хранилище через ПоместитьВоВременноеХранилище и работать по адресу. После закрытия формы данные будут потеряны, поэтому для долговременного хранения нужна запись в базу.
Чем отличается ХранилищеЗначения от обычного строкового реквизита?
ХранилищеЗначения сохраняет объект целиком в сериализованном бинарном виде: типы данных, структуру и вложенные коллекции. Строковый реквизит хранит только текст — чтобы положить туда список, его нужно преобразовать функцией ЗначениеВСтрокуВнутр или в JSON, а при чтении обратно распарсить. Для сложных структур хранилище значений надёжнее, для обмена с внешними системами удобнее строка в JSON.
Почему после обновления конфигурации пропали сохранённые настройки списков?
Настройки привязаны к ключу формы и представлению объекта метаданных. Если при доработке форму создали заново, изменили ключ сохранения или переименовали объект, старые настройки перестают сопоставляться. Проверьте свойство КлючСохраненияПоложенияОкна и автоматическое сохранение данных в настройках, а типовые настройки для пользователей можно пересоздать программно через хранилище пользовательских настроек.
Как сохранить список, чтобы его прочитала другая программа, не 1С?
Используйте открытые форматы: CSV для плоских списков, JSON для структурированных данных, XLSX через табличный документ, если нужен готовый для пользователя файл. Внутренний формат ЗначениеВСтрокуВнутр для этого не подходит — его понимает только платформа 1С. При выгрузке кириллицы в CSV явно указывайте кодировку UTF-8.
Есть ли ограничение на размер списка в хранилище значений?
Жёсткого лимита на количество элементов нет, ограничивает физический размер записи в базе и разумное время чтения. Практически списки из тысяч элементов со ссылками хранятся без проблем, но десятки тысяч элементов с представлениями уже заметно раздувают запись. Если данных много, рассмотрите хранение в табличной части объекта или регистре сведений вместо сериализации.
Что важно запомнить
Сначала определите тип задачи: программный СписокЗначений сохраняют через ХранилищеЗначения или сериализацию в строку, настройки динамического списка — штатным механизмом настроек формы, выгрузку в файл — командой «Вывести список» или записью табличного документа. Всегда проверяйте восстановление данных после перезапуска сеанса и остерегайтесь хранения ссылок на удаляемые объекты.