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