Вызов функции, размещенной во внешней обработке

14.12.12

Разработка - Универсальные функции

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

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

//Наименование - имя обработки в справочнике
//Параметры вызова - передаваемые в обработку параметры
Функция ВызватьВнешнююОбработку(Наименование, ПараметрыВызова=неопределено) Экспорт

СсылкаНаОбъект = Справочники.ВнешниеОбработки.НайтиПоНаименованию(Наименование);

Если не ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
Сообщить("Обработка не найдена");
Возврат неопределено;
КонецЕсли;

ЭтоОбработка = ?(СсылкаНаОбъект.ВидОбработки = Перечисления.ВидыДополнительныхВнешнихОбработок.Обработка, Истина, Ложь);

Если НЕ ЭтоОбработка Тогда
Возврат неопределено;
КонецЕсли;

ИмяФайла = ПолучитьИмяВременногоФайла();
ДвоичныеДанные = СсылкаНаОбъект.ХранилищеВнешнейОбработки.Получить();
ДвоичныеДанные.Записать(ИмяФайла);

Попытка
Обработка = ВнешниеОбработки.Создать(ИмяФайла);
ЗначениеИзОбработки = Обработка.ВычислитьЗначение(ПараметрыВызова);
Исключение
Сообщить ("Выбранный файл не является внешней обработкой,
|поврежден, либо функция вызвана неверно.");
КонецПопытки;

УдалитьФайлы(ИмяФайла);
Возврат ЗначениеИзОбработки;

КонецФункции

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

Функция ВычислитьЗначение(ПараметрыВызова) Экспорт
//Выполняем полезные действия

Возврат ПолученноеЗначение;
КонецФункции

См. также

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

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    2684    1    John_d    8    

55

GUID в 1С 8.3 - как с ними быть

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

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    4620    atdonya    22    

45

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

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

30.11.2023    3965    ke.92@mail.ru    16    

61

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

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

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

28.08.2023    8850    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2078    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16157    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

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

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7244    quazare    8    

109
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. TrinitronOTV 14 14.12.12 07:26 Сейчас в теме
спасибо за полезную информацию
2. ryutao 50 14.12.12 09:43 Сейчас в теме
А вот интересно, насколько замедляет работу использование этой возможности? Самому попробовать пока нет никакой возможности из-за перманентного цейтнота. Информация очень полезна!
4. WKBAPKA 214 14.12.12 10:45 Сейчас в теме
(2) ryutao,
думаю, что не сильно быстро работает... хотя бы уже распаковать, положить на диск, потом удалить
3. anig99 2843 14.12.12 10:09 Сейчас в теме
5. Uncore 1272 14.12.12 11:55 Сейчас в теме
По-моему похожий синтаксис используется в типовых конфигурациях при печати внешних печатных форм.
6. Infector 199 14.12.12 13:13 Сейчас в теме
№5 - вы правы. Внешние печатные функции, а так же простые обработки и обработки заполнения табличных частей вызываются схожим образом: достали из баз файл - выполнили обработку - убрали мусор.

№2,4 - скорость работы вытекает из этого же. Что работать такое решение будет медленнее, чем внутри конфигурации сомневаться не приходится, но если вызов не идет в цикле, заметить разницу сложно. Итоговая потеря во времени, как и везде зависит в конечном итоге от степени оптимизации кода. Наглядно скорость одиночного вызова можно проследить на обработках заполнения табличных частей, механизм взаимодействия конфигурации с обработкой одинаков.
7. DoctorRoza 14.12.12 16:53 Сейчас в теме
Ну да, выглядит достаточно простенько, пустячково. С другой стороны, зачем усложнять? То, что тут используются внешние обработки - мера вынужденная. Так что, решение заслуживает внимания!
8. KapasMordorov 428 14.12.12 17:00 Сейчас в теме
Проще хранить в любом подходящием справочнике или регистре строковые значения и использовать "Выполнить".
9. andrewks 1368 14.12.12 17:18 Сейчас в теме
минус ставить не буду, и "пустячковость" тут ни при чём.
тормоза при массовом использовании очевидны, - это раз,
если можно менять конфу, то почему бы не включить нужные функции сразу в общий модуль? - это два
AlexeyFreeLife; Kuzja_R; +2 Ответить
10. andrewks 1368 14.12.12 17:21 Сейчас в теме
и потом, куда именно мы учим возвращать значение внешнюю обработку? в конфу? значит, мы её изменили? так в чём же дело, почему не включили в общий модуль нужные функции?
11. Infector 199 14.12.12 17:59 Сейчас в теме
andrewks
Попробую пояснить зачем это :)

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

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

В итоге преймущество только одно, но иногда оно важно - такую функцию можно подменить налету, без конфа и стонов от пользователей. Любое решение должно быть кроме всего прочего еще и адекватно задаче. Не слишком адекватно для разгрузки мешка картошки пригонять спецтехнику с одной стороны. С другой стороны неадекватно разгружать несколько вагонов на горбу, когда спецтехника уже есть под боком.
Аналогично дергать в цикле внешнюю функцию или обработку не очень разумно, но зато можно передать в нее одну коллекцию, объект или т.п. и это уже будет заметно быстрее, чем вызов функции для каждого отдельного элемента.
13. Yashazz 4709 18.12.12 19:48 Сейчас в теме
(11) Несколько советов.
1. Приведите в порядок ход работ. Вас послушать - ад кромешный, такие танцы на граблях надо не лечить обходными костылями, а ликвидировать. До добра не доведёт.
2. Заведите справочник "Алгоритмы", в нужных местах проложите ссылки на него. В алгоритмах, в их строковых реквизитах, представляющих исходный код 1С, в режиме "Предприятие" сможете править всё "на лету", и привязка смысловая тоже будет. У меня эта идея себя оправдала. Могу выложить или прислать подсистему с этим справочником, если хотите.
3. Универсальный Подбор И Обработку Объектов никто не отменял, там тоже очень многое можно делать.
rincewind; Infector; +2 Ответить
12. pumbaE 14.12.12 19:18 Сейчас в теме
Ну будущее, делайте экспортную переменную "Версия" и проверяйте ее, очень бывает неудобно, когда в конфигурации уже изменили обработку, а в справочнике Внешние обработки забыли удалить.

p.s.: пометка на удаление тоже в вашем коде не проверяется.
p.s. p.s: проверка на права тоже, НайтиПоНаименованию ну никак не учитывает РЛС (если у вас УПП, то и РЛС должен быть включен на внешние обработки отчеты).
Infector; Yashazz; +2 Ответить
14. vec435 15 19.12.12 09:09 Сейчас в теме
хранение доп кода во внешней обработке - плюс очевиден : конфа не меняется,код можно менять на лету.но время загрузки самой обработки, копирование файла- все это время .хорошо бы поместить обработку во временноехранилище в начале сеанса ,хранить строку с адресом временногохранилища и обращаться уже ко временномухранилищу через эту строку
Infector; +1 Ответить
15. Infector 199 19.12.12 14:29 Сейчас в теме
pumbaE, Yashazz, vec435
Спасибо за советы :) Конструктивная критика всегда полезна. Мысль собрать в одной обработке несколько нужных функций и создавать файл один раз при начале сеанса уже возникала. А вот до хранения кода в справочнике не додумался, такое решение весьма интересно. Всегда есть что-то, что можно сделать лучше :)
16. pumbaE 19.12.12 14:33 Сейчас в теме
Просто используй "Инструменты разработчика".
17. dmitryrk 19.08.15 22:58 Сейчас в теме
Спасибо за тему. И вариант пригодится и дискуссия удачная для выбора решения.
Оставьте свое сообщение