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

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

В конфигурации «Управление торговлей», редакция 10.3 (на обычных формах), разработчики часто сталкиваются с парадоксальной ситуацией: при открытии документа УстановкаЦенНоменклатуры табличная часть кажется пустой или содержит нулевые значения цен, хотя запрос к базе данных или обращение к объекту через консоль кода показывает, что данные в табличной части Товары присутствуют. Рассмотрим детально, почему так происходит, как устроена архитектура этого документа и каким образом можно найти и исправить проблемные документы.

Архитектурные особенности документа «Установка цен номенклатуры»

Для начала проанализируем, как 1С хранит данные этого документа. В отличие от большинства простых документов, где данные на форме напрямую отображают реквизиты табличной части, здесь используется механизм «матричного» или «сводного» отображения. Данные в базе хранятся в «плоском» виде в табличной части Товары, а на форме они трансформируются в таблицу, где типы цен становятся колонками.

Основные элементы этой архитектуры:

  1. Табличная часть Товары: содержит строки с номенклатурой, характеристикой, типом цен и самой ценой. Если для одной позиции номенклатуры устанавливается три типа цен (например, Оптовая, Розничная и Закупочная), в этой ТЧ будет три отдельные записи.
  2. Табличная часть ТипыЦен: служит «описателем» колонок для формы. Именно на основе этого списка система понимает, какие типы цен нужно выводить в горизонтальный ряд.
  3. Реквизит ИндексСтрокиТаблицыЦен: скрытый, но критически важный числовой реквизит в ТЧ Товары. Он служит «ключом» для группировки нескольких физических строк из базы в одну визуальную строку на форме.

Почему цены «невидимы» на форме

Выясним причину, по которой визуально цены отсутствуют. Когда вы открываете форму документа, срабатывает программный алгоритм построения таблицы. Если при программном создании документа (обработкой или загрузкой) были допущены ошибки в заполнении связанных данных, алгоритм «сборки» формы просто не находит данные для отображения.

Разберем основные причины «пустоты»:

Программная логика построения колонок

Посмотрим на пример кода из модуля формы документа, который отвечает за динамическое создание колонок. Процедура ОбновитьСоставКолонок считывает данные из ТЧ ТипыЦен и программно добавляет элементы формы.


// Процедура устанавливает колонки табличной части в требуемом порядке,
// добавляет недостающие колонки, убирает ненужные.
Процедура ОбновитьСоставКолонок()
    КолонкиТаблицыЦен = ТаблицаЦен.Колонки;
    ОчереднойНомерКолонки = 1;
    
    // Стандартные колонки: Код, Артикул, Номенклатура
    ТекущаяКолонка = КолонкиТаблицыЦен.Найти("Номенклатура");
    СдвинутьКолонку(ТекущаяКолонка, ОчереднойНомерКолонки);
    
    // Перебор типов цен из соответствующей табличной части документа
    Для Каждого СтрокаТипаЦен Из ТипыЦен Цикл
        Если НЕ ЗначениеЗаполнено(СтрокаТипаЦен.ТипЦен) Тогда
            Продолжить;
        КонецЕсли;
        
        // Определение внутреннего номера колонки через соответствие
        НомерСоответствияТекущейКолонки = мСоответствиеТиповЦен[СтрокаТипаЦен.ТипЦен];
        
        // Создание колонки "Цена" для конкретного типа цен
        ТекущаяКолонка = КолонкиТаблицыЦен.Найти("цена" + НомерСоответствияТекущейКолонки);
        Если ТекущаяКолонка = Неопределено Тогда 
            КолонкиТаблицыЦен.Вставить(ОчереднойНомерКолонки, "цена" + НомерСоответствияТекущейКолонки, 
                ОбщегоНазначения.ПолучитьОписаниеТиповЧисла(15, 2, ДопустимыйЗнак.Неотрицательный), 
                СокрЛП(СтрокаТипаЦен.ТипЦен), 10);
            ОчереднойНомерКолонки = ОчереднойНомерКолонки + 1;
        КонецЕсли;
        
        // Аналогично создаются колонки: СпособРасчета, Валюта, Единица, Процент
    КонецЦикла;
    
    // Принудительное обновление элементов формы
    ЭлементыФормы.ТаблицаЦен.СоздатьКолонки();
КонецПроцедуры

Из этого кода становится ясно: если в коллекции ТипыЦен нет данных, цикл просто не выполнится, и колонки цена1, цена2 и так далее не появятся на форме. Данные в объекте (в базе) останутся, но пользователь их не увидит.

Как найти проблемные документы запросом

Для того чтобы выявить документы, созданные с ошибками (где данные в ТЧ Товары есть, а отображение будет некорректным), проанализируем ситуацию с помощью запроса. Нам нужно найти документы, в которых типы цен в основной таблице не совпадают с типами цен в служебной таблице «шапки» документа.

Рассмотрим пример запроса, который находит «потерянные» цены:


ВЫБРАТЬ
    УстановкаТовары.Ссылка КАК Документ,
    УстановкаТовары.Номенклатура,
    УстановкаТовары.ТипЦен КАК ТипЦенВТоварах,
    УстановкаТипы.ТипЦен КАК ТипЦенВШапке
ИЗ
    Документ.УстановкаЦенНоменклатуры.Товары КАК УстановкаТовары
ЛЕВОЕ СОЕДИНЕНИЕ 
    Документ.УстановкаЦенНоменклатуры.ТипыЦен КАК УстановкаТипы
    ПО УстановкаТовары.Ссылка = УстановкаТипы.Ссылка
    И УстановкаТовары.ТипЦен = УстановкаТипы.ТипЦен
ГДЕ
    УстановкаТипы.ТипЦен ЕСТЬ NULL

Важный момент: если этот запрос возвращает строки, значит, данные в этих документах «битые». Чтобы цены отобразились на форме, необходимо программно или вручную добавить недостающие типы цен в ТЧ ТипыЦен этих документов и пересчитать ИндексСтрокиТаблицыЦен.

Рекомендации по исправлению и профилактике

Если вы столкнулись с этой проблемой после работы стороннего загрузчика данных, рекомендуем выполнить следующие шаги:

  1. Восстановление ТЧ ТипыЦен: Пройдитесь обработкой по документам, соберите все уникальные типы цен из ТЧ Товары и запишите их в ТЧ ТипыЦен.
  2. Проверка Индексов: Убедитесь, что для каждой уникальной пары «Номенклатура + Характеристика» в рамках одного документа установлен свой уникальный ИндексСтрокиТаблицыЦен. Именно он объединяет «плоские» строки в одну визуальную строку формы.
  3. Правильное заполнение при кодинге: При программном создании документа всегда используйте типовые механизмы или тщательно заполняйте все три составляющие: Товары, ТипыЦен и соответствие индексов в Товары.

Таким образом, «исчезновение» цен — это не потеря данных в базе, а следствие нарушения логической целостности структуры документа, специфичной для управления торговлей на обычных формах. Понимая механизм работы ОбновитьСоставКолонок и роль реквизита ИндексСтрокиТаблицыЦен, вы сможете легко диагностировать и исправлять подобные ошибки.

← На главную