При работе с типовыми конфигурациями «1С:Предприятие 8» часто возникает необходимость точечно доработать логику обмена данными. Например, добавить в комментарий загружаемых документов (таких как ПКО или Эквайринговые операции) информацию о том, из какого конкретно магазина или склада они были выгружены. При этом крайне важно сохранить конфигурацию на полной поддержке поставщика, чтобы не усложнять последующие обновления.
В этой статье мы подробно разберем, как устроен современный механизм синхронизации между конфигурациями «1С:Розница» и «1С:Бухгалтерия предприятия 3.0», и предложим два рабочих сценария решения этой задачи без изменения основной конфигурации: через штатную параметрическую настройку синхронизации и с помощью механизма расширений.
Прежде чем переходить к настройкам, давайте проанализируем, как именно происходит обмен данными в современных версиях конфигураций. Начиная с редакции «Розница 2.x/3.0» и «Бухгалтерия 3.0», обмен строится на основе технологии Конвертации данных 3.0 (КД3) и использует универсальный формат EnterpriseData.
В отличие от старого подхода КД2, где правила конвертации объектов настраивались в отдельном XML-файле и загружались в пользовательском режиме через стандартную обработку, в КД3 вся логика преобразования реквизитов жестко зашита внутри общего модуля МенеджерОбменаЧерезУниверсальныйФормат. Это означает, что:
Тем не менее, решить задачу идентификации источника выгрузки можно красиво и без снятия конфигураций с поддержки.
Рассмотрим самый простой способ, не требующий написания программного кода. Если нам необходимо четко разделять документы в Бухгалтерии по складам (или магазинам) и видеть это в номерах документов, мы можем задействовать механизм фильтрации и индивидуального префиксирования узлов обмена.
По умолчанию префикс в «1С» назначается на всю информационную базу или на конкретную Организацию. Чтобы обойти это ограничение и привязаться к Складам, выполним следующие шаги:
При такой схеме документы по разным складам будут регистрироваться и выгружаться независимо через разные каналы обмена. В результате при загрузке в «1С:Бухгалтерию 3.0» номера документов автоматически получат уникальные префиксы соответствующего склада (например, С1-000001 вместо стандартного РТ-000001). Это позволит легко идентифицировать источник документов визуально и при формировании отчетов.
Если префиксов в номерах недостаточно и информацию обязательно нужно записывать именно в реквизит Комментарий, то лучшим решением станет использование расширений конфигурации. Этот механизм позволяет перехватывать выполнение процедур общего модуля МенеджерОбменаЧерезУниверсальныйФормат без снятия баз с поддержки.
Формат EnterpriseData для большинства объектов содержит специальное стандартное текстовое свойство AdditionalInfo (Дополнительная информация). Мы можем использовать его как транспорт для передачи любых произвольных строковых данных из базы-источника в базу-приемник.
Разберем по шагам логику реализации этого подхода:
Шаг 1. Перехват отправки данных в «1С:Рознице»
Создадим расширение в базе «1С:Розница». В нем мы перехватим процедуру обработки выгрузки документов (например, Приходного кассового ордера) и запишем в свойство формата AdditionalInfo название склада-отправителя.
Пример программного кода в расширении Розницы:
&После("ПриОтправкеДанных")
Процедура Расш_ПриОтправкеДанных(ДанныеИБ, ДанныеФормата, КомпонентыОбмена)
// Проверяем, что выгружается именно Приходный кассовый ордер
Если ТипЗнч(ДанныеИБ) = Тип("ДокументСсылка.ПриходныйКассовыйОрдер") Тогда
// Заполняем поле дополнительной информации представлением склада
Если ЗначениеЗаполнено(ДанныеИБ.Склад) Тогда
ДанныеФормата.Вставить("AdditionalInfo", "Выгружено со склада: " + СокрЛП(ДанныеИБ.Склад.Наименование));
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Шаг 2. Прием данных в «1С:Бухгалтерии 3.0»
Теперь создадим расширение на стороне приемника («1С:Бухгалтерия»). Здесь нам нужно перехватить процедуру обработки входящего XML-пакета, прочитать значение из AdditionalInfo и дописать его в реквизит Комментарий создаваемого или обновляемого документа.
Пример программного кода в расширении Бухгалтерии:
&После("ПриПолученииДанных")
Процедура Расш_ПриПолученииДанных(ДанныеИБ, ДанныеФормата, КомпонентыОбмена)
// Проверяем, что обрабатывается объект документа ПКО
Если ТипЗнч(ДанныеИБ) = Тип("ДокументОбъект.ПриходныйКассовыйОрдер") Тогда
// Проверяем наличие переданных дополнительных данных
Если ДанныеФормата.Свойство("AdditionalInfo") И ЗначениеЗаполнено(ДанныеФормата.AdditionalInfo) Тогда
ТекущийКомментарий = СокрЛП(ДанныеИБ.Комментарий);
НовыйКомментарий = ДанныеФормата.AdditionalInfo;
// Избегаем дублирования строки при повторных обменах
Если Найти(ТекущийКомментарий, НовыйКомментарий) = 0 Тогда
ДанныеИБ.Комментарий = ТекущийКомментарий + ?(ЗначениеЗаполнено(ТекущийКомментарий), " | ", "") + НовыйКомментарий;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Этот способ крайне надежен, так как мы не вмешиваемся в структуру метаданных, а используем только предопределенные свойства универсального формата обмена.
Проанализируем важный вопрос: изменятся ли комментарии у документов, которые уже были загружены в «1С:Бухгалтерию» ранее, если мы запустим повторную синхронизацию с новыми правилами?
Да, при повторном запуске обмена измененные объекты будут сопоставлены по уникальным идентификаторам (GUID) и перезаписаны. Поле Комментарий обновится новыми значениями. Однако здесь нужно учитывать важный нюанс — дату запрета изменения данных:
Таким образом, мы рассмотрели два эффективных способа кастомизации выгрузки: от простой настройки параметров синхронизации до гибкой доработки через расширения EnterpriseData. Выберите наиболее подходящий под ваши задачи вариант и успешно применяйте его на практике!