При разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются с задачей сохранения состояния интерфейса или вспомогательных данных. Платформа предлагает удобный механизм: свойство формы АвтоматическоеСохранениеДанныхВНастройках и флаг «Сохраняемые данные» у реквизитов. Однако новички часто обнаруживают «странное» поведение: данные, введенные в одном документе, внезапно появляются во всех остальных документах того же типа. Разберемся, почему так происходит, и как реализовать корректную привязку данных к конкретному объекту.
Проанализируем логику работы платформы. Когда мы устанавливаем у формы свойство АвтоматическоеСохранениеДанныхВНастройках, система начинает кэшировать значения выбранных реквизитов в системной таблице ХранилищеОбщихНастроек. Ключом для поиска этих настроек является комбинация «Имя формы + Имя пользователя».
Важно понимать: для платформы форма документа «Реализация товаров и услуг» — это один и тот же программный объект, независимо от того, открыт в ней документ №1 или документ №100. Система считает, что вы настраиваете свое рабочее место, а не конкретную бизнес-сущность. Именно поэтому данные «размазываются» по всем экземплярам: вы ввели значение в одном месте, платформа запомнила его для этой формы и подставила при открытии этой же формы с другим документом.
Этот механизм идеально подходит для:
Рассмотрим пример, когда на форме нужно отображать текст, зависящий от валюты документа (например, сокращенное наименование валюты рядом с итогами). Если хранить этот текст в сохраняемом реквизите формы, мы получим ошибку: открыв документ в долларах, мы увидим «USD», но переключившись на документ в рублях, можем снова увидеть «USD», если форма подтянет старую настройку.
Правило проектирования: данные, которые являются производными от реквизитов объекта, вообще не нужно «хранить» или «сохранять». Их нужно вычислять.
Проанализируем правильный алгоритм работы с такими данными:
ПриЧтенииНаСервере или ПриСозданииНаСервере) вызывается процедура заполнения надписей.Пример кода для обновления надписей на лету:
&НаСервере
Процедура ОбновитьНадписиВалютыНаСервере()
// Вычисляем значение на основе данных объекта
ТекстВалюты = СокрЛП(Объект.ВалютаДокумента);
// Устанавливаем значение реквизита формы (НЕ сохраняемого)
НадписьВалютаИтог = ТекстВалюты;
КонецПроцедуры
&НаКлиенте
Процедура ВалютаДокументаПриИзменении(Элемент)
ОбновитьНадписиВалютыНаСервере();
КонецПроцедуры
Если задача все же требует сохранения уникальных пользовательских настроек именно для конкретного документа (что бывает редко, но возможно), мы можем вмешаться в стандартный механизм сохранения через события ПриСохраненииДанныхВНастройкахНаСервере и ПриЗагрузкеДанныхИзНастроекНаСервере.
Рассмотрим, как это сделать. Нам потребуется изменить КлючНастроек, чтобы он включал в себя уникальный идентификатор (GUID) документа. Однако стандартное свойство КлючСохраненияПоложенияОкна часто используется для других целей, поэтому лучше управлять данными вручную.
Разберем пример реализации через обработчики событий формы:
&НаСервере
Процедура ПриСохраненииДанныхВНастройкахНаСервере(Настройки)
// Добавляем к настройкам идентификатор текущего объекта
// Чтобы потом понять, к какому документу они относятся
Настройки.Вставить("СсылкаНаОбъект", Объект.Ссылка);
КонецПроцедуры
&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
// Проверяем, совпадают ли загружаемые настройки с текущим документом
Если Настройки.Свойство("СсылкаНаОбъект") Тогда
Если Настройки.СсылкаНаОбъект <> Объект.Ссылка Тогда
// Если настройки от другого документа — игнорируем их
Настройки.Очистить();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Важное предупреждение: такой подход ведет к быстрому росту системных таблиц. Если в базе 100 000 документов и 50 пользователей, количество записей в настройках может стать катастрофическим. Платформа не очищает эти настройки автоматически при удалении документов, что со временем превратит базу в «склад мусора».
Если данные действительно важны и должны быть уникальны для каждого документа, проанализируем альтернативные пути решения, которые не нагружают кэш настроек:
Подведем итог нашего анализа. Механизм АвтоматическоеСохранениеДанныхВНастройках — это мощный инструмент для кастомизации интерфейса под предпочтения пользователя. Его не следует использовать для хранения данных объекта или значений, зависящих от контекста конкретной ссылки.
Выясним основные рекомендации:
ПриЧтенииНаСервере.Помните, что изящное решение в 1С — это не всегда использование самой «продвинутой» функции платформы, а применение инструмента строго по его назначению. Попытка заставить настройки формы работать как база данных — типичный пример «антипаттерна», который усложняет поддержку кода и снижает стабильность системы.