Как изменить номер сообщения при обмене данными между 1С:7.7 и 1С:8.3?

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

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

Поймем механизм работы номеров в Планах обмена

Для начала проанализируем ситуацию с технической стороны. В системе 1С:Предприятие 8 за контроль очередности обмена отвечает объект метаданных ПланОбмена. У каждого узла (который представляет собой конкретную настройку обмена с базой 7.7) существуют два ключевых скрытых реквизита:

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

Если 1С:8.3 ожидает файл под номером 5, а вы пытаетесь загрузить файл с номером 6 (потому что предыдущая попытка в 1С:7.7 формально завершилась созданием файла, и счетчик в «семерке» увеличился), возникнет ошибка блокировки. Система считает, что одно сообщение было пропущено, и во избежание потери данных останавливает процесс.

Способ 1. Использование обработки «Регистрация изменений для обмена»

Рассмотрим наиболее гуманный способ изменения номеров без написания кода. В современных конфигурациях «Бухгалтерия предприятия 3.0» встроен функционал управления регистрацией. Выполним следующие шаги:

  1. Перейдем в раздел Администрирование, затем выберем пункт Синхронизация данных.
  2. Откроем Настройки синхронизации данных.
  3. Выберем в списке нужную настройку обмена с 1С:7.7.
  4. Нажмем на кнопку Состав отправляемых данных (обычно она выглядит как иконка с синим монитором).
  5. В открывшемся окне управления регистрацией найдем кнопку Параметры узла или Изменить номера сообщений.

В появившемся диалоговом окне мы увидим текущие значения счетчиков. Здесь мы можем вручную отредактировать Номер принятого и Номер отправленного. Чтобы 1С:8.3 приняла ваш исправленный файл, номер в поле «Номер принятого» должен быть ровно на единицу меньше, чем номер НомерВыгрузки, указанный внутри XML-файла сообщения из 1С:7.7.

Способ 2. Редактирование через «Функции для технического специалиста»

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

  1. Зайдем в главное меню (три полоски в левом верхнем углу) — Настройки — Параметры. Установим флажок Режим «Все функции» (в новых версиях — Функции для технического специалиста).
  2. Снова откроем главное меню и выберем появившийся пункт Функции для технического специалиста.
  3. Развернем список Планы обмена и найдем тот, который отвечает за связь с 7.7 (например, ОбменУниверсальный).
  4. Откроем список узлов этого плана. Найдем узел, соответствующий нашей базе 1С:7.7.

Важное замечание: Зачастую в стандартной форме узла реквизиты номеров сообщений не выведены для редактирования. В этом случае нам поможет либо внешняя обработка «Редактор реквизитов», либо программный метод.

Способ 3. Программная корректировка номера (для разработчиков)

Выясним, как быстро поправить значения с помощью короткого скрипта. Это самый надежный метод, если интерфейсные средства недоступны. Воспользуемся обработкой «Групповое изменение реквизитов» или любой «Консолью кода». Напишем и выполним следующий фрагмент:


// Укажите имя вашего плана обмена и код узла
ИмяПлана = "ОбменУниверсальный"; // Замените на реальное имя
КодУзла = "001"; // Замените на реальный код

УзелОбъекта = ПланыОбмена[ИмяПлана].НайтиПоКоду(КодУзла).ПолучитьОбъект();
Если УзелОбъекта <> Неопределено Тогда
    // Устанавливаем номер, предшествующий тому, который мы хотим загрузить
    УзелОбъекта.НомерПринятого = 10; // Например, если загружаем 11-й
    УзелОбъекта.Записать();
    Сообщить("Номер принятого сообщения успешно изменен!");
КонецЕсли;

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

Почему 1С:7.7 может «висеть» при повторной выгрузке?

Разберем причину зависания 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 и избавит вас от необходимости ручной корректировки планов обмена.

← На главную