Как в запросе 1С сопоставить разные типы перечислений: ВидыПродукцииИС и ОсобенностиУчетаНоменклатуры

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

При разработке функционала для работы с системой «Честный знак» (ГИС МТ) программисты часто сталкиваются с архитектурной особенностью типовых конфигураций 1С (ERP, КА, УТ). Проблема заключается в том, что в справочнике ВидыНоменклатуры используется перечисление ОсобенностиУчетаНоменклатуры, а в регистре сведений НастройкиУчетаМаркируемойПродукцииИСМП — перечисление ВидыПродукцииИС. Несмотря на то что названия элементов (например, «Табак» или «Обувь») визуально идентичны, для платформы 1С это принципиально разные типы данных, которые невозможно связать простым условием соединения в запросе.

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

Почему типы данных различаются

Разберем причину разделения. Перечисление ОсобенностиУчетаНоменклатуры отвечает за внутреннюю логику системы 1С: как должны вести себя документы, нужно ли открывать форму подбора кодов маркировки и какие проверки выполнять. Перечисление ВидыПродукцииИС — это более «узкий» технический классификатор, предназначенный для прямого взаимодействия с API системы «Честный знак». Одна особенность учета в 1С (например, молочная продукция) может соответствовать нескольким видам продукции в ИС МП в зависимости от законодательных актов.

Способ 1. Использование оператора ВЫБОР в запросе

Проанализируем самый простой, но «жесткий» способ. Если список категорий маркируемого товара в вашей компании невелик и редко меняется, можно выполнить преобразование типов прямо в тексте запроса. Мы создадим виртуальное поле в первой таблице, которое будет иметь тот же тип, что и во второй.

Рассмотрим пример кода запроса:


ВЫБРАТЬ
    ВидыНоменклатуры.Ссылка КАК ВидНоменклатуры,
    ВЫБОР
        КОГДА ВидыНоменклатуры.ОсобенностьУчета = ЗНАЧЕНИЕ(Перечисление.ОсобенностиУчетаНоменклатуры.Табак)
            ТОГДА ЗНАЧЕНИЕ(Перечисление.ВидыПродукцииИС.Табак)
        КОГДА ВидыНоменклатуры.ОсобенностьУчета = ЗНАЧЕНИЕ(Перечисление.ОсобенностиУчетаНоменклатуры.Обувь)
            ТОГДА ЗНАЧЕНИЕ(Перечисление.ВидыПродукцииИС.ОбувнаяПродукция)
        КОГДА ВидыНоменклатуры.ОсобенностьУчета = ЗНАЧЕНИЕ(Перечисление.ОсобенностиУчетаНоменклатуры.МолочнаяПродукция)
            ТОГДА ЗНАЧЕНИЕ(Перечисление.ВидыПродукцииИС.МолочнаяПродукцияПодконтрольнаяВЕТИС)
        ИНАЧЕ ЗНАЧЕНИЕ(Перечисление.ВидыПродукцииИС.ПустаяСсылка)
    КОНЕЦ КАК ВидПродукцииДляСвязи
ПОМЕСТИТЬ ВТ_ВидыНоменклатуры
ИЗ
    Справочник.ВидыНоменклатуры КАК ВидыНоменклатуры;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ.ВидНоменклатуры,
    Настройки.ДатаКонтрольПроизводства
ИЗ
    ВТ_ВидыНоменклатуры КАК ВТ
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиУчетаМаркируемойПродукцииИСМП КАК Настройки
        ПО ВТ.ВидПродукцииДляСвязи = Настройки.ВидПродукции

Преимущества: не требует создания новых объектов метаданных.
Недостатки: при добавлении новых категорий маркировки в 1С (например, «Пиво» или «БАДЫ») запрос придется переписывать вручную.

Способ 2. Использование временной таблицы соответствия (Маппинг)

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

Разберем алгоритм реализации по шагам:

  1. Создаем таблицу значений с двумя колонками разных типов.
  2. Заполняем её, сопоставляя элементы программно (например, через поиск по имени метаданных).
  3. Передаем таблицу в запрос и помещаем во временную таблицу (ВТ).
  4. Соединяем основные данные с этой ВТ.

