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