Ошибки при копировании документов в 1С:УПП 1.3: Поле объекта не обнаружено (АлкогольнаяПродукция)

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

При работе в конфигурации «Управление производственным предприятием» (редакция 1.3) пользователи могут столкнуться с ситуацией, когда при попытке скопировать документ Поступление товаров и услуг или Приходный ордер на товары система выдает критическую ошибку выполнения обработчика ПриКопировании.

Сама ошибка выглядит следующим образом:


{ОбщийМодуль.ИнтеграцияЕГАИСПереопределяемый.Модуль(3052)}: Поле объекта не обнаружено (АлкогольнаяПродукция)

При этом предприятие может вообще не иметь отношения к обороту алкогольной продукции и не использовать подсистему ЕГАИС. Проанализируем причину возникновения этой проблемы и рассмотрим способы её устранения.

Выясняем причину возникновения ошибки

Разберем логику работы конфигурации в момент копирования документа. При выполнении операции копирования срабатывает событие ПриКопировании, в котором вызываются функции подсистемы интеграции с ЕГАИС.

В общем модуле ИнтеграцияЕГАИСПереопределяемый расположен код, проверяющий тип копируемого документа:


Если ЭтоВходящийДокументЕГАИС(Источник) Тогда
    Для Каждого СтрокаТоваров Из Источник.Товары Цикл
        СтрокаТоваров.АлкогольнаяПродукция   = Справочники.КлассификаторАлкогольнойПродукцииЕГАИС.ПустаяСсылка();
        СтрокаТоваров.ИдентификаторСтроки   = "";
        СтрокаТоваров.ИдентификаторУпаковки = "";
    КонецЦикла;
КонецЕсли;

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


Функция ЭтоВходящийДокументЕГАИС(ЭтотОбъект) Экспорт
    ТД = ТипыВходящихДокументов();
    Возврат ТД.Найти(ТипЗнч(ЭтотОбъект.Ссылка)) <> Неопределено;
КонецФункции

Функция ТипыВходящихДокументов()
    Результат = Новый Массив;
    Результат.Добавить(Тип("ДокументСсылка.ПоступлениеТоваровУслуг"));
    Результат.Добавить(Тип("ДокументСсылка.ПриходныйОрдерНаТовары"));
    Возврат Результат;
КонецФункции

Причин, почему на строке СтрокаТоваров.АлкогольнаяПродукция возникает исключение, может быть две:

  1. Некорректное сравнение и объединение при обновлении: Если конфигурация снята с полной поддержки, во время одного из предыдущих обновлений специалист мог обновить общий модуль ЕГАИС, но не перенести изменения в табличную часть Товары самого документа. В итоге реквизиты АлкогольнаяПродукция, ИдентификаторСтроки и ИдентификаторУпаковки отсутствуют в метаданных табличной части.
  2. Кэширование метаданных платформой: Ошибка может возникать после динамического обновления базы, когда серверный кэш или кэш клиента не синхронизировался с новой структурой метаданных.

Способ 1. Восстановление реквизитов через Конфигуратор (Рекомендуемый)

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

  1. Откроем Конфигуратор и перейдем в меню Конфигурация — Поддержка — Настройка поддержки.
  2. Проверим версию поставщика и убедимся, на сколько релизов отстает текущая конфигурация.
  3. Выполним сравнение и объединение с типовой конфигурацией поставок 1С соответствующей версии.
  4. В табличной части Товары документа ПоступлениеТоваровУслуг убедимся в наличии реквизитов:
    • АлкогольнаяПродукция (тип: СправочникСсылка.КлассификаторАлкогольнойПродукцииЕГАИС);
    • ИдентификаторСтроки (тип: Строка);
    • ИдентификаторУпаковки (тип: Строка).
  5. Обновим конфигурацию базы данных.

Способ 2. Программная доработка проверки колонок

Если добавить реквизиты в метаданные в данный момент невозможно или конфигурация намеренно облегчена от неиспользуемых полей, изменим логику модуля ИнтеграцияЕГАИСПереопределяемый.

Рассмотрим применение проверки наличия колонки в табличной части перед её обнулением. Это позволит избежать ошибок даже при отсутствии реквизитов в конфигураторе:


Если ЭтоВходящийДокументЕГАИС(Источник) Тогда
    // Проверяем, существует ли реквизит в табличной части документа
    Если Источник.Товары.Колонки.Найти("АлкогольнаяПродукция") <> Неопределено Тогда
        Для Каждого СтрокаТоваров Из Источник.Товары Цикл
            СтрокаТоваров.АлкогольнаяПродукция   = Справочники.КлассификаторАлкогольнойПродукцииЕГАИС.ПустаяСсылка();
            СтрокаТоваров.ИдентификаторСтроки   = "";
            СтрокаТоваров.ИдентификаторУпаковки = "";
        КонецЦикла;
    КонецЕсли;
КонецЕсли;

Альтернативный временный вариант — безопасная обработка ошибки с помощью блока Попытка...Исключение:


Попытка
    СтрокаТоваров.АлкогольнаяПродукция   = Справочники.КлассификаторАлкогольнойПродукцииЕГАИС.ПустаяСсылка();
    СтрокаТоваров.ИдентификаторСтроки   = "";
    СтрокаТоваров.ИдентификаторУпаковки = "";
Исключение
    // Пропускаем присвоение, если реквизиты отсутствуют в метаданных
КонецПопытки;

Способ 3. Очистка кэша платформы

Если метаданные в конфигураторе содержат реквизит АлкогольнаяПродукция, но ошибка все равно появляется у пользователей, проанализируем состояние кэша платформы 1С:

  1. Завершим работу всех сеансов пользователей.
  2. Удалим базу из списка запуска 1С и добавим ее заново (это сбросит локальный кэш указанной базы).
  3. При клиент-серверном варианте перезапустим службу 1C:Enterprise 8.3 Server Agent.
← На главную