Как автоматически установить вид цены "Произвольная" при ручном изменении цены в документе реализации 1С?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Многие пользователи 1С сталкиваются с ситуацией, когда при попытке вручную изменить цену на товар в табличной части документа реализации система не позволяет этого сделать, требуя предварительно выбрать вид цены "Произвольная". Это стандартное поведение конфигурации, направленное на соблюдение ценовой политики. Однако в реальной практике часто возникает необходимость оперативно изменить цену для конкретного клиента или в случае "договорных" цен без лишних действий. Рассмотрим, как можно настроить систему 1С таким образом, чтобы вид цены автоматически устанавливался как "Произвольная" при любом ручном изменении цены, обеспечивая гибкость в работе с ценообразованием.

Анализ стандартного поведения системы 1С при изменении цены

Прежде чем приступить к модификации, нам необходимо понять, почему система 1С по умолчанию запрещает прямое изменение цены в документах реализации, если для строки установлен определенный вид цены. Типовая логика конфигураций, таких как 1С:Управление торговлей, 1С:Комплексная автоматизация или 1С:ERP, предусматривает строгий контроль над ценообразованием. Цена товара в строке табличной части документа напрямую зависит от выбранного ВидаЦены. Если для товара установлен определенный вид цены (например, "Оптовая", "Розничная", "Закупочная" и т.д.), система ожидает, что цена будет формироваться согласно правилам, заданным для этого вида цены (по формуле, по прайс-листу и т.д.).

Для обеспечения целостности данных и соблюдения бизнес-логики, конфигурация проверяет наличие установленного ВидаЦены перед разрешением ручного редактирования поля Цена. Если вид цены заполнен и документ не находится в состоянии согласования, система выдает предупреждение и блокирует поле. Давайте посмотрим на фрагмент кода из типовой процедуры ТоварыВыбор модуля формы документа реализации, который отвечает за это поведение:


Процедура ТоварыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)

    // ... другой код, не относящийся к нашей задаче ...

    ИначеЕсли Поле = Элементы.ТоварыЦена Тогда
        ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
        Если ПравоНаЧтениеВидаЦены Тогда
            Если ЗначениеЗаполнено(ТекущиеДанные.ВидЦены) И НЕ Объект.Согласован Тогда
                ОчиститьСообщения();
                ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
                    НСтр("ru='Для редактирования цены выберите вид цены """"';uk='Для редагування ціни виберіть вид ціни """"'"),
                    Объект.Ссылка,
                    ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("Объект.Товары", ТекущиеДанные.НомерСтроки, "ВидЦены")
                );
            КонецЕсли;
        КонецЕсли;
    // ... другой код, не относящийся к нашей задаче ...

КонецПроцедуры

В этом фрагменте мы видим, что при попытке выбора поля Элементы.ТоварыЦена (т.е. при попытке начать редактирование цены), система проверяет условие ЗначениеЗаполнено(ТекущиеДанные.ВидЦены) И НЕ Объект.Согласован. Если ВидЦены заполнен и документ не согласован, то пользователю выводится сообщение о необходимости выбора произвольного вида цены, и редактирование блокируется. Наша задача состоит в том, чтобы программно сбросить значение ВидаЦены на Неопределено (то есть, сделать его пустым) непосредственно перед этой проверкой, тем самым разрешив ввод произвольной цены.

Решение проблемы в форме документа "Реализация товаров и услуг"

Для того чтобы при ручном изменении цены в табличной части документа "Реализация товаров и услуг" автоматически устанавливался вид цены "Произвольная", мы можем внести небольшое изменение в процедуру ТоварыВыбор модуля формы документа. Эта процедура срабатывает при активации ячейки в табличной части и позволяет перехватывать действия пользователя до начала непосредственного редактирования.

Наша цель — сбросить значение ВидЦены в текущей строке табличной части на Неопределено, когда пользователь пытается изменить поле Цена. Это позволит обойти стандартную проверку, которую мы рассмотрели выше.

