О расширениях замолвите слово...

30.05.19

Разработка - Механизмы платформы 1С

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

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

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

  1. Не дробить расширения для одного и того же объекта конфигурации
  2. Изменения расширяемых форм делать программно, а не через редактор форм
  3. Минимизировать использование аннотации &Вместо (&ИзменениеИКонтроль?)
  4. Делать независимые друг от друга расширения
  5. Новые объекты конфигурации, предполагающие хранение данных, добавлять в основную конфигурацию
  6. Вести реестр расширений

Рассмотрим подробнее каждый пункт

1. Не дробить расширения для одного и того же объекта конфигурации.

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

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

 

2. Изменения расширяемых форм делать программно.

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

Давайте возьмем самый банальный пример: сделать определенное поле на форме нередактируемым, т.е. установить ему свойство "ТолькоПросмотр".

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

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

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

Тогда первичная простота во второй раз может превратиться в затратную по времени процедуру и, возможно, это будет повторяться неоднократно.

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

Так что же делать? Всё просто! Любые изменения, связанные с элементами формы делайте программно, вообще старайтесь не трогать редактор форм, как бы соблазнительно это не было. Либо альтернативный вариант решения: к каждому расширению прикладывать подробное описание: что и с каким элементом Вы сделали, какое свойство поменяли, какой элемент добавили и т.п.

Не рекомендуется делать так:

Рекомендуется: добавить процедуру с аннотацией &После для события формы "ПриОткрытии" примерно с таким кодом:

&НаКлиенте
Процедура АТБ_ПриОткрытииПосле(Отказ)
   Элементы.Ответственный.ТолькоПросмотр = Истина;
   // и все другие изменения элементов формы
КонецПроцедуры

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

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

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

 

3. Минимизировать использование аннотации &Вместо.

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

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

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

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

Пример использования директивы &ИзменениеИКонтроль (только с версии платформы 8.3.15)

Например, раньше (т.е. сейчас, пока не обновили платформу) нам приходилось писать так:

 
 Пример с &Вместо

 

Теперь можно написать так.

 
 Пример с &ИзменениеИКонтроль

 

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

 

4. Делать независимые друг от друга расширения.

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

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

Скажу честно, мы так сделали, и оно действительно работает, работает не плохо, но…

Есть риск "зависимости". Что-то измените в таком шаред-расширении и могут "полететь" все остальные… Но если Вы держите это под своим контролем, то в принципе использовать такой механизм вполне возможно.

 

5. Новые объекты конфигурации, предполагающие хранение данных, добавлять в основную конфигурацию.

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

Можно вынести в хранение в расширении, например настроек, логов - т.е. того, что при случае не сильно жалко потерять.

 

6. Вести реестр расширений.

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

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

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

 
Пример фрагмента таблицы реестра расширений

 

На каждом элементе есть ссылка на другую OneNote-страницу с ТЗ (с полным описанием задачи, для чего делалось расширение, какие доработки в него вносились со временем, а также ссылка на GIT-хранилище).

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

 

В итоге немного о том "Почему именно расширения?":

1) Отвечая на вопрос: "Зачем столько мучений, ведь можно просто внести изменения в конфигурацию?" - зачастую это безвыходная ситуация, когда Вам запретили изменять типовую конфигурацию, а что-то добавить очень хочется.

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

3) Удобство при работе с Git (см. Git-репозитории при небольших проектах

 

В конце хотелось бы задать вопрос сообществу: Используете ли Вы расширения в своей работе?

1) Если да, то с какими трудностями Вы сталкивались (а может не сталкивались)?

2) Если не используете, то почему?

 

Другие статьи на эту тему:

расширение 1С8

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4521    dsdred    53    

71

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

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

24.01.2024    5293    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6409    dsdred    36    

111

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18473    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12087    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

28.08.2023    8821    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6279    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15986    SeiOkami    31    

103
Вознаграждение за ответ
Показать полностью
Отзывы
37. Darklight 32 08.04.19 11:53 Сейчас в теме
За статью спасибо. Но, напишу свои замечания к Вашим предложениям:

