Список параметров метода не соответствует методу расширение 1с

Обновлено: 07.07.2024

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

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

  • Общие модули;
  • Модули объектов (модуль объекта, модуль менеджера и т.п.) для всех типов объектов;
  • Модуль сеанса;
  • Модуль управляемого приложения;
  • Модуль внешнего соединения;
  • Модули команд;
  • Модули форм;
  • и т.д.

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

Здесь и дальше, чтобы вам было проще читать, вместо словосочетания «процедура/функция» мы будем использовать слово «метод». Итак, все изменения, которые вы можете выполнять в модулях, можно разделить на 4 группы:

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

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

Собственные модули
Вы можете создавать в расширении собственные общие модули.

Вызов
И, наконец, вы можете вызывать в своём расширении любые методы типовой конфигурации.

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

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

Перехват вызовов методов

Задача перехвата вызовов, в подавляющем большинстве случаев, заключается в том, чтобы окружить вызов типового метода некоторыми перед- и/или последействиями. При этом мы не исключили и вариант полного перекрытия вызова типового метода, и реализовали такую возможность.

Необходимость перехвата того или иного типового метода вы полностью описываете в расширяющем модуле. Для этого мы ввели во встроенный язык новый структурный элемент – аннотацию. С помощью аннотации, расположенной перед определением метода, вы указываете, какой именно типовой метод перехватывает процедура/функция, и каким именно образом. Например:


Аннотация &Перед("Процедура1") означает, что перехватывается типовая процедура с именем Процедура1. Имя аннотации Перед означает, что сначала будет выполнена ваша процедура-перехватчик Расш_Проц1(), а затем - типовая Процедура1().

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

Аннотация &Перед

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

На схеме типовой и расширяющий модули показаны прямоугольниками, а стрелка показывает последовательность исполнения встроенного языка.


Аннотация &После

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


Аннотация &Вместо

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


На одну и ту же типовую процедуру вы можете установить в своём расширении одну из следующих комбинаций перехватчиков:

  • &Перед;
  • &После;
  • &Вместо;
  • &Перед и &После.

Последняя комбинация перехватчиков (&Перед и &После) будет исполняться следующим образом:


Если же вы перехватываете типовую функцию, а не процедуру, то вы можете использовать только перехватчик &Вместо.

Вызов метода, перекрытого аннотацией &Вместо

Получается некоторая несправедливость. Процедуру вы можете перекрыть или обрамить. А функцию – только полностью перекрыть.

Чтобы избавиться от этой несправедливости, мы реализовали во встроенном языке новый метод – ПродолжитьВызов(). Если вы вызовете этот метод внутри своей функции-перехватчика, то исполнится та функция, которую вы перекрыли, после чего исполнение кода вернётся в ваш перехватчик:


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


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

Метод ПродолжитьВызов() вы можете использовать не только при перекрытии функций, но и при перекрытии процедур. В этом случае результат его применения будет по смыслу такой же, как при использовании пары перехватчиков &Перед и &После. Разница будет лишь в том, что в этом случае ваша часть «до» и ваша часть «после» будут существовать внутри одного контекста. В некоторых ситуациях это может быть удобно. На встроенном языке такая процедура-перехватчик может выглядеть следующим образом:


Что лучше, &Перед, &После или &Вместо?

Когда вы перехватываете методы типовой конфигурации, всегда полезно помнить о двух вещах:

  • После того, как вы написали своё расширение, типовая конфигурация будет изменяться;
  • Ваша цель – добавить свою функциональность, а не навсегда отказаться от того, что есть, и что будет в типовой конфигурации.

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

Также вполне приемлемым является использование перехватчика &Вместо и метода ПродолжитьВызов(). Однако тут у вас появляется возможность и соблазн вызывать типовой метод не всегда, а в зависимости от каких-то своих собственных условий. К этому нужно подходить осторожно и помнить, что в тот момент, когда вы отказываетесь от вызова типового метода, вы отказываетесь от вызова не только того метода, который есть в конфигурации сейчас, но и от всех его вариантов, которые появятся в будущем. А в будущем, например, в нём могут появиться важные и полезные изменения.

