Как настроить автозаполнение последней цены поставщика в прайс-листе 1С:Управление торговлей 11.3

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

В процессе работы с конфигурацией 1С:Управление торговлей 11.3 часто возникает необходимость оперативно отражать закупочные цены в собственном прайс-листе. Если компания работает с иностранными поставщиками, задача усложняется необходимостью вести учет в нескольких валютах (например, USD, EUR и RUB) и автоматически обновлять соответствующие виды цен при каждом поступлении товара. В данной статье мы разберем, как автоматизировать этот процесс, рассмотрим программные способы решения и использование типовых механизмов системы.

Способ 1. Использование встроенных схем компоновки данных (без программирования)

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

  1. Перейдем в раздел CRM и маркетинг — Настройки и справочники — Виды цен.
  2. Откроем или создадим вид цены (например, "Заводская USD").
  3. В поле "Способ задания цены" выберем значение Произвольный запрос к данным ИБ.
  4. В появившемся списке схем выберем Цены поступления.

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

Способ 2. Программное создание документа «Установка цен номенклатуры»

Если требуется полная автоматизация (чтобы цена фиксировалась сразу в момент проведения закупки без участия пользователя в обработке «Прайс-лист»), необходимо использовать программный метод. Рассмотрим наиболее эффективный путь — создание Подписки на событие.

Проанализируем ситуацию: нам нужно реагировать на проведение документа ПоступлениеТоваровУслуг. Логика кода должна заключаться в создании документа УстановкаЦенНоменклатуры, заполнении его табличной части товарами из поступления и установке статуса "Согласован".

Рассмотрим пример кода, который можно разместить в обработчике подписки на событие ОбработкаПроведения:


Процедура ПриПроведенииПоступления(Источник, Отказ, РежимПроведения)
    
    // Проверяем, что документ не пустой и проведен
    Если Отказ ИЛИ Источник.ПометкаУдаления Тогда
        Возврат;
    КонецЕсли;

    // Создаем новый документ установки цен
    НовыйДок = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
    НовыйДок.Дата = Источник.Дата;
    НовыйДок.Статус = Перечисления.СтатусыУстановокЦенНоменклатуры.Согласован;
    НовыйДок.Ответственный = Пользователи.ТекущийПользователь();
    НовыйДок.Комментарий = "Создано автоматически на основании " + Строка(Источник.Ссылка);
    
    // Укажем виды цен, которые будем заполнять
    // В реальной задаче нужно сопоставить валюту документа с нужным Видом Цены
    ВидЦеныСсылка = Справочники.ВидыЦен.НайтиПоНаименованию("Заводская цена USD");
    
    СтрокаВидаЦен = НовыйДок.ВидыЦен.Добавить();
    СтрокаВидаЦен.ВидЦены = ВидЦеныСсылка;
    
    // Заполняем товары
    Для Каждого СтрокаТЧ Из Источник.Товары Цикл
        
        НоваяСтрока = НовыйДок.Товары.Добавить();
        НоваяСтрока.Номенклатура = СтрокаТЧ.Номенклатура;
        НоваяСтрока.Характеристика = СтрокаТЧ.Характеристика;
        НоваяСтрока.ВидЦены = ВидЦеныСсылка;
        НоваяСтрока.Цена = СтрокаТЧ.Цена; // Здесь логика подстановки цены из ТЧ поступления
        
    КонецЦикла;
    
    // Записываем и проводим документ
    Попытка
        НовыйДок.Записать(РежимЗаписиДокумента.Проведение);
    Исключение
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Ошибка при автосоздании установки цен: " + ОписаниеОшибки());
    КонецПопытки;

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

Разбор логики работы с валютами

Поскольку в условии задачи фигурируют три валюты (USD, EUR, RUB), нам нужно усложнить алгоритм. Выясним причину, по которой нельзя просто копировать цену: вид цены в 1С жестко привязан к определенной валюте. Выполним сопоставление по следующему алгоритму:

  1. Определяем валюту документа ПоступлениеТоваровУслуг (через реквизит Валюта).
  2. Ищем в справочнике ВидыЦен тот элемент, у которого валюта совпадает с валютой поступления.
  3. Если соответствие найдено, добавляем этот вид цены в документ УстановкаЦенНоменклатуры.

Проанализируем пример сопоставления:


ВалютаДокумента = Источник.Валюта;
ВидЦеныДляУстановки = Справочники.ВидыЦен.ПустаяСсылка();

Если ВалютаДокумента = Константы.ВалютаДоллар.Получить() Тогда
    ВидЦеныДляУстановки = Справочники.ВидыЦен.НайтиПоНаименованию("Заводская USD");
ИначеЕсли ВалютаДокумента = Константы.ВалютаЕвро.Получить() Тогда
    ВидЦеныДляУстановки = Справочники.ВидыЦен.НайтиПоНаименованию("Заводская EUR");
КонецЕсли;

Работа с «тяжелыми» документами и производительность

Важно помнить, что в 1С:УТ 11 документ УстановкаЦенНоменклатуры является технически сложным. Он использует дополнительные табличные части для хранения расчетных данных. При программном заполнении через СоздатьДокумент() система может потребовать заполнения не только основной ТЧ Товары, но и служебных реквизитов.

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

Подводные камни и рекомендации

Проанализируем ключевые моменты, которые часто упускают при разработке подобного функционала:

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

← На главную