При выполнении обмена данными в распределенной информационной базе (РИБ с отборами по подразделению) в конфигурации «1С:Управление торговлей 11» при загрузке данных в центральную или периферийную базу может возникать критическая ошибка чтения сообщения обмена.
В журнале регистрации и в окне сообщений отображается стек ошибки следующего вида:
Ошибка чтения файла сообщения обмена: {Обработка.КонвертацияОбъектовРаспределенныхИнформационныхБаз.МодульОбъекта}: Ошибка при вызове метода контекста (ПрочитатьИзменения): Ошибка при выполнении обработчика - 'ПриПолученииДанныхОтПодчиненного': {ПланОбмена.СОтборами.МодульОбъекта}: Ошибка при вызове метода контекста (Выполнить): {(10, 32)}: Поле не найдено "НастройкиАдресныхСкладовНовая.ИспользоватьПодпитку"
Выясним причину этой проблемы и рассмотрим по шагам способы ее устранения.
Проанализируем ситуацию: в процессе развития подсистемы адресного склада разработчики типовой конфигурации удалили или реструктурировали ресурс ИспользоватьПодпитку в регистре сведений НастройкиАдресныхСкладов. Однако в коде обработчика события ПриПолученииДанныхФайла (или ПриПолученииДанныхОтПодчиненного) модуля плана обмена остался жестко прописанный текст запроса. Этот запрос обращается к таблице переданного набора записей и пытается прочитать поле, которого больше нет в составе метаданных. В результате метод Выполнить() генерирует исключение, и процесс загрузки изменений прерывается.
Разберем основное исправление, рекомендуемое разработчиками конфигурации. Для этого необходимо отредактировать модуль объекта планов обмена РИБ и РИБ с отборами (или соответствующего плана обмена, используемого в вашей базе).
Выполним следующие шаги:
ПриПолученииДанныхФайла (или обработчик получения данных).ТипПолучаемогоОбъекта = Тип("РегистрСведенийНаборЗаписей.НастройкиАдресныхСкладов") заменим исходный текст запроса на корректный, из которого исключено обращение к отсутствующему полю ИспользоватьПодпитку.Посмотрим на пример правильного формирования текста запроса:
ИначеЕсли ТипПолучаемогоОбъекта = Тип("РегистрСведенийНаборЗаписей.НастройкиАдресныхСкладов") Тогда
Запрос = Новый Запрос("
|ВЫБРАТЬ
| НастройкиАдресныхСкладовНовая.Склад,
| НастройкиАдресныхСкладовНовая.Помещение,
| НастройкиАдресныхСкладовНовая.ГлубинаАнализа,
| НастройкиАдресныхСкладовНовая.МинимальнаяВероятностьОтгрузки,
| НастройкиАдресныхСкладовНовая.УровеньОбслуживанияУпаковокКлассаX,
| НастройкиАдресныхСкладовНовая.УровеньОбслуживанияУпаковокКлассаY,
| НастройкиАдресныхСкладовНовая.УровеньОбслуживанияУпаковокКлассаZ,
| НастройкиАдресныхСкладовНовая.ИспользоватьАдресноеХранение,
| НастройкиАдресныхСкладовНовая.ИспользоватьАдресноеХранениеСправочно,
| НастройкиАдресныхСкладовНовая.ИспользоватьРабочиеУчастки,
| НастройкиАдресныхСкладовНовая.НастройкаФормированияПоРабочимУчасткамОтбор,
| НастройкиАдресныхСкладовНовая.ОграничиватьПоВесуОтбор,
| НастройкиАдресныхСкладовНовая.ОграничиватьПоОбъемуОтбор,
| НастройкиАдресныхСкладовНовая.ОграничениеПоОбъемуОтбор,
| НастройкиАдресныхСкладовНовая.ОграничениеПоВесуОтбор,
| НастройкиАдресныхСкладовНовая.РабочийУчастокОтбор,
| НастройкиАдресныхСкладовНовая.НастройкаФормированияПоРабочимУчасткамПодпитка,
| НастройкиАдресныхСкладовНовая.ОграничиватьПоВесуПодпитка,
| НастройкиАдресныхСкладовНовая.ОграничиватьПоОбъемуПодпитка,
| НастройкиАдресныхСкладовНовая.ОграничениеПоВесуПодпитка,
| НастройкиАдресныхСкладовНовая.ОграничениеПоОбъемуПодпитка,
| НастройкиАдресныхСкладовНовая.РабочийУчастокПодпитка
|ПОМЕСТИТЬ ВТ_НовыйНаборЗаписей
|ИЗ
| &ТаблицаНабораЗаписей КАК НастройкиАдресныхСкладовНовая
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_НовыйНаборЗаписей.Склад КАК Склад,
| ВТ_НовыйНаборЗаписей.Помещение КАК Помещение,
| ВТ_НовыйНаборЗаписей.ГлубинаАнализа,
| ВТ_НовыйНаборЗаписей.МинимальнаяВероятностьОтгрузки,
| ВТ_НовыйНаборЗаписей.УровеньОбслуживанияУпаковокКлассаX,
| ВТ_НовыйНаборЗаписей.УровеньОбслуживанияУпаковокКлассаY,
| ВТ_НовыйНаборЗаписей.УровеньОбслуживанияУпаковокКлассаZ,
| ВТ_НовыйНаборЗаписей.ИспользоватьАдресноеХранение,
| ВТ_НовыйНаборЗаписей.ИспользоватьАдресноеХранениеСправочно,
| ВТ_НовыйНаборЗаписей.ИспользоватьРабочиеУчастки,
| ВТ_НовыйНаборЗаписей.НастройкаФормированияПоРабочимУчасткамОтбор,
| ВТ_НовыйНаборЗаписей.ОграничиватьПоВесуОтбор,
| ВТ_НовыйНаборЗаписей.ОграничиватьПоОбъемуОтбор,
| ВТ_НовыйНаборЗаписей.ОграничениеПоОбъемуОтбор,
| ВТ_НовыйНаборЗаписей.ОграничениеПоВесуОтбор,
| ВТ_НовыйНаборЗаписей.РабочийУчастокОтбор,
| ВТ_НовыйНаборЗаписей.НастройкаФормированияПоРабочимУчасткамПодпитка,
| ВТ_НовыйНаборЗаписей.ОграничиватьПоВесуПодпитка,
| ВТ_НовыйНаборЗаписей.ОграничиватьПоОбъемуПодпитка,
| ВТ_НовыйНаборЗаписей.ОграничениеПоВесуПодпитка,
| ВТ_НовыйНаборЗаписей.ОграничениеПоОбъемуПодпитка,
| ВТ_НовыйНаборЗаписей.РабочийУчастокПодпитка,
| ЕСТЬNULL(НастройкиАдресныхСкладов.РегламентноеЗаданиеРасчетаПоказателейПрогноза, &ПустойИдентификатор) КАК РегламентноеЗаданиеРасчетаПоказателейПрогноза,
| ЕСТЬNULL(НастройкиАдресныхСкладов.РегламентноеЗаданиеСозданиеЗаданийНаОтбор, &ПустойИдентификатор) КАК РегламентноеЗаданиеСозданиеЗаданийНаОтбор,
| ЕСТЬNULL(НастройкиАдресныхСкладов.РегламентныеЗаданияСозданияЗаданийНаПересчетТоваров, """") КАК РегламентныеЗаданияСозданияЗаданийНаПересчетТоваров,
| ВЫБОР
| КОГДА НастройкиАдресныхСкладов.РегламентноеЗаданиеСозданиеЗаданийНаОтбор ЕСТЬ NULL
| ТОГДА ЛОЖЬ
| ИНАЧЕ НастройкиАдресныхСкладов.ИспользоватьРегламентноеЗаданиеСозданияЗаданийНаОтбор
| КОНЕЦ КАК ИспользоватьРегламентноеЗаданиеСозданияЗаданийНаОтбор
|ИЗ
| ВТ_НовыйНаборЗаписей КАК ВТ_НовыйНаборЗаписей
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиАдресныхСкладов КАК НастройкиАдресныхСкладов
| ПО ВТ_НовыйНаборЗаписей.Склад = НастройкиАдресныхСкладов.Склад
| И ВТ_НовыйНаборЗаписей.Помещение = НастройкиАдресныхСкладов.Помещение");
Если требуется сохранить типовую конфигурацию на полной поддержке без снятия с замка, переопределим проблемную процедуру с помощью механизма расширений.
Для этого создадим расширение конфигурации, добавим в него целевой план обмена и с помощью аннотации &Вместо изменим метод, содержащий ошибочный запрос к набору записей.
Если обмен данными необходимо провести срочно, а возможность внести изменения в конфигурацию отсутствует, применим обходной путь:
НастройкиАдресныхСкладов и снимем с него регистрацию изменений (также можно воспользоваться вызовом ПланыОбмена.УдалитьРегистрациюИзменений()).Поскольку проблемный набор записей регистра не попадет в выгрузку, центральный узел прочитает пакет обмена без ошибок.
Нередко при возникновении подобных ошибок периферийный узел входит в бесконечный цикл: при запуске конфигурация требует синхронизации, синхронизация падает с ошибкой, и программа аварийно закрывается. Разберем, как восстановить работоспособность узла:
ПланыОбмена.УстановитьГлавныйУзел(Неопределено);
ПланыОбмена.УстановитьГлавныйУзел(ГлавныйУзел);
Важно: перед выполнением любых операций с планами обмена и структурой конфигурации обязательно создавайте резервные копии всех узлов распределенной информационной базы.