И, наконец, самый «нехороший» вариант – это полное перекрытие типового метода перехватчиком &Вместо. В этом случае типовой обработчик безусловно не будет выполняться ни сейчас, ни в будущих версиях. То есть всю ответственность за работу будущих версий конфигурации вы берёте на себя, на своё расширение. Наверняка есть ситуации, когда такое полное перекрытие необходимо, но мы призываем вас подходить к его использованию очень взвешенно и осторожно.

Последовательность вызовов при перехвате методов

Здесь, прежде чем рассказывать, необходимо сделать небольшое пояснение. Важной, можно сказать, «идеологической» характеристикой расширений является их автономность. То есть расширения должны проектироваться так, чтобы не зависеть друг от друга.

Но при работе приложения, естественно и очевидно, существует некоторая последовательность вызова подключенных расширений. Эта последовательность известна и сейчас мы о ней расскажем. Но расскажем мы не для того, чтобы на её основе вы создавали взаимозависимые расширения, или расширения, подразумевающие единственную жёстко определённую последовательность подключения. А для того, чтобы вы могли разбирать возникающие проблемы и отлаживать программный код.

Когда вы подключаете расширения к типовой конфигурации, образуется «многослойный пирог». В основании этого пирога находится типовая конфигурация, а на его вершине – последнее подключенное расширение.

Что в конфигураторе, что в режиме 1С:Предприятие, последнее подключенное расширение находится в списке последним.


Таким образом, в этом примере внизу находится типовая, наверху находится Расширение2, а между ними – Расширение1. Каждое следующее расширение перехватывает (расширяет) то, что находится под ним.

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

Пример 1

Например, если в двух расширениях перехвачен (обрамлён) один и тот же типовой метод, то последовательность вызова обработчиков будет следующая:


  • Сначала будет вызван перехватчик из Расширения2, потому что оно сверху. Это будет перехватчик &Перед, потому что у него такая аннотация;
  • Затем будет вызван перехватчик из Расширения1, потому что оно следующее в пироге. Это будет снова &Перед, потому что у него такая аннотация;
  • После этого будет вызван типовой метод, потому что больше нет перехватчиков, препятствующих его исполнению;
  • Затем, в обратной последовательности «пирога», будут вызваны перехватчик &После из Расширения1 и перехватчик &После из Расширения2.

На этом примере можно хорошо понять следующую особенность: если в одном из перехватчиков возникает необработанное исключение, то вся цепочка прерывается, и исключение продолжает распространяться.

Пример 2

Если в перехватчиках используется метод ПродолжитьВызов(), то действует тот же самый принцип «пирога».


  • Сначала будет вызван перехватчик из Расширения3, потому что оно сверху. Это будет перехватчик &Вместо, потому что у него такая аннотация;
  • При попытке вызвать типовой метод, будет анализироваться оставшийся «пирог». Анализироваться он будет точно таким же образом, как было описано в предыдущем примере;
  • В результате исполнение кода вернётся в перехватчик &Вместо, а по его завершении – в типовую конфигурацию.

Пример 3

Важным для понимания моментом является тот факт, что при перекрытии с помощью аннотации &Вместо, по факту перекрывается не только вызов основного метода, но также и перехватчиков, находящихся ниже в «пироге».


В этом примере будет выполнен только перехватчик &Вместо из Расширения2. Потому что он перекрывает собой типовой метод, то есть весь «пирог», который находится под ним.

Пример 4

Это, по сути, вариация на тему второго примера, но когда под верхним расширением находится расширение, также «прокидывающее» вниз вызов типовой процедуры.


По сути, он просто лишний раз визуализирует тот факт, что вызов типового метода относится ко всему «пирогу», находящемуся под расширением. Именно поэтому после вызова перехватчика из Расширения2, будет вызван перехватчик из Расширения1. Потому что в оставшемся «пироге» именно он перекрывает вызов типового метода, до которого хочется «дотянуться» Расширение2.

Перехват обработчиков событий и собственные обработчики в модулях объектов, менеджеров и т.п.

