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