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

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

При разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются с задачей сохранения состояния интерфейса или вспомогательных данных. Платформа предлагает удобный механизм: свойство формы АвтоматическоеСохранениеДанныхВНастройках и флаг «Сохраняемые данные» у реквизитов. Однако новички часто обнаруживают «странное» поведение: данные, введенные в одном документе, внезапно появляются во всех остальных документах того же типа. Разберемся, почему так происходит, и как реализовать корректную привязку данных к конкретному объекту.

Почему стандартный механизм работает «на все документы»

Проанализируем логику работы платформы. Когда мы устанавливаем у формы свойство АвтоматическоеСохранениеДанныхВНастройках, система начинает кэшировать значения выбранных реквизитов в системной таблице ХранилищеОбщихНастроек. Ключом для поиска этих настроек является комбинация «Имя формы + Имя пользователя».

Важно понимать: для платформы форма документа «Реализация товаров и услуг» — это один и тот же программный объект, независимо от того, открыт в ней документ №1 или документ №100. Система считает, что вы настраиваете свое рабочее место, а не конкретную бизнес-сущность. Именно поэтому данные «размазываются» по всем экземплярам: вы ввели значение в одном месте, платформа запомнила его для этой формы и подставила при открытии этой же формы с другим документом.

Этот механизм идеально подходит для:

Разбор ситуации: производные данные и надписи

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

Правило проектирования: данные, которые являются производными от реквизитов объекта, вообще не нужно «хранить» или «сохранять». Их нужно вычислять.

Проанализируем правильный алгоритм работы с такими данными:

  1. При открытии формы (событие ПриЧтенииНаСервере или ПриСозданииНаСервере) вызывается процедура заполнения надписей.
  2. При изменении ключевого реквизита (например, валюты) на клиенте вызывается обработчик, который обновляет надписи.

Пример кода для обновления надписей на лету:


&НаСервере
Процедура ОбновитьНадписиВалютыНаСервере()
    // Вычисляем значение на основе данных объекта
    ТекстВалюты = СокрЛП(Объект.ВалютаДокумента);
    // Устанавливаем значение реквизита формы (НЕ сохраняемого)
    НадписьВалютаИтог = ТекстВалюты;
КонецПроцедуры

&НаКлиенте
Процедура ВалютаДокументаПриИзменении(Элемент)
    ОбновитьНадписиВалютыНаСервере();
КонецПроцедуры

Как программно привязать настройки формы к ссылке документа

Если задача все же требует сохранения уникальных пользовательских настроек именно для конкретного документа (что бывает редко, но возможно), мы можем вмешаться в стандартный механизм сохранения через события ПриСохраненииДанныхВНастройкахНаСервере и ПриЗагрузкеДанныхИзНастроекНаСервере.

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

Разберем пример реализации через обработчики событий формы:


&НаСервере
Процедура ПриСохраненииДанныхВНастройкахНаСервере(Настройки)
    // Добавляем к настройкам идентификатор текущего объекта
    // Чтобы потом понять, к какому документу они относятся
    Настройки.Вставить("СсылкаНаОбъект", Объект.Ссылка);
КонецПроцедуры

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

Важное предупреждение: такой подход ведет к быстрому росту системных таблиц. Если в базе 100 000 документов и 50 пользователей, количество записей в настройках может стать катастрофическим. Платформа не очищает эти настройки автоматически при удалении документов, что со временем превратит базу в «склад мусора».

Альтернатива: Использование реквизитов объекта или Дополнительных сведений

Если данные действительно важны и должны быть уникальны для каждого документа, проанализируем альтернативные пути решения, которые не нагружают кэш настроек:

  1. Добавление реквизита в объект: Если данные имеют бизнес-смысл (например, особый комментарий для логистики), самое правильное — добавить реквизит непосредственно в метаданные документа.
  2. Дополнительные сведения (БСП): Если вы используете типовую конфигурацию (БП, УТ, ERP), воспользуйтесь механизмом дополнительных сведений. Они хранятся в отдельном регистре, привязаны к ссылке и не требуют изменения структуры таблиц самого документа.
  3. Регистр сведений: Создайте свой регистр сведений, где ключом (измерением) будет ссылка на документ, а ресурсом — ваши данные. Заполняйте и считывайте их в событиях формы.

Резюме по использованию настроек

Подведем итог нашего анализа. Механизм АвтоматическоеСохранениеДанныхВНастройках — это мощный инструмент для кастомизации интерфейса под предпочтения пользователя. Его не следует использовать для хранения данных объекта или значений, зависящих от контекста конкретной ссылки.

Выясним основные рекомендации:

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

← На главную