Перехват любых методов в этих модулях выполняется точно так же, как было описано в начале. Однако если перехватываемая процедура является обработчиком события, существуют некоторые особенности. Эти особенности связаны с тем, что в этих модулях все обработчики событий имеют фиксированные имена.

Во-первых, в качестве имени перехватываемого метода указывается имя события. Например, ПередЗаписью:


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

Поскольку в модулях объектов обработчики событий имеют фиксированные имена, а перечень аннотаций известен, мы реализовали для вас небольшой «сервис». При создании в расширении обработчика открывается диалог, в котором вы можете выбрать тип вызова. После чего в модуле создаётся заготовка процедуры-перехватчика.


Перехват обработчиков событий и собственные обработчики в модулях форм

Перехват любых методов в этих модулях тоже выполняется точно так же, как было описано в начале. Однако и тут есть особенности, связанные с перехватом обработчиков событий. Эти особенности связаны с тем, что в этих модулях все обработчики событий назначаемые, и не имеют фиксированных имён. Как вы наверняка знаете, чтобы платформа понимала, чем нужно обрабатывать то или иное событие, в конфигураторе, в панели свойств, должна существовать привязка конкретной процедуры к конкретному событию.

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

Внешне перехватчик события в модуле формы выглядит следующим образом:


То есть аннотация не используется, а тип перехватчика указывается в палитре свойств. Делается это довольно просто. При создании в расширении обработчика по кнопке «лупа» открывается диалог. Он позволяет вам, помимо контекста, указать тип перехватчика (Перед, После или Вместо).


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


Если вы перекрываете типовой обработчик (Вместо), то это будет просто точка.

Если вы создаёте перехватчик Перед или После, то это будет точка рядом с вертикальной чертой. Местонахождение точки, перед или после черты, обозначает тип перехватчика. А кроме этого в палитре свойств появляется второе (пустое) поле рядом с этим событием. С его помощью вы можете задать парный перехватчик, если есть необходимость обрамить типовой обработчик парой Перед - После.

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

Говоря о модулях форм нужно сделать ещё одно небольшое замечание. Мы немного изменили поведение модулей, расширяющих модули форм, которое существовало ранее. Для того чтобы оно соответствовало поведению остальных модулей, и обеспечивало стабильность программного кода.

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

Общие модули

В расширении вы можете создавать любые собственные общие модули. Существует только два ограничения:

  • Они не должны быть глобальными серверными;
  • Они не должны быть привилегированными.

Когда вы расширяете общий модуль типовой конфигурации, тоже есть аналогичные ограничения:

  • Нельзя заимствовать глобальные серверные модули;
  • Код из вашего расширения будет исполняться только в непривилегированном режиме (если иное не разрешено в профиле безопасности).

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

Серверные методы расширяются не всегда

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

Если прикладное решение работает в файловом варианте или в клиент-серверном варианте без профилей безопасности, то при подключении вашего расширения:

  • В обычном режиме исполнения встроенного языка - будут расширяться все методы типового решения, и клиентские, и серверные;
  • В безопасном режиме исполнения встроенного языка - будут расширяться только клиентские методы и серверные обработчики форм. К остальным серверным процедурам / функциями расширение применяться не будет.

Когда прикладное решение работает в клиент-серверном варианте и при подключении расширения указан конкретный профиль безопасности, либо информационной базе назначены профили обычного и безопасного режима, то «серверная» часть расширения будет применяться так, как указано в соответствующем профиле.

Для этого в профиль безопасности мы добавили несколько новых свойств.


Самое простое из них – это флажок к расширению всех модулей в группе Разрешен полный доступ. Он «одним махом» разрешает расширение серверного контекста.

Есть и более точная настройка с помощью полей Доступные для расширения модули и Недоступные для расширения модули. Мы предполагаем, что вы будет использовать их следующим образом:

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

СВЯЗИ ПАРАМЕТРОВ ВЫБОРА

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

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

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

