Как устранить дублирование номенклатуры при синхронизации из УТ в БП при использовании серий?

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

При настройке стандартного обмена данными между конфигурациями «1С:Управление торговлей 11» (или «1С:ERP») и «1С:Бухгалтерия предприятия 3.0» специалисты часто сталкиваются с неприятным эффектом: в документах поступления или реализации номенклатура, по которой ведется серийный учет, начинает дублироваться. Вместо одной строки с общим количеством в базу-приемник (БП) попадает столько строк, сколько серий было указано в базе-источнике (УТ). Рассмотрим причины этой проблемы, проанализируем технические нюансы и разберем способы исправления.

Выясняем причину возникновения дублей

Проанализируем ситуацию: в последних релизах УТ 11.5 (и соответствующих версиях ERP 2.5) произошли изменения в механизме формирования движений и хранения данных о запасах. Ключевая проблема кроется в объекте ВидыЗапасов. Когда в документе «Приобретение товаров и услуг» или «Реализация товаров и услуг» указывается несколько серий для одной позиции номенклатуры, система автоматически разбивает данные в служебных таблицах по этим сериям.

Ранее при выгрузке данных через универсальный формат EnterpriseData срабатывал механизм автоматической свертки. Поскольку в «1С:Бухгалтерии предприятия» серийный учет в том виде, в котором он есть в торговых базах, обычно не ведется (или не требуется в рамках проводок), строки с одинаковой номенклатурой должны были суммироваться. Однако из-за официально признанной ошибки 00-00523675, алгоритм подготовки данных перестал корректно агрегировать строки, если у них разные идентификаторы серий в таблице видов запасов.

В результате в XML-файл обмена выгружается структура, где каждая серия представлена отдельным узлом СтрокаТЧ. При загрузке в БП система добросовестно создает каждую строку, что приводит к «раздуванию» документа и неудобствам при проверке взаиморасчетов и формировании печатных форм.

Проблема со ставками НДС (18% вместо 20%)

Параллельно с дублированием строк пользователи часто замечают еще одну аномалию: подмену актуальной ставки НДС 20% на устаревшую 18%. Разберем по шагам, почему это происходит. В правилах конвертации данных (даже внутри формата EnterpriseData) существуют таблицы соответствия перечислений. В некоторых релизах при формировании выгрузки идентификатор ставки НДС передается некорректно, и база-приемник, не найдя точного соответствия, подставляет значение по умолчанию или первое подходящее из списка, которым часто оказывается 18%.

Эта проблема, как и дублирование серий, обычно лечится обновлением модулей обмена или использованием патчей от компании «1С». Однако, если обновление конфигурации до самого последнего патча не помогает, придется прибегнуть к программным методам.

Решение №1: Использование расширения (Метод для разработчиков)

Самый надежный способ исправить ситуацию, не дожидаясь официального исправления от разработчиков — это создание расширения для конфигурации «1С:Управление торговлей». Нам необходимо перехватить процесс подготовки данных перед их отправкой в канал обмена.

Проанализируем, какой именно модуль отвечает за выгрузку. Как правило, это менеджер обмена через формат EnterpriseData. Нам нужно найти процедуру, которая формирует табличную часть «Товары». Рассмотрим пример логики, которую следует внедрить в расширение:


// В расширении для модуля менеджера обмена
&После("ПакетнаяВыгрузкаДокумента")
Процедура Расш1_ПакетнаяВыгрузкаДокумента(ДанныеИБ, ДанныеВыгрузки, Контекст)
    // Проверяем наличие таблицы Товары в структуре выгрузки
    Если ДанныеВыгрузки.Свойство("Товары") Тогда
        ТаблицаТовары = ДанныеВыгрузки.Товары;
        
        // Сворачиваем таблицу по ключевым полям, суммируя количественные и суммовые показатели
        // Важно оставить поля, которые определяют уникальность строки для Бухгалтерии
        ТаблицаТовары.Свернуть(
            "Номенклатура, СтавкаНДС, Цена, Склад, ЕдиницаИзмерения", 
            "Количество, Сумма, СуммаНДС, СуммаСНДС"
        );
    КонецЕсли;
КонецПроцедуры

Использование метода Свернуть позволяет объединить все строки, которые различались только сериями. После выполнения этого кода в XML-файл попадет уже «чистая» агрегированная информация, и в БП документ загрузится корректно, одной строкой на каждую позицию номенклатуры.

Решение №2: Обработка на стороне «1С:Бухгалтерии»

Если по каким-то причинам вы не можете вносить изменения в базу-источник (УТ), можно рассмотреть вариант корректировки данных в базе-приемнике (БП). Для этого создается расширение в БП, которое отрабатывает в момент записи документа или в обработчике загрузки данных.

Посмотрим на пример кода, который можно разместить в модуле объекта документа в БП через расширение:


&Перед("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    // Проверяем, что документ загружен через обмен (не ручной ввод)
    Если ОбменДанными.Загрузка Тогда
        // Сворачиваем табличную часть товары
        ЭтотОбъект.Товары.Свернуть(
            "Номенклатура, Склад, СтавкаНДС, Цена", 
            "Количество, Сумма, СуммаНДС"
        );
    КонецЕсли;
КонецПроцедуры

Важный момент: такой подход является менее предпочтительным, так как он борется с последствиями, а не с причиной. Кроме того, при суммировании может возникнуть погрешность округления в 1-2 копейки (ошибка «копейки»), если суммы НДС в разных строках были рассчитаны отдельно и затем просто сложились.

Решение №3: Организационный обход (без программирования)

Как временную меру разработчики 1С предлагают придерживаться правила «одна строка — одна серия». Это означает, что в документе «Приобретение товаров и услуг» в УТ необходимо физически разбивать строки номенклатуры. Если вы закупаете 10 штук товара с двумя разными сериями (по 5 штук), вы вводите две строки в табличную часть вместо одной строки с указанием серий в отдельном окне.

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

Проверка наличия патчей

Перед тем как приступать к написанию кода, обязательно проверьте раздел обновлений. Компания 1С часто выпускает патчи (исправления) для исправления конкретных ошибок релизов. Для этого перейдем в раздел Администрирование — Обслуживание — Обновление программы — Установленные исправления (патчи). Для автоматической проверки и установки обновлений нескольких баз можно задействовать программу для автоматического обновления баз 1С.

Ищите в списке патчи, в описании которых фигурируют термины:

Если такой патч доступен для вашего релиза, его установка решит проблему без вмешательства в конфигурацию программным способом. Если же патча нет, используйте расширение с методом Свернуть, как мы рассмотрели выше. Это позволит сохранить чистоту учета в «1С:Бухгалтерии» и избежать хаоса в табличных частях документов.

← На главную