Синхронизация данных между комплексными конфигурациями старого поколения, такими как «1С:Комплексная автоматизация 1.1» (КА), и современными решениями на базе «1С:Бухгалтерия 3.0» (БП) часто преподносит сюрпризы в части учета материальных ценностей. Одной из наиболее острых проблем является различие в архитектуре хранения единиц измерения. В этой статье мы подробно разберем, как прописать правила обмена в «Конвертации данных 2.1», чтобы количество товара всегда пересчитывалось корректно, а единицы измерения соответствовали базовым настройкам приемника.
Для начала проанализируем ситуацию и выясним причину расхождений. В КА 1.1 реализована гибкая система единиц измерения:
Коэффициент по отношению к базовой единице.В документах Требование-накладная или Поступление товаров и услуг в КА 1.1 в табличной части указывается ссылка именно на подчиненный справочник. Если в документе выбрана единица «Тонна» с коэффициентом 1000, а в БП 3.0 учет ведется только в базовых единицах (например, в «кг»), то при прямом переносе без пересчета программа просто перенесет число «1», и вместо тонны в бухгалтерии окажется один килограмм.
Чтобы данные в БП 3.0 попадали в верном исчислении, нам необходимо привести количество к базовой единице хранения еще на этапе выгрузки. Рассмотрим, как это реализовать в правилах конвертации свойств (ПКС) для реквизита Количество табличной части документа.
В обработчике «Перед выгрузкой» для свойства Количество нам нужно умножить физическое количество в строке документа на коэффициент выбранной единицы измерения. Пропишем следующий код:
// Приводим количество к базовой единице измерения (хранения)
Значение = ОбъектКоллекции.Количество * ОбъектКоллекции.ЕдиницаИзмерения.Коэффициент;
Этот простой алгоритм гарантирует, что если в КА 1.1 указано 2 тонны (коэффициент 1000), в файл обмена попадет значение 2000. Поскольку БП 3.0 ожидает данные в основной единице (кг), складской остаток и себестоимость в приемнике сойдутся.
Посмотрим на ситуацию со стороны справочников. В БП 3.0 нет справочника «Единицы измерения номенклатуры», подчиненного карточке товара. Там используется плоский классификатор. Следовательно, нам нельзя передавать ссылку на подчиненный справочник КА 1.1 напрямую.
Для ПКС ЕдиницаИзмерения в табличной части документа необходимо настроить правило так, чтобы передавалась ссылка на Классификатор единиц измерения (ОКЕИ). В обработчике «Перед выгрузкой» используем следующее выражение:
// Передаем не саму единицу номенклатуры, а ее ссылку на общий классификатор
Значение = ОбъектКоллекции.ЕдиницаИзмерения.ЕдиницаПоКлассификатору;
Важное замечание: При настройке ПКО (Правила конвертации объектов) для классификатора единиц измерения в качестве полей поиска следует выбирать Код (код по ОКЕИ) или Наименование. Это позволит системе однозначно найти «кг» или «шт» в базе приемнике, даже если внутренние идентификаторы (GUID) объектов различаются.
Разберем ситуацию с документами, где важна стоимость (например, Поступление товаров и услуг). Если мы увеличили количество в 1000 раз (перевели тонны в кг), нам необходимо пропорционально уменьшить цену, чтобы общая сумма документа осталась неизменной. В противном случае себестоимость будет завышена в тысячи раз.
Для свойства Цена в ПКС прописываем аналогичную логику пересчета:
Если ОбъектКоллекции.ЕдиницаИзмерения.Коэффициент <> 0 Тогда
Значение = ОбъектКоллекции.Цена / ОбъектКоллекции.ЕдиницаИзмерения.Коэффициент;
Иначе
Значение = ОбъектКоллекции.Цена;
КонецЕсли;
Сумму (Сумма) обычно пересчитывать не нужно, так как она в документах КА 1.1 чаще всего является абсолютной величиной для всей строки и не зависит от выбранной единицы измерения (она уже посчитана как Цена * Количество).
Если ваша задача — всегда приводить данные к той единице, которая в КА 1.1 назначена «Единицей хранения остатков», можно использовать более жесткую привязку. Рассмотрим пример кода для ПКС ЕдиницаИзмерения, если мы хотим игнорировать единицу в документе и брать основную из карточки номенклатуры:
// Берем единицу хранения из карточки товара
Значение = ОбъектКоллекции.Номенклатура.ЕдиницаХраненияОстатков.ЕдиницаПоКлассификатору;
Однако помните, что в этом случае пересчет количества (Шаг 1) должен выполняться именно по отношению к коэффициенту той единицы, которая была реально указана в документе, а не к единице хранения.
Проанализируем распространенную ошибку, когда разработчики пытаются написать Значение = Значение.ЕдиницаПоКлассификатору;. Часто это приводит к ошибке, так как на момент выполнения обработчика Значение еще может быть не инициализировано или содержать пустое значение ссылки. Всегда обращайтесь к источнику через ОбъектКоллекции (для табличных частей) или напрямую через свойства Источник.
Также проверьте, чтобы в БП 3.0 в карточках номенклатуры уже были установлены корректные единицы измерения перед первой загрузкой документов. Если номенклатура в БП создается «на лету» при загрузке документа, убедитесь, что в ПКО Номенклатура правильно заполняются реквизиты ЕдиницаИзмерения.
Мы выяснили, что для корректного обмена между КА 1.1 и БП 3.0 ключевым моментом является использование коэффициентов. Реализовав пересчет количества и цены в обработчиках ПКС «Перед выгрузкой», вы избежите хаоса в складском учете и обеспечите точность формирования бухгалтерской отчетности. Использование классификатора ОКЕИ как связующего звена позволит системе сопоставить данные, даже если структура справочников в базах принципиально отличается.