О расширениях замолвите слово...
Разработка - Механизмы платформы 1С
Начиная разрабатывать расширения, не сразу задумываешься о том, а что с ними будет дальше. Вернее задумываешься, но не все последствия получается предугадать. И лишь основываясь на уже двухгодичном опыте разработки расширений, в частности для типовой отраслевой конфигурации, понимаешь, что уже лучше бы не делать, а что стоит заранее предусмотреть, чтобы в дальнейшем расширение не стало обузой для разработчика, вместо облегчения работы.
Мы сделали выводы из своих ошибок и в итоге появился ряд рекомендаций, которыми руководствуемся при разработке расширений:
- Не дробить расширения для одного и того же объекта конфигурации
- Изменения расширяемых форм делать программно, а не через редактор форм
- Минимизировать использование аннотации &Вместо (&ИзменениеИКонтроль?)
- Делать независимые друг от друга расширения
- Новые объекты конфигурации, предполагающие хранение данных, добавлять в основную конфигурацию
- Вести реестр расширений
Рассмотрим подробнее каждый пункт
1. Не дробить расширения для одного и того же объекта конфигурации.
Если изменения касаются, например, одной формы, то мы делаем одно расширение, а не несколько. Если в последствии появляются еще задачи на изменение этой же формы, мы дополняем существующее расширение, вместо создания нового. Особенно, если логика в расширениях зависимая друг от друга. Поменять последовательность исполнения расширений не самая тривиальная задача. Как говорят разработчики: расширения исполняются в последовательности их добавления в конфигурацию и поменять их местами можно только через удаление/добавление (а если расширения содержали хранимые данные, то сделать это может стать невозможно).
Как вариант, можно объединять расширения по функциональности, а не только по определенным объектам, хотя здесь может возникнуть "конфликт объединений" и решить, каким образом лучше объединять, возможно, стоит в самом начале доработок. Например, нужно добавить определенный (схожий) функционал к нескольким объектам, что лучше: добавлять его в каждое расширение, относящееся к определенному объекту, или же сделать одно расширение, но зато придется сослаться на эти объекты в этом одном расширении? Вопрос на самом деле довольно сложный и порой заставляет отступить от принципа "один объект - одно расширение", ради объединение функционала в одном месте.
2. Изменения расширяемых форм делать программно.
Функция "Обновить расширение формы": не стоит всегда надеяться на этот автоматический механизм, так как иногда он может не сработать и будет нестерпимо больно от того, что нужно переделывать всё с нуля.
Давайте возьмем самый банальный пример: сделать определенное поле на форме нередактируемым, т.е. установить ему свойство "ТолькоПросмотр".
Видела много примеров в сети, в том числе на Инфостарт, где предлагалось решить такую простую задачу через редактор форм. Т.е. выбрать элемент нужного поля в редакторе и в свойствах установить "галочку" только просмотр…

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

Рекомендуется: добавить процедуру с аннотацией &После для события формы "ПриОткрытии" примерно с таким кодом:
&НаКлиенте
Процедура АТБ_ПриОткрытииПосле(Отказ)
Элементы.Ответственный.ТолькоПросмотр = Истина;
// и все другие изменения элементов формы
КонецПроцедуры
В этом случае, если Вам придется воспроизводить расширение с нуля, достаточно будет просто перенести данный код в воспроизводимое расширение и всё.
В случае затруднений при программном изменении элементов форм можно воспользоваться бесплатным инструментарием декомпиляции формы, который публиковался здесь на Инфорстарте Евгенией Карук - Генерация кода управляемой формы (т.е. сначала делаем форму в редакторе, указанным инструментом декомпилируем ее и смотрим, как делаются элементы формы программно).
В каком случае можно смело отступить от этой рекомендации? Когда Ваше расширение является временным исправлением ошибки, которую разработчики поправят в следующем релизе типовой конфигурации.
3. Минимизировать использование аннотации &Вместо.
Старайтесь при любой возможности избегать использования аннотации &Вместо. Если логика позволяет, используем &Перед или &После.

