При переходе на новые версии программы 1С:Управление торговлей 11 (УТ 11), 1С:Комплексная автоматизация 2 (КА 2) или 1С:ERP многие пользователи и администраторы сталкиваются с неочевидным поведением системы при регистрации цен. В старой версии 1С:Управление торговлей 10.3 цены поставщиков могли напрямую влиять на расчетные цены без создания дополнительных документов. В современных конфигурациях этот механизм претерпел серьезные архитектурные изменения.
Разберем детально, почему зарегистрированные в документе поступления цены поставщика автоматически не обновляют вашу внутреннюю «Закупочную» цену, и рассмотрим все возможные варианты решения этой задачи: от стандартных ручных настроек до полной автоматизации процесса.
Для начала проанализируем ситуацию и выясним причину такого поведения программы. В редакции 10.3 существовало понятие «Динамический тип цен». Такие цены рассчитывались буквально «на лету» в момент подбора товаров в документы или при формировании отчетов. Система обращалась к базовой цене (например, цене поставщика), применяла наценку и выводила результат без физической записи в базу данных.
В современных конфигурациях на платформе 1С:Предприятие 8.3 (УТ 11, КА 2, ERP) разработчики полностью отказались от концепции динамических цен в пользу производительности и стабильности базы данных. Теперь актуальны следующие правила:
ЦеныНоменклатуры.УстановкаЦенНоменклатуры. Проведение документа закупки ПриобретениеТоваровУслуг (даже с включенным флагом «Регистрировать цены поставщика») делает записи только в регистр цен поставщиков, но никак не влияет на ваши внутренние цены номенклатуры.Таким образом, чтобы обновить ваши закупочные цены, система обязательно должна создать и провести документ УстановкаЦенНоменклатуры.
Прежде чем переходить к обновлению цен, необходимо убедиться, что ваш внутренний вид цены правильно взаимосвязан с ценами поставщиков. Разберем по шагам, как настроить карточку вида цены:
Если документов поступления в течение дня оформляется много, ручной ввод на основании каждого поступления (команда «Создать на основании» — «Установка цен номенклатуры») становится трудоемким процессом. Рассмотрим более удобный штатный способ массового расчета цен без программирования:
После выполнения этих действий система автоматически сгенерирует и проведет один общий документ УстановкаЦенНоменклатуры на всю изменившуюся номенклатуру, что исключает необходимость работать с каждым поступлением по отдельности.
Если ручной запуск обработки «Прайс-лист» вам не подходит и требуется, чтобы цены обновлялись полностью автоматически (например, ночью или каждый час), наилучшим решением будет использование встроенного механизма регламентных заданий.
Для реализации этого механизма программист может написать небольшую процедуру, которая будет выполняться на сервере по расписанию. Рассмотрим пример кода, который автоматически находит последние закупки, рассчитывает новые закупочные цены и создает документ УстановкаЦенНоменклатуры:
Процедура АвтоматическийРасчетЗакупочныхЦен() Экспорт
// Определяем вид цен, который нужно обновить
СсылкаНаВидЦены = Справочники.ВидыЦен.НайтиПоНаименованию("Закупочная");
Если Не ЗначениеЗаполнено(СсылкаНаВидЦены) Тогда
ВызватьИсключение "Не найден вид цен 'Закупочная'!";
КонецЕсли;
// Формируем таблицу новых цен по данным информационной базы
ТаблицаЦен = ПолучитьАктуальныеЦеныПоступления(СсылкаНаВидЦены);
Если ТаблицаЦен.Количество() > 0 Тогда
// Создаем новый документ Установка цен номенклатуры
ДокументУстановка = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
ДокументУстановка.Дата = ТекущаяДата();
ДокументУстановка.Согласован = Истина;
ДокументУстановка.Статус = Перечисления.СтатусыУстановокЦенНоменклатуры.Действует;
// Заполняем виды цен в документе
НоваяСтрокаВида = ДокументУстановка.ВидыЦен.Добавить();
НоваяСтрокаВида.ВидЦены = СсылкаНаВидЦены;
// Заполняем товары и рассчитанные цены
Для Каждого СтрокаДанных Из ТаблицаЦен Цикл
НоваяСтрокаТовара = ДокументУстановка.Товары.Добавить();
НоваяСтрокаТовара.Номенклатура = СтрокаДанных.Номенклатура;
НоваяСтрокаТовара.ВидЦены = СсылкаНаВидЦены;
НоваяСтрокаТовара.Цена = СтрокаДанных.НоваяЦена;
КонецЦикла;
// Записываем и проводим документ
Попытка
ДокументУстановка.Записать(РежимЗаписиДокумента.Проведение);
ЗаписьЖурналаРегистрации("Автоустановка цен", УровеньЖурналаРегистрации.Информация, , , "Успешно создан документ: " + ДокументУстановка.Ссылка);
Исключение
ЗаписьЖурналаРегистрации("Автоустановка цен", УровеньЖурналаРегистрации.Ошибка, , , "Ошибка проведения: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Для внедрения этого кода достаточно создать новое регламентное задание в вашей базе данных через конфигуратор или использовать механизм расширений, чтобы не снимать конфигурацию с поддержки. Это обеспечит актуальность ваших внутренних цен без участия человека.