С развитием механизма расширений конфигурации в платформе 1С:Предприятие появилась возможность добавлять собственные прикладные объекты: справочники, документы и регистры сведений. Однако при внедрении таких расширений в типовые конфигурации (например, 1С:Бухгалтерия предприятия, 1С:Управление нашей фирмой или 1С:Зарплата и управление персоналом) разработчики сталкиваются с рядом специфических проблем: ошибками обновления вспомогательных данных БСП, конфликтами системных методов и некорректной работой запросов к виртуальным таблицам. Разберем по шагам, с чем связаны эти проблемы и как их правильно решать.
При добавлении новых объектов (документов, справочников, регистров) в расширение типовой базы стандартный запуск в режиме 1С:Предприятие может завершиться аварийно с ошибками инициализации параметров работы программы. При этом обработка обновления вспомогательных данных не распознает метаданные из расширения.
Проанализируем причину такого поведения. В типовых конфигурациях библиотека стандартных подсистем (БСП) ведет строгий учет объектов конфигурации в специальных справочниках идентификаторов метаданных. В ранних версиях БСП механизмы обновления были ориентированы исключительно на объекты основной конфигурации. Полноценная поддержка собственных объектов расширений с сохранением данных требует использования справочника Идентификаторы объектов версий расширений, который поддерживается в более свежих редакциях БСП (начиная с БСП 2.4.4+ и редакции 3.x).
Кроме того, в типовых решениях срабатывает механизм контроля неразделенных данных технологии сервиса. Если добавленный объект не зарегистрирован в подписках на события БСП, система выбрасывает исключение. Чтобы временно обойти эту проблему при тестировании или накатывании релизов, применяют следующий порядок действий:
Конфигурация - Расширения конфигурации - Сохранить в файл.ПриОпределенииИсключенийНеразделенныхДанных соответствующего общего модуля БСП.Для того чтобы задействовать все функциональные возможности расширений, часто требуется отключить режим совместимости конфигурации (установить значение Не использовать). Однако сразу после этого в модулях могут начать массово появляться ошибки вида Процедура или функция с указанным именем уже определена для функций ПобитовоеНЕ, ПобитовоеИ, ПобитовоеИЛИ.
Выясним причину ошибки: начиная с версии 8.3.10 платформы 1С:Предприятие, побитовые операции были добавлены в состав встроенного языка как системные функции. В модулях старых версий БСП (например, при работе с контактной информацией) данные функции были объявлены разработчиками вручную. При отключении режима совместимости возникает коллизия имен встроенного языка и пользовательского кода.
Рассмотрим варианты устранения проблемы:
ПобитовоеИ, ПобитовоеИЛИ, ПобитовоеНЕ, ПобитовоеСдвигВлево и ПобитовоеСдвигВправо.При обращении через язык запросов к виртуальным таблицам СрезПоследних или СрезПервых периодических регистров сведений, созданных внутри расширения, платформа может выдавать ошибку Таблица не найдена, даже если конструктор запросов успешно видит и строит обращение к таблице.
Посмотрим на пример проблемного кода в обработчике расширения:
&НаСервере
Процедура ГарантПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| АктыСрезПоследних.Акт КАК Акт
|ИЗ
| РегистрСведений.Акты.СрезПоследних(&НаДату, Контрагент = &Контрагент) КАК АктыСрезПоследних";
Запрос.УстановитьПараметр("НаДату", ТекущаяДата());
Запрос.УстановитьПараметр("Контрагент", Объект.Ссылка);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Если Выборка.Следующий() Тогда
ЭтаФорма.Акт = Выборка.Акт;
КонецЕсли;
КонецПроцедуры
Данная ошибка зарегистрирована в фирме «1С» под кодом 10186928 и связана с особенностями работы механизма виртуальных таблиц расширений в ранних релизах платформы. Для стабильной работы запросов к срезам требуется обновить платформу на исправленный релиз. Если обновление платформы прямо сейчас невозможно, разберем два надежных обходных пути.
Методы объектной модели регистра сведений работают без ошибок и обращаются к физическим таблицам напрямую. Заменим текст запроса на метод ПолучитьПоследнее() или ПолучитьПервое():
&НаСервере
Процедура ГарантПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
Отбор = Новый Структура;
Отбор.Вставить("Контрагент", Объект.Ссылка);
// Получаем срез последних данных без использования языка запросов
ЗначенияРесурсов = РегистрыСведений.Акты.ПолучитьПоследнее(ТекущаяДата(), Отбор);
ЭтаФорма.Акт = ЗначенияРесурсов.Акт;
КонецПроцедуры
Если требуется получить срез по множеству записей одним запросом, заменим виртуальную таблицу на вложенный запрос с группировкой по максимальному периоду к физической таблице РегистрСведений.Акты:
ВЫБРАТЬ
Акты.Контрагент КАК Контрагент,
Акты.Акт КАК Акт
ИЗ
РегистрСведений.Акты КАК Акты
ВНУТРЕННЕЕ СОЕДИНЕНИЕ (
ВЫБРАТЬ
АктыМакс.Контрагент КАК Контрагент,
МАКСИМУМ(АктыМакс.Период) КАК Период
ИЗ
РегистрСведений.Акты КАК АктыМакс
ГДЕ
АктыМакс.Период <= &НаДату
И АктыМакс.Контрагент = &Контрагент
СГРУППИРОВАТЬ ПО
АктыМакс.Контрагент
) КАК МаксимальныеДаты
ПО Акты.Контрагент = МаксимальныеДаты.Контрагент
И Акты.Период = МаксимальныеДаты.Период
При проектировании архитектуры на расширениях учтем состав поддерживаемых объектов и правила хранения информации:
РегистрыНакопления, РегистрыБухгалтерии и РегистрыРасчета поддерживаются начиная с версии 8.3.12, а собственные Перечисления — с платформы 8.3.14.