1. Не дробить расширения для одного и того же объекта конфигурации
Дельный совет. Но я бы пошёл бы ещё дальше - ВООБЩЕ НЕ ДРОБИТЬ расширения - т.е. если какую-то конфигурацию. поддерживает команда разработчиков с разными проектами - они могут вести их в отдельных расширениях в своих тестовых базах и отдельных хранилищах конфигураций расширений (но это тоже не обязательно - можно вести всё в одном расширении/хранилище)
А перед установкой в рабочую базу (вернее в продакшен-конфигурацию, возможно так же имеющую своё отдельное хранилище) переносить изменения из разных конфигураций-расширений - в одну (дабы сравнение-объединение для конфигураций-расширений вполне нормально работает) - если их несколько или так и подключать к продуктивным базам единое расширение (если оно сразу был одно). То есть - сводить все свои доработки, в итоге, к одной конфигурации-расширения (ну, максимум к 2-3 - если уже очень приспичит) и подключать ко всем ИБ.

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

2. Изменения расширяемых форм делать программно
Тоже дельный совет. Он касается не только расширений. Увы, даже в управляемых формах и без расширений надёжнее все изменения вносить программно. Эх... жаль-только, что нет возможности писать программные макросы, которые отработают ещё на стадии компиляции в конфигураторе - один раз внеся изменения в форму - а не каждый раз при её создании в runtime.
Ну и фреймов не хватает - ведь один раз так перенести элементы в программный код это не страшно. А если их постоянно приходится модифицировать - это дальше чаще придётся уже работать исключительно с программным текстом, а нес формой.
И ещё есть сложности - порой при добавлении новых элементов на форму приходится перемещать имеющиеся - это самое неприятное. Впрочем это может быть чревато большими проблемами при любом подходе: и программном и при изменении на самой форме.

3. Минимизировать использование аннотации &Вместо
Конечно, с приходом аннотации "&ИзменениеИКонтроль" использование "&Вместо" должно существенно сократиться, но 15- релиза ещё нет даже в бете. Ну а далее - боюсь всё-равно будет куча проблем с сопровождением - там время покажет, пока ещё нечего даже пощупать.
Но, сам формат данной аннотации - мне уже сейчас не нравится - идея хорошая - исполнение отвратительное (Увы это норма для 1С).
Лучше бы парадигму аспектного программирования в 1С привнесли - вот это был бы прорыв.

4. Делать независимые друг от друга расширения
Совет был бы дельным. Но, я уже написал, в самом начале, что лучше вообще делать одно расширение (или пару - полностью независимых друг от друга). Иначе - будут проблемы другого рода - если разные расширения имеют общую основу (как общие модули, так и другие метаданные) - то если их делать полностью автономными - то - эти общие элементы будут в них дублироваться от того сразу ряд проблем:
а. Дублирование кода и метаданных - нужно будет во всех расширениях вручную поддерживать его актуальность - особенно сложно, когда его будут менять в разных проектах и разные команды.
б. Дублирование метаданных так же вызовет конфликт дублирования имён - при установки таких автономных расширений в одну ИБ. Да, конечно же - придётся
разграничивать их все префиксами разными расширений
в. Дублирование метаданных, сохраняемых в СУБД - вообще, можно сказать, невозможно, в большинстве случаев
г. Дублирование да даже не сохраняемых в СУБД метаданных - может быть проблемным - когда, скажем, нужно будет иметь расшаренные глобальные перенные
(параметры сеанса пока расширения вообще не поддерживают - в 14 релизе).
д. Дублирование метаданных приведёт ещё и к дублирование прав доступа к ним (ролей) - настройка прав превратится в хаос.
е. Дублирование перехватчиков событимй (да и просто вызовов функций), реализующих одну и ту же логику - создаст ещё больший хаос.
ж. И отдельно упомяну о том, что многие алгоритмы нуждаются в настройках - их где-то надо хранить - плрохая идея дублировать один и тотжемеханизм работы
с настройками для каждого расширения - ведь его ещё и настраивать придётся в отдельных автономных формах.
В общем, проблем много. Лучше всё-таки все свои изменения вести в одном расширении. Как я написал выше - можно сначала вести отдельные расширения, в и т.ч. создавать общие-расшаренные (ну тут тоже желательно не плодить много таких общий расширений) - а потом всё переносить в одно (сравнением/объединением), без дублей - его уже ставить в продакшен-базы.

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

