Разберем частую проблему, с которой сталкиваются программисты при автоматизации создания прайс-листов и установки цен в конфигурации 1С:Управление торговлей 11.5 (а также в ERP 2.5 и КА 2.5). Ситуация выглядит так: при ручном создании документа через форму всё работает отлично — цены пишутся в регистр ЦеныНоменклатуры25 и подтягиваются в заказы и реализации. Однако, если мы создаем документ программно, цены по какой-то причине попадают в старый регистр ЦеныНоменклатуры, и система их «не видит» в новых документах.
Проанализируем ситуацию на примере кода, который часто пишут разработчики по привычке:
ДокУЦ = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
ДокУЦ.Дата = ТекущаяДата();
ДокУЦ.Статус = Перечисления.СтатусыУстановокЦенНоменклатуры.Согласован;
ДокУЦ.Ответственный = Пользователи.ТекущийПользователь();
ДокУЦ.Согласован = Истина;
ТЧВидЦены = ДокУЦ.ВидыЦен.Добавить();
ТЧВидЦены.ВидЦены = ВыбранныйВидЦены;
Для каждого СтрД Из ТаблицаЦен Цикл
НоваяСтрока = ДокУЦ.Товары.Добавить(); // Здесь кроется ошибка!
НоваяСтрока.Номенклатура = СтрД.Номенклатура;
НоваяСтрока.ВидЦены = ВыбранныйВидЦены;
НоваяСтрока.Цена = СтрД.Цена;
КонецЦикла;
ДокУЦ.Записать(РежимЗаписиДокумента.Проведение);
Документ успешно создается, ошибок не возникает, но цены не работают. Выясним причину такого поведения программы и посмотрим, как правильно адаптировать код.
Рассмотрим подробнее, что изменилось в системе. Начиная с версий УТ 11.5, фирма 1С внедрила переработанную подсистему, получившую название «Ценообразование 2.5». Этот функционал активируется в базе через настройки (раздел «CRM и маркетинг») и включает опцию ИспользуетсяЦенообразование25.
Чтобы обеспечить обратную совместимость со старыми базами, которые еще не перешли на новый механизм, разработчики 1С оставили в документе УстановкаЦенНоменклатуры старую логику. В результате в метаданных документа присутствуют две разные табличные части:
Товары — устаревшая табличная часть. Если при программном создании обращаться к ней, документ срабатывает по алгоритмам старой версии (11.4) и формирует движения исключительно в устаревший регистр сведений ЦеныНоменклатуры.Товары2_5 — новая табличная часть для Ценообразования 2.5. При ее заполнении система понимает, что используются новые механизмы, и корректно формирует движения по новому регистру сведений ЦеныНоменклатуры25.Когда пользователь создает документ вручную, форма автоматически определяет, какой режим включен, и заполняет нужные скрытые реквизиты. Но при программном создании мы должны явно указывать правильную табличную часть.
Посмотрим на пример того, как нужно исправить программный код. Нам достаточно заменить обращение к таблице Товары на Товары2_5.
// Правильное заполнение для версии 11.5 (Ценообразование 2.5)
Для каждого СтрД Из ТаблицаЦен Цикл
// Используем правильную табличную часть Товары2_5
НоваяСтрока = ДокУЦ.Товары2_5.Добавить();
НоваяСтрока.Номенклатура = СтрД.Номенклатура;
НоваяСтрока.ВидЦены = ВыбранныйВидЦены;
// Если используются характеристики или упаковки, их также нужно заполнить
НоваяСтрока.Валюта = ВыбраннаяВалюта;
НоваяСтрока.Цена = СтрД.Цена;
КонецЦикла;
Практический совет: Если вы сталкиваетесь с тем, что программно созданный документ ведет себя не так, как созданный вручную, всегда применяйте простой и надежный метод проверки. Создайте один документ вручную (через форму), а второй программно. Затем откройте консоль запросов или обработку просмотра объектов и сравните их пореквизитно (включая скрытые табличные части). Это позволит мгновенно обнаружить незаполненные поля или неверные таблицы.
Разберем по шагам, на что еще влияет переход на новое ценообразование, чтобы избежать дальнейших ошибок в разработке отчетов и печатных форм:
РегистрСведений.ЦеныНоменклатуры25.СрезПоследних.Обратите внимание на специфическое измерение ХарактеристикаЦО (характеристика ценообразования) в новом регистре. При получении цен запросом теперь необходимо использовать конструкцию ВЫБОР КОГДА, чтобы проверять, применяется ли отбор цен по характеристике для конкретного вида номенклатуры (через реквизит НастройкиКлючаЦенПоХарактеристике). Если ваши старые внешние обработки, расширения или отчеты обращаются к таблице ЦеныНоменклатуры, их необходимо переписать на новую логику, иначе они будут возвращать устаревшие данные или пустоту.