В практике разработки на платформе 1С часто возникает задача: пользователь вносит изменения в обработку (например, проставляет статусы документов флажками), и эти изменения должны сразу стать видны всем остальным коллегам. Стандартные методы СохранитьЗначение и ВосстановитьЗначение, которые часто используют начинающие разработчики, сохраняют данные в локальный профиль пользователя. Это означает, что другой человек, открыв ту же обработку, увидит пустые поля.
Разберем подробно, почему так происходит, и проанализируем три эффективных способа сделать данные общими для всех пользователей в системе, используя обычные формы.
Методы СохранитьЗначение и ВосстановитьЗначение работают с системным хранилищем настроек, которое жестко привязано к текущему пользователю (его идентификатору в базе данных или системному логину). Эти функции идеально подходят для запоминания положения окна, выбора принтера или последнего выбранного значения в поле ввода, но они категорически не предназначены для хранения бизнес-данных. Данные, сохраненные таким образом, физически недоступны из-под другой учетной записи.
Это самый правильный и надежный способ с точки зрения архитектуры 1С. Мы создадим специальный объект в конфигурации, который будет хранить наши флажки. Рассмотрим по шагам процесс реализации.
Шаг 1. Создание регистра. Создадим в конфигураторе непериодический регистр сведений, например, СтатусыДокументов.
Измерения: Документ (тип: ДокументСсылка.РеализацияТоваровУслуг).
Ресурсы: Вернул, НакладнаяЗакрыта, БезПечати (тип: Булево).
Шаг 2. Запись данных. Перепишем процедуру сохранения так, чтобы она работала с набором записей регистра. Обратите внимание, что мы отказываемся от УникальныйИдентификатор, так как ключом является сам документ.
Процедура ЗаписатьСтатусыВРегистр()
Для Каждого СтрокаТЗ Из ТаблицаСтатуса Цикл
// Создаем набор записей для каждого документа
Набор = РегистрыСведений.СтатусыДокументов.СоздатьНаборЗаписей();
Набор.Отбор.Документ.Установить(СтрокаТЗ.Документ);
НоваяЗапись = Набор.Добавить();
ЗаполнитьЗначенияСвойств(НоваяЗапись, СтрокаТЗ);
НоваяЗапись.Документ = СтрокаТЗ.Документ;
// Записываем данные в базу, они станут доступны всем
Набор.Записать();
КонецЦикла;
КонецПроцедуры
Шаг 3. Чтение данных. Теперь проанализируем, как загрузить эти данные для всех пользователей при открытии формы или выборе данных.
Процедура ЗагрузитьСтатусыИзРегистра()
Для Каждого СтрокаТЗ Из ТаблицаСтатуса Цикл
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Статусы.Вернул,
| Статусы.НакладнаяЗакрыта,
| Статусы.БезПечати
|ИЗ
| РегистрСведений.СтатусыДокументов КАК Статусы
|ГДЕ
| Статусы.Документ = &Документ";
Запрос.УстановитьПараметр("Документ", СтрокаТЗ.Документ);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ЗаполнитьЗначенияСвойств(СтрокаТЗ, Выборка);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Если вы не хотите добавлять новый регистр в конфигурацию, можно воспользоваться объектом ХранилищеОбщихНастроек. Однако здесь есть хитрость: чтобы данные были видны всем, мы будем сохранять и загружать их, принудительно указывая имя одного и того же «служебного» пользователя (например, «Администратор»).
Посмотрим на пример реализации, который адаптирован под обычные формы:
Процедура СохранитьНастройкиДляВсех()
// Сериализуем таблицу значений в строку или хранилище для сохранения
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("Таблица", ТаблицаСтатуса);
// Сохраняем в общее хранилище под именем конкретного пользователя
// Последний параметр "Администратор" — это ключ пользователя
ХранилищеОбщихНастроек.Сохранить("ОбработкаСтатусыДокументов", "ОбщиеНастройки", СтруктураДанных, , "Администратор");
КонецПроцедуры
Процедура ЗагрузитьНастройкиДляВсех()
// Загружаем данные, сохраненные под именем "Администратор"
Результат = ХранилищеОбщихНастроек.Загрузить("ОбработкаСтатусыДокументов", "ОбщиеНастройки", , "Администратор");
Если ТипЗнч(Результат) = Тип("Структура") Тогда
ТаблицаСтатуса = Результат.Таблица.Скопировать();
КонецЕсли;
КонецПроцедуры
Важный нюанс: Этот метод подходит только для небольших объемов данных (например, общие фильтры обработки). Если документов тысячи, хранилище будет работать медленно и может привести к ошибкам блокировок.
В типовых конфигурациях (УПП, УТ 10.3) существует встроенный механизм «Дополнительные сведения». Выясним, как использовать его без изменения кода конфигурации.
Мы можем добавить новое свойство к объекту ДокументСсылка.РеализацияТоваровУслуг через интерфейс программы. В коде обработки мы будем обращаться к регистру ЗначенияСвойствОбъектов.
Рассмотрим пример кода для работы с такими свойствами:
Процедура УстановитьСвойствоДокумента(ДокументСсылка, ИмяСвойства, Значение)
ПланХарактеристик = ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию(ИмяСвойства);
МенеджерЗаписи = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Объект = ДокументСсылка;
МенеджерЗаписи.Свойство = ПланХарактеристик;
МенеджерЗаписи.Значение = Значение;
МенеджерЗаписи.Записать();
КонецПроцедуры
Этот метод хорош тем, что данные хранятся в стандартных таблицах базы данных, они доступны всем пользователям и автоматически попадают в резервные копии.
Проанализировав ситуацию, можно сделать вывод: для корректной совместной работы всегда выбирайте хранение данных в базе данных (SQL/File DB), а не в локальных настройках пользователя. Использование РегистрСведенийМенеджерЗаписи или наборов записей гарантирует, что как только один бухгалтер нажал кнопку «Сохранить», другой бухгалтер на своем мониторе увидит актуальную информацию.