6. Вести реестр расширений
Совет дельный, но делать это очень не удобно. Увы - с документированием конфигураций в 1С Предприятие 8 всё очень печально. А вести в отдельном приложении - не очень удобно. Разве что только настраивать GIT и подключать сторонние приложения для решения вопросов документирования уже к GIT-депозитарию -- но это очень не простой путь для 1С разработчиков.
Вести в OneNote - тоже как-то не очень удобно (лично сколько раз порывался - но так и не смог полюбить OneNote - мне не удобно, но, возможно, я просто не научился его готовить).
Ввёл, как-то в отдельной кустарной конфигурации (ещё до появления расширений - для фиксации доработок обычных конфигураций) - это даже как-то удобнее было (метаданные автоматически туда подтягивались фоновым процессом - та же был учет задач и проектов - нужно было только подцепить метаданные к уже имеющимся там задача и всё) - но такую конфигурацию нужно разрабатывать себе самостоятельно - под свои предпочтения и свой учет планирования работа ИТ-отдела.
VyacheslavShilov; papche; plus1s_a; Drivingblind; Риник; Mi4man; jif; davdykin; kostas; dvpk1c; user1183297; VladC#; YPermitin; Il; Vladimir Litvinenko; +15 Ответить
79. 77dream77 421 10.04.19 12:59 Сейчас в теме
использую расширения на проектах давно (более 2 лет), даже читал курсы по ним 😊
Из последнего проекта перехода с КА 1.1 на КА 2.4 - там все изменения сделаны через расширения (41 расширение), в конфигурации только новые объекты/реквизиты и одно изменение кода из-за нежелательности применения расширения в данном случае. Было 3 обновления с начала года - никаких проблем
много расширений настраивал для типовых ЗУП, БП, Итилиума, КА, ДО
Много расширений приходится переделывать после других, если неправильно настроены – то они валятся после очередного обновления.
при правильной настройке расширения - очень удобный и стабильный механизм, нужно просто понимать что можно делать через расширение, а что нет

к статье я бы добавил следующее:
1. полностью согласен, для одного объекта/формы отдельное расширение.
одно расширение опасно тем, что при ошибке подключения теряется весь функционал, который заложен в нем
а при отдельных расширениях только небольшая часть отключается и его можно будет легко поправить
2. да, лучше делать программные изменения
но новые элементы формы я обычно добавляю на форму в редакторе. Для них обязательно использую префиксы, новые группы с префиксами и никогда не изменяю типовые реквизиты на форме, только программно
проблем пока не было
3. согласен, аннотация Вместо - это крайний случай и часто бывают проблемы с расширением после обновления, но есть и плюсы…
Последний раз ее применял для доработки печати ТТН и УПД.
Вместо вызывает типовую процедуру получения данных, которая возвращает результат запроса
Этот результат выгружается в ТЗ, обрабатывается, добавляются новые колонки с данными при необходимости и помещаются обратно в результат.
Таким образом при изменении типовой процедуры ничего не сломается даже при изменении запроса или колонок результата, а дальше в коде я ориентируюсь на свои добавленные колонки, которые тоже останутся и не мешают работе типовой.

4. согласен, но если функционал как-то пересекается, то можно общий функционал вынести в отдельный общий модуль конфигурации, например.
Здесь все зависит от решаемой задачи.
5. да, я пока тоже не доверяю хранение важных данных расширению, добавляю новые объекты в конфигурацию.
6. отдельного реестра не веду, все описание в комментариях в расширении или в отдельном макете.
Но для удобства анализа версии расширений – использую реквизит Версия, в него записываю последнюю дату редактирования расширения, например, 10.04.2019
Таким образом при большом количестве расширений очень удобно понимать в какой базе какая версия и переносить изменения, например, из копии в рабочую. Присваивать просто номер версии типа 1.1 неудобно, потому что не известно какая версия последняя, а с датой всегда понятно.

