Как использовать собственные объекты метаданных в расширениях 1С и обойти сопутствующие ошибки

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

С развитием механизма расширений конфигурации в платформе 1С:Предприятие появилась возможность добавлять собственные прикладные объекты: справочники, документы и регистры сведений. Однако при внедрении таких расширений в типовые конфигурации (например, 1С:Бухгалтерия предприятия, 1С:Управление нашей фирмой или 1С:Зарплата и управление персоналом) разработчики сталкиваются с рядом специфических проблем: ошибками обновления вспомогательных данных БСП, конфликтами системных методов и некорректной работой запросов к виртуальным таблицам. Разберем по шагам, с чем связаны эти проблемы и как их правильно решать.

1. Ошибки обновления вспомогательных данных БСП при добавлении объектов

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

Проанализируем причину такого поведения. В типовых конфигурациях библиотека стандартных подсистем (БСП) ведет строгий учет объектов конфигурации в специальных справочниках идентификаторов метаданных. В ранних версиях БСП механизмы обновления были ориентированы исключительно на объекты основной конфигурации. Полноценная поддержка собственных объектов расширений с сохранением данных требует использования справочника Идентификаторы объектов версий расширений, который поддерживается в более свежих редакциях БСП (начиная с БСП 2.4.4+ и редакции 3.x).

Кроме того, в типовых решениях срабатывает механизм контроля неразделенных данных технологии сервиса. Если добавленный объект не зарегистрирован в подписках на события БСП, система выбрасывает исключение. Чтобы временно обойти эту проблему при тестировании или накатывании релизов, применяют следующий порядок действий:

  1. Выгрузим разрабатываемое расширение в файл через меню Конфигурация - Расширения конфигурации - Сохранить в файл.
  2. Удалим расширение из информационной базы перед выполнением процедур обновления основной конфигурации.
  3. Выполним обновление конфигурации и процедур информационной базы в штатном режиме.
  4. Загрузим сохраненное расширение обратно в базу.
  5. Для долговременного решения переопределим состав исключений в процедуре ПриОпределенииИсключенийНеразделенныхДанных соответствующего общего модуля БСП.

2. Конфликт функций побитовых операций при отключении режима совместимости

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

Выясним причину ошибки: начиная с версии 8.3.10 платформы 1С:Предприятие, побитовые операции были добавлены в состав встроенного языка как системные функции. В модулях старых версий БСП (например, при работе с контактной информацией) данные функции были объявлены разработчиками вручную. При отключении режима совместимости возникает коллизия имен встроенного языка и пользовательского кода.

Рассмотрим варианты устранения проблемы:

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

3. Ошибка запросов к виртуальным таблицам СрезПоследних и СрезПервых

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

Посмотрим на пример проблемного кода в обработчике расширения:


&НаСервере
Процедура ГарантПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    АктыСрезПоследних.Акт КАК Акт
        |ИЗ
        |    РегистрСведений.Акты.СрезПоследних(&НаДату, Контрагент = &Контрагент) КАК АктыСрезПоследних";
    
    Запрос.УстановитьПараметр("НаДату", ТекущаяДата());
    Запрос.УстановитьПараметр("Контрагент", Объект.Ссылка);
    
    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();
    Если Выборка.Следующий() Тогда
        ЭтаФорма.Акт = Выборка.Акт;
    КонецЕсли;
КонецПроцедуры

Данная ошибка зарегистрирована в фирме «1С» под кодом 10186928 и связана с особенностями работы механизма виртуальных таблиц расширений в ранних релизах платформы. Для стабильной работы запросов к срезам требуется обновить платформу на исправленный релиз. Если обновление платформы прямо сейчас невозможно, разберем два надежных обходных пути.

Вариант А: Использование методов менеджера регистра сведений

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


&НаСервере
Процедура ГарантПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    Отбор = Новый Структура;
    Отбор.Вставить("Контрагент", Объект.Ссылка);
    
    // Получаем срез последних данных без использования языка запросов
    ЗначенияРесурсов = РегистрыСведений.Акты.ПолучитьПоследнее(ТекущаяДата(), Отбор);
    ЭтаФорма.Акт = ЗначенияРесурсов.Акт;
КонецПроцедуры

Вариант Б: Замена виртуальной таблицы среза на запрос к реальной таблице

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


ВЫБРАТЬ
    Акты.Контрагент КАК Контрагент,
    Акты.Акт КАК Акт
ИЗ
    РегистрСведений.Акты КАК Акты
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (
            ВЫБРАТЬ
                АктыМакс.Контрагент КАК Контрагент,
                МАКСИМУМ(АктыМакс.Период) КАК Период
            ИЗ
                РегистрСведений.Акты КАК АктыМакс
            ГДЕ
                АктыМакс.Период <= &НаДату
                И АктыМакс.Контрагент = &Контрагент
            СГРУППИРОВАТЬ ПО
                АктыМакс.Контрагент
        ) КАК МаксимальныеДаты
        ПО Акты.Контрагент = МаксимальныеДаты.Контрагент
        И Акты.Период = МаксимальныеДаты.Период

4. Ограничения состава объектов и безопасность данных

При проектировании архитектуры на расширениях учтем состав поддерживаемых объектов и правила хранения информации:

  1. Состав объектов: В базовых версиях функционала расширений доступны справочники, документы и регистры сведений. Поддержка других видов метаданных добавлялась постепенно: РегистрыНакопления, РегистрыБухгалтерии и РегистрыРасчета поддерживаются начиная с версии 8.3.12, а собственные Перечисления — с платформы 8.3.14.
  2. Хранение данных: Физически таблицы объектов расширений хранятся в базе данных отдельно. При удалении расширения из базы связанные с ним таблицы данных безвозвратно удаляются. Перед любыми регламентными работами, обновлением структуры и удалением расширений обязательно выполняем резервное копирование информационной базы.
← На главную