В процессе работы с конфигурацией 1С:Управление торговлей 11.3 часто возникает необходимость оперативно отражать закупочные цены в собственном прайс-листе. Если компания работает с иностранными поставщиками, задача усложняется необходимостью вести учет в нескольких валютах (например, USD, EUR и RUB) и автоматически обновлять соответствующие виды цен при каждом поступлении товара. В данной статье мы разберем, как автоматизировать этот процесс, рассмотрим программные способы решения и использование типовых механизмов системы.
Прежде чем приступать к написанию кода, проанализируем возможности типового функционала. В УТ 11 предусмотрен мощный механизм расчета цен на основании данных информационной базы. Для настройки автоматического подтягивания цен выполним следующие шаги:
Важный нюанс: Чтобы этот механизм видел данные, в документах ПоступлениеТоваровУслуг (или Приобретение товаров и услуг в более новых редакциях) должна быть активна опция регистрации цен поставщика. Система будет анализировать регистр "Цены номенклатуры поставщиков" и подставлять последние значения.
Если требуется полная автоматизация (чтобы цена фиксировалась сразу в момент проведения закупки без участия пользователя в обработке «Прайс-лист»), необходимо использовать программный метод. Рассмотрим наиболее эффективный путь — создание Подписки на событие.
Проанализируем ситуацию: нам нужно реагировать на проведение документа ПоступлениеТоваровУслуг. Логика кода должна заключаться в создании документа УстановкаЦенНоменклатуры, заполнении его табличной части товарами из поступления и установке статуса "Согласован".
Рассмотрим пример кода, который можно разместить в обработчике подписки на событие ОбработкаПроведения:
Процедура ПриПроведенииПоступления(Источник, Отказ, РежимПроведения)
// Проверяем, что документ не пустой и проведен
Если Отказ ИЛИ Источник.ПометкаУдаления Тогда
Возврат;
КонецЕсли;
// Создаем новый документ установки цен
НовыйДок = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
НовыйДок.Дата = Источник.Дата;
НовыйДок.Статус = Перечисления.СтатусыУстановокЦенНоменклатуры.Согласован;
НовыйДок.Ответственный = Пользователи.ТекущийПользователь();
НовыйДок.Комментарий = "Создано автоматически на основании " + Строка(Источник.Ссылка);
// Укажем виды цен, которые будем заполнять
// В реальной задаче нужно сопоставить валюту документа с нужным Видом Цены
ВидЦеныСсылка = Справочники.ВидыЦен.НайтиПоНаименованию("Заводская цена USD");
СтрокаВидаЦен = НовыйДок.ВидыЦен.Добавить();
СтрокаВидаЦен.ВидЦены = ВидЦеныСсылка;
// Заполняем товары
Для Каждого СтрокаТЧ Из Источник.Товары Цикл
НоваяСтрока = НовыйДок.Товары.Добавить();
НоваяСтрока.Номенклатура = СтрокаТЧ.Номенклатура;
НоваяСтрока.Характеристика = СтрокаТЧ.Характеристика;
НоваяСтрока.ВидЦены = ВидЦеныСсылка;
НоваяСтрока.Цена = СтрокаТЧ.Цена; // Здесь логика подстановки цены из ТЧ поступления
КонецЦикла;
// Записываем и проводим документ
Попытка
НовыйДок.Записать(РежимЗаписиДокумента.Проведение);
Исключение
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Ошибка при автосоздании установки цен: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Поскольку в условии задачи фигурируют три валюты (USD, EUR, RUB), нам нужно усложнить алгоритм. Выясним причину, по которой нельзя просто копировать цену: вид цены в 1С жестко привязан к определенной валюте. Выполним сопоставление по следующему алгоритму:
ПоступлениеТоваровУслуг (через реквизит Валюта).ВидыЦен тот элемент, у которого валюта совпадает с валютой поступления.УстановкаЦенНоменклатуры.Проанализируем пример сопоставления:
ВалютаДокумента = Источник.Валюта;
ВидЦеныДляУстановки = Справочники.ВидыЦен.ПустаяСсылка();
Если ВалютаДокумента = Константы.ВалютаДоллар.Получить() Тогда
ВидЦеныДляУстановки = Справочники.ВидыЦен.НайтиПоНаименованию("Заводская USD");
ИначеЕсли ВалютаДокумента = Константы.ВалютаЕвро.Получить() Тогда
ВидЦеныДляУстановки = Справочники.ВидыЦен.НайтиПоНаименованию("Заводская EUR");
КонецЕсли;
Важно помнить, что в 1С:УТ 11 документ УстановкаЦенНоменклатуры является технически сложным. Он использует дополнительные табличные части для хранения расчетных данных. При программном заполнении через СоздатьДокумент() система может потребовать заполнения не только основной ТЧ Товары, но и служебных реквизитов.
Рассмотрим альтернативный подход: Регламентное задание. Вместо того чтобы создавать документ при каждом проведении закупки (что может замедлять работу пользователей), мы можем настроить запуск обработки раз в час. Программа будет собирать все новые поступления за период и создавать один сводный документ установки цен. Это снизит нагрузку на базу данных и решит проблему блокировок.
Проанализируем ключевые моменты, которые часто упускают при разработке подобного функционала:
СтрокаТЧ.Характеристика в новый документ. Если этого не сделать, цена установится на номенклатуру в целом, и в заказах клиентов для конкретных размеров или цветов цена не подставится.ЦенаЗаЕдиницу = СтрокаТЧ.Цена / СтрокаТЧ.Коэффициент.Статус = Согласован цены не будут считаться действующими. Документ просто сохранится в черновиках.Таким образом, мы рассмотрели два основных пути решения задачи: настройку видов цен через СКД и программную реализацию через подписку на события. Для начинающего разработчика рекомендуется сначала освоить типовой механизм "Цены поступления", так как он не требует поддержки кода при обновлении конфигурации.