Как выгрузить непроведенный документ из УТ 11 в БП 3.0 с помощью стандартной синхронизации?

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

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

Однако на практике нередко возникает необходимость выгрузить документ, который по каким-либо причинам не может быть проведен в текущей базе. Это может быть связано с отсутствием необходимых данных, неверным заполнением, спецификой бизнес-процесса или другими техническими ограничениями. В такой ситуации стандартный монитор обмена данными не регистрирует непроведенные документы для отправки, что создает трудности для пользователей и программистов.

Давайте рассмотрим подробнее, почему возникает такая ситуация и какие подходы существуют для решения этой задачи, начиная от простых обходных путей и заканчивая более сложными, но гибкими методами кастомизации.

Метод 1: Временное проведение документа для синхронизации

Наиболее очевидный и часто используемый обходной путь, предложенный нашими коллегами на форуме, — это временное изменение статуса документа. Этот метод является своего рода "хаком", который позволяет обойти типовое ограничение без серьезных доработок конфигурации.

  1. Провести документ: Нам необходимо временно провести нужный документ в базе-источнике (в нашем случае УТ 11). Для этого открываем документ и нажимаем кнопку "Провести". Это действие заставит систему зарегистрировать документ как измененный и готовый к обмену, поскольку он будет соответствовать критерию "проведенности", требуемому стандартными правилами синхронизации.
  2. Выгрузить данные: После проведения документа запускаем стандартную синхронизацию данных. Система обнаружит проведенный документ как зарегистрированное изменение и включит его в состав данных для выгрузки.
  3. Распровести документ: Как только документ будет успешно выгружен и отправлен в базу-приемник (БП 3.0), мы можем вернуться в базу-источник и распровести этот документ. Это действие вернет его в исходное состояние "не проведен", если такое состояние требуется по бизнес-логике или если документ изначально не мог быть проведен.

Преимущества этого метода:

Недостатки и важные моменты:

Этот метод является рабочим обходным путем, но его следует применять с осторожностью и только тогда, когда другие, более автоматизированные подходы нецелесообразны или невозможны.

Метод 2: Ручная или программная регистрация изменений через план обмена

Если временное проведение документа не подходит или слишком затратно, мы можем использовать более продвинутые методы, связанные с непосредственной регистрацией изменений в системе обмена. Механизм планов обмена в 1С предоставляет инструменты для управления тем, какие объекты будут выгружены, что особенно актуально, если ваш обмен переполнен документами.

На форуме справедливо отмечалось, что стандартный "Монитор обмена данными" или "Состав отправляемых данных" не позволяет вручную регистрировать непроведенные документы для отправки. Это связано с тем, что монитор работает на более высоком уровне, уже учитывая типовые правила, которые требуют проведенности.

Ручная регистрация с помощью специализированных обработок

Для более гибкого ручного управления регистрацией изменений существуют специализированные внешние обработки, например, "Регистрация объектов для обмена". Эти обработки предоставляют удобный интерфейс для просмотра и редактирования зарегистрированных изменений для различных узлов обмена.

С их помощью мы можем:

  1. Просмотреть зарегистрированные изменения: Увидеть, какие объекты (документы, справочники) уже зарегистрированы к обмену.
  2. Принудительно зарегистрировать объект: Вручную добавить конкретный непроведенный документ в список зарегистрированных изменений для выбранного узла обмена. Такие обработки обычно позволяют выбрать объект по ссылке, по типу или даже по произвольному запросу.
  3. Использовать отборы: Отобрать произвольным запросом или просто подбирая документы по одному, чтобы затем зарегистрировать их.

Использование таких обработок может быть удобным для периодической регистрации специфических документов, которые не подпадают под стандартные правила.

Программная регистрация изменений

Для автоматизации или более точечного контроля мы можем использовать программную регистрацию изменений. Механизм планов обмена позволяет регистрировать изменения данных программно, используя метод ЗарегистрироватьИзменения().

Давайте посмотрим, как это работает:

  1. Получаем менеджер плана обмена: Нам нужен доступ к менеджеру конкретного плана обмена, который используется между УТ 11 и БП 3.0. Обычно это что-то вроде ПланыОбмена.СинхронизацияУТБП или аналогичное название, присвоенное вашему узлу обмена.
  2. Получаем ссылку на объект: Нам нужна ссылка на тот непроведенный документ, который мы хотим выгрузить.
  3. Регистрируем изменения: Вызываем метод ЗарегистрироватьИзменения() у менеджера плана обмена, передавая ему ссылку на документ.

Пример программного кода:


// Внешняя обработка или модуль, где выполняется регистрация