Разберем по шагам, как это сделать:

  1. Откроем конфигуратор и найдем документ "Реализация товаров и услуг" (или аналогичный, например, "Заказ клиента", "Коммерческое предложение").
  2. Перейдем к форме документа (обычно это основная форма объекта).
  3. Откроем модуль формы, нажав правой кнопкой мыши на форме и выбрав "Открыть модуль".
  4. Найдем процедуру ТоварыВыбор. Если такой процедуры нет, ее необходимо будет создать, либо найти похожий обработчик, который срабатывает при активации ячейки таблицы. В большинстве типовых конфигураций 1С (УТ, КА, ERP) она существует.
  5. Внутри этой процедуры найдем блок, который обрабатывает выбор поля Элементы.ТоварыЦена. Он будет выглядеть примерно так, как показано в предыдущем разделе.
  6. Важный шаг: Добавим строку ТекущиеДанные.ВидЦены = Неопределено; прямо перед проверкой Если ПравоНаЧтениеВидаЦены Тогда.

Итоговый код с внесенными изменениями будет выглядеть следующим образом:


Процедура ТоварыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)

    // ... другой код, не относящийся к нашей задаче ...

    ИначеЕсли Поле = Элементы.ТоварыЦена Тогда
        ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
        // +++++++++++ НАШЕ ИЗМЕНЕНИЕ +++++++++++
        ТекущиеДанные.ВидЦены = Неопределено; // Сбрасываем вид цены на произвольную
        //-----------------------------------------

        Если ПравоНаЧтениеВидаЦены Тогда
            Если ЗначениеЗаполнено(ТекущиеДанные.ВидЦены) И НЕ Объект.Согласован Тогда
                ОчиститьСообщения();
                ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
                    НСтр("ru='Для редактирования цены выберите вид цены """"';uk='Для редагування ціни виберіть вид ціни """"'"),
                    Объект.Ссылка,
                    ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("Объект.Товары", ТекущиеДанные.НомерСтроки, "ВидЦены")
                );
            КонецЕсли;
        КонецЕсли;
    // ... другой код, не относящийся к нашей задаче ...

КонецПроцедуры

Объяснение работы модификации: Когда пользователь кликает по полю "Цена" в табличной части, срабатывает процедура ТоварыВыбор. Внутри этой процедуры, благодаря нашей добавленной строке, значение поля ВидЦены для текущей строки принудительно устанавливается в Неопределено. Таким образом, когда система далее проверяет условие ЗначениеЗаполнено(ТекущиеДанные.ВидЦены), оно оказывается ложным, и блокировка редактирования не происходит. Пользователь получает возможность ввести любую цену, а система автоматически интерпретирует это как "произвольную" цену, поскольку конкретный вид цены для этой строки теперь не определен.

Важно отметить, что такой подход изменяет стандартное поведение, и необходимо убедиться, что это соответствует бизнес-требованиям. В некоторых случаях может потребоваться дополнительная логика для записи или отслеживания таких "произвольных" цен.

Решение для формы "Подбор товаров в документ продажи"

Аналогичная проблема может возникнуть и в обработке "Подбор товаров в документ продажи", которая часто используется для быстрого заполнения табличной части документа. Здесь также может действовать ограничение на изменение цены, если установлен какой-либо вид цены. Решение для этой формы может потребовать немного другого подхода, так как структура и обработчики событий могут отличаться от формы документа.

Разберем предложенные изменения для формы подбора по шагам:

  1. Откройте конфигуратор и найдите обработку ПодборТоваровВДокументПродажи (или аналогичную по функционалу, например, "ПодборНоменклатуры").
  2. Перейдите к основной форме обработки.
  3. Откройте модуль формы.
  4. Найдите процедуру ПриСозданииНаСервере. В этой процедуре часто устанавливаются свойства элементов формы, такие как ТолькоПросмотр или ПропускатьПриВводе.
  5. Измените процедуру ПриСозданииНаСервере: Закомментируйте (поставьте // перед строкой) или удалите строки, которые могут блокировать поле Цена. Например, это могут быть строки вида:
    
    // Элементы.Цена.ТолькоПросмотр = ЗначениеЗаполнено(ВидЦены);
    // Элементы.Цена.ПропускатьПриВводе = ЗначениеЗаполнено(ВидЦены);
    
    Эти строки обычно устанавливают свойство "ТолькоПросмотр" для поля цены, если вид цены уже заполнен, что предотвращает ручной ввод. Их комментирование снимет это ограничение.
  6. Добавьте обработчик события ПриИзменении для поля "Цена" на клиенте: Найдите элемент формы "Цена" (или аналогичный, отвечающий за цену подбираемого товара). В палитре свойств этого элемента перейдите на вкладку "События" и создайте обработчик события ПриИзменении, если его еще нет. Если обработчик уже существует, добавьте в него нужную строку.
  7. В созданном или измененном обработчике ЦенаПриИзменении добавьте следующую строку:
    
    &НаКлиенте
    Процедура ЦенаПриИзменении(Элемент)
        ВидЦены = Неопределено;
    КонецПроцедуры
    
    Обратите внимание, что здесь мы напрямую сбрасываем переменную ВидЦены (если она является реквизитом формы или доступна в данном контексте), а не через Элементы.Товары.ТекущиеДанные.ВидЦены, как в документе. Это связано с тем, что форма подбора может работать с временными данными или реквизитами, не связанными напрямую с табличной частью документа, а с реквизитами самой формы подбора.

Объяснение работы модификации в подборе:

Закомментировав строки в ПриСозданииНаСервере, мы убираем изначальную блокировку поля "Цена", позволяя пользователю ввести данные. Добавив обработчик ЦенаПриИзменении, мы гарантируем, что как только пользователь начнет менять цену, соответствующий ВидЦены будет сброшен на Неопределено. Это позволит цене, введенной вручную, быть воспринятой как произвольная. Таким образом, мы получаем возможность гибко управлять ценами непосредственно в процессе подбора товаров, что является очень ценным функционалом для быстро меняющихся условий торговли или индивидуального подхода к клиентам.

Альтернативные подходы и важные нюансы

Хотя предложенные решения являются прямыми и эффективными, существуют и другие способы достижения схожих результатов, а также важные аспекты, которые следует учитывать при любой модификации типовой конфигурации:

  1. Ручная скидка: Если основная причина изменения цены заключается исключительно в предоставлении скидки клиенту, возможно, использование механизма ручных скидок будет более предпочтительным. Типовые конфигурации 1С обладают развитым функционалом скидок и наценок, который позволяет применять их как в процентах, так и в сумме, без изменения базовой цены товара. Этот подход сохраняет целостность данных о ценах, упрощает анализ ценовой политики и часто не требует изменения кода конфигурации.
  2. Расширения конфигурации: Вместо прямого изменения кода типовой конфигурации, что может усложнить процесс обновления при выходе новых версий, настоятельно рекомендуется использовать механизм расширений. Расширения позволяют добавлять и изменять функционал форм, модулей и других объектов без изменения самой конфигурации. Вы можете создать расширение, которое модифицирует описанные процедуры и формы, сохраняя типовую конфигурацию в неизменном виде. Это значительно упростит сопровождение системы в будущем и обеспечит беспроблемное обновление.
  3. Права пользователей: Убедитесь, что пользователи, которым разрешено изменять цены произвольно, имеют соответствующие права доступа в системе. В 1С предусмотрены роли и права доступа, которые регулируют возможность редактирования цен и видов цен. Если у пользователя нет прав на изменение цен, даже после программных доработок система может продолжать блокировать поле или отказывать в сохранении документа. Проверьте роли, связанные с изменением цен и продажами.
  4. Бизнес-процессы и согласование: Если в вашей компании существуют строгие бизнес-процессы согласования цен (например, для крупных сделок, превышающих определенную сумму или процент скидки), автоматическое обнуление вида цены может нарушить эти процессы. В таких случаях, возможно, потребуется доработать логику, чтобы установка произвольной цены требовала дополнительного согласования (например, через механизм бизнес-процессов 1С) или чтобы она была доступна только для определенных ролей пользователей, имеющих необходимые полномочия.
  5. Пересчет сумм: После ручного изменения цены убедитесь, что все связанные суммы (сумма строки, сумма документа, НДС, общая сумма к оплате) корректно пересчитываются. Обычно типовые механизмы 1С автоматически пересчитывают эти значения при изменении цены или количества в табличной части, но в случае нестандартных доработок всегда стоит это тщательно проверить на различных тестовых сценариях.
  6. Поведение после сохранения: Проанализируйте, как ведет себя документ после сохранения. Сохраняется ли 'Произвольная' цена корректно? Возникают ли конфликты с автоматическими перерасчетами цен при повторном открытии документа или изменении других полей?

В целом, решение путем модификации процедур ТоварыВыбор и ЦенаПриИзменении является эффективным способом достижения желаемого результата, повышающим оперативность работы менеджеров. Однако, как и любая модификация типовой конфигурации, она требует тщательного тестирования и учета потенциальных последствий для других аспектов системы, особенно при работе с ценообразованием и учетом.

Мы рассмотрели подробные шаги для реализации автоматической установки произвольного вида цены, что значительно повышает гибкость работы пользователей 1С с ценообразованием в документах реализации и обработках подбора.

← На главную