Как сохранить цены в заказе при смене контрагента в 1С:Управление торговлей 11?

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

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

Почему 1С обнуляет цены при смене клиента?

Проанализируем внутреннюю логику программы. В современных конфигурациях 1С на платформе 8.3 цены в заказе не являются просто «цифрами в таблице». Они жестко привязаны к условиям продаж. Условия продаж определяются через такие объекты, как Соглашение, Договор и Вид цены. Когда мы меняем Контрагента, система автоматически инициирует цепочку проверок:

  1. Проверяется, доступно ли выбранное ранее Соглашение для нового контрагента.
  2. Если соглашение меняется или очищается, программа обязана пересчитать цены, так как у нового клиента может быть другой тип цен (например, «Оптовая» вместо «Дилерской»).
  3. Система вызывает процедуру пересчета табличной части. Поскольку значения, введенные вручную (произвольные цены), не зафиксированы ни в одном типовом соглашении или прайс-листе, алгоритм 1С считает их неактуальными для нового контрагента и очищает колонку Цена.

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

Способ 1. Быстрый пользовательский метод: копирование строк

Если в заказе не «100 500 строк», а разумное количество, самым быстрым способом будет использование буфера обмена внутри самой программы. В последних версиях УТ 11.4 и выше этот функционал работает очень стабильно. Проанализируем последовательность действий:

  1. Откроем заказ, в котором нужно заменить контрагента.
  2. Перейдем на вкладку Товары.
  3. Выделим все строки табличной части (нажатием клавиш Ctrl + A).
  4. Нажмем кнопку Копировать строки (значок с двумя листами над табличной частью).
  5. Теперь изменим Партнера или Контрагента в шапке документа. Система выдаст предупреждение и обнулит цены.
  6. Снова перейдем в табличную часть Товары и нажмем Вставить строки.

При вставке система может предложить обновить цены в соответствии с условиями нового соглашения. В этот момент важно выбрать вариант «Нет» или «Оставить текущие». Таким образом, вы вернете все свои ручные цены на место без повторного ввода.

Способ 2. Использование группового изменения реквизитов

Рассмотрим ситуацию, когда заказ уже записан и нам нужно изменить контрагента, не открывая форму документа и не запуская «опасные» скрипты пересчета. Для этого воспользуемся стандартной обработкой Групповое изменение реквизитов.

Этот метод подходит для администраторов или опытных пользователей:

  1. Перейдем в раздел НСИ и администрирование — Обслуживание — Корректировка данных.
  2. Выберем пункт Групповое изменение реквизитов.
  3. В поле «Изменять» выберем Заказ клиента.
  4. Настроим фильтр (ссылка «Все элементы»), выбрав конкретный номер или ссылку на нужный заказ. Это критически важно, чтобы не изменить все заказы в базе!
  5. Найдем в списке реквизитов Контрагент и установим новое значение.
  6. Нажмем кнопку Дополнительные параметры и убедимся, что флажок «Выполнять в транзакции» или «Вызывать обработчики при записи» можно регулировать.

Если изменить реквизит через эту обработку с отключенными обработчиками, данные в табличной части (цены) останутся нетронутыми, так как логика формы документа (событие ПриИзменении) просто не будет запущена.

Способ 3. Программный метод (для разработчиков)

Если компания постоянно сталкивается с необходимостью менять контрагента в заказах с сохранением цен, лучшим решением будет создание небольшого расширения конфигурации. Нам нужно вмешаться в процесс обработки изменения реквизита на форме.

Посмотрим на пример логики, которую можно реализовать в расширении. Нам необходимо перехватить процедуру КонтрагентПриИзменении. Рассмотрим пример кода, который сохраняет значения цен перед выполнением стандартной очистки:


&НаКлиенте
Процедура Расш_КонтрагентПриИзмененииПосле(Элемент)
    // Алгоритм сохранения ручных цен
    Для Каждого СтрокаТовара Из Объект.Товары Цикл
        // Здесь можно реализовать логику восстановления, 
        // если типовой код уже успел все очистить.
        // Но лучше использовать &Перед или перехватывать 
        // серверные вызовы пересчета.
    КонецЦикла;
КонецПроцедуры

Более грамотным подходом будет модификация серверной процедуры пересчета. В модуле формы заказа часто вызывается процедура, отвечающая за обновление цен при смене условий. Мы можем добавить проверку: если цена была установлена вручную (флаг ПересчитатьЦены = Ложь или отсутствие связи с видом цены), то очистку выполнять не нужно.

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

Способ 4. Загрузка данных из внешнего файла

Если заказ огромный, и вы боитесь ошибок при копировании, можно воспользоваться механизмом выгрузки/загрузки. Это универсальное решение, которое упоминали участники обсуждения.

  1. В текущем заказе (до смены контрагента) воспользуйтесь кнопкой выгрузки табличной части в Excel или MXL.
  2. Измените контрагента в заказе (цены обнулятся).
  3. Воспользуйтесь штатной кнопкой Загрузить из внешнего файла над табличной частью товаров.
  4. Сопоставьте колонки Номенклатура и Цена.

Программа повторно загрузит строки и подставит те цены, которые были в файле, игнорируя настройки нового контрагента.

Важные замечания по договорам и валюте

Выясним еще одну причину очистки данных. В 1С:УТ 11 смена контрагента почти всегда влечет за собой очистку поля Договор. Если в новом договоре указана другая Валюта или другой режим Налогообложения (НДС), система технически не может оставить старые цены. Например, если старая цена была 100 рублей (НДС сверху), а новый контракт требует НДС в том числе, сумма документа изменится в любом случае. Для реализации программной корректировки в таких случаях пригодится шаблон запроса для пересчета цен строк заказа по курсу валюты.

Рекомендация: перед сменой контрагента всегда проверяйте, совпадают ли параметры учета (валюта, налогообложение) у старого и нового клиента. Если они различны, ручное восстановление цен может привести к расхождениям в бухгалтерском и налоговом учете.

Резюме

Проблема обнуления цен — это не ошибка программы, а ее логика защиты данных. Однако для удобства работы мы рекомендуем:

Выбор метода зависит от ваших полномочий в системе и частоты возникновения такой задачи.

← На главную