gifts2017

Управляемое приложение. Внешняя обработка. Создание связанных объектов

Опубликовал Андрей Чунихин (ApocalypseNTC) в раздел Программирование - Практика программирования

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

Условия:

1) До записи нового документа счет-фактура выданный аванс показать его заполненную, по основанию, форму и предложить пользователю интерактивно его записать;

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

Нюанс: У документа счет-фактура выданный аванс в конфигурации оснований не задано.

Решение:

Шаг 1.

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

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

 

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

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

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

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

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

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

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

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

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


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

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

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

Шаг 2.

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

 

&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив, СозданныеОбъекты) Экспорт

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

        //Получая форму объекта создаваемого документа, мы уже создаем этот объект
        ФормаДок = ПолучитьФорму("Документ.СчетФактураВыданныйАванс.ФормаОбъекта");

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

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

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

        //Открываем результат выполнения обработки
        ФормаДок.Открыть();
    КонецЦикла;

КонецПроцедуры


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

 

&НаСервере
Процедура СоздатьНовыйДокумент(Элемент, НовыйОбъект)

    Основание = Элемент.Ссылка;

    НовыйОбъект.Дата = ТекущаяДата();
    НовыйОбъект.Организация = Основание.Организация;
    НовыйОбъект.ДокументОснование = Основание;
    НовыйОбъект.Контрагент = Основание.Контрагент;
    ДанныеОснования = ПолучитьДанныеОснованияНаСервере(НовыйОбъект.ДокументОснование);
    ЗаполнитьЗначенияСвойств(НовыйОбъект, ДанныеОснования);

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

    НовыйОбъект.Сумма = НовыйОбъект.Авансы.Итог("Сумма");
    НовыйОбъект.СуммаНДС = НовыйОбъект.Авансы.Итог("СуммаНДС");

КонецПроцедуры

&НаСервере
Функция ПолучитьДанныеОснованияНаСервере(ДокументОснование)

    ДанныеОснования = Документы.СчетФактураВыданныйАванс.ПолучитьВходящиеНомерДатуДокумента(ДокументОснование);

    Возврат ДанныеОснования;

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


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

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

P.S. Следующая задача, которую я пытаюсь решить: внешняя подключаемая обработка заполнения объекта без его записи в информационную базу.

Релиз платформы: 8.2.13.219 Файл-сервер

UPD: Хорошие примеры от Поручик: первый и второй

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Создать счет-фактуру выданный аванс на основании поступления безналичных денежных средств
.epf 7,57Kb
12.04.11
219
.epf 7,57Kb 219 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Сергей Ожерельев (Поручик) 12.04.11 16:10
(0)
>>>> сообщайте об этом мне или публикуйтесь самостоятельно, не молчите.
Слушаюсь, вашескородие. Сделано.

Реализация/Перемещение товаров на основании поступления товаров для Управления торговлей 11
http://infostart.ru/public/83963/

Поступление безналичных денежных средств на основании реализации товаров для Управления торговлей 11
http://infostart.ru/public/83248/
ApocalypseNTC; +1 Ответить
2. Алексей Константинов (alexk-is) 13.04.11 08:19
Программный код в тексте публикации можно раскрасить получше.
3. Андрей Чунихин (ApocalypseNTC) 13.04.11 15:02
Оформил текст кода разукрашкой. Спасибо. Очень полезная вещь!
5. Андрей (andron79) 13.01.12 10:04
7. Гость 20.02.12 00:30
Спасибо, очень пригодилась
8. Сергей Ожерельев (Поручик) 30.06.12 16:28
(0) Вот вам ещё две работы по теме, если актуально:
http://infostart.ru/public/141777/
http://infostart.ru/public/141765/
9. Юрий Зайцев (Yury1001) 17.07.12 11:41
Это всё хорошо, а как изменить тот объект из которого вызвал?
Вернее изменить я его могу но форма не видит этих изменений, а если объект записать то нужно форму закрыть и заново открыть.

ч/з 9мин ...ну или Действия Перечитать, всё равно лажа.

З.Ы. Ногами не бейте - два часа страдаю, пока ничего не получается.
Нет ли где случайно примера заполнения табличной части?

а, всё, нашел http://infostart.ru/public/84119/
извиняюсь
10. Андрей Чунихин (ApocalypseNTC) 17.07.12 19:05
Я верю что будет другое решение.
11. Людмила Вальская (Вальская Людмила) 17.10.13 09:42
Спасибо!
Если кто может - подскажите толковую книжку по программированию для управляемого приложения!
(Ажеронок и проч, "Разработка управляемого интерфейса" не предлагать!)
12. sumixam (sumixam) 08.11.13 07:49
Добрый день коллеги, хотел бы поитересоваться нет ли у кого ссылки на статью или примерчик, где можно глянуть как из документа на управляемой форме (свой документ), ввести на основании документ первичный в бухгалтерии (30 типов документов) или УПП буду очень признателен за информацию, пока ничего путнегоне нашел. Спасибо.
13. Aleksandr Filonov (AleksSF) 13.12.13 23:54
(11) Вальская Людмила,
На мой взгляд это самое лучшее http://www.spec8.ru/
14. Александр Злобин (elian) 25.04.14 12:05
Автор умалчивает о структуре параметров, которая необходима для корректного создания документов, например, в конфигурации БП 3.0.
15. Дмитрий Иванов (MasterIt) 29.09.14 15:41
Мне, как новичку в программировании 1С было очень интересно, спасибо!
16. Марина Семёнова (SemenovaMarinaV) 22.10.14 18:21
а как посмотреть структуру подчиненности в ЗУП 3.0
17. Дмитрий Кузнецов (kudim) 28.11.14 11:08
Спасибо! информация полезная еще бы то же самое, но для форм с программным формированием колонок в табличных частях создаваемого документа.
18. evg (evg_m) 23.01.15 09:36
Подскажите пожалуйста. Сделала я обработку по вашему примеру. В отладке работает как надо. При регистрации обработки в поле показывать указываю "В формах элементов справочников и документов", т.е. не в списке команд. В документе появляется моя команда, но создается только пустая форма документа. А если в списке команд, тогда открывается форма с командой и от туда все заполняется. Как сделать чтобы работало из формы???
19. vadyasty Вадим (vadyasty) 26.02.16 08:20
Спасибо, с Вашей помощью заполняем требование-накладную по инвентаризации
20. Андрей Андреев (DrDrew34) 24.05.16 09:02
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа