Управляемое приложение. Внешняя обработка. Заполнение объекта

05.07.20

Разработка - Инструментарий разработчика

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

Скачать исходный код

Наименование Файл Версия Размер
Заполнение табличной части документа счет-фактура на аванс
.epf 8,27Kb
871
.epf 8,27Kb 871 Скачать

Задача: В "1С:Управление торговлей 11" (релиз 11.06.7). В форме документа счет-фактура выданный аванс заполнить табличную часть Авансы на основании документа поступление безналичных денежных средств.

Условия:

1) Перед заполнением табличной части документа получить от пользователя подтверждение на это действие;

2) Обработку создания документа сделать внешней и подключаемой к форме документа счет-фактура на аванс выданный;

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

Решение:

Пункты 1 и 2 не представляют особой сложности, но пункт 3 заставил меня задуматься и написать, по-моему мнению, топорный, но исправно действующий код.

Шаг 1.

Понятно, что от нас требуется создать внешнюю обработку вида "ЗаполнениеОбъекта" и подключить её в информационную базу.

Приведу код в модуле обработки:

Функция СведенияОВнешнейОбработке() Экспорт

    ПараметрыРегистрации = Новый Структура;
    МассивНазначений = Новый Массив;
    МассивНазначений.Добавить("Документ.СчетФактураВыданныйАванс");

    ПараметрыРегистрации.Вставить("Вид", "ЗаполнениеОбъекта");
    ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
    ПараметрыРегистрации.Вставить("Наименование", "Заполнить документ");
    ПараметрыРегистрации.Вставить("Версия", "1.0");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
    ПараметрыРегистрации.Вставить("Информация", "Дополнительная обработка табличной части к документу счет-фактура выданный аванс");

    ТаблицаКоманд = ПолучитьТаблицуКоманд();

    ДобавитьКоманду(ТаблицаКоманд,
    "Заполнить документ",
    "Заполнить документ",
    "ВызовКлиентскогоМетода",
    Истина);

    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);

    Возврат ПараметрыРегистрации;
КонецФункции

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

Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
  НоваяКоманда = ТаблицаКоманд.Добавить();
  НоваяКоманда.Представление = Представление;
  НоваяКоманда.Идентификатор = Идентификатор;
  НоваяКоманда.Использование = Использование;
  НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
  НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры

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

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

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

Шаг 2.

Так как мы использовали ВызовКлиентскогоМетода, то обязательную процедуру, для внешней подключаемой обработки заполнения объектов, ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт, необходимо выполнять &НаКлиенте в модуле формы обработки, а значит создадим любую форму обработки, пользователь её всеравно не увидит, и поместим внутрь модуля формы следующий код:

&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
    //Спросим у пользователя разрешение на продолжение обработки
    Режим = РежимДиалогаВопрос.ДаНет;
    Текст = "Текущие данные документа будут заменены новыми без возможности восстановления.
    |Продолжить?";
    Ответ = Вопрос(Текст, Режим, 0);
    Если Ответ = КодВозвратаДиалога.Да Тогда

        //Если пользователь дал разрешение на продолжение, то начнем перебирать все
        //документы, у которых мы планируем заполнить табличную часть
        Для каждого Элемент из ОбъектыНазначенияМассив Цикл

            //Зададим ключ поиска документа, из которого вызвана данная обработка,
            //чтобы получить ссылку на редактирумый документ в удобном виде для
            //функции ОткрытьФорму()
            КлючПоиска = Новый Структура("Ключ", Элемент);

            //Но нам не надо открывать новую форму (окно) для изменяемого документа, а
            //Нам надо все изменения показать в уже открытых у клиента окнах
            Окна = ПолучитьОкна();
            Для каждого Окно из Окна Цикл

                //Окно изменяемого документа будет точно не основным, а вспомогательным, поэтому
                //сразу пропускаем основное окно, а далее идем на не очень хороший способ поиска открытого окна
                //изменяемого документа. Мы просто переберем все окна, а в заголовке, которых будет встречаться
                //Наименование, номер и дата нужного документа - будем изменять
                Если НЕ Окно.Основное
                    И Найти(Окно.Заголовок, Элемент) Тогда
                    //Передадим ключ поиска (можно сказать ссылку на объект) и данные о найденном открытом окне
                    //в функцию ОткрытьФорму()
                    //Код находится в цикле на тот случай, если открытых окон изменяемого документа больше одного
                    Форма = ОткрытьФорму("Документ.СчетФактураВыданныйАванс.Форма.ФормаДокумента",КлючПоиска,,,Окно);

                    //Далее мы получаем объект только, что повторно открытой формы и помещаем её в переменную
                    //В объекте содержатся все реквизиты (элементы) формы
                    НовыйОбъект = Форма.Объект;

                    //Мы помещаем объект формы в переменную,
                    //так как должны передать её в процедуру на сервере,
                    //где нельзя изменять объект формы, зато можно править переменную содержащую его
                    ЗаполнитьОбъект(НовыйОбъект);

                    //После выполнения процедуры на сервере мы получаем изменную переменную НовыйОбъект,
                    //которую необходимо передать в уже полученную нами форму
                    КопироватьДанныеФормы(НовыйОбъект, Форма.Объект);
                КонецЕсли;
            КонецЦикла;

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

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

 

&НаСервере
Функция ЗаполнитьОбъект(НовыйОбъект)

    Если ТипЗнч(НовыйОбъект.ДокументОснование) = Тип("ДокументСсылка.ПоступлениеБезналичныхДенежныхСредств") Тогда

        Если НовыйОбъект.ДокументОснование.РасшифровкаПлатежа.Количество() > 0 Тогда
            НовыйОбъект.Авансы.Очистить();
        КонецЕсли;

        Для каждого СтрокаТЧ из НовыйОбъект.ДокументОснование.РасшифровкаПлатежа Цикл
            НоваяСтрока = НовыйОбъект.Авансы.Добавить();
            Если ЗначениеЗаполнено(СтрокаТЧ.СчетНаОплату) Тогда
                НоваяСтрока.Содержание = "Предварительная оплата" + ФормированиеПечатныхФорм.СформироватьЗаголовокДокумента(СтрокаТЧ.СчетНаОплату, НСтр("ru=' по счету на оплату'"));
            КонецЕсли;
            НоваяСтрока.Сумма = СтрокаТЧ.Сумма;
            НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.НДС18_118;
            ТекПроцентНДС = ЦенообразованиеКлиентСервер.ПолучитьСтавкуНДСЧислом(НоваяСтрока.СтавкаНДС);
            НоваяСтрока.СуммаНДС = ЦенообразованиеКлиентСервер.РассчитатьСуммуНДС(НоваяСтрока.Сумма, ТекПроцентНДС);
        КонецЦикла;
    КонецЕсли;

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

 

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

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

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    124860    682    389    

732

Infostart PrintWizard - создание и редактирование печатных форм в 1С 8.3

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

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

18000 руб.

06.10.2023    7757    24    6    

42

Infostart УДиФ: Управление данными и формами

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

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

10000 руб.

10.11.2023    4268    12    2    

36

SALE! %

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

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

3600 2280 руб.

14.01.2013    178634    1083    0    

861

Многопоточность. Универсальный «Менеджер потоков» 2.1

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99609    239    97    

298

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

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

3000 руб.

27.08.2019    18382    6    8    

40

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

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

2400 руб.

24.09.2019    23854    16    15    

33

1С HTML Шаблоны / HTML Templates

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    28314    3    10    

16
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
106. mart-sha 295 28.01.18 19:42 Сейчас в теме
(98)Пожайлуста подскажите, сделал по вашему варианту ,

ЭтаФорма.РежимОткрытияОкна = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца;
ЭтотОбъект.Открыть();

после того как форма открылась, на ней поле "Коэффициент"- числовое и кнопка "Расчет" (и связанная с ней функция). Кнопка не срабатывает, нажимаем, но функция не выполняется.
+
103. Mails79 12 18.07.17 13:29 Сейчас в теме
(94) Очень простой и удачный способ. Но в случаи с вызовом обработки заполнения из формы списка нужно будет "ставить заглушку". Вариант же предложенный в статье универсален по отношению к способу вызова (просто проигнорирует вызов из списка).
+
95. DedMoroz1983 2 02.11.16 08:53 Сейчас в теме
Полезно. Статья помогла сделать свою обратотку, заполнения дополнительных реквизитов, без изменения основной формы, а с помощью формы отбработки.
+
100. Anchoret 60 16.03.17 16:06 Сейчас в теме
Остался вопрос, как обновить отображение данных на форме, чтобы сразу увидеть изменения?
+
101. slawanix 9 18.03.17 13:22 Сейчас в теме
(100), смотри сообщения (94), (97). Этого должно быть достаточно.
+
102. Anchoret 60 18.03.17 18:19 Сейчас в теме
(101)
Делал через ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта()

В модуле объекта после заполнения, достаточно вызвать метод формы Прочитать()
+
104. Ольга_tmp 71 28.08.17 13:46 Сейчас в теме
107. docerman 71 23.03.18 16:31 Сейчас в теме
Для старых конфигураций очень актуально (например УТ 11.0 там у формы внешней обработки заполнения нет владельца, так что остается перебор открытых окон как в статье).
+
108. pyrkin_vanya 488 12.01.21 21:31 Сейчас в теме
Если объект изменен, то при нажатии на кнопку заполнения появляется стандартное окно записи объекта. А вот если в обработке вызвать метод ПоказатьВопрос, то он показывается два раза. Как это победить?
+
109. zhuravlev_as 395 10.02.21 14:49 Сейчас в теме
Спустя годы после этой публикации. Попробовал сделать на платформе 8.3.17 без использования конструкции с перебором окон, чтобы переносить изменения в форму.

Получилось, что вот этого оказалось достаточно:

ПараметрыФормы = Новый Структура("Ключ", ОбъектНазначения);
	
	ТекФорма = ПолучитьФорму("Документ.ЗаказКлиента.Форма.ФормаДокумента", ПараметрыФормы);
			
	ОбъектФормы = ТекФорма.Объект;
			
	ОбновитьЦеныВДокументе(ОбъектФормы);
			
        КопироватьДанныеФормы(ОбъектФормы, ТекФорма.Объект);
Показать

НО, за подробное описание кода обработки - СПАСИБО, т.к. дало четкое понимание происходяещго процесса в мелких деталях.
Рабочий пример указанного кода можно посмотреть в коде обработки: Обработка изменения цен табличной части документов для КА 2, УТ 11
+
Оставьте свое сообщение