Почему не отображаются цены в документе «Установка цен номенклатуры» при программном создании?

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

При автоматизации работы в современных конфигурациях на базе 1С:ERP 2.5, Комплексная автоматизация 2.5 или Управление торговлей 11.5 программисты часто сталкиваются с ситуацией: документ УстановкаЦенНоменклатуры создается, проводится, данные в табличных частях присутствуют, но при открытии формы колонки с ценами пустуют. Рассмотрим подробно, почему это происходит и как правильно заполнять документ программно, чтобы интерфейс отображал данные корректно.

Разберем архитектуру ценообразования версии 2.5

В новых редакциях конфигураций механизм ценообразования претерпел значительные изменения. Главное отличие — переход от использования обычных характеристик номенклатуры к специализированному справочнику ХарактеристикиНоменклатурыДляЦенообразования (далее — ХарактеристикаЦО). Это сделано для оптимизации хранения данных и возможности устанавливать единые цены на разные физические характеристики. Если мы заполняем документ «по старинке», интерфейс просто не «подцепляет» данные к динамическим колонкам формы.

Проанализируем ключевую причину: реквизит ХарактеристикаЦО

Выясним причину, которая чаще всего мешает визуализации цен. В табличной части Товары2_5 существует реквизит ХарактеристикаЦО. Рассмотрим правила его заполнения:

  1. Если для номенклатуры ведется учет по характеристикам, в это поле должна записываться ссылка на элемент справочника ХарактеристикиНоменклатурыДляЦенообразования. Важно понимать, что это не то же самое, что ссылка из справочника ХарактеристикиНоменклатуры. Система должна найти или создать соответствие в справочнике «для ценообразования».
  2. Если для номенклатуры не ведется учет по характеристикам, реквизит ХарактеристикаЦО не может быть пустым или иметь значение Неопределено. В него обязательно должна быть записана пустая ссылка соответствующего типа.

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


// Если учет по характеристикам не ведется
НоваяСтрока.ХарактеристикаЦО = Справочники.ХарактеристикиНоменклатурыДляЦенообразования.ПустаяСсылка();

Как показывает практика, именно отсутствие явного указания пустой ссылки специального типа приводит к тому, что в коде цена есть, а на форме — нет.

Выбор правильной табличной части: Товары или Товары2_5

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

Заполнение обеих таблиц одновременно не требуется и может привести к конфликтам при проведении или отображении данных.

Регистрация выбранных видов цен

Рассмотрим еще один важный аспект. Форма документа УстановкаЦенНоменклатуры строится динамически. Колонки в ней появляются только для тех видов цен, которые указаны в служебной табличной части ВидыЦен документа. Проверим наш код: если мы добавили товар с определенным видом цены в Товары2_5, но не добавили этот же вид цены в таблицу ВидыЦен, колонка на форме просто не будет отрисована.

Разберем по шагам алгоритм регистрации вида цены в документе:


НСтрокаВидЦен = УстановкаЦенНоменклатуры.ВидыЦен.Добавить();
НСтрокаВидЦен.ВидЦены = НужныйВидЦеныСсылка; // Ссылка на справочник ВидыЦен

Влияние флага «Цена изменена вручную»

В ценообразовании 2.5 важную роль играет реквизит ЦенаИзмененаВручную. Рассмотрим, на что он влияет. Если вы программно назначаете конкретное число в поле Цена, но оставляете ЦенаИзмененаВручную = Ложь, система при открытии формы или проведении может попытаться пересчитать эту цену по правилам, заданным в способе задания цены (например, наценка на базовый вид). Если база для расчета не найдена, цена может обнулиться.

Рекомендация: При программной установке фиксированных цен всегда устанавливайте этот флаг в значение Истина.


НоваяСтрока.Цена = 1500;
НоваяСтрока.ЦенаИзмененаВручную = Истина;

Использование валюты и упаковок

Проанализируем дополнительные реквизиты. Хотя валюта часто берется из настроек вида цены, в некоторых случаях (особенно при ручном заполнении в коде) важно явно указать валюту в строке. Также убедитесь, что если в системе используются упаковки, реквизит Упаковка заполнен корректно. Если цена устанавливается за единицу хранения, поле Упаковка должно содержать пустую ссылку.

Пример итогового кода создания документа

Соберем все вышеперечисленные правила в единый работающий алгоритм:


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

Подведем итоги

Для того чтобы цены корректно отображались в интерфейсе 1С:УТ 11.5 / ERP 2.5, необходимо соблюдать три условия: правильно заполнять ХарактеристикаЦО (даже если характеристик нет), регистрировать виды цен в соответствующей табличной части документа и использовать таблицу Товары2_5. Следуя этим правилам, мы обеспечим корректную работу механизмов ценообразования и отсутствие проблем у конечных пользователей при просмотре документов.

← На главную