Также после окончательной готовности расширения удаляю все не используемые реквизиты/объекты, отключаю все не нужные для меня зависимости и контроли, добиваюсь, чтобы проверка конфигурации расширения не выдавала ошибок.
Таким образом в расширении остается только измененные и важные для расширения объекты с отключенными контролями и т.п.
При обновление обязательно проверяю все расширения на применимость и еще раз запускаю проверку конфигурации, если она выдает ошибку – ищу причину и устраняю. Таким образом после обновления можно быт спокойным, что на следующий день рабочая будет стабильна и тебя не засыпят ошибками пользователи.
Из недавнего – в КА 2.4 изменилось название документов с ПоступлениеТоваров на Поступление товаровНаСклад, а оно использовалось в двух расширениях в проверке типа и в запросе. Проверка конфигурации естественно выдало эту ошибку, и я ее исправил сразу после обновления до наката на рабочую. Если бы не делал такую проверку, то на следующий день два важных функционала отвалилось бы с ошибкой и утро началось бы не с кофе…
VyacheslavShilov; mvxyz; bazelyukandrei; Angealtor; AllexSoft; o.nikolaev; Krio2; worker1c; ellavs; +9 Ответить
73. rpgshnik 10.04.19 07:23 Сейчас в теме
Хорошая публикация. Расширения использую. Фактически самостоятельно пришел к тем же рекомендациям/правилам:
1. Не дробить расширения, где-то слышал сплетни, что несколько расширений - тормозят базу, а одно нет. По этому одно расширение на одну конфигурацию, желательно конечно!
2. Изменять свойства элементов форм программно, согласен.
3. Минимизация использования директивы &Вместо это вообще святое, уже не однократно черпнул горя. Надеюсь директива &ИзменениеИКонтроль поможет в этом, но практика показывает, режим совместимости на типовых конфигурациях очень сильно не успевает за актуальной рабочей версией платформы. Когда она будет? Через год, минимум наверное :)
4. Независимые расширения, это наверное правило а не рекомендация. Да и вообще пункта 4 не должно быть, учитывая пункт 1 :)
5. Все новые объекты строго в основной конфигурации, удаление расширения явно приведёт к потере данных. Тем более создание новых объектов ни как не повлияет на обновление. А уже обработка их на форме и т.п. строго в расширение. Так же слышал по сплетням, что общие модули так же лучше создавать в основной конфигурации и якобы длительные операции значительно быстрее отрабатывают в основной конфигурации, а не в расширении.
6. Реестры доработок в целом для всего это плюс.
9576836; ids79; kostas; Interrupted; lefthander; ellavs; +6 Ответить
90. e-tixom 108 10.04.19 21:13 Сейчас в теме
(0) (86) Хорошая статья. Спасибо.
У нас Бухгалтерия 3.0. На расширении сделана целая подсистема со своими справочниками и документами. https://infostart.ru/public/956446/ Сначала были опасения о потере данных, но было условие не менять конфигурацию. Рискнули. Пока все нормально. Были глюки с установкой обновлений, кажется февральских. Приходилось отключать расширения и после загрузки конфигурации закрывать конфигуратор и продолжать обновлять уже в пользовательском режиме. Но сейчас проблема ушла. В принципе, расширения - довольно хороший инструмент. Среди плюсов также можно также отметить возможность использования его для отладки, например, новых печатных форм или отчетов.

Из проблемных ситуаций могу отметить:
1. никогда не получалось динамическое обновление расширений и подключение новых при работающих пользователях. Возможно это был глюк платформы или релиза, но я больше не рискую: быстрота не стоит возможной потери данных. Лучше как положено: архив и т.д. ...
2. В формах списков добавленных справочников и документов отсутствует стандартная команда "вывести список". Создавала даже тему на форуме https://forum.infostart.ru/forum29/topic204577/ . Но решение не известно (по крайней мере мне).
3. В добавленных документах нет стандартных кнопок "Дт Кт" и "Структура подчиненности" (соответственно они не отображаются в структуре подчиненности объектов основной конфигурации). Допилить, конечно, можно, но уже с помощью своих кнопок.
Yashazz; ellavs; acanta; +3 Ответить
92. dsdred 12.04.19 11:28 Сейчас в теме
45. nagimo 08.04.19 13:19 Сейчас в теме
Спасибо.
Очень полезная статья!

насчет Используете ли Вы расширения в своей работе?
Использую. Я их фанат! )) Очень доволен. Но в основном использую в небольших организациях.