// 1. Получаем менеджер плана обмена.
// Замените "ИмяВашегоПланаОбмена" на фактическое имя плана обмена в вашей конфигурации.
// Например, для УТ-БП это может быть "ОбменУправлениеТорговлейБухгалтерияПредприятия"
// или "ПолныйОбмен" в зависимости от настроек.
// Мы также указываем узел обмена, для которого регистрируем изменения.
// Предположим, у нас есть узел обмена с именем "УзелБП"
Попытка
    УзелОбмена = ПланыОбмена.ПолныйОбмен.НайтиПоКоду("УзелБП"); // Или НайтиПоНаименованию
    Если УзелОбмена = Неопределено Тогда
        Сообщить("Узел обмена с кодом 'УзелБП' не найден!", СтатусСообщения.Ошибка);
        Возврат;
    КонецЕсли;
Исключение
    Сообщить("Не удалось получить узел обмена. Проверьте имя плана обмена или код узла.", СтатусСообщения.Ошибка);
    Возврат;
КонецПопытки;

МенеджерПланаОбмена = ПланыОбмена.ПолныйОбмен;

// 2. Получаем ссылку на непроведенный документ, который нужно выгрузить.
// Замените "РеализацияТоваровУслуг" и параметры поиска на данные вашего документа.
// Например, найдем по номеру и дате
СсылкаНаДокумент = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("РТ00-000001", Дата("20230101"));

Если СсылкаНаДокумент = Неопределено Тогда
    Сообщить("Документ не найден. Проверьте параметры поиска.", СтатусСообщения.Ошибка);
    Возврат;
КонецЕсли;

Если СсылкаНаДокумент.Проведен Тогда
    Сообщить("Документ уже проведен. Регистрация изменений не требуется, если он уже зарегистрирован.", СтатусСообщения.Внимание);
    // Возможно, нужно распровести, если цель именно выгрузка непроведенного
    // Но для принудительной регистрации это не критично, если его все равно нужно передать
КонецЕсли;

// 3. Регистрируем документ для выбранного узла обмена.
Попытка
    МенеджерПланаОбмена.ЗарегистрироватьИзменения(УзелОбмена, СсылкаНаДокумент);
    Сообщить("Документ '" + СсылкаНаДокумент + "' успешно зарегистрирован к обмену для узла '" + УзелОбмена.Наименование + "'.");
Исключение Как Искл
    Сообщить("Ошибка при регистрации документа: " + Искл.Описание, СтатусСообщения.Ошибка);
КонецПопытки;

Этот код может быть размещен в отдельной внешней обработке или, как было предложено на форуме, прикручен к документу в виде "кнопочки". Создав такую кнопку на форме документа, мы можем добавить обработчик, который будет вызывать вышеописанный код, позволяя пользователю вручную регистрировать документ для обмена прямо из его формы, без необходимости открывать монитор обмена или другие сложные механизмы.

Важный нюанс: Программная регистрация лишь добавляет документ в список изменений, которые должны быть выгружены. Сама выгрузка все равно будет происходить в соответствии с правилами обмена, и если эти правила жестко требуют проведенности, документ может быть проигнорирован на этапе формирования выгружаемого файла, если только правила обмена не будут доработаны (см. Метод 4).

Метод 3: Использование дополнительных отборов в настройках плана обмена (с оговорками)

В настройках узла обмена, которые являются частью плана обмена, действительно можно использовать дополнительные отборы для определения состава выгружаемых данных. Эти отборы могут быть настроены по различным реквизитам документов, таким как дата, организация или даже статус проведения.

Мы можем найти эти настройки, перейдя в раздел "Администрирование и синхронизация данных" → "Настройки синхронизации данных" → выбрать нужную синхронизацию → "Настроить" → "Дополнительные отборы". Здесь обычно можно добавить условия по полям объектов.

Например, мы могли бы попробовать установить отбор на поле Проведен со значением Ложь, чтобы попытаться выгрузить только непроведенные документы. Однако, следует понимать, что если типовые правила обмена жестко требуют статуса "Проведен" для выгрузки документа (что часто встречается), то установка такого отбора на непроведенные документы может не привести к их выгрузке без изменения самих правил.

Почему это так? Дополнительные отборы действуют как фильтр на уже отобранные для выгрузки данные. Если базовый механизм формирования данных для выгрузки (определенный правилами обмена) изначально игнорирует непроведенные документы, то ваш отбор на них просто не найдет данных для фильтрации, поскольку они не были выбраны на первом этапе.

Когда дополнительные отборы полезны:

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

Метод 4: Кастомизация правил обмена с помощью конфигурации "1С:Конвертация данных"

Самым надежным, гибким и универсальным решением для выгрузки непроведенных документов, а также для реализации любой сложной логики обмена, является доработка правил обмена данными. Для создания и изменения правил обмена используется специализированная конфигурация "1С:Конвертация данных" (КД 2.0 или КД 3.x).

Давайте разберем этот подход подробнее:

Понимание "1С:Конвертация данных"

Конфигурация "1С:Конвертация данных" (КД) – это мощный инструмент для разработчиков, который позволяет создавать, изменять и управлять правилами обмена данными между различными информационными базами 1С:Предприятия. Именно здесь мы определяем, какие объекты выгружаются, в каком формате, и как они преобразуются при загрузке в другую базу.

Ключевыми компонентами в КД являются:

Настройка правил для выгрузки непроведенных документов

Чтобы выгрузить непроведенные документы, нам нужно внести изменения как минимум в ПВД, а при необходимости и в ПКО.

  1. Изменение Правил выгрузки данных (ПВД):

    В типовых правилах обмена для многих документов в ПВД присутствует условие, которое отбирает только проведенные документы. Например, в запросе для выгрузки документа "Реализация товаров и услуг" может быть условие ГДЕ Док.Проведен = ИСТИНА.

    Для того чтобы выгружать непроведенные документы, мы должны удалить или изменить это условие. Например, мы можем полностью убрать проверку на проведенность, или изменить ее на ГДЕ Док.Проведен = ЛОЖЬ, если хотим выгружать только непроведенные, или вовсе не использовать условие по проведенности, чтобы выгружать и те, и другие.

    Пример (псевдокод для КД, раздел "Запрос" в ПВД):

    
    // Стандартный запрос для ПВД, который выгружает только проведенные
    ВЫБРАТЬ
        Док.Ссылка,
        Док.Дата,
        Док.Номер,
        Док.Проведен
    ИЗ
        Документ.РеализацияТоваровУслуг КАК Док
    ГДЕ
        Док.Проведен = ИСТИНА
        И Док.Дата МЕЖДУ &НачалоПериода И &КонецПериода;
    
    // Модифицированный запрос для ПВД, который выгружает все документы
    // независимо от статуса проведения
    ВЫБРАТЬ
        Док.Ссылка,
        Док.Дата,
        Док.Номер,
        Док.Проведен
    ИЗ
        Документ.РеализацияТоваровУслуг КАК Док
    ГДЕ
        Док.Дата МЕЖДУ &НачалоПериода И &КонецПериода; // Условие по проведенности удалено
    
    // Или запрос для выгрузки ТОЛЬКО непроведенных документов
    ВЫБРАТЬ
        Док.Ссылка,
        Док.Дата,
        Док.Номер,
        Док.Проведен
    ИЗ
        Документ.РеализацияТоваровУслуг КАК Док
    ГДЕ
        Док.Проведен = ЛОЖЬ
        И Док.Дата МЕЖДУ &НачалоПериода И &КонецПериода;
    
  2. Изменение Правил конвертации объектов (ПКО):

    В ПКО мы управляем тем, как данные загружаются в базу-приемник. Если мы выгружаем непроведенный документ, то, скорее всего, мы хотим, чтобы он и загрузился непроведенным. В ПКО для соответствующего документа мы можем:

    • Явно установить статус "Проведен" в значение "Ложь": Это можно сделать в обработчиках события, например, "После загрузки" или "При загрузке" объекта-приемника.
    • Удалить любую логику, которая пытается провести документ: Некоторые типовые правила могут содержать код, который автоматически проводит загружаемые документы. Этот код также нужно будет скорректировать.

    Пример (псевдокод для КД, обработчик события "ПослеЗагрузки" в ПКО):

    
    // Источник - это объект, который выгружается из базы-источника (УТ)
    // ОбъектПриемник - это объект, который создается или изменяется в базе-приемнике (БП)
    
    // Если источник был непроведенным, то и в приемнике устанавливаем его как непроведенный
    Если Источник.Проведен = Ложь Тогда
        ОбъектПриемник.Проведен = Ложь;
    КонецЕсли;
    
    // Если в типовом правиле есть автоматическое проведение,
    // его необходимо отключить или изменить логику
    // Пример (не является универсальным, зависит от конкретных правил):
    // Если Параметры.РежимЗагрузки = "Стандартный" И НЕ ОбъектПриемник.Проведен Тогда
    //    ОбъектПриемник.Записать(РежимЗаписиДокумента.ОтменаПроведения); // Если хотим быть уверенными, что не проведен
    // КонецЕсли;
    

Использование Универсального обмена данными XML

В контексте кастомизации правил обмена, "Универсальный обмен данными XML" является общим инструментом для обмена данными между базами 1С, использующим XML-файлы и настроенные правила обмена (созданные в КД). Он предоставляет гораздо большую гибкость по сравнению со стандартной синхронизацией, поскольку позволяет полностью контролировать процесс выгрузки и загрузки любых данных, включая непроведенные документы, при наличии соответствующих правил.

Современные обмены часто используют универсальный формат EnterpriseData (ED), и "Конвертация данных 3.x" позволяет работать с ним, создавая правила для передачи данных между различными конфигурациями, поддерживающими этот формат.

Важно: Доработка правил обмена требует квалификации разработчика 1С и понимания структуры данных обеих конфигураций. Перед внесением изменений всегда необходимо делать резервные копии и тестировать новые правила на тестовых базах.

В целом, выбор метода зависит от ваших потребностей:

Мы рассмотрели все основные подходы к решению проблемы выгрузки непроведенных документов в 1С. Выбирайте тот, который наилучшим образом соответствует вашей ситуации и техническим возможностям.

← На главную