Почему не заполняются характеристики при программном заполнении табличной части в 1С:УТ 11 и как это исправить?

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

При разработке внешних обработок заполнения табличных частей для конфигураций на базе ERP-платформы (таких как «1С:Управление торговлей 11», «1С:Комплексная автоматизация 2» или «1С:ERP») программисты часто сталкиваются с неприятным поведением интерфейса. Внешне код выглядит абсолютно корректно: номенклатура и характеристики успешно считываются и записываются в строку табличной части. В отладчике мы четко видим, что все поля заполнены нужными ссылками. Однако на форме документа пользователь видит пустую ячейку с сообщением «<Характеристики не используются>».

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

Выясняем причину: как это устроена «под капотом» формы

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

Давайте разберем ключевые особенности реализации этого механизма:

  1. В табличной части Товары на уровне формы присутствует специальный служебный реквизит ХарактеристикиИспользуются с типом данных Булево. Этот реквизит является реквизитом формы и не сохраняется в базе данных.
  2. На форму наложено правило условного оформления: если в строке табличной части значение реквизита ХарактеристикиИспользуются равно Ложь, то для ячейки Характеристика применяется оформление: текст по умолчанию заменяется на <Характеристики не используются>, а сама ячейка блокируется для редактирования.
  3. При интерактивном добавлении строки или выборе номенклатуры срабатывают стандартные обработчики событий формы. Они обращаются к свойствам выбранного товара (или его вида номенклатуры), определяют, ведется ли по нему учет в разрезе характеристик, и устанавливают значение ХарактеристикиИспользуются в Истина или Ложь.
  4. При программном заполнении табличной части (например, через внешнюю обработку заполнения ТЧ) стандартные интерактивные события формы не вызываются. Программа напрямую записывает данные в объект, минуя логику формы. В результате служебный реквизит ХарактеристикиИспользуются остается в значении по умолчанию (Ложь), что и приводит к блокировке отображения характеристики на форме.

Теперь, когда причина поведения системы нам понятна, рассмотрим способы решения этой проблемы.

Способ 1. Использование типовых механизмов (по «фэншую»)

В конфигурациях 1С, построенных на базе ERP-платформы, реализована мощная подсистема для работы с номенклатурой. Чтобы не изобретать велосипед и гарантировать, что все служебные поля (включая информацию о характеристиках, сериях и типах номенклатуры) заполнятся корректно, рекомендуется использовать процедуры общего модуля НоменклатураСервер.

Рассмотрим пример кода, который необходимо вызвать в серверной части вашей обработки после того, как вы заполнили основную часть реквизитов (таких как Номенклатура, Характеристика, Количество и др.):


// Шаг 1. Создаем структуру параметров для заполнения служебных реквизитов.
// Мы указываем системе, что нам требуется рассчитать признак использования характеристик.
ПараметрыЗаполненияРеквизитов = Новый Структура;
ПараметрыЗаполненияРеквизитов.Вставить(
    "ЗаполнитьПризнакХарактеристикиИспользуются", 
    Новый Структура("Номенклатура", "ХарактеристикиИспользуются")
);

// Шаг 2. Вызываем типовой метод общего модуля для всей коллекции строк.
// В качестве первого параметра передается табличная часть документа (например, Объект.Товары).
НоменклатураСервер.ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции(
    Объект.Товары, 
    ПараметрыЗаполненияРеквизитов
);

Преимущества этого способа: Это наиболее надежный и методически верный вариант. Типовой метод самостоятельно обратится к кэшированным данным настроек видов номенклатуры, проанализирует особенности каждой позиции в табличной части и установит флаги ХарактеристикиИспользуются в строгое соответствие с бизнес-логикой системы.

Способ 2. Быстрое заполнение реквизита в цикле (альтернативный вариант)

Если по каким-то причинам вы не хотите задействовать тяжелые вызовы серверных процедур общего модуля или точно уверены, что для всех загружаемых позиций характеристики должны быть включены, можно установить это значение принудительно в цикле обхода ТЧ.

Давайте посмотрим на пример реализации такого обхода:


Для Каждого СтрокаТЧ Из Объект.Товары Цикл
    
    // Заполняем основные реквизиты строки номенклатуры
    СтрокаТЧ.Номенклатура = СсылкаНаТовар;
    СтрокаТЧ.Характеристика = СсылкаНаХарактеристику;
    
    // Принудительно взводим флаг использования характеристики на форме
    СтрокаТЧ.ХарактеристикиИспользуются = Истина;
    
КонецЦикла;

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


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

Преимущества этого способа: Высокая скорость выполнения кода, отсутствие зависимости от обновлений интерфейса общих модулей (если они подвергнутся рефакторингу со стороны вендора).

Важные нюансы: сохранение признака при перезаписи и открытии

Поскольку реквизиты формы, отвечающие за видимость элементов (такие как ХарактеристикиИспользуются), не сохраняются в базе данных, их значения могут сбрасываться при перезаписи документа или его повторном открытии.

Чтобы избежать ситуации, когда при открытии уже сохраненного документа характеристики снова блокируются, обратите внимание на следующие моменты:


НоменклатураСервер.УстановитьУсловноеОформлениеХарактеристикНоменклатуры(
    ЭтаФорма, 
    "ИмяВашейТЧХарактеристика", 
    "ИмяВашейТЧХарактеристикиИспользуются"
);

Подводя итог, отметим, что при работе с современными конфигурациями 1С крайне важно разделять данные, хранящиеся в базе данных, и служебные реквизиты, предназначенные для динамического управления интерфейсом управляемых форм. Программное заполнение всегда требует явной инициализации таких элементов управления.

← На главную