Из проблем:
1. Действительно, после каждого обновления приходится пока актуализировать заимствованные формы. Думаю воспользоваться советом и формировать их программно. Хотя в большинстве случаев обхожусь дополнительными реквизитами формы без изменения самой формы.
2. Так и не связал их с хранилищем 1С.
3. Постоянно забываю про проблему с конструктором запроса - сначала ступор - почему нет большинства объектов конфигурации, и только потом доходит, что это же расширение. Приходится делать лишние движения с вызовом конструктора из обработки или кода основной конфигурации.
4. Периодически (но вообще не часто) приходится переписывать некоторые наследованные процедуры - когда меняется состав аргументов. И это не только для процедур с оператором &Вместо.
Остальные комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
83. ellavs 1022 10.04.19 16:00 Сейчас в теме
(82) а как тогда отличить версию расширения позавчерашнюю, от вчерашней/сегодняшней? А еще бывает утром один программист зарелизит, а я потом нахожу ошибку и вечером делаю новый релиз расширения (в версии ставлю "10.04.2019 22:30"), в этом случае понятно, какого времени релиз.
84. lefthander 10.04.19 16:02 Сейчас в теме
(83)у меня не было такой проблемы, я был один... Готовил в хранилище версию для обновления, что то дорабатывал в расширении затем делал поставку с версией БП и менял версию в расширении :)
102. o.nikolaev 211 18.07.19 19:03 Сейчас в теме
(79) Тот случай когда комментарий тянет на отдельную публикацию.
108. 77dream77 421 19.07.19 14:28 Сейчас в теме
131. user590624_berez 11.07.21 15:49 Сейчас в теме
(79) Помогите с вопросом обращения из расширения к объекту другого расширения.
если это возможно, не могу найти информацию.
Спасибо
86. sergathome 4 10.04.19 17:44 Сейчас в теме
Расширения не использую по причине боязни потери данных, так как большинство доработок связаны именно с хранением. Есть идейка заменить комплект внешних допотчетов одним расширением, но пока руки не доходят. Идея с выносом туда сервисов и прочих интеграций кажется рабочей.
90. e-tixom 108 10.04.19 21:13 Сейчас в теме
(0) (86) Хорошая статья. Спасибо.
У нас Бухгалтерия 3.0. На расширении сделана целая подсистема со своими справочниками и документами. https://infostart.ru/public/956446/ Сначала были опасения о потере данных, но было условие не менять конфигурацию. Рискнули. Пока все нормально. Были глюки с установкой обновлений, кажется февральских. Приходилось отключать расширения и после загрузки конфигурации закрывать конфигуратор и продолжать обновлять уже в пользовательском режиме. Но сейчас проблема ушла. В принципе, расширения - довольно хороший инструмент. Среди плюсов также можно также отметить возможность использования его для отладки, например, новых печатных форм или отчетов.

Из проблемных ситуаций могу отметить:
1. никогда не получалось динамическое обновление расширений и подключение новых при работающих пользователях. Возможно это был глюк платформы или релиза, но я больше не рискую: быстрота не стоит возможной потери данных. Лучше как положено: архив и т.д. ...
2. В формах списков добавленных справочников и документов отсутствует стандартная команда "вывести список". Создавала даже тему на форуме https://forum.infostart.ru/forum29/topic204577/ . Но решение не известно (по крайней мере мне).
3. В добавленных документах нет стандартных кнопок "Дт Кт" и "Структура подчиненности" (соответственно они не отображаются в структуре подчиненности объектов основной конфигурации). Допилить, конечно, можно, но уже с помощью своих кнопок.
Yashazz; ellavs; acanta; +3 Ответить
91. ellavs 1022 11.04.19 17:48 Сейчас в теме
(90) спасибо за отзыв. По п.1 - несколько раз приходилось производить срочное обновление расширения динамически, когда в базе сидело около 15-20 пользователей. Вроде проходило без проблем, или я про них просто не узнала )
95. muskul 13.04.19 03:31 Сейчас в теме
Кто объяснит почему тотже конструктор запроса в расширении не работает так как не видит таблиц, что как бы логично с одной стороны так как это отдельная конфа, но при этом в любой обработке которая даже не сохранена это работает. Неужели нельзя было скрестить
118. Yashazz 4709 23.08.19 19:30 Сейчас в теме
(95) Потому что кривая приблуда. Оно много чего не видит, не цепляет или, что хуже, теряет иногда.
Darklight; +1 Ответить
96. n0nsense 15.04.19 16:08 Сейчас в теме
Собратья и любители расширений, есть такая проблема https://forum.infostart.ru/forum9/topic215446/
Сталкивался ли кто с подобным?
100. zqzq 23 22.04.19 10:03 Сейчас в теме
Расширение не использую.
1. Основная база УПП на 8.2
2. Обновляю на платформе 8.3 с использованием (штатным) kdiff3 для трехстороннего объединения модулей -- в 99.9% случаях kdiff сам разруливает изменения. И особого смысла в расширениях не вижу, если честно, для данной ситуации. Модификация форм программно, естественно.
101. Vladimir45 90 18.07.19 08:25 Сейчас в теме
Начали про программное изменение формы, но не закончили самое главное:

Добавление/изменение реквизитов тоже делать программно.
Создание команд тоже программно.

А вот хинт как сделать для существующих кнопок &после или &перед?
А хинт с пустой формой в расширении?

обсудим в личке? потом сможете добавить в статью.
109. AllexSoft 19.07.19 16:25 Сейчас в теме
Статья полезна, спасибо за то что делитесь опытом!
2. Изменения расширяемых форм делать программно.

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

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

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

ПС: задумываюсь выложить подсистему на ИС, по всей видимости придется перебороть лень )
Yashazz; AlX0id; ellavs; +3 Ответить
119. Yashazz 4709 23.08.19 19:33 Сейчас в теме
(109) Вот да, соглашусь. Советовать "программное изменение форм" может только наивный, который с этим кодом потом дела не имел. Это непрозрачный, неуправляемый и легко устраиваемый любым вмешательством тихий Адъ.
Гораздо разумнее, например, сделать свою форму, а в типовой (если уж вам так любы расширения, то в расширенной) поставить перехват при открытии, ну и перехваты подписок на события, оповещений итд.
Или вот как Алекс говорит (я, кстати, в одном из проектов примерно так и делал, и безо всяких там расширений отлично работает).
110. skv_79 353 26.07.19 10:22 Сейчас в теме
"Поменять последовательность исполнения расширений не самая тривиальная задача. Как говорят разработчики: расширения исполняются в последовательности их добавления в конфигурацию и поменять их местами можно только через удаление/добавление (а если расширения содержали хранимые данные, то сделать это может стать невозможно)."

Разве для этого не существует как Назначение, насколько я понимаю приоритет расширения конфигурации зависит от него:
1. Исправление
2. Адаптация
3. Дополнение
Чем меньше цифра, тем выше приоритет расширения.
Прикрепленные файлы:
112. ellavs 1022 26.07.19 11:46 Сейчас в теме
(110) если расширений больше трех, то этот вариант перестает работать ;) Сейчас, например, в одной из конфигураций 12 расширений, это после объединения (до этого было около 25).
114. skv_79 353 26.07.19 12:13 Сейчас в теме
(112) Все-же мне кажется что количество многовато. Насколько знаю, расширения 1С планирует использовать как модульность, с добавлением сразу целой подсистемы. Недавно вроде даже анонс был, что-то начинают как расширение распространять.
115. ellavs 1022 26.07.19 13:18 Сейчас в теме
(114) ну вот Вы говорите, что что-то распространяется уже в качестве расширений (тут на инфорстарте тоже доработки в виде расширений часто выкладывают). Я тоже выкладываю некоторые свои расширения.
Допустим, Вам какие-то понравились, Вы их скачали. Вы будете их устанавливать как отдельные расширения или начнете вручную их объединять в какое-то одно?
Многие, особенно те, кто не очень хорошо разбирается в программировании, просто устанавливают эти расширения себе в базу и работают. В итоге у них таких расширений может довольно много накопиться.
116. skv_79 353 26.07.19 13:49 Сейчас в теме
(115) Да, если так, то это та тема, над которое 1С следует еще подумать. С одной стороны расширения создавались как упрощение поставки именно для обычных пользователей, с другой если расширений становится больше - то это новое поле деятельности для программистов.
120. Yashazz 4709 23.08.19 19:34 Сейчас в теме
(112) Зоопарк. Мне вас искренне жаль.
Darklight; +1 Ответить
111. acanta 26.07.19 10:29 Сейчас в теме
Да, но можно ли явно указать последовательность в пределах например, адаптации? Можно ли увидеть где-то результирующий исполняемый код с учётом всех наложений?
113. ellavs 1022 26.07.19 11:48 Сейчас в теме
(111)
можно ли явно указать последовательность в пределах например, адаптации?

