В конфигурациях 1С:Комплексная автоматизация 2.5 и 1С:ERP Управление предприятием 2.5 механизм ценообразования существенно отличается от простых конфигураций. Одной из частых задач программиста является автоматическая загрузка цен из внешних источников с последующим расчетом зависимых цен (например, «Розничная», которая считается как «Оптовая + %»). Для этой задачи подойдёт внешняя обработка для загрузки цен из файлов Excel в ERP 2.5 и КА 2.
Многие разработчики сталкиваются с проблемой: при программном создании документа зависимые цены не пересчитываются автоматически, если просто записать документ. Создание промежуточных документов и их последующее удаление — это «костыльный» метод, который замедляет работу системы и засоряет базу данных. Проанализируем, как сделать это правильно и «красиво».
Стандартный механизм, который использует форма документа, основан на функции Документы.УстановкаЦенНоменклатуры.ЗаписатьИзмененияЦенНаСервере. Это мощный инструмент, который позволяет передать подготовленную структуру данных, а система сама создаст документ, заполнит его и проведет расчеты.
Рассмотрим структуру, которую необходимо подготовить перед вызовом этого метода. Основная сложность заключается в том, что в структуру нужно передать не только сами товары, но и метаданные о видах цен. Разберем пример формирования такой структуры:
// Подготовка структуры для записи цен
СтруктураФормы = Новый Структура;
СтруктураФормы.Вставить("Дата", ТекущаяДата());
СтруктураФормы.Вставить("Согласован", Истина);
СтруктураФормы.Вставить("Статус", Перечисления.СтатусыУстановокЦенНоменклатуры.Действует);
// Формируем таблицу видов цен
ТаблицаВидовЦен = Новый ТаблицаЗначений;
ТаблицаВидовЦен.Колонки.Добавить("ВидЦены");
ТаблицаВидовЦен.Колонки.Добавить("Настройка"); // Настройка расчета
НоваяСтрокаВида = ТаблицаВидовЦен.Добавить();
НоваяСтрокаВида.ВидЦены = СсылкаНаБазовыйВидЦены;
СтруктураФормы.Вставить("ВидыЦен", ТаблицаВидовЦен);
// Формируем таблицу товаров
ТаблицаТовары = Новый ТаблицаЗначений;
ТаблицаТовары.Колонки.Добавить("Номенклатура");
ТаблицаТовары.Колонки.Добавить("Характеристика");
// Для каждого вида цены в документе должна быть колонка с идентификатором вида цены
ИдентификаторЦены = "Цена_" + СтрЗаменить(Строка(СсылкаНаБазовыйВидЦены.УникальныйИдентификатор()), "-", "");
ТаблицаТовары.Колонки.Добавить(ИдентификаторЦены);
// Заполняем данные...
// Вызываем типовой метод
Документы.УстановкаЦенНоменклатуры.ЗаписатьИзмененияЦенНаСервере(СтруктураФормы, "Загрузка из файла", 1);
Если нам нужно рассчитать зависимые цены без участия интерактивных механизмов формы, следует обратиться к серверному API конфигурации. Основная логика сосредоточена в модуле ЦенообразованиеСервер. Рассмотрим ситуацию, когда у нас есть базовая цена, и мы хотим получить значения для всех зависимых цен, формулы которых прописаны в справочнике ВидыЦен.
Выясним причину, почему обычное заполнение объекта документа не всегда работает: формулы требуют контекста других цен. Чтобы система «увидела» базовую цену для расчета, она должна либо уже существовать в регистре на дату документа, либо присутствовать в этой же таблице цен.
Посмотрим на алгоритм использования модуля ЦенообразованиеСервер для расчета:
ЦенообразованиеСервер.РассчитатьЦеныПоДаннымДругихВидовЦен.Проанализируем пример кода для автоматического заполнения зависимых строк:
// Создаем объект документа
ДокОбъект = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
ДокОбъект.Дата = ТекущаяДата();
ДокОбъект.Статус = Перечисления.СтатусыУстановокЦенНоменклатуры.Действует;
ДокОбъект.Согласован = Истина;
// Добавляем виды цен в ТЧ документа
Для Каждого ТекВидЦены Из СписокНужныхВидовЦен Цикл
НоваяСтрока = ДокОбъект.ВидыЦен.Добавить();
НоваяСтрока.ВидЦены = ТекВидЦены;
КонецЦикла;
// Заполняем товары базовой ценой
// ... заполнение ТЧ Товары ...
// Вызываем пересчет зависимых цен
ПараметрыРасчета = ЦенообразованиеСервер.ПараметрыРасчетаЦен();
ПараметрыРасчета.Дата = ДокОбъект.Дата;
// В параметрах указываем, какие виды цен являются базовыми
ЦенообразованиеСервер.РассчитатьЦеныПоФормулам(ДокОбъект, ПараметрыРасчета);
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
Важно помнить, что в последних версиях 1С:КА 2.5 механизмы стали более требовательными. Рассмотрим ключевые моменты, которые помогут избежать ошибок:
УстановкаЦенНоменклатуры обязательно должны присутствовать оба этих вида цен в табличной части ВидыЦен.ЦеныНоменклатуры.ЦенообразованиеВызовСервера.РассчитатьЦеныВФоне. Это позволит избежать таймаутов сервера и обеспечит стабильную работу системы.Подводя итог, «красивое» решение заключается в отказе от удаления документов. Вместо схемы «Создать базовый -> Создать расчетный -> Удалить базовый», мы используем схему «Подготовить данные в памяти -> Создать один итоговый документ».
Для этого мы формируем таблицу значений, в которой присутствуют все необходимые колонки. Если в справочнике ВидыЦен для зависимой цены указан способ расчета «По другим видам цен», система ERP/КА сама подставит нужные значения при вызове процедур из ЦенообразованиеСервер или ЦенообразованиеКлиентСервер (в зависимости от контекста выполнения).
Таким образом, мы минимизируем нагрузку на базу данных, исключаем разрывы в нумерации документов и гарантируем, что все записи в регистрах сведений будут консистентными и актуальными на момент проведения документа. Если требуется внедрить подобный функционал без самостоятельной разработки, можно использовать готовую обработку для создания установок цен и их автоматического пересчета по правилам.