Как исправить ошибку РИБ «Поле не найдено НастройкиАдресныхСкладовНовая.ИспользоватьПодпитку» в УТ 11?

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

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

В журнале регистрации и в окне сообщений отображается стек ошибки следующего вида:

Ошибка чтения файла сообщения обмена: {Обработка.КонвертацияОбъектовРаспределенныхИнформационныхБаз.МодульОбъекта}: Ошибка при вызове метода контекста (ПрочитатьИзменения): Ошибка при выполнении обработчика - 'ПриПолученииДанныхОтПодчиненного': {ПланОбмена.СОтборами.МодульОбъекта}: Ошибка при вызове метода контекста (Выполнить): {(10, 32)}: Поле не найдено "НастройкиАдресныхСкладовНовая.ИспользоватьПодпитку"

Выясним причину этой проблемы и рассмотрим по шагам способы ее устранения.

Причина возникновения ошибки

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

Способ 1. Корректировка текста запроса в плане обмена

Разберем основное исправление, рекомендуемое разработчиками конфигурации. Для этого необходимо отредактировать модуль объекта планов обмена РИБ и РИБ с отборами (или соответствующего плана обмена, используемого в вашей базе).

Выполним следующие шаги:

  1. Откроем конфигуратор и найдем модуль объекта используемого плана обмена.
  2. Найдем процедуру ПриПолученииДанныхФайла (или обработчик получения данных).
  3. В ветке условия проверки типа ТипПолучаемогоОбъекта = Тип("РегистрСведенийНаборЗаписей.НастройкиАдресныхСкладов") заменим исходный текст запроса на корректный, из которого исключено обращение к отсутствующему полю ИспользоватьПодпитку.

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


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

Способ 2. Исправление через расширение конфигурации

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

Для этого создадим расширение конфигурации, добавим в него целевой план обмена и с помощью аннотации &Вместо изменим метод, содержащий ошибочный запрос к набору записей.

Способ 3. Временная отмена регистрации изменений регистра

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

  1. В информационной базе источника (подчиненном узле) откроем обработку «Регистрация изменений для обмена».
  2. Найдем регистр сведений НастройкиАдресныхСкладов и снимем с него регистрацию изменений (также можно воспользоваться вызовом ПланыОбмена.УдалитьРегистрациюИзменений()).
  3. Сформируем новый файл выгрузки обмена.

Поскольку проблемный набор записей регистра не попадет в выгрузку, центральный узел прочитает пакет обмена без ошибок.

Способ 4. Устранение зацикливания обновления периферийной базы

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

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

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

← На главную