Насколько знаю, нет.
В качестве эксперимента, можно попробовать написать код в расширениях, который будет где-то фиксировать свой запуск, чтобы в итоге увидеть, кто в какой последовательности запустился...
117. Yashazz 4709 23.08.19 19:29 Сейчас в теме
Уж не знаю, откуда столько восторгов по поводу этой кривой приблуды, "расширений"... Вот как встанете, господа, с размаху на какие-нибудь грабли этой дряни, так сразу поймёте, что пилить конфу и потом обновлять - оно, конечно, трудоёмко, но в разы стабильнее, если по-умному организовать доработку. А тут, во-первых, любители программно допиливать формы, которые запарятся потом в своём или не своём коде этих динамических доработок разбираться (ибо визуализации ноль), во-вторых рисковые парни с хранением данных в расширении... Ну-ну, флаг в руки. До первых граблей, господа)
121. Angealtor 32 09.09.19 12:17 Сейчас в теме
Пробовал ли кто использовать &ИзменениеИКонтроль на платформе 8.3.15.65 в УТ 11?
У меня почему-то не работает ?
Текст ошибки "{ОсновноеРасширение Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента.Форма(45,3)}: Ожидается оператор препроцессора
#<<?>>Удалить (Проверка: Сервер)
" и.т.д
122. Angealtor 32 12.09.19 11:06 Сейчас в теме
(121)
&ИзменениеИКонтроль("ВозведениеВСтепень")
Функция Расш1_ВозведениеВСтепень(Основание, Степень)
    Результат = 1;
    Для Индекс = 1 По Степень Цикл
#Удаление
        Результат = Результат + Основание;
#КонецУдаления
#Вставка
        Результат = Результат * Основание;
#КонецВставки
    КонецЦикла;
    Возврат Результат;
КонецФункции
Показать
125. Darklight 32 05.11.19 13:54 Сейчас в теме
Никто не написал, что расширения - ущербны тем, что не умеют расширять типы у заимстованных объектов метаданных (реквизитов или определяемых типов)! Вот такая вот засада! Сейчас уже есть релиз платформы 1С: Предприятие 8.3.16 - а расширить типы нельзя.

То есть - если из основной конфигурации заимствовать, скажем, реквизит, то тип его нельзя будет расширить в расширении новыми типами (не важно откуда - из основной конфигурации или из расширения).
Вот это беда так беда.


Вот добавите Вы в расширение, скажем, новые документы партий - захотите расширить у регистров измерение "Партия" ("ДокументОприходования") а сделать это не сможете - НИКАК!
Само собой, в основной конфигурации типы этих документов из расширения Вы так же не сможете включить в составной тип данного измерения!

Более того, если в основной конфигурации у такого измерения назначить тип "ДокументыСсылка" (т.е. общий тип для всех документов), то он всё равно не будет включать в себя типы документов из расширений и присвоить их ссылки в это измерение ВСЁ РАВНО БУДЕТ НЕЛЬЗЯ!

Вот такая, свинья в расширениях от 1С заложена!

А уж про то, что все модули (и элементы метаданных) в расширениях не должны пересекаться по именам (а если пересекаются - то нужно для каждого расширения делать свои префиксы и многократно дублировать эти элементы), а заимствовать метаданные в расширение из другого расширения платформа так же, до сих пор, не научилась! Колоссальная проблема повторного использования кода и метаданных!

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

Но, на мой взгляд, всё это можно было делать и через конфигурации поставщиков (что были ещё в 8.2 - разве что механизм их обновления нужно было улучшить). А перехват/подписка на вызов функций - нужно было просто включить в механизм подписки на события (ну или немного переработать его - сделать как в расширениях - но только в составе модулей основной конфигурации).


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