Поясню на конкретных примерах. Представим себе форму, в которой есть два реквизита типа Контрагент. Скажем нужно указать первого контрагента, а потом выбрать второго. Однако второго контрагента можно выбрать только из той же группы контрагентов, в которой находится первый. Здесь условие связи параметров выбора могло бы быть таким: Отбор.Родитель = Контрагент.Родитель. Однако правое выражение через точку не поддерживается платформой и потому такое условие связи ввести нельзя.

Для второго примера представим себе форму, в которой в шапке есть реквизит типа Договор, а в табличной части - реквизит Статья. При этом выбор статей ограничен списком из регистра соответствия статей договору. Такое условие связей могло бы выглядеть так: Отбор.Ссылка = РС.Статья И РС.Договор = ДоговорКонтрагента. Однако в этом случае в условии задействована дополнительная таблица и такое условие также задать стандартно нельзя.

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

  • ввод через форму выбора;
  • ввод из списка выбора;
  • определение однозначного значения выбора (предсказание выбора);
  • проверка соответствия значения ограничениям по связям параметров выбора.

ПАРАМЕТРЫ ВЫБОРА

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

Платформа накладывает следующие ограничения на создание выражений условий связей параметров. Имя параметра должно удовлетворять условиям написания имен (не содержать пробелов, начинаться может с буквы или символа подчеркивание); в имени можно использовать только одну точку или не использовать точку вообще. Значение параметра должно быть значением реквизита формы без использования подчиненных реквизитов, однако можно указать реквизит табличной части в специальном формате через элементы формы: Элементы.Список.ТекущиеДанные.ИмяРеквизита.

ОБХОД ОГРАНИЧЕНИЙ ПАРАМЕТРОВ ВЫБОРА

Практика

На практике мне попадались следующие решения:

  • Передача в параметры формы выбора подготовленного списка ссылок для выбираемого типа данных
  • Использование специализированной формы выбора с предопределенным запросом динамического списка
  • Выбор из подготовленного списка значений

Недостатками этих решений являются:

  • Не универсальность (необходимо разрабатывать специализированные формы выбора)
  • Невозможность переиспользования данного подхода для формирования списка выбора
  • Невозможность переиспользования для проверки введенного значения

Решение

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

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

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

ПОДСИСТЕМА РАБОТА С ДАННЫМИ ВЫБОРА


Рисунок 1. Диаграмма последовательности

Предлагаемая подсистема реализует интерфейс для работы следующих сценариев:

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

Подключение к подсистеме производится через вставку вызова в форме выбора и добавление предопределенной процедуры менеджера объекта ОбработкаПолученияДанныхВыбора.

Обработка параметров, функция ПолучитьТекстЗапроса

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

Основное назначение функции - в получении текста запроса по переданным параметрам. В отличии от стандартного поведения платформы, когда в форму выбора передаются параметры, эта функция не имеет ограничений: в ней можно реализовать любые условия выбора. Однако и здесь есть ограничение платформы: результирующий запрос не должен содержать объединений ни в одном из пакетов запроса. Это ограничение накладывается реализацией динамического списка, в котором на текущий момент объединения не поддерживаются (однако объединение можно использовать во вложенном запросе!).

В следующем листинге демонстрируется пример-заготовка реализации такой функции. Данная реализация основана на использовании объектной модели запроса. Работа с объектной моделью осуществляется с использованием подсистемы "Работа со схемой запроса". С шаблонами построения текста запроса при использовании подсистемы можно подробнее ознакомиться в одноименной статье.

Листинг 1. Общая структура функции ПолучитьТекстЗапроса на примере справочника _ДемоНоменклатура

Динамический список формы выбора

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

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

Для работа подсистемы необходимо настроить динамический список формы выбора: установить произвольный запрос и изменить псевдоним основной таблицы на имя "Источник".

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

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

Листинг 2. Демонстрация разделения параметров в функции ПолучитьТекстЗапроса

Листинг 3. Подключение формы выбора к подсистеме

Примечание: подключаемая форма выбора должна содержать произвольный текст запроса основной таблицы, при этом псевдоним основной таблицы должен быть предопределенным «Источник». Этот же псевдоним используется в подсистеме для построения текста запроса путем добавления условия и соединений.

Список данных выбора


Рисунок 2. Список выбора

