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