Работа с распределенными информационными базами (РИБ) в современных конфигурациях на платформе «1С:Предприятие 8.3» (таких как Управление торговлей 11, ERP Управление предприятием 2 или Комплексная автоматизация 2) претерпела значительные изменения по сравнению со старыми редакциями. Архитектура метаданных усложнилась, и теперь перенос документов «один в один» часто сопровождается скрытыми механизмами оптимизации проведения и отложенной регистрации изменений.
Многие специалисты сталкиваются с крайне неприятной ситуацией: после создания подчиненного узла РИБ или в процессе регулярного обмена часть документов (например, перемещения товаров, поступления, реализации) переносится в периферийную базу без движений по регистрам накопления. Из-за этого в подчиненном узле возникает нехватка свободных остатков, ломается партионный учет и блокируется оперативная работа пользователей. Рассмотрим подробно причины возникновения этих проблем и разберем по шагам практические способы их решения.
В конфигурации Управление торговлей 11 ключевым регистром, отвечающим за межфирменные продажи (механизм «Интеркампани») и контроль остатков организаций, является регистр накопления ТоварыОрганизаций. При создании узла РИБ с отборами (например, по конкретной организации) правила регистрации изменений могут отрабатывать некорректно.
Если в документе перемещения или реализации участвуют несколько юридических лиц, а в настройках узла РИБ установлены фильтры, система может частично заблокировать выгрузку движений по «чужой» организации. В результате сам документ в подчиненный узел приходит, но его движения по регистру ТоварыОрганизаций оказываются неполными или вовсе отсутствуют.
Проанализируем решение этой проблемы. Для восстановления целостности данных нам необходимо принудительно включить выгрузку движений этого регистра в плане обмена после инициализации узла. Мы можем сделать это программно, добавив регистр в состав обмена или зарегистрировав его записи вручную. Рассмотрим пример кода для принудительной регистрации движений регистра накопления по узлу обмена:
ПланОбменаСсылка = ПланыОбмена.Полный.НайтиПоКоду("ПФ1"); // Укажите ваш план обмена и код узла
Если Не ПланОбменаСсылка.Пустая() Тогда
ВыборкаДокументов = Документы.ПриобретениеТоваровУслуг.Выбрать();
Пока ВыборкаДокументов.Следующий() Цикл
// Получаем набор записей регистра для конкретного документа
НаборЗаписей = РегистрыНакопления.ТоварыОрганизаций.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ВыборкаДокументов.Ссылка);
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() > 0 Тогда
// Регистрируем изменения набора записей для периферийного узла
ПланыОбмена.ЗарегистрироватьИзменения(ПланОбменаСсылка, НаборЗаписей);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Применение этого подхода гарантирует, что физические движения регистра будут принудительно доставлены в подчиненную базу вместе с транзакцией обмена данными.
В современных конфигурациях 1С активно используется служебный регистр сведений РеестрДокументов. Он предназначен для быстрого построения динамических списков и журналов документов в интерфейсе пользователя. Если запись в этом регистре отсутствует, повреждена или содержит неактуальные данные, документ может физически существовать в базе данных (и даже иметь движения по регистрам), но не отображаться в стандартных списках и журналах.
При обмене через РИБ часто возникает конфликт: в центральном узле документ удаляется или помечается на удаление, а в периферийном узле запись регистра РеестрДокументов превращается в «битую ссылку» (объект со значением <Объект не найден>). При последующих сеансах обмена это приводит к критическому сбою чтения сообщения обмена со следующей ошибкой:
«Ошибка чтения файла сообщения обмена: Ошибка при вызове метода контекста (ЗакончитьЧтение): Ошибка при выполнении обработчика - ПередЗаписью... Преобразование значения к типу Булево не может быть выполнено»
Выясним причину этой ошибки. В модуле менеджера документа (например, ПриобретениеТоваровУслуг) при записи система пытается прочитать связанные свойства из реестра документов или метаданных. Встречая битую ссылку, алгоритм получает значение Неопределено или NULL вместо ожидаемого булевого флага (например, признака проведения или проведения по регламентированному учету), что вызывает аварийное завершение транзакции обмена.
Для исправления ситуации выполним очистку регистра сведений РеестрДокументов от записей с битыми ссылками. Напишем для этого простую обработку:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Реестр.Документ КАК Документ,
| Реестр.ТипСсылки КАК ТипСсылки
|ИЗ
| РегистрСведений.РеестрДокументов КАК Реестр";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
КоличествоОчищенных = 0;
Пока Выборка.Следующий() Цикл
// Проверяем битую ссылку через получение объекта
Если Выборка.Документ.ПолучитьОбъект() = Неопределено Тогда
Набор = РегистрыСведений.РеестрДокументов.СоздатьНаборЗаписей();
Набор.Отбор.Документ.Установить(Выборка.Документ);
Набор.Записать(); // Записываем пустой набор для удаления записи
КоличествоОчищенных = КоличествоОчищенных + 1;
КонецЕсли;
КонецЦикла;
Сообщить("Очищено битых записей в реестре документов: " + КоличествоОчищенных);
После удаления записей с битыми ссылками в обоих узлах обмена рекомендуется запустить стандартную процедуру «Исправление ошибок в данных» или перестроить индекс реестра документов с помощью типовой обработки «Заполнение реестра документов» из состава конфигурации.
Ошибка преобразования к типу Булево при вызове метода ЗакончитьЧтение() в процессе обмена РИБ также может быть вызвана багом платформы «1С:Предприятие 8.3» (особенно на устаревших релизах веток 8.3.11 и 8.3.12). При выгрузке данных механизмы XDTO-сериализации могут некорректно обрабатывать реквизиты документов, имеющие составной тип данных или пустые значения по умолчанию.
Если при выгрузке реквизит типа Булево записывается в XML-файл обмена некорректно, то при чтении в подчиненном узле код конфигурации не может распознать значение. Для устранения этой проблемы выполните следующие действия:
Когда документ переносится через РИБ, в базу-приемник он загружается со специальным флагом блокировки обработчиков: ОбменДанными.Загрузка = Истина. Это отключает стандартные проверки проведения. Однако при попытке ручного перепроведения документа в подчиненной базе или при выполнении регламентных операций движения могут внезапно очиститься.
Выясним причину этого поведения. Логика проведения документов в Управление торговлей 11 сильно зависит от состояния функциональных опций (ФО). Если в центральной базе включены опции ИспользоватьНесколькоСкладов или ИспользоватьОрдерныеСклады, а в периферийной базе эти константы по какой-то причине (например, сбой при начальной инициализации узла) выключены, то при проведении документов алгоритмы проведения будут игнорировать склады и обрезать движения по регистру Товары на складах.
Рассмотрим порядок синхронизации функциональных опций:
При создании начального образа РИБ или настройке нового узла в фильтрах регистрации изменений часто устанавливают параметр «Дата начала выгрузки документов» (например, с начала текущего года).
Рассмотрим ситуацию: документ поступления или перемещения был создан до этой даты, а его движения по регистрам накопления (влияющие на текущие остатки) актуальны и сегодня. Если сам документ не попадает в границы фильтра выгрузки, он не переносится в подчиненную базу. Но если на него ссылаются более поздние документы, система переносит его в режиме «битой ссылки» или только в виде объекта без движений. Это порождает дефицит остатков по регистру Свободные остатки при попытке провести новые документы в периферийной базе.
Рекомендуется проанализировать настройки фильтрации и при необходимости временно сдвинуть дату начала выгрузки на момент начала ведения учета в базе, либо воспользоваться обработкой регистрации изменений для принудительной выгрузки исторических остатков и документов, формирующих партии.
Если вы столкнулись с потерей движений или ошибками обмена в РИБ на базе УТ 11.4, выполните следующие шаги:
РеестрДокументов от некорректных записей с помощью приведенного выше скрипта.ТоварыОрганизаций, ТоварыНаСкладах и СвободныеОстатки включены в авторегистрацию или корректно регистрируются программными подписками на события.