Нужно свою тему пилить для сборки конфигураций из отдельных подсистем (подконфигураций) - на расширения больше надежды нет!
mikele_bes; +1 1 Ответить
126. shatunovs 23.04.20 22:08 Сейчас в теме
Хорошие рекомендации, хорошее обоснование. Когда я обдумывал свои первые расширения, практически сразу же пришел к тем же выводам при обдумывании архитектуры. Мой предыдущий опыт привел к тем же тезисам кроме п.6, т.к. я один и доработки планировались ограниченного масштаба в количестве 1 расширения на конфу. А для п.5 оно получилось автоматически, т.к. тогда платформа еще не позволяла такой роскоши. Правда в следующий раз я сам и по описанным тут причинам осознанно отказался от хранения данных в расширении. НО имелся и случай, когда я столь же осознанно отказался отказываться от хранения данных в расширении: делал маленькую законченную подсистему под полностью стандартную конфу. Очень не хотелось "снимать ее с замка" даже минимальным образом, и даже еще есть мысль продавать это тиражно как продукт. И тогда эта роскошь новых платформ становится нам очень приятной, ибо компонента устанавливается прямо из-под клиента и уже работает после перезапуска!
127. vkozak 15.03.21 11:27 Сейчас в теме
Дельная статья не порерявшая свою актуальность. Комментарии с добавлениями тоже полезны, поддерживаю.
128. dadel 19 12.05.21 15:09 Сейчас в теме
В статье есть ошибка в части Вместо с контролем.

&НаКлиенте
&ИзменениеИКонтроль("ЗаполнитьИнформациюОбОбучении")
Процедура ФФЛ_ЗаполнитьИнформациюОбОбучении()
   Если Элементы.ЗачетныеКниги.ТекущаяСтрока <> Неопределено Тогда
     ЗачетнаяКнига = Элементы.ЗачетныеКниги.ТекущаяСтрока;
     ДанныеОбОбучении = ФизическиеЛицаСервер.ПолучитьДанныеЗачетнойКниги(ЗачетнаяКнига);
     Факультет = ДанныеОбОбучении.Факультет;
     Специальность = ДанныеОбОбучении.Специальность;
     ФормаОбучения = ДанныеОбОбучении.ФормаОбучения;
     Курс = ДанныеОбОбучении.Курс;

    #Удалить
      Группа = ДанныеОбОбучении.Группа;
      Подгруппа = ДанныеОбОбучении.Подгруппа;
    #КонецУдалить

    #Вставить
      Группа = ДанныеОбОбучении.Группа + " - " + ДанныеОбОбучении.Подгруппа;
    #КонецВставить

     Основа = ДанныеОбОбучении.Основа;
     ЯвляетсяСтаростой = ФизическиеЛицаСервер.ПолучитьПризнакСтаростыДляФизЛица(ЗачетнаяКнига);

    #Вставить
    Если ДанныеОбОбучении.УчебныйПлан <> Неопределено Тогда                     
        УПОбучение = ДанныеОбОбучении.УчебныйПлан;
        УПОбучение = ПолучитьОбъектУППоСсылке(УПОбучение);
    КонецЕсли;
    #КонецВставить

   КонецЕсли;
КонецПроцедуры 
Показать

А должно быть вот так:
&ИзменениеИКонтроль("ВозведениеВСтепень")
Функция Расш1_ВозведениеВСтепень(Основание, Степень)
    Результат = 1;
    Для Индекс = 1 По Степень Цикл
#Удаление
   Результат = Результат + Основание;
#КонецУдаления
#Вставка
   Результат = Результат * Основание;
#КонецВставки
    КонецЦикла;
    Возврат Результат;
КонецФункции
Показать

Просто могут начинающие поиском наткнуться и скопировать, а потом искать - что не работает у них...
129. ellavs 1022 12.05.21 15:36 Сейчас в теме
(128) спасибо за дополнение. Статья писалась, когда данного функционала (ИзменениеИКонтроль) еще не было, по анонсированному примеру будущей реализации.
130. dadel 19 13.05.21 10:11 Сейчас в теме
(129)Да, уже порылся и нашел следы истории - в первом варианте именно так было, как в статье написано.
Но опять же, сейчас кто-то может погуглить в поиске что же там за Вставка и как её верно написать и нарваться на это)))
Оставьте свое сообщение