Главная цель в этом случае - избежать проблем при изменении кода исходной процедуры в типовой конфигурации (ведь аннотацией &Вместо мы перехватываем исполнение процедуры полностью на расширение, заменяя исходную).
Однако бывают ситуации, когда нужно поменять несколько строк кода именно внутри процедуры и никак аннотациями &Перед и &После сделать этого не получается.
Из этой ситуации теперь есть выход. В платформе 8.3.15 появилась замечательная новая аннотация &ИзменениеИКонтроль, в какой-то степени она решит многие проблемы, связанные с тем, что Вам нужно подправить лишь пару строк в заимствованной функции/процедуре модуля, но Вы не хотели бы перехватывать его полностью, с риском в дальнейшем постоянно отслеживать изменения данного модуля (хотя даже при использовании &ИзменениеИКонтроль риски остаются).
Пример использования директивы &ИзменениеИКонтроль (только с версии платформы 8.3.15)
Например, раньше (т.е. сейчас, пока не обновили платформу) нам приходилось писать так:
&НаКлиенте
&Вместо("ЗаполнитьИнформациюОбОбучении")
Процедура ФФЛ_ЗаполнитьИнформациюОбОбучении()
Если Элементы.ЗачетныеКниги.ТекущаяСтрока <> Неопределено Тогда
ЗачетнаяКнига = Элементы.ЗачетныеКниги.ТекущаяСтрока;
ДанныеОбОбучении = ФизическиеЛицаСервер.ПолучитьДанныеЗачетнойКниги(ЗачетнаяКнига);
Факультет = ДанныеОбОбучении.Факультет;
Специальность = ДанныеОбОбучении.Специальность;
ФормаОбучения = ДанныеОбОбучении.ФормаОбучения;
Курс = ДанныеОбОбучении.Курс;
// измененный код в расширении НАЧАЛО
// Группа = ДанныеОбОбучении.Группа;
// Подгруппа = ДанныеОбОбучении.Подгруппа;
Группа = ДанныеОбОбучении.Группа + " - " + ДанныеОбОбучении.Подгруппа;
// КОНЕЦ
Основа = ДанныеОбОбучении.Основа;
ЯвляетсяСтаростой = ФизическиеЛицаСервер.ПолучитьПризнакСтаростыДляФизЛица(ЗачетнаяКнига);
// добавленный в процедуру код расширения НАЧАЛО
Если ДанныеОбОбучении.УчебныйПлан <> Неопределено Тогда
УПОбучение = ДанныеОбОбучении.УчебныйПлан;
УПОбучение = ПолучитьОбъектУППоСсылке(УПОбучение);
КонецЕсли;
// КОНЕЦ
КонецЕсли;
КонецПроцедуры
Теперь можно написать так.
&НаКлиенте
&ИзменениеИКонтроль("ЗаполнитьИнформациюОбОбучении")
Процедура ФФЛ_ЗаполнитьИнформациюОбОбучении()
Если Элементы.ЗачетныеКниги.ТекущаяСтрока <> Неопределено Тогда
ЗачетнаяКнига = Элементы.ЗачетныеКниги.ТекущаяСтрока;
ДанныеОбОбучении = ФизическиеЛицаСервер.ПолучитьДанныеЗачетнойКниги(ЗачетнаяКнига);
Факультет = ДанныеОбОбучении.Факультет;
Специальность = ДанныеОбОбучении.Специальность;
ФормаОбучения = ДанныеОбОбучении.ФормаОбучения;
Курс = ДанныеОбОбучении.Курс;
#Удалить
Группа = ДанныеОбОбучении.Группа;
Подгруппа = ДанныеОбОбучении.Подгруппа;
#КонецУдалить
#Вставить
Группа = ДанныеОбОбучении.Группа + " - " + ДанныеОбОбучении.Подгруппа;
#КонецВставить
Основа = ДанныеОбОбучении.Основа;
ЯвляетсяСтаростой = ФизическиеЛицаСервер.ПолучитьПризнакСтаростыДляФизЛица(ЗачетнаяКнига);
#Вставить
Если ДанныеОбОбучении.УчебныйПлан <> Неопределено Тогда
УПОбучение = ДанныеОбОбучении.УчебныйПлан;
УПОбучение = ПолучитьОбъектУППоСсылке(УПОбучение);
КонецЕсли;
#КонецВставить
КонецЕсли;
КонецПроцедуры
При этом в дальнейшем платформа сама отследит изменения кода расширяемой процедуры и оповестит в случае его изменения, что позволит Вам проанализировать свои дополнения.
4. Делать независимые друг от друга расширения.
Можно ли из одного расширения вызвать функцию в другом расширении? Можно, но может не нужно?
Ведь действительно удобно: сделать одно расширение с некоторым набором общих процедур и функций, которые можно использовать во всех остальных расширениях.
Скажу честно, мы так сделали, и оно действительно работает, работает не плохо, но…
Есть риск "зависимости". Что-то измените в таком шаред-расширении и могут "полететь" все остальные… Но если Вы держите это под своим контролем, то в принципе использовать такой механизм вполне возможно.
5. Новые объекты конфигурации, предполагающие хранение данных, добавлять в основную конфигурацию.
Разработчики 1С сделали многое, чтобы сделать хранение данных в объектах, добавленных в расширении, более безопасным. Но мы пока не рискуем с данными, имеющими критическую важность. Т.е. новые справочники, документы и регистры стараемся добавлять в основную конфигурацию, т.к. они не сильно мешают дальнейшему обновлению типовой конфигурации.
Можно вынести в хранение в расширении, например настроек, логов - т.е. того, что при случае не сильно жалко потерять.
Вообще вести документирование по любому изменению, связанному с типовой конфигурацией - это обязательно (иначе каждое обновление будет превращаться в головную боль).
Рекомендуется также и ведение реестра всех созданных расширений с описанием функционального назначения расширения, а также перечислением процедур и функций, которые оно заимствует из конфигурации, особенно следует выделять те, что используются с аннотацией &Вместо, т.к. на них нужно будет обращаться особое внимание при обновлении.
В нашем случае ведем реестр в общей записной книге OneNote. Пример фрагмента таблицы такого реестра (в некоторых названиях добавлены пробелы, т.к. иначе таблица здесь не поместится в ширину страницы):
|
Наименование расширения |
Наследуемые модули |
Тип наследования |
Примечание |
|
ПечатьМакетаДоговора ФорматДаты ТабличнойЧасти Ссылка на GIT |
ОбщиеМодули ВспомогательныеФункцииКлиент. ПрисоединитьИЗаполнитьОбластьТаблицы |
Вместо |
Добавлено форматирование даты до передачи в Word |
|
Договора. График платежей. Распределение сумм Ссылка на GIT |
Справочник\Объекты\ ФормаЭлемента: |
|
|
|
|
Подключаемый_УтвердитьДоговор |
Вместо |
// отмена автоматического формирования квитанций на оплату // добавление запрета пересохранения утвержденного договора |
|
|
ПолучитьЗначения РеквизитовДляПараметровФормы |
Вместо |
убрана блокировка создания ДС, если имеются другие ДС в проекте |
|
|
Подключаемый_ПроектДоговора |
Вместо |
Проверка права разутверждения ДС. Разутверждение последующих ДС. |
|
ПланНабора |
Документы\ПланНабора\ Формы\ ФормаДокумента УстановитьВидимость КомандыСоздания КонкурсныхГрупп ПоУчебнымПланам |
После |
Скрытие блока стоимости |
|
|
ОбработатьАктивизациюСтроки |
Вместо |
Комментирование строк загрузки стоимости |
|
|
ЗаписатьСтоимостьОбучения |
Вместо |
Процедура полностью закомментирована (предотвращает запись стоимости) |
|
|
УдалитьСтоимостьОбучения |
Вместо |
Процедура полностью закомментирована (предотвращает удаление стоимости) |
|
История изменений - ограничение просмотра Ссылка на GIT |
Общие\Общие команды\ИсторияИзменений ОбработкаКоманды |
Вместо |
Разрешаем просматривать журнал изменений только пользователям с полными правами |
|
Заявление поступающего Ссылка на GIT |
Документы\ ЗаявлениеПоступающего\ ФормаАнкетыАбитуриента |
|
|
|
|
ПриСозданииНаСервере |
Перед |
Ссылка в форме на процедуру "перед" Добавлены реквизиты (Программно) Договоры\ СтоимостьОбученияЗаВесьПериод Договоры\ГрафикПлатежей\ ДатаНачала Договоры\ГрафикПлатежей\ ДатаПериодаБезОплат Договоры\ГрафикПлатежей\ ДатаОкончания |
|
|
ОбработкаПроверки ЗаполненияНаСервере |
После |
Ссылка в форме на процедуру "после" Добавлена проверка электронной почты ЗП_ОбработкаПроверки ЗаполненияНаСервереПосле(Отказ, ПроверяемыеРеквизиты) |
На каждом элементе есть ссылка на другую OneNote-страницу с ТЗ (с полным описанием задачи, для чего делалось расширение, какие доработки в него вносились со временем, а также ссылка на GIT-хранилище).
Естественно, каждый сам для себя решает, в каком виде ему удобнее представлять такие сведения, главное, чтобы потом их смогли понять не только Вы, но и те, кто будет после Вас.
В итоге немного о том "Почему именно расширения?":
1) Отвечая на вопрос: "Зачем столько мучений, ведь можно просто внести изменения в конфигурацию?" - зачастую это безвыходная ситуация, когда Вам запретили изменять типовую конфигурацию, а что-то добавить очень хочется.
2) Легко распространять. Если Вы что-то изменили в конфигурации, сразу появляется проблема передачи этого изменения клиенту (отправлять целую конфигурацию для дальнейшего сравнения и объединения не всегда удобно, можно конечно сделать через выгрузку файлов и частичную их загрузку, но тоже не самый простой (для клиента) путь), а вот передача клиенту легких в установке расширений для типовых конфигураций, не требующих от пользователя изменения конфигурации, может стать выходом (но есть, конечно, риски при обновлении).
3) Удобство при работе с Git (см. Git-репозитории при небольших проектах)
В конце хотелось бы задать вопрос сообществу: Используете ли Вы расширения в своей работе?
1) Если да, то с какими трудностями Вы сталкивались (а может не сталкивались)?
2) Если не используете, то почему?
Другие статьи на эту тему:
Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Механизмы платформы 1С Разработчик Бесплатно (free)
Разберем 15 мифов о работе платформы «1С:Предприятие 8» – как распространенных, так и малоизвестных. Начнем с классики: «Код, написанный в одну строку, работает быстрее, чем многострочный». Так ли это на самом деле?
16.07.2025 45643 TitanLuchs 109
Работа с интерфейсом WEB-интеграция Механизмы платформы 1С Бесплатно (free)
Веб-интерфейсы повышают качество внешнего вида приложений 1С, предсказуемы с точки зрения верстки, позволяют организовать удобные и высокопроизводительные рабочие места для пользователей. Расскажем об особенностях разработки веб-интерфейсов на React внутри 1С, двустороннем взаимодействии 1С и JavaScript, а также сборке веб-приложения в одностраничный файл.
19.06.2025 18654 zeegin 15
Механизмы платформы 1С Работа с интерфейсом Разработчик Стажер 1С:Предприятие 8 Бесплатно (free)
Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).
03.02.2025 26018 bayselonarrend 127
Механизмы платформы 1С Разработчик 1С:Предприятие 8 Бесплатно (free)
В этой статье подробно рассматривается работа с JSON в XDTO в 1С:Предприятие. Вы узнаете, как сериализовать и десериализовать объекты XDTO в JSON, интегрировать 1С с веб-сервисами и API, а также корректно обрабатывать данные при обмене. Разбираются особенности работы с коллекциями, использование функций восстановления и частые ошибки при работе с JSON и XDTO.
30.01.2025 33261 user2122906 10
Механизмы платформы 1С Файловый обмен (TXT, XML, DBF), FTP Разработчик 1С:Предприятие 8 Бесплатно (free)
Этот материал познакомит вас с механизмом XDTO (XML Data Transfer Objects) в 1С и научит эффективно использовать его возможности. Мы разберёмся, как работать с XML-схемами, создавать модели данных, манипулировать объектами XDTO, а также сериализовать и десериализовать их в XML. Вы узнаете, как использовать XDTO для интеграции с внешними системами, избегать типичных ошибок и оптимизировать код. К концу вы будете уверенно применять XDTO для решения сложных задач обмена данными и автоматизации процессов.
17.01.2025 55712 user2122906 13
Механизмы платформы 1С WEB-интеграция Разработчик 1С:Предприятие 8 Бесплатно (free)
В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.
14.01.2025 46757 dsdred 110
Механизмы платформы 1С Разработчик 1С:Предприятие 8 Бесплатно (free)
Особенности "Знач" и разбор документации к нему.
10.01.2025 26436 VAAngelov 60
Механизмы платформы 1С Разработчик Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.
23.06.2024 40428 bayselonarrend 24
1. Не дробить расширения для одного и того же объекта конфигурации
Дельный совет. Но я бы пошёл бы ещё дальше - ВООБЩЕ НЕ ДРОБИТЬ расширения - т.е. если какую-то конфигурацию. поддерживает команда разработчиков с разными проектами - они могут вести их в отдельных расширениях в своих тестовых базах и отдельных хранилищах конфигураций расширений (но это тоже не обязательно - можно вести всё в одном расширении/хранилище)
А перед установкой в рабочую базу (вернее в продакшен-конфигурацию, возможно так же имеющую своё отдельное хранилище) переносить изменения из разных конфигураций-расширений - в одну (дабы сравнение-объединение для конфигураций-расширений вполне нормально работает) - если их несколько или так и подключать к продуктивным базам единое расширение (если оно сразу был одно). То есть - сводить все свои доработки, в итоге, к одной конфигурации-расширения (ну, максимум к 2-3 - если уже очень приспичит) и подключать ко всем ИБ.
Различиями в функционале управлять программно и через функциональные опции (знаю, что расширения их ещё не поддерживают, при необходимости можно внести их в основную конфигурацию, ну или не использовать - это не обязательно).
2. Изменения расширяемых форм делать программно
Тоже дельный совет. Он касается не только расширений. Увы, даже в управляемых формах и без расширений надёжнее все изменения вносить программно. Эх... жаль-только, что нет возможности писать программные макросы, которые отработают ещё на стадии компиляции в конфигураторе - один раз внеся изменения в форму - а не каждый раз при её создании в runtime.
Ну и фреймов не хватает - ведь один раз так перенести элементы в программный код это не страшно. А если их постоянно приходится модифицировать - это дальше чаще придётся уже работать исключительно с программным текстом, а нес формой.
И ещё есть сложности - порой при добавлении новых элементов на форму приходится перемещать имеющиеся - это самое неприятное. Впрочем это может быть чревато большими проблемами при любом подходе: и программном и при изменении на самой форме.
3. Минимизировать использование аннотации &Вместо
Конечно, с приходом аннотации "&ИзменениеИКонтроль" использование "&Вместо" должно существенно сократиться, но 15- релиза ещё нет даже в бете. Ну а далее - боюсь всё-равно будет куча проблем с сопровождением - там время покажет, пока ещё нечего даже пощупать.
Но, сам формат данной аннотации - мне уже сейчас не нравится - идея хорошая - исполнение отвратительное (Увы это норма для 1С).
Лучше бы парадигму аспектного программирования в 1С привнесли - вот это был бы прорыв.
4. Делать независимые друг от друга расширения
Совет был бы дельным. Но, я уже написал, в самом начале, что лучше вообще делать одно расширение (или пару - полностью независимых друг от друга). Иначе - будут проблемы другого рода - если разные расширения имеют общую основу (как общие модули, так и другие метаданные) - то если их делать полностью автономными - то - эти общие элементы будут в них дублироваться от того сразу ряд проблем:
а. Дублирование кода и метаданных - нужно будет во всех расширениях вручную поддерживать его актуальность - особенно сложно, когда его будут менять в разных проектах и разные команды.
б. Дублирование метаданных так же вызовет конфликт дублирования имён - при установки таких автономных расширений в одну ИБ. Да, конечно же - придётся
разграничивать их все префиксами разными расширений
в. Дублирование метаданных, сохраняемых в СУБД - вообще, можно сказать, невозможно, в большинстве случаев
г. Дублирование да даже не сохраняемых в СУБД метаданных - может быть проблемным - когда, скажем, нужно будет иметь расшаренные глобальные перенные
(параметры сеанса пока расширения вообще не поддерживают - в 14 релизе).
д. Дублирование метаданных приведёт ещё и к дублирование прав доступа к ним (ролей) - настройка прав превратится в хаос.
е. Дублирование перехватчиков событимй (да и просто вызовов функций), реализующих одну и ту же логику - создаст ещё больший хаос.
ж. И отдельно упомяну о том, что многие алгоритмы нуждаются в настройках - их где-то надо хранить - плрохая идея дублировать один и тотжемеханизм работы
с настройками для каждого расширения - ведь его ещё и настраивать придётся в отдельных автономных формах.
В общем, проблем много. Лучше всё-таки все свои изменения вести в одном расширении. Как я написал выше - можно сначала вести отдельные расширения, в и т.ч. создавать общие-расшаренные (ну тут тоже желательно не плодить много таких общий расширений) - а потом всё переносить в одно (сравнением/объединением), без дублей - его уже ставить в продакшен-базы.
5. Новые объекты конфигурации, предполагающие хранение данных, добавлять в основную конфигурацию
Может и дельный совет. Пока расширения не поддерживают всех объектов метаданных. Но тут главная проблема именно в том, что приходится разделять проекты на части - что будет размещено в расширениях, что в нужно будет разместить в основной конфигурации. Жить с этим вполне можно - но очень неудобно. Но, пока без этого вообще не обойтись. Самое неприятное, что нельзя предопределённые элементы вот так нормально добавить, и не бояться их потерять. И с расширением составным типов всё тоже не очень гладко.
6. Вести реестр расширений
Совет дельный, но делать это очень не удобно. Увы - с документированием конфигураций в 1С Предприятие 8 всё очень печально. А вести в отдельном приложении - не очень удобно. Разве что только настраивать GIT и подключать сторонние приложения для решения вопросов документирования уже к GIT-депозитарию -- но это очень не простой путь для 1С разработчиков.
Вести в OneNote - тоже как-то не очень удобно (лично сколько раз порывался - но так и не смог полюбить OneNote - мне не удобно, но, возможно, я просто не научился его готовить).
Ввёл, как-то в отдельной кустарной конфигурации (ещё до появления расширений - для фиксации доработок обычных конфигураций) - это даже как-то удобнее было (метаданные автоматически туда подтягивались фоновым процессом - та же был учет задач и проектов - нужно было только подцепить метаданные к уже имеющимся там задача и всё) - но такую конфигурацию нужно разрабатывать себе самостоятельно - под свои предпочтения и свой учет планирования работа ИТ-отдела.
Из последнего проекта перехода с КА 1.1 на КА 2.4 - там все изменения сделаны через расширения (41 расширение), в конфигурации только новые объекты/реквизиты и одно изменение кода из-за нежелательности применения расширения в данном случае. Было 3 обновления с начала года - никаких проблем
много расширений настраивал для типовых ЗУП, БП, Итилиума, КА, ДО
Много расширений приходится переделывать после других, если неправильно настроены – то они валятся после очередного обновления.
при правильной настройке расширения - очень удобный и стабильный механизм, нужно просто понимать что можно делать через расширение, а что нет
к статье я бы добавил следующее:
1. полностью согласен, для одного объекта/формы отдельное расширение.
одно расширение опасно тем, что при ошибке подключения теряется весь функционал, который заложен в нем
а при отдельных расширениях только небольшая часть отключается и его можно будет легко поправить
2. да, лучше делать программные изменения
но новые элементы формы я обычно добавляю на форму в редакторе. Для них обязательно использую префиксы, новые группы с префиксами и никогда не изменяю типовые реквизиты на форме, только программно
проблем пока не было
3. согласен, аннотация Вместо - это крайний случай и часто бывают проблемы с расширением после обновления, но есть и плюсы…
Последний раз ее применял для доработки печати ТТН и УПД.
Вместо вызывает типовую процедуру получения данных, которая возвращает результат запроса
Этот результат выгружается в ТЗ, обрабатывается, добавляются новые колонки с данными при необходимости и помещаются обратно в результат.
Таким образом при изменении типовой процедуры ничего не сломается даже при изменении запроса или колонок результата, а дальше в коде я ориентируюсь на свои добавленные колонки, которые тоже останутся и не мешают работе типовой.
4. согласен, но если функционал как-то пересекается, то можно общий функционал вынести в отдельный общий модуль конфигурации, например.
Здесь все зависит от решаемой задачи.
5. да, я пока тоже не доверяю хранение важных данных расширению, добавляю новые объекты в конфигурацию.
6. отдельного реестра не веду, все описание в комментариях в расширении или в отдельном макете.
Но для удобства анализа версии расширений – использую реквизит Версия, в него записываю последнюю дату редактирования расширения, например, 10.04.2019
Таким образом при большом количестве расширений очень удобно понимать в какой базе какая версия и переносить изменения, например, из копии в рабочую. Присваивать просто номер версии типа 1.1 неудобно, потому что не известно какая версия последняя, а с датой всегда понятно.
Также после окончательной готовности расширения удаляю все не используемые реквизиты/объекты, отключаю все не нужные для меня зависимости и контроли, добиваюсь, чтобы проверка конфигурации расширения не выдавала ошибок.
Таким образом в расширении остается только измененные и важные для расширения объекты с отключенными контролями и т.п.
При обновление обязательно проверяю все расширения на применимость и еще раз запускаю проверку конфигурации, если она выдает ошибку – ищу причину и устраняю. Таким образом после обновления можно быт спокойным, что на следующий день рабочая будет стабильна и тебя не засыпят ошибками пользователи.
Из недавнего – в КА 2.4 изменилось название документов с ПоступлениеТоваров на Поступление товаровНаСклад, а оно использовалось в двух расширениях в проверке типа и в запросе. Проверка конфигурации естественно выдало эту ошибку, и я ее исправил сразу после обновления до наката на рабочую. Если бы не делал такую проверку, то на следующий день два важных функционала отвалилось бы с ошибкой и утро началось бы не с кофе…
1. Не дробить расширения, где-то слышал сплетни, что несколько расширений - тормозят базу, а одно нет. По этому одно расширение на одну конфигурацию, желательно конечно!
2. Изменять свойства элементов форм программно, согласен.
3. Минимизация использования директивы &Вместо это вообще святое, уже не однократно черпнул горя. Надеюсь директива &ИзменениеИКонтроль поможет в этом, но практика показывает, режим совместимости на типовых конфигурациях очень сильно не успевает за актуальной рабочей версией платформы. Когда она будет? Через год, минимум наверное :)
4. Независимые расширения, это наверное правило а не рекомендация. Да и вообще пункта 4 не должно быть, учитывая пункт 1 :)
5. Все новые объекты строго в основной конфигурации, удаление расширения явно приведёт к потере данных. Тем более создание новых объектов ни как не повлияет на обновление. А уже обработка их на форме и т.п. строго в расширение. Так же слышал по сплетням, что общие модули так же лучше создавать в основной конфигурации и якобы длительные операции значительно быстрее отрабатывают в основной конфигурации, а не в расширении.
6. Реестры доработок в целом для всего это плюс.
У нас Бухгалтерия 3.0. На расширении сделана целая подсистема со своими справочниками и документами. Сначала были опасения о потере данных, но было условие не менять конфигурацию. Рискнули. Пока все нормально. Были глюки с установкой обновлений, кажется февральских. Приходилось отключать расширения и после загрузки конфигурации закрывать конфигуратор и продолжать обновлять уже в пользовательском режиме. Но сейчас проблема ушла. В принципе, расширения - довольно хороший инструмент. Среди плюсов также можно также отметить возможность использования его для отладки, например, новых печатных форм или отчетов.
Из проблемных ситуаций могу отметить:
1. никогда не получалось динамическое обновление расширений и подключение новых при работающих пользователях. Возможно это был глюк платформы или релиза, но я больше не рискую: быстрота не стоит возможной потери данных. Лучше как положено: архив и т.д. ...
2. В формах списков добавленных справочников и документов отсутствует стандартная команда "вывести список". Создавала даже тему на форуме . Но решение не известно (по крайней мере мне).
3. В добавленных документах нет стандартных кнопок "Дт Кт" и "Структура подчиненности" (соответственно они не отображаются в структуре подчиненности объектов основной конфигурации). Допилить, конечно, можно, но уже с помощью своих кнопок.
Очень полезная статья!
насчет Используете ли Вы расширения в своей работе?
Использую. Я их фанат! )) Очень доволен. Но в основном использую в небольших организациях.
Из проблем:
1. Действительно, после каждого обновления приходится пока актуализировать заимствованные формы. Думаю воспользоваться советом и формировать их программно. Хотя в большинстве случаев обхожусь дополнительными реквизитами формы без изменения самой формы.
2. Так и не связал их с хранилищем 1С.
3. Постоянно забываю про проблему с конструктором запроса - сначала ступор - почему нет большинства объектов конфигурации, и только потом доходит, что это же расширение. Приходится делать лишние движения с вызовом конструктора из обработки или кода основной конфигурации.
4. Периодически (но вообще не часто) приходится переписывать некоторые наследованные процедуры - когда меняется состав аргументов. И это не только для процедур с оператором &Вместо.
Это совет для какой платформы 1С?
8.3.13 кажется всё хорошо с этим. К тому же, должны быть бэкапы, если переживаете за сохранность данных.
Второй момент, получится ли обновить конфигурацию снятую с поддержки с возможностью изменений - скриптом, когда баз много?
Чтобы не программист 1с нажимал кнопки?
Чтобы не программист 1с нажимал кнопки?
Поставка конфигурации: создаем файл обновления и вперед скриптом... точно так же, как и типовые обновления. Только один нюанс - на рабочей базе конфигурация получается без возможности изменения.
Второй вариант - обновление из хранилища.Но обновлять из хранилища рабочие базы... Ну это если один разработчик держит все эти базы :)
З.Ы. не все комменты внимательно прочитал, но при беглом просмотре не увидел ответа на данный вопрос :)
Да бросьте уже нагнетать обстановку, ну или примеры кривизны в студию. Я, признаться, побаиваюсь еще добавлять данные в расширения, но что касается кода, особых претензий к механизму нет.
Пример 1:
Пример 2:
Добавьте к этому необходимость создавать отдельные хранилища конфигурации для каждого расширения и авторизоваться в каждом из них отдельно. Проблем ещё много, можно на форумах ещё найти, особенно для нечётных релизов 8.3.11, 8.3.13 на которых обкатываются нововведения, прежде чем перевести типовые на чётные релизы.
Расширения хороши до тех пор, пока код, форма или объект метаданных, который они меняют, в действительности не меняется или почти не меняется в новой версии конфигурации поставщика. Так как при небольших модификациях типовых это основной случай расширения и получили такое большое распространение.
Но когда модификации типовой конфигурации действительно требуют адаптации под новый релиз конфигурации поставщика, расширения перестают выполнять свою функцию "упрощения обновления" и только скрывают от глаз проблему, которую должен решить релиз-инженер. О ней узнают по факту накатки обновления или от пользователей.
Совет из этой публикации менять формы только программно - из той же области.
P.S.: Для Бухгалтерий и ЗУП-ов расширения хороши. Постоянная надёжность конфигурации не нужна, на исправление багов времени всегда достаточно. Ценность замочка на объектах метаданных высока по психологическим причинам )) Почему бы и нет )) Проблема только в том, что набив руку на нетребовательных к надёжности конфигурациях специалисты потом эти приёмы переносят на конфигурации, требующие больших модификаций и высокой надёжности, в том числе отсутствия косяков сразу после операции обновления, а не через неделю после вала сообщений от пользователей.
(12)
Откуда инфа? Сторонник теории заговора релизов или офф. источник?
ERP 2.0 была в режиме совместимости 8.3.6, ERP 2.1 и 2.2 - 8.3.8 и 8.3.10, ERP 2.4 - 8.3.12. Аналогично конфигурации КА 2 и УТ 11. За бухгалтериями не следил, но подозреваю, что там аналогичная ситуация.
Официально заявлений о том, что функционал нечетных релизов "сырой" мы конечно нигде не увидим, да и вообще всё это неправда, и, как Вы написали, несостоятельная теория заговора )) Может быть там внутри 1С другие причины так между релизами переключаться. Но наиболее вероятно, что ERP на 8.3.15 с директивой в расширениях &ИзменениеИКонтроль мы не увидим. Надо будет ждать режима совместимости с 8.3.16.
Понятно, что для простых изменений (форму подправить и т.п.), все нормально работает, а вот что-то сложное, ну такое.
В статье по большому счету о проблемах ни слова. А проблемы действительно есть, хотя и многие из них решаются.
Самая большая их них - расширения ничего не знают о типах расширяемой конфигурации (как впрочем и о других расширениях), как следствие невозможно в расширениях использовать тип "ЛюбаяСсылка" (так же как и типы других расширений).
Другими словами невозможно использовать "критерии отбора" т.е. структуру подчиненности через стандартных механизм критериев отбора уже не получить,
как вариант можно использовать
Другая не менее важная проблема это невозможность использовать в расширениях механизм доп.атрибутов, точнее невозможно использование объектов расширения (все так же из-за типизации)
Есть в расширениях замечательная опция "Активно", вот только отключить ее не всегда есть возможность, точнее отключить то ее можно, но вот если есть заимствованный регистр накопления и добавленный новый документ который участвует в движении по этому регистру то увы и ах провести документ не удастся ибо выйдет вот такая шибка:
Работа с таблицей невозможна. Структура таблицы несовместима с текущими расширениями конфигурации.
При обновлении доработанных конфигураций у меня тоже проблем не наблюдается, движения делаются по подпискам, формы меняются программно через переопределяемые модули, отчеты/обработки через механизмы БСП.
Это не исключает копирование этой информации в отдельное место, но позволяет при работе с расширением сразу же получать нужную информацию. Я такое использую во внешних обработках и отчетах, добавляя текстовый макет История.
Для сложных случаев там же храню описание задачи (ТЗ), которая решалась в данной разработке
По п.5 можно ещё максимально продумать структуру дополнительных данных - может можно обойтись дополнительными и реквизитами и сведениями? Хранение их так же безопасно и не требует снятия конфигурации с поддержки.
1) Система сообщит "ваш метод требует адаптации", но что именно адаптировать нам придётся узнавать самим. Трехстороннее сравнение/объединение придётся организовывать самим, например выгружая все версии кода в файл и применяя внешние инструменты или делая попарное сравнение файлов в 1С. Кто будет с этим заморачиваться? Скорее глазами по тексту пробегать будут, что повышает риск ошибки. На небольших примерах в "Зазеркалье" всё выглядит красиво. А если метод на 300-500 строк и код разделён большими блоками запросов? Так часто бывает в типовых.
2) &ИзменениеИКонтроль появится в 8.3.15. А значит для того же семейства конфигураций ERP/КА/УТ станет доступно только в 8.3.16 где-то через год. На "пробную" нечетную платформу их переводить не будут. Ждать ещё долго. А расширения массово лепятся как снежки уже сейчас, без всяких аннотаций &ИзменениеИКонтроль.
Не говоря уже о ставших популярными шутках на счёт необходимости применять беспощадные аннотации &КонецУдалить и &КонецВставить совместно с &ИзменениеИКонтроль ))
1. Обычно это не вызывает больших проблем - всё быстро можно урегулировать
2. Но возникают некоторые дополнительные сложности при установке апдейт-обновлений - но, обычно, тоже нет больших сложностей
3. Главное при апдейте обновления от вендора не забыть о том, что режим совместимости надо поправить снова (у корня конфигурации)
4. Ну, и сначала надо на копии тестировать - выявить косяки, поправить и переходить потом к рабой базе (бэкап обязателен)
Мы так повышали уровень совместимости и для документооборота и даже для УПП - где без повышения уровня совместимости, например, расширения вообще не будут доступны. Ничего страшного в этом нет - но проблемы всё-равно решать придётся.
В основном проблемы были с именами полей метаданных и функций - в новых версиях конфигураций появляются новые встроенные или появляются просто запрет какого-то имени - и возникает конфликт, когда в конфигурации это имя использется -чаще все го нужно просто везде переименовать (дабы платформа сейчас это легко позволяет автоматизировать).
Вроде как с регистрами (вроде сведений_ были какие-то траблы - не реструктуризировались (парочка - но это индивидуально) - пришлось их выгружать, очищать и потом загружать.
Не бойтесь сами посмотреть - сделайте копию и на ней проверьте. Рекомендую только делать всё на серверной базе и менять режим совместимости поэтапно (по одной версии) - делать реструктуризацию - как при обновлении.
А в конце на копии запустить перепроведение всех документов. Ну и РИБ перенастроить заново и проверит (конфигурацию придётся так же по частям переносить в другой узел, возможно через РИБ не пройдёт - придётся вручную переносить) - если используете.
Поищите на инфорстарте - тут вроде были статьи на то как перейти на версию совместимости с поддержкой расширений для старых конфигураций
Сам ставлю времмено реквизит "ссылка", потом меняю руками в тексте модуля.
!!!Для этого нужно захватить форму списка.!!!
А теперь вопрос! ДЛЯ ЗАЧЕМ??!?!?! Если Я и так уже справочник захватил и его родителя или владельца!
А ещё, захватив форму списка, тянем за собой в расширение все реквизиты и все связанные с ними перечисления, справочники, документы из основной конфигурации. Оно нам надо?
По моему расширения годны пока только для модификации или замены чистого кода, не более.
Я не сохраняю захваченные для построения запросов объекты в расширении ))) не переживайте.
Из неудобств можно отметить работу с СКД и прочие запросы, но выход простой писать запрос либо в обработке, либо другим способом.
Раньше много было косяков в конфигурациях 8.3.8 например, отладку надо было с ключем "РежимОтладки" запускать, но сейчас с этим все хорошо.
Из последних Косяков, при переходе на платформу 8.3.12.1469 напарывался на описанное в данной теме
Сломало полностью все, начиная от механизма обмена, заканчивая нормальной работой распределенных баз. Практически на любое действие: Ошибка исключительной блокировки информационной базы. При том, что в самом расширении ничего такого не было. Расширили табличную часть Товары документа Поступление, добавив туда две колонки Дата изготовления и Срок годности (дата и число) и добавили обработку выгрузки на весы CAS для работы с бесплатным драйвером. Причем все это давно уже работало, но для нового клиента решили не трогать конфигурацию и вынести в расширение. Вынесли...
Самое гадкое в этом то, что расширение сломало типовой механизм обмена и "починить" базы РИБ просто удалив расширение из центрального узла не получится. Нам пришлось отвязывать базы от центрального узла, удалять в них расширение руками и привязывать заново. Хорошо что заметили это рано утром и магазинов было всего три.
Конфигурация: Розница 2.2.1.24, платформа 8.3.13.1690
1. в локальной сети всё работало стабильно
2. Тонкий клиент и web с удаленными пользователями происходили ошибки из серии "Ошибка разбора XML" при открытии формы с расширением. Ошибки происходили нерегулярно. раз-два в день. у некоторых пользователей.
в итоге, пока побаиваюсь работать с расширением когда пользователей более 100 пользователей и не все работают в одной локальной сети
В статье упоминается особенность 8.3.15.
Пример использования директивы &ИзменениеИКонтроль (только с версии платформы 8.3.15)
1. Не дробить расширения для одного и того же объекта конфигурации
Дельный совет. Но я бы пошёл бы ещё дальше - ВООБЩЕ НЕ ДРОБИТЬ расширения - т.е. если какую-то конфигурацию. поддерживает команда разработчиков с разными проектами - они могут вести их в отдельных расширениях в своих тестовых базах и отдельных хранилищах конфигураций расширений (но это тоже не обязательно - можно вести всё в одном расширении/хранилище)
А перед установкой в рабочую базу (вернее в продакшен-конфигурацию, возможно так же имеющую своё отдельное хранилище) переносить изменения из разных конфигураций-расширений - в одну (дабы сравнение-объединение для конфигураций-расширений вполне нормально работает) - если их несколько или так и подключать к продуктивным базам единое расширение (если оно сразу был одно). То есть - сводить все свои доработки, в итоге, к одной конфигурации-расширения (ну, максимум к 2-3 - если уже очень приспичит) и подключать ко всем ИБ.
Различиями в функционале управлять программно и через функциональные опции (знаю, что расширения их ещё не поддерживают, при необходимости можно внести их в основную конфигурацию, ну или не использовать - это не обязательно).
2. Изменения расширяемых форм делать программно
Тоже дельный совет. Он касается не только расширений. Увы, даже в управляемых формах и без расширений надёжнее все изменения вносить программно. Эх... жаль-только, что нет возможности писать программные макросы, которые отработают ещё на стадии компиляции в конфигураторе - один раз внеся изменения в форму - а не каждый раз при её создании в runtime.
Ну и фреймов не хватает - ведь один раз так перенести элементы в программный код это не страшно. А если их постоянно приходится модифицировать - это дальше чаще придётся уже работать исключительно с программным текстом, а нес формой.
И ещё есть сложности - порой при добавлении новых элементов на форму приходится перемещать имеющиеся - это самое неприятное. Впрочем это может быть чревато большими проблемами при любом подходе: и программном и при изменении на самой форме.
3. Минимизировать использование аннотации &Вместо
Конечно, с приходом аннотации "&ИзменениеИКонтроль" использование "&Вместо" должно существенно сократиться, но 15- релиза ещё нет даже в бете. Ну а далее - боюсь всё-равно будет куча проблем с сопровождением - там время покажет, пока ещё нечего даже пощупать.
Но, сам формат данной аннотации - мне уже сейчас не нравится - идея хорошая - исполнение отвратительное (Увы это норма для 1С).
Лучше бы парадигму аспектного программирования в 1С привнесли - вот это был бы прорыв.
4. Делать независимые друг от друга расширения
Совет был бы дельным. Но, я уже написал, в самом начале, что лучше вообще делать одно расширение (или пару - полностью независимых друг от друга). Иначе - будут проблемы другого рода - если разные расширения имеют общую основу (как общие модули, так и другие метаданные) - то если их делать полностью автономными - то - эти общие элементы будут в них дублироваться от того сразу ряд проблем:
а. Дублирование кода и метаданных - нужно будет во всех расширениях вручную поддерживать его актуальность - особенно сложно, когда его будут менять в разных проектах и разные команды.
б. Дублирование метаданных так же вызовет конфликт дублирования имён - при установки таких автономных расширений в одну ИБ. Да, конечно же - придётся
разграничивать их все префиксами разными расширений
в. Дублирование метаданных, сохраняемых в СУБД - вообще, можно сказать, невозможно, в большинстве случаев
г. Дублирование да даже не сохраняемых в СУБД метаданных - может быть проблемным - когда, скажем, нужно будет иметь расшаренные глобальные перенные
(параметры сеанса пока расширения вообще не поддерживают - в 14 релизе).
д. Дублирование метаданных приведёт ещё и к дублирование прав доступа к ним (ролей) - настройка прав превратится в хаос.
е. Дублирование перехватчиков событимй (да и просто вызовов функций), реализующих одну и ту же логику - создаст ещё больший хаос.
ж. И отдельно упомяну о том, что многие алгоритмы нуждаются в настройках - их где-то надо хранить - плрохая идея дублировать один и тотжемеханизм работы
с настройками для каждого расширения - ведь его ещё и настраивать придётся в отдельных автономных формах.
В общем, проблем много. Лучше всё-таки все свои изменения вести в одном расширении. Как я написал выше - можно сначала вести отдельные расширения, в и т.ч. создавать общие-расшаренные (ну тут тоже желательно не плодить много таких общий расширений) - а потом всё переносить в одно (сравнением/объединением), без дублей - его уже ставить в продакшен-базы.
5. Новые объекты конфигурации, предполагающие хранение данных, добавлять в основную конфигурацию
Может и дельный совет. Пока расширения не поддерживают всех объектов метаданных. Но тут главная проблема именно в том, что приходится разделять проекты на части - что будет размещено в расширениях, что в нужно будет разместить в основной конфигурации. Жить с этим вполне можно - но очень неудобно. Но, пока без этого вообще не обойтись. Самое неприятное, что нельзя предопределённые элементы вот так нормально добавить, и не бояться их потерять. И с расширением составным типов всё тоже не очень гладко.
6. Вести реестр расширений
Совет дельный, но делать это очень не удобно. Увы - с документированием конфигураций в 1С Предприятие 8 всё очень печально. А вести в отдельном приложении - не очень удобно. Разве что только настраивать GIT и подключать сторонние приложения для решения вопросов документирования уже к GIT-депозитарию -- но это очень не простой путь для 1С разработчиков.
Вести в OneNote - тоже как-то не очень удобно (лично сколько раз порывался - но так и не смог полюбить OneNote - мне не удобно, но, возможно, я просто не научился его готовить).
Ввёл, как-то в отдельной кустарной конфигурации (ещё до появления расширений - для фиксации доработок обычных конфигураций) - это даже как-то удобнее было (метаданные автоматически туда подтягивались фоновым процессом - та же был учет задач и проектов - нужно было только подцепить метаданные к уже имеющимся там задача и всё) - но такую конфигурацию нужно разрабатывать себе самостоятельно - под свои предпочтения и свой учет планирования работа ИТ-отдела.
хорошее предложение, но не всегда можно применять. Например, некоторые расширения у нас носят "сезонный" характер (например, используются только летом) и периодически "вырезать" их из одного большого расширения было бы не очень удобно.
Просто это один из моих любимых программных продуктов, поэтому не смогла удержаться и не упомянуть его ;)
По остальным пунктам во многом соглашусь.
а. Как я написал - при ОЧЕНЬ БОЛЬШОЙ и ОБОСНОВАННОЙ ПОТРЕБНОСТИ - можно иметь 2 ну максимум 3 консолидированных расширения, реально мало связанных друг с другом (или одно общее-основное - и несколько дополняющих). Но это скорее исключение - когда это реально удобнее, чем всё в одномю
б. Для Вашего же примера - идеально подходя, как раз таки, опции настройки - которыми Вы будете включать/выключать функционал в ИБ по потребности (если его реально нужно выключать, т.е. он будет мешать не в своё время).
Для опций - просто заводите регистр сведений (лучше не периодический) и ПВХ (будут едины для всех расширений; константы расширения пока не поддерживают). И коде, через модуль повторного использования получаете и проверяете эти опции - и выбираете использовать или не использовать те или иные алгоритмы; отображать или нет те или иные элементы формы.
При желании - подключаете к этим регистрам - функциональные опции (но их расширения пока тоже не поддерживают - поэтому их придётся добавлять в основу. конфигурацию) - но я не вижу большой потребности в их использовании.
По поводу "OneNote"
Мне кажется настоящий разработчик на 1С в короткие сроки сделает куда более удобный инструмент документирования, чем "OneNote". Особенно, если уже возьмёт за основу какую-нибудь готовую конфигурации класса ITIL или класса ITSM, с поддержкой работы через WEB.
А потом ещё и с GIT её интегрирует или с другими WEB-ориентированными специализированными продуктами.
Но это просто моё мнение ;-)
Очень полезная статья!
насчет Используете ли Вы расширения в своей работе?
Использую. Я их фанат! )) Очень доволен. Но в основном использую в небольших организациях.
Из проблем:
1. Действительно, после каждого обновления приходится пока актуализировать заимствованные формы. Думаю воспользоваться советом и формировать их программно. Хотя в большинстве случаев обхожусь дополнительными реквизитами формы без изменения самой формы.
2. Так и не связал их с хранилищем 1С.
3. Постоянно забываю про проблему с конструктором запроса - сначала ступор - почему нет большинства объектов конфигурации, и только потом доходит, что это же расширение. Приходится делать лишние движения с вызовом конструктора из обработки или кода основной конфигурации.
4. Периодически (но вообще не часто) приходится переписывать некоторые наследованные процедуры - когда меняется состав аргументов. И это не только для процедур с оператором &Вместо.
Из проблем
1. Сам столкнулся когда изменилась форма документа и перестала нормально работать. Обновил в расширении и потерял то что добавлял... Вот тогда на собственном опыте дошел что надо программно добавлять элементы в форму расширения. Пришлось переписать процедуры для большей структурности добавления, и в последующем уже именно туда вписывал необходимые элементы для модификации. Благо таких форм не так много.
3. Просто в расширение заимствую необходимые реквизиты, потом их можно удалить или не обращать внимания...
4 Наследованные в таком случае всегда видны, а вот с оператором &Вместо - это действительно скоро будет засада, ну когда их будет много. Тоже стараюсь их избегать, но не всегда это возможно.
Насколько мне известно с 12 релиза (или чуть позже, не помню точно) эта проблема частично решилась. То есть, теперь если в исходной процедуре после обновления появится новый аргумент (со значением по умолчанию) - то это не вызовет ошибки в расширении. Главное, чтобы не в середину вклеили новый аргумент - а то логика может нарушиться.
Тогда чесались руки это сделать в виде расширения, но были отзывы, что этот механизм пока сырой и не хотелось пускать под это своих клиентов. А тут недавно УТ глобально обновилось и Библиотека подключаемого оборудования поменялась кардинально. Обрадовался, что теперь наконец то можно будет поработать с расширениями. Я в восторге.
Очередностью расширений прекрасно можно управлять (Утверждение справедливо для платформы 8.3.13.1644 и режиму совместимости Версия 8.3.12)
Для этого открываем свойство расширения и меняем назначение расширения конфигурации. Сначала выполняется Исправление, потом Адаптация а потом Дополнение
● Исправление ‑ такое расширение предназначено для исправления ошибок в прикладном решении. В таких расширениях предполагается использование потенциально «опасных» возможностей расширений, например, применение расширения метода с помощью аннотации Вместо. Исправления предназначено для определенной версии прикладного решения. При выходе следующей версии этого решения автор расширения должен проводить анализ применимости созданных расширений в новой версии. Допускается наличие нескольких расширений с таким назначением, но необходимо обеспечить отсутствие конфликтов между такими расширениями, например, несколько таких расширений не должны расширять один и тот же метод с разными целями. Такие расширения могут не учитывать наличия расширений другого назначения.
● Адаптация ‑ такое расширение предназначено для адаптации прикладного решения под условия конкретного клиента. В таких расширениях рекомендуется не использовать потенциально «опасных» возможностей, т. е. тех возможностей, которые могут привести к конфликту расширений при их совместной работе или которые зависят от порядка подключения расширений. Тем не менее, допускается аккуратное использование «опасных» возможностей, при условии, что автор расширения берет на себя полную ответственность за обеспечение корректного функционирования результирующей конфигурации в новых версиях прикладных решений, и с учетом расширений, имеющих назначение Исправление. Предполагается, что в каждый момент времени в информационной базе существует минимальное количество таких расширений. Если в одно расширение невозможно включить весь набор изменений, то рекомендуется расширения с назначением Адаптация разбивать по максимально крупным блокам расширяемого прикладного решения.
● Дополнение ‑ такое расширение предназначено для реализации новых возможностей прикладных решений, которые минимально привязаны к конкретной версии прикладного решения. Примером такого расширения может служить создание нового набора отчетов, который отсутствует в расширяемом прикладном решении. Предполагается, что такие расширения должны корректно работать в случае обновления расширяемого прикладного решения. При этом расширение с назначением Дополнение не должно учитывать в своей работе возможное наличие расширений с другим назначением. Предполагается, что таких расширений может быть произвольное количество.
И вот еще был вопрос по взаимодействию расширений в зависимости от назначения расширения
Так что предпочитаю если есть возможность все делать в одном расширении определенного типа.
ЛИЦИМЕРы.
А вот, что касается расширений, то использовать их можно и нужно. Здесь, да и в других делах, главное без фанатизма. + 100 к карме)
Но всё равно - недостатков у архитектуры расширений - море! Хоть те же конфликты дублирования одинаковых метаданных. И невозможность делать приватные (изолированные) метаданные (доступные только внутри расширения). Нет возможностей указывать зависимости (от других расширений, подсистем, версий конфигураций; уж про желание указывать ветвление состава метаданных и реализацию алгоритмов в рамках одного расширения в зависимости от версии конфигурации/платформы куда оно устанавливается), и просто требовать наличие определённых метаданных (хотя бы функциональных опций и привязывать свой функционал к ним, или, в случае отсутсвия некоторых метаданных - автоматически их добавлять - так сказать "в минимально требуемом объёме"). И нет возможности в расширениях добавлять предопределённые данные. Ну уж про отсутсиве возможности расширять расширения - я вообще молчу.
Ещё -до сих пор было нельзя конвертировать проекты расширений и обычных конфигураций друг в друга (хотя бы сравнением объединением) - что очень неудобно в ряде случаев.
Из достоинств - это конечно перехват любых функций и динамическое подключение (и разделение по разделителям), добавление реквизитов к существующим метаданными, расширение их типов и создание некоторых своих метаданных.
Лично я считаю расширения любопытной - но тупиковой ветвью развития.
Но никакой классический ООП тут бы ничего лучше бы тоже не предложил.
Я считаю - что вместо расширений - нужно было делать саму конфигурацию - изначально модульной, когда метаданные делятся по модулям (примерно как по подсистемам) которые могут быть определены как отдельные проекты как отдельные подконфигурации - и эти модули уже совмещаются друг с другом по гибким правилам - схожими с тем, как устанавливаются расширения.
И одно и то же метаданное может быть распределено по разным модулям - собираясь по частям, расширяясь и дополняясь. Но эти части могут быть как публичные, так и изолированные с разным уровнем изоляции. Изолированные части не пересекаются друг с другом, даже при совпадении имён.
А ещё должны быть опции интеграции - типа функциональных опций - но определяемых значениями на уровне конфигуратора (в т.ч. по различным условиям - например проверка на наличие тех или иных версий требуемых модулей или версию платформы сборки; ну или задаваемым в ручную - как настройка) - и уже по этим опциям различные части кода и метаданных включаются или выключаются для использования в ИБ. Всё лишнее и несовместимое можно было бы сразу отключить - чтобы оно не загружало ИБ лишним содержимым и не снижало её эффективность (расход памяти, скорость алгоритмов и эффективность запросов к СУБД).
Вот такое моё мнение! А расширения - это лишь жалкая пародия на модульную схему.
Это я к тому, что пока мы (или они) будут делать идеальный продукт (типа водопадной модели), к релизу он станет уже не идеальный (в той или иной степени), т.к. время снятие показаний и их реализация самый главный наш враг.
Аминь.
Что то мне интуиция шепчет а их и не будет. ;) и даже намекает почему... Посудите сами - идея расширений дополнение типовых решений. В идеале не снимая с замка. Но идеал не достижим, а раз так то: подписки - добавление своих в основную конфигурацию типовой функционал не пересекают, а значит при обновлениях никаким образом не мешают.
Остальные объекты аналогично. То есть, все то что можно добавить не используя типовой функционал вполне можно, и я для себя решил, вполне нужно, реализовать в основной конфигурации.
(65)
Пародия, не пародия, но жизнь по доработке на текущий момент существенно облегчает. Учитывая что модульность в принципе не заложена, то это можно считать началом будущей модульности. Во всяком случае я на это сильно рассчитываю....
1. Можно сделать одну подписку сразу на несколько источников, в т.ч. на обобщённые - типа ДокументОбъект - без этого просто невозможно делать универсальные подписчики, которые, скажем, должны срабатывать при записи любого ссылочного объекта (в т.ч. которые появятся в будущем), при необходимости проверяя источник уже в самом обработчке на любые условия.
2. В рамках одной конфингурации можно делать несколько подписчиков на одно событие - когда они не пересекаются друг с другом и относятся к решению разных задач, и могут разрабатываться параллельно разными разработчиками, не мешая друг другу. Заодно можно проверить в одном месте всех подписчиков (особенно в EDT где наконец-то их можно группировать по источникам - хоть и всё-равно через жопу).
Конечно, наиболее важным тут является пункт 1.
По остальным отсутствующим объектам - это больше похоже про то как сначала дают конфетку, приучают к ней - а потом её отбирают - мол довольно уже есть сладкое, жри горькую редьку - она полезнее, а с конфеткой мы погорячились!
Добавлять в прямо конфигурацию - это же кошмар - как я написал делить проект на части и по разному размещать его в ИБ - это БРЕД! Особенно если думать о расширениях - именно как о шаге к модульным поставкам решений - когда поставщик поставляет дополнительный функционал к основной конфигурации в самостоятельном расширении. И через него осуществляет обновления.
Даже для внутренней разработки расширения, содержащие именно внутри новые метаданные, могут быть очень полезны - вот, к примеру у меня в группе компаний сотни баз, несколько десятков разных конфигураций, нескольких базовых типовых видов. У меня есть функционал - который мне нужно в них все поставить (на 80% он общий для всех баз), который мне потом нужно будет сопровождать и поддерживать. Что мне проще - заморачиваться с отдельной поставкой конфигурации поставщиком (старый проблемный подход) - или завести расширение в хранилище - и подключить его сразу ко всем базам (и обновлять потом через единое хранилище, а оставшимся 20% различий в функционале управлять через встроенные в расширение функциональные опции на базе встроенных же констант)?
Так что пока расширения выглядят больше как издёвка - но я не буду спорить - даже в таком виде (не ниже 12 релиза совместимости) они могут быть вполне полезны - но только как суррогат - т.к. как по-другому выходит не лучше!
А про конфигурации на на обычных формах я вообще молчу - они без "танцов в бубном" вообще расширения не поддерживают. И не говорите, что их инсталлировано меньше, чем на управляемом приложении.
Про слои в Axapta я читал, открыв рот, году так в 2007, и уже тогда приходил в восторг от имеющихся возможностей у "вражеского лагеря". А в 1С прям открытие сделали, с худшей, чем у конкурентов, реализацией
Что-то связанное с хранением данных пока тоже не рискую делать. Хотя в этом направлении наверное тоже идет развитие. Поэтому когда-нибудь мнение свое изменю.
Иногда расширения используем для исправления ошибок при обновлении. Для критических исправлений.
1. Не дробить расширения, где-то слышал сплетни, что несколько расширений - тормозят базу, а одно нет. По этому одно расширение на одну конфигурацию, желательно конечно!
2. Изменять свойства элементов форм программно, согласен.
3. Минимизация использования директивы &Вместо это вообще святое, уже не однократно черпнул горя. Надеюсь директива &ИзменениеИКонтроль поможет в этом, но практика показывает, режим совместимости на типовых конфигурациях очень сильно не успевает за актуальной рабочей версией платформы. Когда она будет? Через год, минимум наверное :)
4. Независимые расширения, это наверное правило а не рекомендация. Да и вообще пункта 4 не должно быть, учитывая пункт 1 :)
5. Все новые объекты строго в основной конфигурации, удаление расширения явно приведёт к потере данных. Тем более создание новых объектов ни как не повлияет на обновление. А уже обработка их на форме и т.п. строго в расширение. Так же слышал по сплетням, что общие модули так же лучше создавать в основной конфигурации и якобы длительные операции значительно быстрее отрабатывают в основной конфигурации, а не в расширении.
6. Реестры доработок в целом для всего это плюс.
Вы будете смеяться, но рекомендации разработаны, а подогнать под них уже созданные ранее решения всё никак руки не доходят, поэтому пункт 4 у нас существует в проекте (т.е. есть расширение, которое используют другие расширения, по хорошему либо переносить код в общий модуль в конфигурации, либо объединять расширения в одно).
Расскажите: откуда информация? Замеров нигде не видел, на глаз разницы не увидел (версия 8.3.7 и ниже не в счет). Лично общался с разработчиками функционала расширений, уверяли, что на производительность работы количество расширений не влияет и у них это контролируется.
(73)
Так же сплетни, наверно все же в профессиональном сообществе не то, что не стоит на это полагаться, а даже озвучивать тезисы с такими источниками.
Отсюда с тем что для 1 базы использовать одно расширение - не соглашусь. Если в базе много доработок, разного времени и разного назначения, то под каждую задачу нужно отдельное расширение. Естественно, пересекающиеся задачи, которые используют одни объекты (например несколько раз доработали форму заказа, под разные хотелки) - по сути 1 задача и расширение одно. К этому пришел после неоднократных, не очень удачных обновлений, когда 1С переработают конфигурацию на столько, что не работает почти ни чего. Когда расширение одно - оно отвалилось и пока весь функционал не пройдем, в продакшине ни чего не работает. А на это не всегда есть время, лучше все же если обновление поджимает - его сделать и функционал доработок запустить по очереди в порядке приоритета. Бывают же функции которые раз в квартал используют, а из-за этого мы не можем первичку оперативную печатать - не хорошо.
Ошибка номера платформы - поправьте.
В тексте статьи есть фраза: "В платформе 8.3.15 появилась замечательная новая аннотация &ИзменениеИКонтроль"
Из последнего проекта перехода с КА 1.1 на КА 2.4 - там все изменения сделаны через расширения (41 расширение), в конфигурации только новые объекты/реквизиты и одно изменение кода из-за нежелательности применения расширения в данном случае. Было 3 обновления с начала года - никаких проблем
много расширений настраивал для типовых ЗУП, БП, Итилиума, КА, ДО
Много расширений приходится переделывать после других, если неправильно настроены – то они валятся после очередного обновления.
при правильной настройке расширения - очень удобный и стабильный механизм, нужно просто понимать что можно делать через расширение, а что нет
к статье я бы добавил следующее:
1. полностью согласен, для одного объекта/формы отдельное расширение.
одно расширение опасно тем, что при ошибке подключения теряется весь функционал, который заложен в нем
а при отдельных расширениях только небольшая часть отключается и его можно будет легко поправить
2. да, лучше делать программные изменения
но новые элементы формы я обычно добавляю на форму в редакторе. Для них обязательно использую префиксы, новые группы с префиксами и никогда не изменяю типовые реквизиты на форме, только программно
проблем пока не было
3. согласен, аннотация Вместо - это крайний случай и часто бывают проблемы с расширением после обновления, но есть и плюсы…
Последний раз ее применял для доработки печати ТТН и УПД.
Вместо вызывает типовую процедуру получения данных, которая возвращает результат запроса
Этот результат выгружается в ТЗ, обрабатывается, добавляются новые колонки с данными при необходимости и помещаются обратно в результат.
Таким образом при изменении типовой процедуры ничего не сломается даже при изменении запроса или колонок результата, а дальше в коде я ориентируюсь на свои добавленные колонки, которые тоже останутся и не мешают работе типовой.
4. согласен, но если функционал как-то пересекается, то можно общий функционал вынести в отдельный общий модуль конфигурации, например.
Здесь все зависит от решаемой задачи.
5. да, я пока тоже не доверяю хранение важных данных расширению, добавляю новые объекты в конфигурацию.
6. отдельного реестра не веду, все описание в комментариях в расширении или в отдельном макете.
Но для удобства анализа версии расширений – использую реквизит Версия, в него записываю последнюю дату редактирования расширения, например, 10.04.2019
Таким образом при большом количестве расширений очень удобно понимать в какой базе какая версия и переносить изменения, например, из копии в рабочую. Присваивать просто номер версии типа 1.1 неудобно, потому что не известно какая версия последняя, а с датой всегда понятно.
Также после окончательной готовности расширения удаляю все не используемые реквизиты/объекты, отключаю все не нужные для меня зависимости и контроли, добиваюсь, чтобы проверка конфигурации расширения не выдавала ошибок.
Таким образом в расширении остается только измененные и важные для расширения объекты с отключенными контролями и т.п.
При обновление обязательно проверяю все расширения на применимость и еще раз запускаю проверку конфигурации, если она выдает ошибку – ищу причину и устраняю. Таким образом после обновления можно быт спокойным, что на следующий день рабочая будет стабильна и тебя не засыпят ошибками пользователи.
Из недавнего – в КА 2.4 изменилось название документов с ПоступлениеТоваров на Поступление товаровНаСклад, а оно использовалось в двух расширениях в проверке типа и в запросе. Проверка конфигурации естественно выдало эту ошибку, и я ее исправил сразу после обновления до наката на рабочую. Если бы не делал такую проверку, то на следующий день два важных функционала отвалилось бы с ошибкой и утро началось бы не с кофе…
если это возможно, не могу найти информацию.
Спасибо
У нас Бухгалтерия 3.0. На расширении сделана целая подсистема со своими справочниками и документами. Сначала были опасения о потере данных, но было условие не менять конфигурацию. Рискнули. Пока все нормально. Были глюки с установкой обновлений, кажется февральских. Приходилось отключать расширения и после загрузки конфигурации закрывать конфигуратор и продолжать обновлять уже в пользовательском режиме. Но сейчас проблема ушла. В принципе, расширения - довольно хороший инструмент. Среди плюсов также можно также отметить возможность использования его для отладки, например, новых печатных форм или отчетов.
Из проблемных ситуаций могу отметить:
1. никогда не получалось динамическое обновление расширений и подключение новых при работающих пользователях. Возможно это был глюк платформы или релиза, но я больше не рискую: быстрота не стоит возможной потери данных. Лучше как положено: архив и т.д. ...
2. В формах списков добавленных справочников и документов отсутствует стандартная команда "вывести список". Создавала даже тему на форуме . Но решение не известно (по крайней мере мне).
3. В добавленных документах нет стандартных кнопок "Дт Кт" и "Структура подчиненности" (соответственно они не отображаются в структуре подчиненности объектов основной конфигурации). Допилить, конечно, можно, но уже с помощью своих кнопок.
1. Основная база УПП на 8.2
2. Обновляю на платформе 8.3 с использованием (штатным) kdiff3 для трехстороннего объединения модулей -- в 99.9% случаях kdiff сам разруливает изменения. И особого смысла в расширениях не вижу, если честно, для данной ситуации. Модификация форм программно, естественно.
Добавление/изменение реквизитов тоже делать программно.
Создание команд тоже программно.
А вот хинт как сделать для существующих кнопок &после или &перед?
А хинт с пустой формой в расширении?
обсудим в личке? потом сможете добавить в статью.
Когда нужно добавить пару элементов форм или изменить свойства, все это правильно и хорошо, но когда объем доработок нарастает то либо выделять функционал в отдельную форму, а из основной формы сделать ссылку "Перейти в...". Например сильно доработана форма договоров с контрагентами, добавлено много своих реквизитов, табличные части, предпросмотр файлов и тд.. в итоге сделали отдельную форму элемента для этого справочника, а в типовой форме программно сделали ссылку "Перейти к документам...". Так и у пользователей нет дискомфорта, по сути для них добавилась только одна ссылка по которой надо кликать что бы попасть в нужную форму из привычной формы справочника.
Мы пошли дальше, и для тех формы которых невозможно вынести функционал в отдельную форму мы придумали подсистему программных расширений форм. Она умеет рекурсивно читать дерево элементов формы, команды и реквизиты формы (в том числе и дин. списки, таб части), формировать структуру элементов формы "расширения". Так же она умеет из структуры элементов создавать новые элементы, команды, реквизиты.
Таким образом мы делаем общую форму (в расширении или в основной конфигурации, не важно), далее при открытии расширяемой формы мы прописываем вызов нашего модуля, который объединяет программно расширяемую форму и форму расширения. Очень удобно получилось, редактируем все дизайнером форм (форму расширения), а типовые формы можно оставить на замке.
ПС: задумываюсь выложить подсистему на ИС, по всей видимости придется перебороть лень )
Гораздо разумнее, например, сделать свою форму, а в типовой (если уж вам так любы расширения, то в расширенной) поставить перехват при открытии, ну и перехваты подписок на события, оповещений итд.
Или вот как Алекс говорит (я, кстати, в одном из проектов примерно так и делал, и безо всяких там расширений отлично работает).
Разве для этого не существует как Назначение, насколько я понимаю приоритет расширения конфигурации зависит от него:
1. Исправление
2. Адаптация
3. Дополнение
Чем меньше цифра, тем выше приоритет расширения.
Допустим, Вам какие-то понравились, Вы их скачали. Вы будете их устанавливать как отдельные расширения или начнете вручную их объединять в какое-то одно?
Многие, особенно те, кто не очень хорошо разбирается в программировании, просто устанавливают эти расширения себе в базу и работают. В итоге у них таких расширений может довольно много накопиться.
Насколько знаю, нет.
В качестве эксперимента, можно попробовать написать код в расширениях, который будет где-то фиксировать свой запуск, чтобы в итоге увидеть, кто в какой последовательности запустился...
У меня почему-то не работает ?
Текст ошибки "{ОсновноеРасширение Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента.Форма(45,3)}: Ожидается оператор препроцессора
#<<?>>Удалить (Проверка: Сервер)
" и.т.д
&ИзменениеИКонтроль("ВозведениеВСтепень")
Функция Расш1_ВозведениеВСтепень(Основание, Степень)
Результат = 1;
Для Индекс = 1 По Степень Цикл
#Удаление
Результат = Результат + Основание;
#КонецУдаления
#Вставка
Результат = Результат * Основание;
#КонецВставки
КонецЦикла;
Возврат Результат;
КонецФункции ПоказатьТо есть - если из основной конфигурации заимствовать, скажем, реквизит, то тип его нельзя будет расширить в расширении новыми типами (не важно откуда - из основной конфигурации или из расширения).
Вот это беда так беда.
Вот добавите Вы в расширение, скажем, новые документы партий - захотите расширить у регистров измерение "Партия" ("ДокументОприходования") а сделать это не сможете - НИКАК!
Само собой, в основной конфигурации типы этих документов из расширения Вы так же не сможете включить в составной тип данного измерения!
Более того, если в основной конфигурации у такого измерения назначить тип "ДокументыСсылка" (т.е. общий тип для всех документов), то он всё равно не будет включать в себя типы документов из расширений и присвоить их ссылки в это измерение ВСЁ РАВНО БУДЕТ НЕЛЬЗЯ!
Вот такая, свинья в расширениях от 1С заложена!
А уж про то, что все модули (и элементы метаданных) в расширениях не должны пересекаться по именам (а если пересекаются - то нужно для каждого расширения делать свои префиксы и многократно дублировать эти элементы), а заимствовать метаданные в расширение из другого расширения платформа так же, до сих пор, не научилась! Колоссальная проблема повторного использования кода и метаданных!
Расширения хорошо - если они полностью автономны от основного кода и метаданных, ну или используют его типы, без изменений, или добавляют только новые элементы, не меняя состав типов в элементах основной конфигурации.
Ну и для подписки/перехвата вызова функций тоже хорошо.
Но, на мой взгляд, всё это можно было делать и через конфигурации поставщиков (что были ещё в 8.2 - разве что механизм их обновления нужно было улучшить). А перехват/подписка на вызов функций - нужно было просто включить в механизм подписки на события (ну или немного переработать его - сделать как в расширениях - но только в составе модулей основной конфигурации).
А нынешнем развитии (а прошло уже много времён, со времён своего появления) - расширения как были сильно ущербными, так ими и остались!
Широко использовать их не рекомендую - проблем и ограничений немерено!
Нужно свою тему пилить для сборки конфигураций из отдельных подсистем (подконфигураций) - на расширения больше надежды нет!
&НаКлиенте
&ИзменениеИКонтроль("ЗаполнитьИнформациюОбОбучении")
Процедура ФФЛ_ЗаполнитьИнформациюОбОбучении()
Если Элементы.ЗачетныеКниги.ТекущаяСтрока <> Неопределено Тогда
ЗачетнаяКнига = Элементы.ЗачетныеКниги.ТекущаяСтрока;
ДанныеОбОбучении = ФизическиеЛицаСервер.ПолучитьДанныеЗачетнойКниги(ЗачетнаяКнига);
Факультет = ДанныеОбОбучении.Факультет;
Специальность = ДанныеОбОбучении.Специальность;
ФормаОбучения = ДанныеОбОбучении.ФормаОбучения;
Курс = ДанныеОбОбучении.Курс;
#Удалить
Группа = ДанныеОбОбучении.Группа;
Подгруппа = ДанныеОбОбучении.Подгруппа;
#КонецУдалить
#Вставить
Группа = ДанныеОбОбучении.Группа + " - " + ДанныеОбОбучении.Подгруппа;
#КонецВставить
Основа = ДанныеОбОбучении.Основа;
ЯвляетсяСтаростой = ФизическиеЛицаСервер.ПолучитьПризнакСтаростыДляФизЛица(ЗачетнаяКнига);
#Вставить
Если ДанныеОбОбучении.УчебныйПлан <> Неопределено Тогда
УПОбучение = ДанныеОбОбучении.УчебныйПлан;
УПОбучение = ПолучитьОбъектУППоСсылке(УПОбучение);
КонецЕсли;
#КонецВставить
КонецЕсли;
КонецПроцедуры ПоказатьА должно быть вот так:
&ИзменениеИКонтроль("ВозведениеВСтепень")
Функция Расш1_ВозведениеВСтепень(Основание, Степень)
Результат = 1;
Для Индекс = 1 По Степень Цикл
#Удаление
Результат = Результат + Основание;
#КонецУдаления
#Вставка
Результат = Результат * Основание;
#КонецВставки
КонецЦикла;
Возврат Результат;
КонецФункции ПоказатьПросто могут начинающие поиском наткнуться и скопировать, а потом искать - что не работает у них...
Но опять же, сейчас кто-то может погуглить в поиске что же там за Вставка и как её верно написать и нарваться на это)))
Рейтинг: 1081
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 1039552
Создание 07.04.19 00:10
Обновление 30.05.19 09:29
Просмотры 59760
Загрузки 0
Рейтинг
242
Комментарии 131
Код открыт Да
Рубрики Механизмы платформы 1С
Кому
Разработчик
,
Стажер
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация Универсальные
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)