1С, зачем ты меняешь, прекрати?!

Клиент из Fresh после перехода на релиз Бухгалтерии 3.0.200.23 обратился с проблемой — перестали работать обработки по маркировке.

В этом релизе наконец-то переименовали реквизит «Вид маркировки» в «Удалить вид маркировки».

При этом поле вида маркировки заменили на флаги номенклатуры, например вместо вида «Обувная продукция» сделали флаг «Обувь». Зачем — непонятно. Предполагается что один товар может быть разного вида маркировки? Если смотреть на значения флагов «Легкая промышленность», «Легкая промышленность 2025», то можно предположить, что да. Но так ли это на самом деле?

Функции по преобразованию вида номенклатуры в флаг номенклатуры не предоставили, крутитесь, как хотите.

Какие то наметки есть в МенеджерОбменаЧерезУниверсальныйФормат13.ВидыПродукцииИСПоXDTO, но этот код не вызывает у меня доверия:

В общем, опять на пустом месте создали хаос.

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

// Функция определяет имя поля Номенклатуры по идентификатору ВидПродукцииИС
//
// Параметры:
//  ВидПродукцииИС - Строка, ПеречислениеСсылка.ВидыПродукцииИС - Идентификатор вида продукции
//
// Возвращает:
//  Строка - Имя поля Номенклатуры (если не найдено - пустая строка)
//
Функция ИмяПоляНоменклатурыПоВидуПродукцииИС(Знач ВидПродукцииИС) Экспорт
	
	// Если передан элемент перечисления, получаем его имя (идентификатор)
	ИмяВида = Строка(ВидПродукцииИС);
	
	// Сводная таблица исключений, где имена в Номенклатуре отличаются от ВидПродукцииИС
	СоответствиеИсключений = Новый Соответствие;
	СоответствиеИсключений.Вставить("Обувь",                        "ОбувнаяПродукция");
	СоответствиеИсключений.Вставить("Табак",                        "ТабачнаяПродукция");
	СоответствиеИсключений.Вставить("ПродукцияИзНатуральногоМеха",  "ПродукцияМаркируемаяДляГИСМ");
	СоответствиеИсключений.Вставить("ТоварыИзНатуральногоМеха",     "ПродукцияМаркируемаяДляГИСМ"); // На случай дублирования логики меха
	
	// Проверяем по таблице исключений
	ИмяПоля = СоответствиеИсключений[ИмяВида];
	Если ИмяПоля <> Неопределено Тогда
		Возврат ИмяПоля;
	КонецЕсли;
	
	// Список всех существующих релевантных полей Номенклатуры из вашего списка (для валидации)
	ДоступныеПоля = Новый Соответствие;
	ДоступныеПоля.Вставить("АлкогольнаяПродукцияДо9Процентов", Истина);
	ДоступныеПоля.Вставить("АльтернативныйТабак", Истина);
	ДоступныеПоля.Вставить("Антисептики", Истина);
	ДоступныеПоля.Вставить("БАДы", Истина);
	ДоступныеПоля.Вставить("Бакалея", Истина);
	ДоступныеПоля.Вставить("БезалкогольноеПиво", Истина);
	ДоступныеПоля.Вставить("БезалкогольныеНапитки", Истина);
	ДоступныеПоля.Вставить("Велосипеды", Истина);
	ДоступныеПоля.Вставить("ВетеринарныеПрепараты", Истина);
	ДоступныеПоля.Вставить("Зерно", Истина);
	ДоступныеПоля.Вставить("ЗерноВЕТИС", Истина);
	ДоступныеПоля.Вставить("ИгрыИИгрушкиДляДетей", Истина);
	ДоступныеПоля.Вставить("КабельнаяПродукция", Истина);
	ДоступныеПоля.Вставить("КонсервированнаяПродукцияБезВЕТИС", Истина);
	ДоступныеПоля.Вставить("КонсервированнаяПродукцияПодконтрольнаяВЕТИС", Истина);
	ДоступныеПоля.Вставить("КормаДляЖивотныхБезВЕТИС", Истина);
	ДоступныеПоля.Вставить("КормаДляЖивотныхВлажныеБезВЕТИС", Истина);
	ДоступныеПоля.Вставить("КормаДляЖивотныхВлажныеПодконтрольныеВЕТИС", Истина);
	ДоступныеПоля.Вставить("КормаДляЖивотныхПодконтрольныеВЕТИС", Истина);
	ДоступныеПоля.Вставить("КреслаКоляски", Истина);
	ДоступныеПоля.Вставить("ЛегкаяПромышленность", Истина);
	ДоступныеПоля.Вставить("ЛегкаяПромышленность2025", Истина);
	ДоступныеПоля.Вставить("МедицинскиеИзделия", Истина);
	ДоступныеПоля.Вставить("МедицинскиеИзделия20", Истина);
	ДоступныеПоля.Вставить("МолочнаяПродукцияБезВЕТИС", Истина);
	ДоступныеПоля.Вставить("МолочнаяПродукцияПодконтрольнаяВЕТИС", Истина);
	ДоступныеПоля.Вставить("МорепродуктыПодконтрольныеВЕТИС", Истина);
	ДоступныеПоля.Вставить("МоторныеМасла", Истина);
	ДоступныеПоля.Вставить("МясоПодконтрольноеВЕТИС", Истина);
	ДоступныеПоля.Вставить("НикотиносодержащаяПродукция", Истина);
	ДоступныеПоля.Вставить("ОптоволокноИОптоволоконнаяПродукция", Истина);
	ДоступныеПоля.Вставить("ОтопительныеПриборы", Истина);
	ДоступныеПоля.Вставить("ПарфюмерныеИКосметическиеСредстваИБытоваяХимия", Истина);
	ДоступныеПоля.Вставить("ПечатнаяПродукция", Истина);
	ДоступныеПоля.Вставить("Пиво", Истина);
	ДоступныеПоля.Вставить("ПивоВПотребительскихУпаковках", Истина);
	ДоступныеПоля.Вставить("ПиротехническиеИзделияИСредстваПожарнойБезопасности", Истина);
	ДоступныеПоля.Вставить("ПодконтрольнаяПродукцияВЕТИС", Истина);
	ДоступныеПоля.Вставить("ПодконтрольнаяПродукцияСАТУРН", Истина);
	ДоступныеПоля.Вставить("ПродуктыПереработкиЗерна", Истина);
	ДоступныеПоля.Вставить("ПродуктыПереработкиЗернаВЕТИС", Истина);
	ДоступныеПоля.Вставить("РадиоэлектроннаяПродукция", Истина);
	ДоступныеПоля.Вставить("РастительныеМасла", Истина);
	ДоступныеПоля.Вставить("СоковаяПродукция", Истина);
	ДоступныеПоля.Вставить("СтроительныеМатериалы", Истина);
	ДоступныеПоля.Вставить("ТелефоныИНоутбуки", Истина);
	ДоступныеПоля.Вставить("ТехническиеСредстваРеабилитации", Истина);
	ДоступныеПоля.Вставить("ТитановаяМеталлопродукция", Истина);
	ДоступныеПоля.Вставить("УпакованнаяВода", Истина);
	ДоступныеПоля.Вставить("Фотоаппараты", Истина);
	ДоступныеПоля.Вставить("Шины", Истина);

	// Если имя совпадает один в один и есть в метаданных Номенклатуры
	Если ДоступныеПоля[ИмяВида] <> Неопределено Тогда
		Возврат ИмяВида;
	КонецЕсли;
	
	// Особый случай для новинок (например, ЛегкаяПромышленность2026), 
	// если в конфигурации еще нет точной структуры, но логика требует общего поля
	Если СтрНайти(ИмяВида, "ЛегкаяПромышленность") > 0 Тогда
		Возврат "ЛегкаяПромышленность";
	КонецЕсли;

	// Если соответствие не найдено (актуально для новых видов ИС: ПолимерныеТрубы, Сладости и т.д.)
	Возврат "";

КонецФункции


Эх 1С, куда же ты несешься, залётная …

Среда: БП 3.0.200.23 Объем: 1 час.

Сделано с ❤️‍🔥 @GPT4AgentsBot Модель: Nano Banana 2