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