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