Как восстановить документ в структуре подчиненности после синхронизации в 1С:Бухгалтерия

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

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

Почему пропадает связь между документами при обмене

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

Если после синхронизации документ выпадает из дерева подчиненности, это означает, что физическое значение в реквизите ДокументОснование было очищено или перезаписано. Выясним основные причины:

  1. Перезапись объекта при загрузке: При очередном сеансе обмена данными документ списания загружается из внешней информационной базы и полностью перезаписывает реквизиты существующего документа в базе-приемнике.
  2. Несоответствие объектов учета в разных базах: В конфигурации «1С:Управление торговлей» списания безналичных денежных средств формируются на основании заявок на расходование ДС или распоряжений, а сами платежные поручения могут не использоваться или не выгружаться. В результате в формате обмена реквизит ДокументОснование передается пустым и затирает ссылку на платежное поручение, введенное ранее в «1С:Бухгалтерии».

Способ 1. Восстановление связи через «Групповое изменение реквизитов»

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

  1. Перейдем в раздел Администрирование — Обслуживание — Корректировка данных — Групповое изменение реквизитов (или откроем ее через меню «Функции для технического специалиста»).
  2. В поле «Изменять» выберем объект Списание с расчетного счета.
  3. По кнопке «Добавить условие отбора» настроим фильтр по нужному периоду, организации или конкретному списку документов.
  4. В дополнительных параметрах обработки (по кнопке «Дополнительно») включим отображение служебных реквизитов, если требуемое поле не отображается в общем списке.
  5. Найдем реквизит «Документ-основание» (ДокументОснование) и укажем ссылку на соответствующее Платежное поручение.
  6. Нажмем кнопку «Изменить реквизиты» для сохранения изменений.

Способ 2. Программное восстановление с помощью внешней обработки

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

Посмотрим на пример программного кода для пакетного восстановления:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Списание.Ссылка КАК ДокументСписание,
    |   Платежка.Ссылка КАК ДокументОснование
    |ИЗ
    |   Документ.СписаниеСРасчетногоСчета КАК Списание
    |   ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПлатежноеПоручение КАК Платежка
    |       ПО Списание.Организация = Платежка.Организация
    |       И Списание.БанковскийСчет = Платежка.БанковскийСчет
    |       И Списание.Контрагент = Платежка.Контрагент
    |       И Списание.СуммаДокумента = Платежка.СуммаДокумента
    |       И Списание.НомерВходящегоДокумента = Платежка.Номер
    |ГДЕ
    |   Списание.ДокументОснование = ЗНАЧЕНИЕ(Документ.ПлатежноеПоручение.ПустаяСсылка)
    |   И Списание.Проведен = ИСТИНА";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    ДокОбъект = Выборка.ДокументСписание.ПолучитьОбъект();
    ДокОбъект.ОбменДанными.Загрузка = Истина;
    ДокОбъект.ДокументОснование = Выборка.ДокументОснование;
    ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
КонецЦикла;

Обратим внимание: использование флага ОбменДанными.Загрузка = Истина позволяет записать исправленный реквизит без повторного проведения документа и смещения границы последовательности расчетов.

Как предотвратить затирание реквизита при последующих обменах

Рассмотрим особенности синхронизации по универсальному формату (EnterpriseData). Логика сопоставления и загрузки данных описана в общем модуле МенеджерОбменаЧерезУниверсальныйФормат, а правила формируются с помощью конфигурации «1С:Конвертация данных 3.0» на базе XDTO-пакетов.

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

  1. Создадим расширение конфигурации и переопределим процедуру обработки загрузки объекта СписаниеСРасчетногоСчета.
  2. Добавим проверку: если в базе-приемнике у существующего документа поле ДокументОснование уже содержит ссылку на ПлатежноеПоручение, а из источника приходит пустое значение, алгоритм должен сохранять текущую ссылку и не перезаписывать ее пустым значением.

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

← На главную