В первой части статьи о расширениях конфигурации 1С мы говорили о возможностях технологии, собственных структурах данных и хранении новых реквизитов. Во второй части обсудим РН, изменение режима совместимости, доработку модулей и форм, отчеты, печатные формы и ограничения расширений.
Новые регистры накопления (РН)
В ходе адаптации под нужды заказчика потребовалось переработать типовой механизм учета НДФЛ к перечислению. Для этого понадобилась возможность создавать собственные РН, которая стала доступна в версии 8.3.13 платформы. В БСП, актуальной на тот момент, режим совместимости был только 8.3.12, поэтому его потребовалось повысить.
Появились нюансы, характерные для конкретной версии платформы 8.3.13.1644. Оказалось, что для нее заимствованные РН нельзя модифицировать, точнее, можно, но конфигурация начинает работать нестабильно: ломается конструктор запросов в пользовательском режиме, возникают странные падения и ошибки. Причем регистр накопления считается измененным, даже если установлен флаг модификации совершенно пустого модуля набора записей. Такое состояние метаданных можно получить, если в заимствованном регистре написать код в модуле набора записей и потом его удалить. Поиск этой ошибки занял большое количество нервов и времени.
Кстати, модифицированные объекты легко отобрать прямо из дерева конфигурации с помощью кнопки-фильтра. В свежих версиях платформы (например, 8.3.15 и выше в режиме совместимости 8.3.13) эта проблема не воспроизводится.
Изменение режима совместимости
Вытекающая из предыдущей части задача — поднять режим совместимости конфигурации. Это контролируемое свойство, и приходится менять его и в основной конфигурации, и в расширении.
В любом случае требуется адаптация кода БСП. В БСП реализован защитный механизм от запуска на более высоких версиях платформы в модуле СтандартныеПодсистемыСервер. Править придется в основной конфигурации, поскольку при обновлении конфигурации выполняется вызов ВыполнитьФоновоеЗаданиеБезРасширений, без этой доработки клиент не отработает как надо.
В зависимости от версий нюансы могут быть разные, так как поведение платформы отличается, меняются сигнатуры некоторых платформенных функций. Это выявляется только тщательным тестированием.
С чем сталкивались мы:
● Особенность компоновки в СКД запросов-объединений, когда накладывается отбор и поле для отбора присутствует только в одном запросе. Это даже не баг, а фича — это описано в изменении к релизу платформы 8.3.13 (http://downloads.v8.1c.ru/content//Platform/8_3_13_1513/1cv8upd_8_3_13_1513.htm#11b285ec-7857-11e8-a3f7-0050569f678a). Новое поведение платформы приводит к появлению в запросах объединения ложных условий NULL = &П, из-за чего типовые отчеты перестают работать как ожидается (столкнулись при подготовке регламентированной отчетности). Задачу решили, работая с текстом запроса в скомпонованном макете, другими вариантами проблема не решалась. К счастью, в версии 8.3.14 это поведение изменилось, о чем в документации тоже есть информация.
● Менялась сигнатура метода НачатьПомещениеФайла. Третий параметр в 8.3.12 мог быть простой строкой, которая шла в заголовок диалога, а в 8.3.13 должен быть объект ДиалогВыбораФайла.
Доработка модулей
В расширении можно заимствовать модули основной конфигурации и создавать свои. В заимствованных модулях, помимо создания собственных функций/процедур, можно менять выполнение типового кода: вклиниться до выполнения типовой процедуры и после или вместо типовой сделать свою процедуру. Это реализуется указанием перед заимствованной процедурой или функцией аннотации &Перед, &Вместо, &После. Работают заимствованные модули в одном пространстве имен с основными — можно вызвать типовой код из расширения.
Особенности. Модули в расширении могут быть собственными и заимствованными. Лучше в заимствованных писать только код, касающийся перехвата поведения типового, а свой код писать в собственных модулях расширения. Это позволяет легче контролировать изменения относительно типовой конфигурации при обновлении, когда исходная функция изменена. Потребуется анализировать меньше кода.
Существует настройка — безопасный режим и имя профиля безопасности. Она влияет на переопределение кода в общих модулях. Если не разрешить ее для расширения, код из его общих модулей не будет срабатывать без каких-либо видимых оповещений.
Лучше использовать аннотации &Перед и &После, а не &Вместо. К сожалению, это не всегда возможно. Например, в обычной для ЗУПа функции получения каких-нибудь данных может идти формирование запроса, настройка его параметров и выполнение, а потом еще и обработка результата. Даже если нужно исправить только одну строчку в тексте запроса, все равно приходится копировать весь код. Из-за этого часто встречается заимствованный в расширение код. Для него полезно оставлять где-нибудь в начале функции комментарий, который можно найти глобальным поиском, а также информацию о версии, из которой код заимствован, чтобы хоть как-то разобраться при изменении типовой функции.
В платформе 8.3.15 стала доступна новая аннотация &ИзменениеИКонтроль, которая позволяет выделять свои области изменения областями #Вставить и #КонецВставить и #Удалить и #КонецУдалить. Код в области удаления выполняться не будет, комментировать его не нужно. Также будет реализовываться блок вставляемого кода. Кроме этого, платформа контролирует отличие версии процедуры с исходным кодом и исключенным добавляемым и выдает предупреждение.
Доработка форм
Механика процесса сложнее, чем кажется на первый взгляд.
В момент захвата формы в расширение вместе с экземпляром сохраняется исходная версия захваченной формы. При открытии расширенной формы в пользовательском режиме вычисляются две разницы: новой формы в основной конфигурации относительно старой формы и формы в расширении относительно старой формы. Разница подразумевает изменения в свойствах и структуре элементов, команд и реквизитов. Сопоставление элементов выполняется по именам.
После вычисления разницы они совмещаются с приоритетом изменений расширения — так получается результирующая форма.
Проблемы, к которым может привести алгоритм
Во-первых, вычисление разниц требует времени, и на больших сложных формах типа РМК возможно существенное замедление.
Во-вторых, есть зависимость от сохраненной формы. Пока форма в основной конфигурации не изменилась, все работает логично и понятно. При существенных изменениях структуры форм результат в пользовательском режиме может быть неожиданным. К счастью, в редакторе формы есть команда обновления сохраненной формы в расширение, с помощью которой получится затянуть новую версию из основной конфигурации. Можно также открыть сохраненную форму на чтение.
Подходы к доработке форм
Часто другие компании на проектах запрещают редактирование свойств формы — все реализуется только кодом. В этом случае полезно сделать обработку: создать форму как обычно, обработка генерирует код для получения того же результата программно.
Полезный инструмент — декомпилятор управляемых форм https://infostart.ru/public/304736/
При доработке формы интерактивным редактированием есть особенность для обработчиков событий: вместо аннотаций для них используется создание собственных процедур в расширении с назначением в свойствах элементов формы. Также там можно указать обработчик Перед, После и Вместо. Для остального кода формы доработка выполняется как и в других модулях — через аннотации.
Отчеты и печатные формы
Для подключения отчетов расширения к подсистеме БСП «Варианты отчетов» нужно по сути два действия:
1. Подключить отчет к хранилищу вариантов, предварительно захватив его в расширение (это актуально для ЗУП, где в корне основной конфигурации не проставлено свойство хранилища вариантов).
2. Описать подключаемые варианты кодом в менеджере отчета функцией НастроитьВариантыОтчета().
Особенности внешних дополнительных отчетов и обработок
● Для собственных документов расширения не подключаются назначаемые печатные формы, реализовать можно только командами из формы. Причина: в подсистеме используется ТЧ «Назначения», где для дополнительного отчета хранятся ссылки на идентификаторы объектов метаданных. При этом справочника в БСП два: для объектов метаданных и для объектов расширений. Но хранить ссылку там можно только для объектов метаданных.
● Конструктор запросов в конфигураторе работает только со структурами данных, захваченными или созданными в расширении. Если запрос или отчет строится по большому числу существующих в основной конфигурации объектов, то их все (и объекты, и реквизиты) нужно захватывать в расширение, что довольно утомительно — инструмента, позволяющего это сделать в один клик, нет.
Решение: подготовка текста запроса или схемы СКД в пользовательском режиме в консоли запроса или СКД. Результат можно загрузить в конфигурацию, и он будет исполняться корректно (не работает только конструктор).
● При работе с внешними отчетами конструктор запросов и СКД не видит собственные структуры данных расширения. Это проблема только конструктора запросов в конфигураторе, так что можно работать с текстом запроса из консоли запросов в пользовательском режиме и уже готовый запрос вставлять в отчет. Вероятно, потребуется сначала создать пустышку запроса для возможности настроить структуру, отборы и т. п. в СКД.
Внешний отчет можно разрабатывать в расширении, а в конце выгрузить его.
Ограничения расширений
Несколько существенных ограничений технологии, с которыми мы столкнулись на проекте.
Планы обмена. В версии 8.3.13 они практически полноценные: можно создавать свои, в заимствованных менять состав, добавлять и заимствованные и собственные объекты. Но в версии платформы 8.3.13.1644 это не работало: таблицы изменений для собственных добавленных объектов метаданных не создавались, в конструкторе запросов тоже не было таблиц изменений.
Решение простое, но требует вмешательства в основную конфигурацию: создаем пустышку плана обмена — только сам объект с требуемым именем — захватываем в расширение. Остальное: реквизиты и ТЧ, состав, макеты и прочее — можно настроить в расширении.
Кстати, в 8.3.15 даже с режимом совместимости 8.3.13 работает корректно.
Константы не поддерживаются (стало возможным в 8.3.16). Решается это созданием собственного независимого непериодического регистра сведений, где в ресурсах можно хранить все необходимые данные. Из недостатков: запись будет работать на весь набор целиком (если часто меняются константы, возможны проблемы с блокировками).
Нельзя создавать в расширении собственные подписки на события (стало возможным в 8.3.17). Решения два: метод пустышек (только собственно подписка с именем, типы и остальное в расширении) или делать вызовы нужного кода в модулях объектов и наборов записей.
Нельзя создавать в расширении регламентные задания (альтернатив нет вплоть до 8.3.18). Варианты решения: метод пустышек или внешний отчет, подключаемый к подсистеме БСП с типом команды ВызовСерверногоМетода (для него из стандартного интерфейса есть возможность настройки расписания).
Версионирование
С версии 8.3.12 платформы поддерживается работа расширения с хранилищем. Это немного странно реализовано в меню, и новые разработчики путаются. Управляется одним и тем же меню в конфигураторе, нужно только выбрать объект из дерева основной конфигурации или из дерева расширения.
Доработка расширением удобна: оно небольшое, на 1–2 порядка меньше основной конфигурации, и все операции с хранилищем выполняются быстро.
Расширения, как и основную конфигурацию, можно разбирать на файлы и собирать обратно.
Заключение
● Технология достигла зрелости. В продуктивной среде проблем стабильности и производительности нет.
● Можно использовать на крупных проектах, в том числе и для расширения данных.
● Ошибки работы расширений редкие, но есть особенности применения. Необходимо заранее проверять проектные решения на работоспособность в используемой версии платформы.
Не стоит применять расширения для развития уже существенно переписанных систем или если в проекте изначально предполагается масштабная переработка типовых механизмов. Причина — исключается преимущество (нетронутая основная конфигурация) при возрастающей сложности доработки (особенности механизмов и несколько мест правки кода).
Не следует использовать в одной конфигурации несколько расширений, изменяющих один и тот же объект метаданных. Это приводит к запутыванию работы кода, доработки будет сложно выполнять. Исключение: временные исправления ошибок, которые в ближайшем релизе будут устранены.
Максим
Вместо #Вставить, #КонецВставить, #Удалить, #КонецУдалить, Вставка/КонецВставки, Удаление/КонецУдаления. Исправьте, пожалуйста.