Часто при автоматизации рабочих мест продавцов или сотрудников розницы возникает необходимость программной смены подразделения пользователя при переходе из магазина в магазин. Казалось бы, задача проста: находим объект, меняем реквизит и записываем. Однако на практике разработчики сталкиваются с тем, что данные не сохраняются или сбрасываются. Давайте разберем, почему это происходит и как сделать процесс надежным.
Первое, на что стоит обратить внимание — это механизм поиска пользователя. Часто ошибки возникают на этапе получения ссылки на объект. Использование НайтиПоНаименованию является небезопасным, так как в базе могут существовать дубликаты, помеченные на удаление пользователи или расхождения между полным именем и представлением объекта. В результате ваш код меняет данные не того «пользователя», который активен в текущем сеансе.
Второй критический момент — это типы данных. В современных конфигурациях 1С часто используются ОпределяемыеТипы. Если ваш реквизит «Подразделение» в справочнике пользователей ожидает значение типа СтруктураПредприятия, а вы пытаетесь передать туда ссылку на ПодразделениеОрганизации (или наоборот), платформа может просто очистить поле при записи, так как типы несовместимы.
Чтобы гарантированно найти текущего пользователя, необходимо опираться на его уникальный идентификатор (UUID). Рассмотрим, как реализовать это корректно с помощью ПользователиИнформационнойБазы.
// Получаем текущего пользователя ИБ
ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
// Ищем соответствующий элемент в справочнике Пользователи
ПользовательСсылка = Справочники.Пользователи.НайтиПоРеквизиту("ИдентификаторПользователяИБ", ПользовательИБ.УникальныйИдентификатор);
// Получаем объект для редактирования
ПользовательОбъект = ПользовательСсылка.ПолучитьОбъект();
Такой подход исключает случайный выбор другого пользователя с похожим именем и делает код устойчивым к изменениям структуры справочника.
Если поиск работает корректно, но подразделение все равно не меняется, проверьте метаданные. Перейдите в конфигуратор и посмотрите тип реквизита Подразделение у справочника Пользователи.
Если там указан ОпределяемыйТип, убедитесь, что ваше значение принадлежит к одному из типов, входящих в этот определяемый тип. Если вы используете конфигурацию на БСП, помните, что подразделения могут храниться в справочнике СтруктураПредприятия. Попытка записать ссылку неверного типа приведет к тому, что 1С проигнорирует изменение или сбросит поле в пустое значение.
В типовых решениях (ERP, УТ 11, КА, БП 3.0) простого метода Записать() может быть недостаточно, так как данные пользователя связаны с регистрами сведений и настройками сеанса. Рекомендуем использовать методы БСП:
// Устанавливаем подразделение
ПользовательОбъект.Подразделение = НовоеПодразделение;
// Записываем объект, используя методы БСП, если доступно
// Или стандартным методом, если вы уверены в отсутствии подписок
Попытка
ПользовательОбъект.Записать();
Исключение
Сообщить("Ошибка при записи пользователя: " + ОписаниеОшибки());
КонецПопытки;
При отладке обязательно выполняйте следующие действия:
Пользователи подписок на событие ПередЗаписью или ПриЗаписи. Они могут принудительно возвращать подразделение к «старому» значению, если логика программы считает, что пользователь не имеет прав на смену точки присутствия.
УстановитьПривилегированныйРежим(Истина);
ПользовательОбъект.Записать();
УстановитьПривилегированныйРежим(Ложь);
ПараметрахСеанса. После записи изменений может потребоваться перезапуск системы или обновление параметров сеанса через соответствующие процедуры БСП.Следуя этим шагам, вы сможете найти узкое место в вашей обработке и обеспечить корректную смену подразделения для пользователей.