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