Механизм получения списка данных выбора аналогичен описанному для динамического списка формы выбора.

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

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

Листинг 4. Подключение процедуры к подсистеме

Проверка на соответствие условиям параметров выбора. Заполнение по-умолчанию.

Теперь, когда мы умеем формировать текст запроса по условиям связей, мы можем также проверить текущее значение реквизита на соответствие условиям связей. Это может быть полезным, когда меняются связи (топология), либо меняются значения связей, либо производится выбор значения из истории списка.

Если в выборке по условиям связей мы получим единственное значение, то его можно использовать для заполнения реквизита по-умолчанию. В этом случае пользователя не обязательно заставлять сделать выбор, когда выбора то и нет.

Листинг 5. Проверка соответствия переменной СсылкаНаЗначение переданным параметрам выбора из структуры Параметры

СТЕНД "РАБОТА С ДАННЫМИ ВЫБОРА"


Рисунок 3. Форма обработки стенда

Для демонстрации работы подсистемы выбран справочник _ДемоНоменклатура из демо-конфигурации БСП. С помощью расширения конфигурации в справочнике доработан менеджер объекта и форма выбора. В модуль менеджера добавлена функция ПолучитьТекстЗапроса и предопределенная процедура ОбработкаДанныхВыбора. В форме выбора добавлен вызов процедуры ЗаполнитьТекстЗапросаДинамическогоСписка.

В функции ПолучитьТекстЗапроса реализована обработка дополнительных параметров:

  1. Организация и Контрагент - формируется список номенклатуры, которая использовалась в документах реализации
  2. Договор контрагента - формируется список номенклатуры, определенный в регистре сведений НоменклатураДоговора
  3. Дополнительные реквизиты - отбор по реквизитам из табличной части номенклатуры
  4. Дополнительные свойства - отбор по свойствам, определенным в регистре сведений СвойстваОбъектов

В процедуре используются приемы по формированию текста запроса в объектной модели с использованием подсистемы РаботаСоСхемойЗапроса. Более подробно читайте здесь.

Возможность для созданных дополнительных реквизитов объектов указывать несколько значений.

Иногда для одного и того же свойства, например, назначение для номенклатуры, необходимо указать несколько значений: флебологический, профилактический, специализированный (см. на рисунках), или цвет - красный, белый и т.д., или указать список номенклатуры продаваемой совместно для последующей выгрузки на сайт. В штатном механизме нет такой возможности, поэтому было создано расширение, которое позволяет указывать список значений для доп.реквизита. Введенные значения сериализуются с помощью метода "ЗначениеВСтрокуВнутр" платформы и записываются в реквизит "ТекстоваяСтрока" табличой части "ДополнительныеРеквизиты".

Расширение нужно использовать без безопасного режима - нужно отключать Безопасный режим использования расширения.

Версии 11.3.4.103, 11.4.5.24:

Изменения в типовой конфигурации УТ 11 (до версии 11.4.5):

  • в конфигураторе для плана видов характеристик "Дополнительные характеристики и сведения" добавить реквизит "МДК_Множественное" (тип Булево)
  • установить режим использования совместимости не ниже 8.3.9 (или поставить не использовать)

тогда при установке галочки в свойстве - "Множественное" при выборе значений - открывается список, куда можно подобрать несколько свойств.

Они будут выгружены в 1с-Битрикс автоматически с указанным признаком.

Проверено на конфигурации УТ 11.3.4.103, 11.4.5.24. Платформа 8.3.9 или выше.

Расширение для УНФ проверено на версии 1_6_16_132.

Расширение для Розницы проверено на версии 2.2.11.16.

Расширение для ERP проверено на версии 2.4.6.

Модуль обмена Битрикса с 1С 7.0.1.6, 7.0.1.13 (для УТ 11.4.5.24)

для обмена с Битрикс нужно