Посмотрим на пример реализации на языке 1С:


// 1. Подготовка таблицы соответствия
ТаблицаСоответствия = Новый ТаблицаЗначений;
ТаблицаСоответствия.Колонки.Добавить("ОсобенностьУчета", Новый ОписаниеТипов("ПеречислениеСсылка.ОсобенностиУчетаНоменклатуры"));
ТаблицаСоответствия.Колонки.Добавить("ВидПродукцииИС", Новый ОписаниеТипов("ПеречислениеСсылка.ВидыПродукцииИС"));

// 2. Автоматическое заполнение по именам
Для Каждого ТекОсобенность Из Перечисления.ОсобенностиУчетаНоменклатуры Цикл
    ИмяОсобенности = Метаданные.Перечисления.ОсобенностиУчетаНоменклатуры.ЗначенияПеречисления[Перечисления.ОсобенностиУчетаНоменклатуры.Индекс(ТекОсобенность)].Имя;
    
    // Пытаемся найти одноименное значение в другом перечислении
    Попытка
        ВидИС = Перечисления.ВидыПродукцииИС[ИмяОсобенности];
        НоваяСтрока = ТаблицаСоответствия.Добавить();
        НоваяСтрока.ОсобенностьУчета = ТекОсобенность;
        НоваяСтрока.ВидПродукцииИС = ВидИС;
    Исключение
        // Если имена не совпадают (например, Обувь vs ОбувнаяПродукция), прописываем исключения вручную
        Если ИмяОсобенности = "Обувь" Тогда
            НоваяСтрока = ТаблицаСоответствия.Добавить();
            НоваяСтрока.ОсобенностьУчета = ТекОсобенность;
            НоваяСтрока.ВидПродукцииИС = Перечисления.ВидыПродукцииИС.ОбувнаяПродукция;
        КонецЕсли;
    КонецПопытки;
КонецЦикла;

// 3. Передача в запрос
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ * ПОМЕСТИТЬ ВТ_Соответствие ИЗ &ТаблицаСоответствия КАК ТаблицаСоответствия;
    |
    |ВЫБРАТЬ
    |   ВидыНоменклатуры.Ссылка,
    |   Настройки.ДатаКонтрольПроизводства
    |ИЗ
    |   Справочник.ВидыНоменклатуры КАК ВидыНоменклатуры
    |   ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Соответствие КАК Соответствие
    |       ПО ВидыНоменклатуры.ОсобенностьУчета = Соответствие.ОсобенностьУчета
    |   ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиУчетаМаркируемойПродукцииИСМП КАК Настройки
    |       ПО Соответствие.ВидПродукцииИС = Настройки.ВидПродукции";

Запрос.УстановитьПараметр("ТаблицаСоответствия", ТаблицаСоответствия);
Результат = Запрос.Выполнить();

Способ 3. Использование типовых функций 1С

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

Часто встречается функция вида ВидПродукцииПоОсобенностиУчета(ОсобенностьУчета). Вы можете использовать её в цикле перед формированием запроса, чтобы собрать массив нужных видов продукции и передать его в условие ГДЕ ВидПродукции В (&МассивВидов).

Важные нюансы при работе с датами контроля

При проверке дат начала прослеживаемости через регистр НастройкиУчетаМаркируемойПродукцииИСМП следует учитывать несколько критических моментов:

Рекомендация для перфекционистов

Если вам часто требуется связывать эти данные в разных частях системы, лучшим решением будет создание Служебного Регистра Сведений (например, СоответствиеКатегорийМаркировки). Вы можете заполнить его один раз (автоматически при обновлении или вручную) и использовать во всех запросах. Это избавит вас от необходимости передавать таблицы параметров и сделает ваши запросы максимально читаемыми и производительными.

Таким образом, мы выяснили, что проблема разных типов — это не ошибка, а следствие разделения бизнес-логики и интеграционных механизмов. Используя метод временных таблиц или программного маппинга, вы сможете создавать надежные и легко поддерживаемые решения для работы с маркируемым товаром.

← На главную