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