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