При организации регулярного обмена данными между устаревшими конфигурациями на платформе 1С:Предприятие 7.7 и современными базами на 1С:Предприятие 8.3 специалисты часто сталкиваются с проблемой нарушения последовательности номеров сообщений. Типичная ситуация: выгрузка из «семерки» прерывается из-за фатальной ошибки (например, наличия недопустимых XML-символов в наименовании контрагента), после чего база-приемник отказывается принимать исправленный файл, так как ожидает сообщение с конкретным порядковым номером. Разберем подробно, как устроена эта механика и как корректно изменить номера выгрузки в 1С 8.3.
Для начала проанализируем ситуацию с технической стороны. В системе 1С:Предприятие 8 за контроль очередности обмена отвечает объект метаданных ПланОбмена. У каждого узла (который представляет собой конкретную настройку обмена с базой 7.7) существуют два ключевых скрытых реквизита:
Если 1С:8.3 ожидает файл под номером 5, а вы пытаетесь загрузить файл с номером 6 (потому что предыдущая попытка в 1С:7.7 формально завершилась созданием файла, и счетчик в «семерке» увеличился), возникнет ошибка блокировки. Система считает, что одно сообщение было пропущено, и во избежание потери данных останавливает процесс.
Рассмотрим наиболее гуманный способ изменения номеров без написания кода. В современных конфигурациях «Бухгалтерия предприятия 3.0» встроен функционал управления регистрацией. Выполним следующие шаги:
В появившемся диалоговом окне мы увидим текущие значения счетчиков. Здесь мы можем вручную отредактировать Номер принятого и Номер отправленного. Чтобы 1С:8.3 приняла ваш исправленный файл, номер в поле «Номер принятого» должен быть ровно на единицу меньше, чем номер НомерВыгрузки, указанный внутри XML-файла сообщения из 1С:7.7.
Если в вашем интерфейсе отсутствуют кнопки настройки (как это часто бывает в специализированных или сильно доработанных конфигурациях), проанализируем ситуацию через технологический интерфейс. Нам потребуется доступ к самим объектам Планы обмена:
ОбменУниверсальный).Важное замечание: Зачастую в стандартной форме узла реквизиты номеров сообщений не выведены для редактирования. В этом случае нам поможет либо внешняя обработка «Редактор реквизитов», либо программный метод.
Выясним, как быстро поправить значения с помощью короткого скрипта. Это самый надежный метод, если интерфейсные средства недоступны. Воспользуемся обработкой «Групповое изменение реквизитов» или любой «Консолью кода». Напишем и выполним следующий фрагмент:
// Укажите имя вашего плана обмена и код узла
ИмяПлана = "ОбменУниверсальный"; // Замените на реальное имя
КодУзла = "001"; // Замените на реальный код
УзелОбъекта = ПланыОбмена[ИмяПлана].НайтиПоКоду(КодУзла).ПолучитьОбъект();
Если УзелОбъекта <> Неопределено Тогда
// Устанавливаем номер, предшествующий тому, который мы хотим загрузить
УзелОбъекта.НомерПринятого = 10; // Например, если загружаем 11-й
УзелОбъекта.Записать();
Сообщить("Номер принятого сообщения успешно изменен!");
КонецЕсли;
Этот код напрямую обращается к объекту в базе данных и перезаписывает счетчик, после чего система примет следующий файл без лишних вопросов.
Разберем причину зависания 1С:7.7, о которой упоминалось в ситуации. При использовании типовых обработок выгрузки (например, V77Exp.ert) система анализирует зарегистрированные изменения. Если предыдущая попытка завершилась аварийно (фатальная ошибка XML), в каталоге обмена может остаться файл блокировки с расширением .lck. Проанализируем содержимое каталога обмена и удалим все временные файлы, если процесс 1С:7.7 уже завершен.
Также стоит помнить, что при повторной выгрузке с тем же номером 1С:7.7 может пытаться повторно прочитать те же данные, которые вызвали ошибку парсера. Если «нечитаемый символ» не был вычищен из всех строк (например, он есть и в кратком, и в полном наименовании), процесс может зациклиться на этапе формирования XML-структуры.
Чтобы в будущем не пришлось вручную править номера сообщений или XML-файлы блокнотом, проанализируем способы очистки данных в базе-источнике (1С:7.7). Ошибка часто вызвана спецсимволами ASCII (0–31), которые недопустимы в стандарте XML 1.0.
В правилах обмена (в конфигурации «Конвертация данных») для строковых реквизитов рекомендуется использовать обработчики, удаляющие мусор. Рассмотрим пример функции, которую можно внедрить в правила:
// Пример логики для очистки строки перед выгрузкой
Результат = СокрЛП(ИсходнаяСтрока);
// Можно использовать СтрЗаменить для удаления символов перевода строки или табуляций,
// если они мешают парсеру на стороне 8.3
Результат = СтрЗаменить(Результат, Символ(10), "");
Результат = СтрЗаменить(Результат, Символ(13), "");
Использование таких простых проверок на этапе выгрузки из 1С:7.7 позволит избежать «падения» загрузки в 1С:8.3 и избавит вас от необходимости ручной корректировки планов обмена.