Как сделать так, чтобы данные формы сохранялись для всех пользователей

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

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

Разберем подробно, почему так происходит, и проанализируем три эффективных способа сделать данные общими для всех пользователей в системе, используя обычные формы.

Почему СохранитьЗначение не подходит для общей работы

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

Решение 1: Использование непериодического регистра сведений

Это самый правильный и надежный способ с точки зрения архитектуры 1С. Мы создадим специальный объект в конфигурации, который будет хранить наши флажки. Рассмотрим по шагам процесс реализации.

Шаг 1. Создание регистра. Создадим в конфигураторе непериодический регистр сведений, например, СтатусыДокументов. Измерения: Документ (тип: ДокументСсылка.РеализацияТоваровУслуг). Ресурсы: Вернул, НакладнаяЗакрыта, БезПечати (тип: Булево).

Шаг 2. Запись данных. Перепишем процедуру сохранения так, чтобы она работала с набором записей регистра. Обратите внимание, что мы отказываемся от УникальныйИдентификатор, так как ключом является сам документ.


Процедура ЗаписатьСтатусыВРегистр()
    Для Каждого СтрокаТЗ Из ТаблицаСтатуса Цикл
        // Создаем набор записей для каждого документа
        Набор = РегистрыСведений.СтатусыДокументов.СоздатьНаборЗаписей();
        Набор.Отбор.Документ.Установить(СтрокаТЗ.Документ);
        
        НоваяЗапись = Набор.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяЗапись, СтрокаТЗ);
        НоваяЗапись.Документ = СтрокаТЗ.Документ;
        
        // Записываем данные в базу, они станут доступны всем
        Набор.Записать();
    КонецЦикла;
КонецПроцедуры

Шаг 3. Чтение данных. Теперь проанализируем, как загрузить эти данные для всех пользователей при открытии формы или выборе данных.


Процедура ЗагрузитьСтатусыИзРегистра()
    Для Каждого СтрокаТЗ Из ТаблицаСтатуса Цикл
        Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ
            |   Статусы.Вернул,
            |   Статусы.НакладнаяЗакрыта,
            |   Статусы.БезПечати
            |ИЗ
            |   РегистрСведений.СтатусыДокументов КАК Статусы
            |ГДЕ
            |   Статусы.Документ = &Документ";
        
        Запрос.УстановитьПараметр("Документ", СтрокаТЗ.Документ);
        Выборка = Запрос.Выполнить().Выбрать();
        
        Если Выборка.Следующий() Тогда
            ЗаполнитьЗначенияСвойств(СтрокаТЗ, Выборка);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Решение 2: Программное использование хранилища общих настроек

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

Посмотрим на пример реализации, который адаптирован под обычные формы:


Процедура СохранитьНастройкиДляВсех()
    // Сериализуем таблицу значений в строку или хранилище для сохранения
    СтруктураДанных = Новый Структура;
    СтруктураДанных.Вставить("Таблица", ТаблицаСтатуса);
    
    // Сохраняем в общее хранилище под именем конкретного пользователя
    // Последний параметр "Администратор" — это ключ пользователя
    ХранилищеОбщихНастроек.Сохранить("ОбработкаСтатусыДокументов", "ОбщиеНастройки", СтруктураДанных, , "Администратор");
КонецПроцедуры

Процедура ЗагрузитьНастройкиДляВсех()
    // Загружаем данные, сохраненные под именем "Администратор"
    Результат = ХранилищеОбщихНастроек.Загрузить("ОбработкаСтатусыДокументов", "ОбщиеНастройки", , "Администратор");
    
    Если ТипЗнч(Результат) = Тип("Структура") Тогда
        ТаблицаСтатуса = Результат.Таблица.Скопировать();
    КонецЕсли;
КонецПроцедуры

Важный нюанс: Этот метод подходит только для небольших объемов данных (например, общие фильтры обработки). Если документов тысячи, хранилище будет работать медленно и может привести к ошибкам блокировок.

Решение 3: Механизм свойств и категорий (ПВХ)

В типовых конфигурациях (УПП, УТ 10.3) существует встроенный механизм «Дополнительные сведения». Выясним, как использовать его без изменения кода конфигурации. Мы можем добавить новое свойство к объекту ДокументСсылка.РеализацияТоваровУслуг через интерфейс программы. В коде обработки мы будем обращаться к регистру ЗначенияСвойствОбъектов.

Рассмотрим пример кода для работы с такими свойствами:


Процедура УстановитьСвойствоДокумента(ДокументСсылка, ИмяСвойства, Значение)
    ПланХарактеристик = ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию(ИмяСвойства);
    
    МенеджерЗаписи = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.Объект = ДокументСсылка;
    МенеджерЗаписи.Свойство = ПланХарактеристик;
    МенеджерЗаписи.Значение = Значение;
    МенеджерЗаписи.Записать();
КонецПроцедуры

Этот метод хорош тем, что данные хранятся в стандартных таблицах базы данных, они доступны всем пользователям и автоматически попадают в резервные копии.

Сравнительный анализ методов

  1. Регистр сведений: Максимальная производительность, поддержка типизации, возможность строить отчеты по этим статусам. Рекомендуется как основной метод.
  2. Хранилище настроек (под админом): Быстрая разработка, не требует изменения структуры метаданных. Минусы: риск потери данных при очистке кэша, плохая производительность на больших объемах.
  3. Свойства и категории: Идеально для типовых конфигураций, где запрещено менять структуру БД. Позволяет добавлять новые статусы без участия программиста.

Проанализировав ситуацию, можно сделать вывод: для корректной совместной работы всегда выбирайте хранение данных в базе данных (SQL/File DB), а не в локальных настройках пользователя. Использование РегистрСведенийМенеджерЗаписи или наборов записей гарантирует, что как только один бухгалтер нажал кнопку «Сохранить», другой бухгалтер на своем мониторе увидит актуальную информацию.

← На главную