Меняем код процедур (см. метки //МДК+. //МДК-), затем загружаем схему XDTO (План обмена - Б_ОбменССайтом - Макеты - СхемаXSDОбмена - Загрузить из файла)

Для интеграции с УНФ - нужно просто установить соответствующее расширение. Для работы расширения необходимо:
- Режим совместимости установить = "Не использовать" (если конфигурация типовая, то пропускаем этот пункт)
Никаких дополнительных изменений в основной конфигурации не требуется.

Для интеграции с УТ, начиная с версии 11.4.6.166 - множественные свойства вынесены в расширение. Нет необходимости менять конфигурацию, снимать с поддержки. Все что нужно сделать - купить расширение, подключить его к базе и можно работать! В старых версиях расширений нужно было дополнительно вносить изменения в план видов характеристик (добавлять реквизит "Множественное"), сейчас же этого делать не надо, т.к. в редакции УТ 11.4 режим совместимости конфигурации "Не использовать". В расширении добавлен регистр сведений, в котором указывается признак "Множественное"и флаг "Действует".

Для интеграции множественных свойств с Битрикс, начиная с версии 11.4.6.166 - создано отдельное расширение для версии модуля обмена 1С-Битрикс: Управление сайтом 7.0.1.19 от 11.02.2019г. При установке расширения подразумевается, что конфигурация уже имеет изменения, т.к. вы устанавливали модуль Битрикс. Порядок действий для такой настройки:

1. Нужно приобрести и установить расширение для множественных свойств,

2. Интегрировать модуль 1С-Битрикс для своей конфигурации,

3. приобрести и установить расширение для обмена множественных свойств с Битрикс,


Меню расширений находится в Главном меню - Стандартные - Управление расширениями

Настройка расширений должна быть выполнена как на скриншоте.


Если на сайте не создаются множественные свойства - нажимайте "Принудительная выгрузка картинок".

Если будут вопросы, то оставляйте свои контакты и присылайте тимвивер.

Осуществляется бесплатная поддержка в течение 1 месяца для установки расширения.

Гарантия возврата денег

ООО "Инфостарт" гарантирует Вам 100% возврат оплаты, если программа не соответствует заявленному функционалу из описания. Деньги можно вернуть в полном объеме, если вы заявите об этом в течение 14-ти дней со дня поступления денег на наш счет.

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

Данная статья является анонсом новой функциональности.
Не рекомендуется использовать содержание данной статьи для освоения новой функциональности.
Полное описание новой функциональности будет приведено в документации к соответствующей версии.
Полный список изменений в новой версии приводится в файле v8Update.htm.

Реализовано в версии 8.3.15.1489.

Мы выполнили ряд доработок, которые упрощают поддержку и подключение расширений в простых и частых сценариях использования.

Упрощение поддержки небольших изменений в методах

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

Но часто возникают ситуации, когда вы не хотите полностью менять поведение метода конфигурации, а хотите лишь немного подкорректировать его. Так, чтобы основное «содержание» метода менялось бы вместе с изменениями конфигурации, и в то же время в нём сохранялись ваши небольшие изменения.

Специально для таких небольших доработок мы сделали компромиссное решение – новую аннотацию &ИзменениеИКонтроль. Она позволяет вам добавить собственные изменения в метод, сохраняя, при этом, его исходный текст.

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

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

002.jpg

В такой ситуации вы можете заимствовать этот метод в расширение, и использовать при этом аннотацию &ИзменениеИКонтроль.

001.jpg

004.jpg

Таким образом, заимствованный модуль будет содержать сразу два «варианта» текста:

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

Несмотря на всё удобство аннотации &ИзменениеИКонтроль, мы всё равно рекомендуем подходить к её использованию очень взвешенно. Основным сценарием для расширения типовых конфигураций являются аннотации &Перед и &После. Аннотацию &ИзменениеИКонтроль вы можете использовать тогда, когда &Перед и &После не позволяют достичь желаемого результата.

Облегчение поддержки расширений в случае переименования объектов конфигурации

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

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

Это понятное ограничение, но технически следовать ему не очень удобно. Такое переименование в расширении приходится выполнять вручную. К тому же не всегда бывает ясно, какое исходное имя было у переименованного объекта.

Чтобы облегчить вам эту работу, мы сделали следующие доработки:

  • Для свойств заимствованных объектов мы добавили новый тип действия – Предупреждать о расхождении при подключении расширения. Он отображается как обычный флажок. Кроме этого для заимствованных объектов мы добавили новое контролируемое свойство Объект расширяемой конфигурации. Оно недоступно для редактирования, заполняется автоматически при заимствовании и содержит внутренний идентификатор расширяемого объекта.

101.jpg

  • Для самого расширения мы добавили новое свойство Поддерживать соответствие объектам расширяемой конфигурации по внутренним идентификаторам. По умолчанию оно имеет значение Истина.

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

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

  • Переименовать, сохранив соответствие,
  • Выбрать соответствие,
  • Сохранить имя, изменив соответствие,
  • Установить значение из объекта конфигурации,
  • Очистить соответствие,
  • Отключить проверку,
  • Удалить объект.

Облегчение подключения «универсальных» расширений

«Универсальными» мы, условно, называем такие расширения, которые приносят в конфигурацию свою функциональность, и, как правило, не содержат заимствованных объектов. Например, это может быть расширение, добавляющее в конфигурацию какие-то обработки или отчёты.

Пользователи конфигурации, у которых есть роли, автоматически дающие права на новые объекты, смогут воспользоваться этими обработками и отчётами. Но дать права на них другим пользователям бывает сложно.

Хорошо, если разработчик расширения предусмотрел собственную роль (роли), включающую объекты расширения. Тогда администратор может назначить эту роль нужным пользователям. Однако заранее неизвестно, как такая роль может называться, да и само создание такой роли для разработчика расширения является чисто «механической» задачей.

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

Чтобы упросить создание и подключение «универсальных» расширений, мы внесли в механизм некоторые доработки, которые позволяют работать по следующему сценарию:

  • На предприятии некоторым ответственным пользователям дается дополнительное право администрирования расширений конфигурации. Благодаря этому они могут самостоятельно (без участия администратора) подключать новые расширения.
  • Эти пользователи, например, скачивают из Интернета расширение, подключающее новую печатную форму.
  • С помощью стандартной функции Управление расширениями конфигурации они добавляют это расширение в информационную базу.

Доработки, которые мы сделали в механизме, заключаются в следующем.

Во-первых, теперь при создании расширения в нем автоматически создаётся роль, имя которой формируется по шаблону <ПрефиксРасширенияКонфигурации>_ОсновнаяРоль. Эта роль устанавливает права для новых собственных объектов.

Эта роль сразу же добавляется в свойство Основные роли расширения (возможность модифицировать основные роли мы добавили в версии 8.3.14).

202.jpg

Таким образом, мы избавляем вас от необходимости «механически» создавать роли, дающие полный доступ к объектам расширения. Кроме этого такая, автоматически созданная роль, имеет понятное для всех имя, формируемое по фиксированному шаблону.

Во-вторых, расширению конфигурации мы добавили новое свойство ИспользоватьОсновныеРолиДляВсехПользователей, которое стандартно установлено в значение Истина. Это значит, что по умолчанию при добавлении такого расширения все пользователи конфигурации будут обладать правами из основных ролей добавляемого расширения.

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

203.jpg

С её помощью пользователь, которому «доверено» администрирование расширений, может отобрать роли расширения у тех пользователей, которым оно не нужно. При этом автоматически будет сброшено свойство расширения ИспользоватьОсновныеРолиДляВсехПользователей.

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

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

Также мы изменили отображение ролей расширения в Конфигураторе. Теперь они отображаются под своими именами, и у вас есть возможность управлять ими.

201.jpg

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

Во-первых, среди основных ролей расширения могут быть только собственные роли, и эти роли не могут давать права на заимствованные объекты.

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

И, наконец, если в расширении нужен разный ролевой доступ к разным его частям, то в основную роль расширения добавляйте ту роль, которая понадобится большинству пользователей. А роль, которая даёт права на остальную функциональность, администратор добавит пользователям самостоятельно. Например, ваше расширение позволяет формировать и отправлять отчёты. Формировать могут все, а отправлять – только некоторые пользователи. Тогда роль, позволяющую формировать отчеты, вам нужно включить в основные роли расширения.

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

Читайте также: