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