• Внеконтекстный вызов методов объекта обработки (отчета) в управляемой форме. Внеконтекстный вызов методов объекта обработки (отчета) в управляемой форме 1с из формы вызвать процедуру модуля объекта

    21.12.2023

    Awk 693 22.12.13 22:44 Сейчас в теме

    () Начнем с главного. Бред и чушь - это попытка окрасить выражения эмоциями. Что достаточно сложно сделать посредством эпистолярного жанра. Так что это выражение моего непонимания, а не попытка задеть. Приятно иметь дело с человеком который это понимает. Если задел извини.

    Аналогия просто неуместна, по природе ООП. ООП - наследник процедурного, модульного программирования. Это все равно, что сравнивать отца и сына, при этом ставя в пример отцу сына.

    Поспорить с утверждением трудно. Но по смыслу это замечание слабо связано с комментируемым в статье местом.

    Это связано с приведенным в статье примером. Там у метода есть директива компиляции, причем ключевое слово "экспорт", почему-то опущено.

    Из того, что ему ни разу не приходилось чего-то делать, еще не следует, что это не актуально, или что этого не делают другие.

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

    В обычном приложении они часто используются для решения чисто интерфейсных задач:

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

    Я думаю было бы полезно расширить абстракцию, заложенную в понятие "ОбщийМодуль", и ввести в конфигурацию
    сущности нового типа, скажем, "ИсполняемыйМодуль", аналогичные объектам Module из MS VBA.
    "ОбщиеМодули" были бы частным случаем объектов "ИсполняемыйМодуль", находящимися примерно
    в том же соотношении, что объекты "ОбщаяФорма" и просто "Форма"....

    Для начала, неплохо было бы в 1С реализовать пространства имен и метаданные модулей, а не как сейчас (цитата из синтакс-помощника); "Неопределено - т.к. Не предполагается работа из встроенного языка"

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

    В классическом веб программировании - это решается возможностью формы вкладывать в формы и асинхронными вызовами (AJAX), к сожалению это проигнорировано 1С. Так что остается три варианта:

    1. Использовать разные формы
    2. Передавать все необходимые данные на клиента
    3. Дергать сервер.

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


    Внеконтекстные вызовы сервера предназначены для уменьшения трафика при передачи данных от клиента на сервер. Только этим они отличаются от контекстных.

    Пример 1: надо получить контрагента по документу основанию.

    клиент сервер
    1. форма выбора --> получение формы
    2. При изменении <--
    3. Получить контрагента --> ДокументОснование["Контрагент"]

    В третьем шаге нет смысла тащить на сервер всю форму, со всеми реквизитами. Потому, целесообразно использовать НаСервереБезКонтекста.

    В твоем варианте можно просто использовать:

    Для методов модуля объекта:

    &НаСервереБезКонтекста
    Функция Что_то_с_чем_то(ОбъектОбработка, ТипОбработкиСтрока, Параметры)
    Возврат ДанныеФормыВЗначение(ОбъектОбработка, Тип(ТипОбработкиСтрока)).НужнаяНамФункция(Параметры);
    КонецФункции

    Для методов модуля менеджера:

    &НаСервереБезКонтекста
    Функция Что_то_с_чем_то(Имя, Параметры)
    Возврат Обработки[Имя].НужнаяНамФункция(Параметры);
    КонецФункции

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

    Согласно теории объектно-ориентированного программирования, методы объектов делятся на две группы: статические и простые. Простые методы имеют доступ только к конкретному экземпляру класса. Статические методы не имеют доступа к данным объектов, а работают с классом в целом.

    Если перевести все это в термины системы 1С:Предприятие, то Модуль объекта содержит простые методы. Для их использования необходимо сначала получить конкретный объект: элемент справочника, документа и т.п. Модуль менеджера содержит статические методы. Для его использования нет необходимости отдельно получать каждый конкретный объект, он позволяет работать со всей коллекцией сразу.

    Модуль объекта может иметь процедуры и функции, которые можно использовать извне. Для этого такая процедура или функция обозначается словом Экспорт.

    Функция НоваяФункция () Экспорт

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



    Пер= Объект. НоваяФункция() ;

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

    Перем НоваяПеременная Экспорт

    ЭлементСправочника= Справочники. Номенклатура. НайтиПоКоду("000000001" ) ;
    Объект= ЭлементСправочника. ПолучитьОбъект() ;
    Объект. НоваяПеременная= ) ;

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

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

    Процедура НоваяПроцедура () Экспорт

    ЭлементСправочника= Справочники. Номенклатура. НоваяПроцедура() ;

    Или для переменной:

    Перем НоваяПеременная Экспорт

    ЭлементСправочника= Справочники. Номенклатура. НоваяПеременная;

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

    При использовании модуля объекта код будет выглядеть следующим образом:

    Функция ПечатьДокумента (Ссылка) Экспорт
    //В эту функцию необходимо передать ссылку на конкретный документ
    Возврат ТабДок;
    КонецФункции

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

    &НаКлиенте
    Процедура Печать(Команда)
    ТабДок = ПечатьНаСервере() ;
    ТабДок. Показать() ;
    КонецПроцедуры
    &НаСервере
    Функция ПечатьНаСервере()
    Док = РеквизитФормыВЗначение("Объект" ) ;
    Возврат Док. ПечатьДокумента(Объект. Ссылка) ;
    КонецФункции

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

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

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

    Так когда же использовать модуль объекта, а когда модуль менеджера?

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

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


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

    Пробую:
    &НаСервере
    Процедура МояПроцедура() Обработка = РеквизитФормыВЗначение("Запись",Тип("ОбработкаОбъект.НужнаяОбработка")); Результат = Обработка.ЭкспортнаяПроцедураВМодулеНужнойОбработки("НужныйПараметр"); КонецПроцедуры Ошибка: неверный параметр № 1

    Ответ: И это касается не только обработок - а вообще в принципе даже любых объектов.

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


    Здравствуйте!
    Подскажите пример кода, как можно программно вызвать заполненую печатную форму по ссылке на объект,
    например,
    ссылка=Документы.СчетФактураВыданный.НайтиПоКоду(...);
    ...
    ссылка...ПолучитьДанныеПечатныхФорм...
    и т.п

    Ответ: Вызовите команду из которой вызывается печать данного документа и в ней один параметр - это Ваш документ.

    Вопрос: управляемые формы в УПП 1.3


    Добрый день! В конфигураторе создаю обработку с управляемой формой (переключаю флаг на управляемую). В режиме предприятия не открывается никак. Кто сталкивался? как открыть созданную управляемую форму?

    Ответ: +() Классика жанра:

    <<К сожалению, это невозможно. Свойство "Использовать управляемые формы в обычном приложении" не влияет на внешние обработки и отчёты. В обычном приложении можно открывать только обычные формы таких объектов, а в управляемом только управляемые. Это ограничение платформы.>>

    Вопрос: [РЕШЕНО] Вызов процедуры модуля формы из модуля управляемой формы внешней обработки


    Уважаемые эксперты, подскажите, пожалуйста:
    8.3.9.2170
    Как из клиентской процедуры модуля формы внешней обработки (УФ), привязанной к документу, вызвать процедуру модуля формы этого документа?
    Спасибо

    Ответ:

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

    Вопрос: Управляемые формы, а также доп. реквизиты справочника


    Здравствуйте!
    Я наконец-то начал работать с управляемыми формами, а также доп. реквизитами справочника, которые были введены в режиме предприятие.
    1С:Предприятие 8.3 (8.3.8.2054), 1С:Комплексная автоматизация 2 (2.2.3.196).
    К сожалению, столкнулся с проблемой и не смог нагуглить её решение.
    Суть такова - есть внешняя обработка, в ней пользователь выбирает номенклатуру, после чего другие поля этой обработки должны автоматически заполниться доп. реквизитами этой номенклатуры. Споткнулся в самом начале - пытаюсь запросом получить эти доп. реквизиты.
    1C
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 & НаКлиенте Процедура НоменклатураПриИзменении(Элемент) ДопРеквизиты = ЗапросДопРеквизитов(Объект. Номенклатура) ; КонецПроцедуры & НаСервере Функция ЗапросДопРеквизитов(Номенклатура) ЗапросДопРеквизитов = Новый Запрос() ; ЗапросДопРеквизитов. Текст = "ВЫБРАТЬ | НоменклатураДополнительныеРеквизиты.Ссылка, | НоменклатураДополнительныеРеквизиты.Свойство, | НоменклатураДополнительныеРеквизиты.Значение, | НоменклатураДополнительныеРеквизиты.ТекстоваяСтрока |ИЗ | Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты |ГДЕ | НоменклатураДополнительныеРеквизиты.Ссылка = &Номенклатура" ; ЗапросДопРеквизитов. УстановитьПараметр ("Номенклатура" , Объект. Номенклатура) ; РезультатЗапросДопРеквизитов = ЗапросДопРеквизитов. Выполнить () . Выгрузить() ; Возврат РезультатЗапросДопРеквизитов; конецфункции

    Выдает

    "{ВнешняяОбработка.ПечатьЭтикеток.Форма.Форма.Форма(11)}: Ошибка при вызове метода контекста (ЗапросДопРеквизитов)
    ДопРеквизиты = ЗапросДопРеквизитов(Объект.Номенклатура);
    по причине:
    Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
    по причине:
    Ошибка преобразования данных XDTO:
    НачалоСвойства: ret Форма: Элемент Тип: {http://www.w3.org/2001/XMLSchema}anyType
    по причине:
    Ошибка отображения типов:
    Отсутствует отображение для типа "{http://v8.1c.ru/8.1/data/core}ValueTable""

    Пожалуйста, помогите!

    Добавлено через 9 минут
    В 28 строке "Возврат РезультатЗапросДопРеквизитов;" возвращается таблица значений. Пробую на клиенте обозначить переменную "ДопРеквизиты" как "Новый ТаблицаЗначений" - программа ругается, что не знает, что такое "ТаблицаЗначений". Пробую менять контекст с "НаКлиенте" на "НаСервере" - тогда уже не ругается, но и отладчик перестает работать.

    Ответ: Спасибо за ответ!

    Разместите на форме табличную часть аналогичной структуры

    Но зачем пользователю эта табличная часть? Только лишнее нагромождение формы обработки.

    Добавлено через 6 минут
    Попробую просто создать таб. часть обработки (без вынесения её на форму) и в неё загрузить результат.

    Так и получилось! Спасибо!

    Вопрос: Работа с ТаблицейЗначений в управляемой форме


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

    и пишу "ТЗ."и в выпадающем списке есть свойство "Колонки" . Вопрос-почему????????

    Ответ:

    Сообщение от Briolin

    А 1с надо сделать что бы прям в конфигураторе было написано что у реквизита на форме тип данных ДанныеФормыКоллекция!

    Тогда будет не понятно в какой прикладной объект это можно перевести

    Вопрос: Управляемая форма (доступность элементов)


    На Базе УТэшки 10.3.40.1 платформа 8.3.9.2033 делаю форму подбора товара в веб-е. Создал новую роль, для неё начал открывать доступ к объектам постепенно. Все было хорошо, пока не дошел до справочника Значения свойств объектов. Понятно что в 10 нет управляемых форм, все генерируются в процессе, но если форма выбора тех же "Свойств объектов" нормально создается, то форма выбора "Значений свойств объектов" создается с неактивными элементами... И что я только не пробовал - права на чтение, на просмотр и справочнику и ПлануВидовХарактеристик.СвойстваОбъектов... ничего не помогает. Куда рыть? Вариант сделать отдельную форму и все там прописать можно не предлагать, его я оставил на случай если причина так и не выяснится.

    Ответ: Может доступность устанавливается в самой форме по какому-то условию?

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


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

    &НаСервере
    Процедура ПриЗакрытииНаСервере() Набор=РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей(); Набор.Отбор.Объект.Установить(тек_.Объект); Набор.Отбор.Тип.Установить(тек_.тип); Набор.Отбор.Вид.Установить(тек_.вид);

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

    Вопрос: Структура элементов на управляемой форме. Как найти нужный элемент без перебора элементов?


    Нужно найти табличное поле на управляемой форме. Делаю это перебором всех элементов формы. Может быть есть какой-то иной способ найти нужный элемент управляемой формы?
    Пример поиска перебором:
    //***** ФлНашлиТабличнуюЧасть = Ложь; Для Каждого Эл Из _ЭтаФорма.Элементы Цикл Если ТипЗнч(Эл) <> Тип("ТаблицаФормы") Тогда Продолжить; КонецЕсли; Если Эл.ПутьКДанным = "Объект." + _ИмяТабличнойЧасти Тогда ФлНашлиТабличнуюЧасть = Истина; Прервать; КонецЕсли; КонецЦикла; //*****

    Вопрос: Записать() в управляемой форме


    Ситуация следующая:

    У меня ЗУП 3.0. Есть документ "Изменение штатного расписания". В организации штатные единицы могут вводиться временно. Для этого по кнопке из исходного документа по выбранным позициям создаётся документ на исключение позиций. Эту ссылку мне надо сохранить. Для этого я создал реквизит с типом "Изменение штатного расписания".
    После того, как программно записал документ, ссылку пишу в этот реквизит. Вызываю метод записать из управляемой формы с параметрами.. . А он берет и режим записи ставит ПРОВЕДЕНИЕ. ессно исходный документ у меня проведенный! но мне нужно записать 1 реквизит и НЕ перепроводить исходный документ. Как будто не видел моего параметра. Код ниже. Вопрос что не так сделал?

    ДокументРасформирования.Записать(РежимЗаписиДокумента.Запись);
    Объект.итр_ДокументРасформирования = ДокументРасформирования.Ссылка; ПараметрыЗаписи = Новый Структура(); ПараметрыЗаписи.Вставить("РежимЗаписи",РежимЗаписиДокумента.Запись); ЭтаФорма.Записать(ПараметрыЗаписи);

    Ответ: собственно нашел как сделать... так и быть поделюсь.

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

    Похожие статьи