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