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