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