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