gifts2017

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

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

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

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

Условия:

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

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

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

Решение:

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

Шаг 1.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Шаг 2.

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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


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

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

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

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

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Артур Аюханов (artbear) 15.04.11 07:49
В чем разница сабжа и http://infostart.ru/public/84001/ ?
одну из них удали или опиши различия или одну из них (сабж) удалю я.
2. Денис Плясовских (Denizzz) 15.04.11 08:09
Вроде как в первом случае используется СозданиеСвязанныхОбъектов
а во втором ЗаполнениеОбъекта
в принципе задача то одна, а вот решения разные. Обратил внимание на ВыполнитьКоманду
3. Сергей Ожерельев (Поручик) 15.04.11 08:17
(1) Не разбираешься, не лезь. И описывать различия не требуется, кто в теме, в курсе.

Разница такая, что в этой статье описана методика заполнения объекта (аналог из УПП 1.2 или УТ 10.3 - заполнение табличных частей), а в другой - описание создания связанных объектов или ввода на основании.
Статья полезная, сам думал, как бы это сделать пооптимальней. Намудили Намудрили разработчики с БСП.
Spacer; tkv44; shard; biz-intel; KazeNoYaida; ShyThun; kote; Cobalt River; Nuobu; Denizzz; +10 1 Ответить 1
4. Сергей Ожерельев (Поручик) 15.04.11 08:18
>>> в принципе задача то одна
Нет, это разные задачи.
5. Денис Плясовских (Denizzz) 15.04.11 08:21
В данном контексте читать как "Результат один"
Понимаю, что основной задаче для автора является ее реализация.
6. Денис Плясовских (Denizzz) 15.04.11 08:23
Поручик пишет:
Намудрили разработчики с БСП.

полностью согласен. БСП еще допиливать и допиливать
7. Артур Аюханов (artbear) 15.04.11 10:16
(0) Автор, все еще жду ответа и исправления в описании!

(3) 1. Будь вежливее.
2. Цель моего предложения в (1) - автор ДОЛЖЕН расписать отличие одной обработки от другой, чтобы пользователь сайта, который не разбирается в этом (а ведь статья именно для таких пользователей! ), мог понять отличие и назначение каждой статьи.
Если ТЕБЕ эта моя цель непонятна/недоступна, это твои проблемы!
Уважаю тебя за твои работы, но здесь ты неправ.

ЗЫ На будущее - Не лезь и не обсуждай работу Модераторов.
www2000; altimait; +2 2 Ответить
8. Андрей Чунихин (ApocalypseNTC) 15.04.11 12:16
Разница публикаций очевидна из их названия.
Поясню:
1) Создание связанных объектов
2) Заполнение объекта

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

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

Я мог конечно написать только суть и даже не публиковать обработку, но тогда по собственному опыту скажу, что были бы только вопросы и плевки в мою сторону, особенно у новичков.
baracuda; KarV; svartemov; drcrasher; Denizzz; Поручик; +6 Ответить
11. Сергей Ожерельев (Поручик) 15.04.11 12:38
(10) Успокойся, здесь люди всё таки адекватные, статью не удалят.
Это две разные публикации о разных задачах. Заявляю, как человек постоянно с прошлого года работающий с УТ 11 и вообще с БСП.
12. Ирина Пятакова (Alraune) 15.04.11 13:24
(10) Не стоит выставлять копию письма здесь.
А насчет
человек читающий публикации и имеющий аккаунт на http://infostart.ru некомпетентен в вопросах программирования на процедурном языке 1С

- это вполне может быть, здесь полно таких, вот я, к примеру. Поэтому Вам предложили только более понятно описать, о чем материал в статье, чтобы нам, "чайникам", было понятно. Удалять статьи никто не собирался.
13. Саша (TbSasha) 09.05.11 18:27
Подскажите можно ли как то делать отладку внешней подключаемой обработки?
И как какая тут последовательность надо вначале создать документ "счет-фактура выданный аванс" потом выбрать у него в основание "поступление безналичных денежных средств" а потом нажать заполнение?
14. Макс Унжаков (MAntaNA) 12.05.11 01:30
Хм, а если после выполнения обработки при любой попытке изменить реквизит или просто сохранить пишет «Ошибка блокировки объекта. Объект уже заблокирован <наименование сеанса>» ?
15. Макс Унжаков (MAntaNA) 12.05.11 02:03
Разобрался.
Опа, нет ещё...
Короче, нифига не выходит с заполнением формы без сохранения данных в объекте: форма заполняется - но больше с ней ничего не сделать: «Ошибка блокировки объекта. Объект уже заблокирован». Пришлось в серверной процедуре записывать объект с помощью ДанныеФормыВЗначение... Пытался прикрутить к УТ 11.0.6.7 заполнение графы «Основание» в ПКО описанием документа-основания ПКО...
16. llll ffffffffff (magicdee87) 12.05.11 14:56
как обойти «Ошибка блокировки объекта. Объект уже заблокирован», подскажите оч надо
17. Sensey Master (MSensey) 12.05.11 17:43
Кстати, а зачем обработка заполнения ТЧ счета-фактуры на аванс?
На мой взгляд правильней заполнять с/ф в обработке формирования с/ф на аванс.
18. Андрей Чунихин (ApocalypseNTC) 13.05.11 10:51
MSensey пишет:

Кстати, а зачем обработка заполнения ТЧ счета-фактуры на аванс?

На мой взгляд правильней заполнять с/ф в обработке формирования с/ф на аванс.


Это лишь пример реализации интерактивного заполнения ТЧ. Можно было бы заполнять другую ТЧ, но суть решения не изменилась бы.

MAntaNA пишет:

Хм, а если после выполнения обработки при любой попытке изменить реквизит или просто сохранить пишет «Ошибка блокировки объекта. Объект уже заблокирован <наименование сеанса>» ?


Верно подмечено. Разбираюсь в этой проблемой в данный момент.
19. Дмитрий Гомзин (plevakin) 19.08.11 16:12
Так никто и не разобрался с
Ошибка блокировки объекта.
?
Не хочу троллить, но автор сам пользовался этой обработкой?
20. Denis Serov (fsolution) 11.10.11 17:51
Сталкнулся с проблемой когда созданная внешняя обработка по загрузке прайса из XLS в док заказ клиента - выдавал в документе что он заблокирован, и в результате после заполнения таблич части документа нельзя было его не записать не сохранить - это безусловно баг УТ 11 и пофиксят непонятно в каких релизах потом - но проблема осталась!
21. Denis Serov (fsolution) 13.10.11 18:12
Короче, нифига не выходит с заполнением формы без сохранения данных в объекте: форма заполняется - но больше с ней ничего не сделать: «Ошибка блокировки объекта. Объект уже заблокирован». Пришлось в серверной процедуре записывать объект с помощью ДанныеФормыВЗначение... Пытался прикрутить к УТ 11.0.6.7 заполнение графы «Основание» в ПКО описанием документа-основания ПКО...

Вопрос блокировок конечно очень обширный, поэтому я хотел бы для себя разобраться для начала в каком то одном частном вопросе. А именно как работает свойство БлокироватьДляИзменения у набора записей в 8.2 в управляемом режиме (SQL). Если для предыдущих версий платформы все достаточно понятно, так например:
Для 8.1 (Автоматический режим) ответы будут следующие:
1) Когда читаются данные, которые необходимо изменять в текущей транзакции необходимо в запросе указывать "ДЛЯИЗМЕНЕНИЯ"
2) Блокировка накладывается в момент выполнения запроса, диапазон блокируемых данных определяется условиями в запросе.
3) Блокируется запись, а так же чтение другими транзакциями, запросы которых используют директиву "ДЛЯИЗМЕНЕНИЯ"

Для 8.1 (Управляемый режим)
1) Когда читаются данные которые необходимо изменять в текущей транзакции нужно установить исключительную блокировку, когда необходимо просто обеспечить неизменность прочитанных данных - разделяемую.
2) Блокировка устанавливается явно, методом Заблокировать() блокируемые записи так же явно указываем в коде.
3) Разделяемая - запрещает запись, Исключительная - Чтение и запись

Для 8.2 (Управляемый режим) в принципе верно тоже что и для 8.1 (Управляемый),
но это если использовать старую методику - сначала контроль остатков, потом проведение.
Как действовать при новой методике, непонятно... ответ судя по всему кроется в понимании принципов работы этой самой "БлокироватьДляИзменения"


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

//Далее мы получаем объект только, что повторно открытой формы и помещаем её в переменную
//В объекте содержатся все реквизиты (элементы) формы
НовыйОбъект = Форма.Объект;
22. Илья Д. (Diakon) 25.10.11 17:23
Большое спасибо за обработку, нашел её с Мисты, так что не удаляйте).Пустые ссылки это не хорошо.
23. Алексей Чухланцев (AvalonE2008) 27.10.11 09:14
Спасибо за пример работы с формами. Очень помогло.
24. denis leonov (curys) 27.10.11 11:33
Большое спасибо за обработку)
25. Василий Зайцев (vasiliy_b) 18.11.11 12:21
Поставил, плюс, но все таки получается пример не рабочий...
Думаю стоит исправить... пока проблема будет не решена.
27. Андрей Чунихин (ApocalypseNTC) 21.11.11 11:51
Я знал, что так будет :)
happyden; +1 Ответить
28. Д. Р. (starjevschik) 22.11.11 21:24
Отлично сделано. Автору полный зачет. Работает на платформе .528 без вопросов.
Незачет 1с. Собственно проблема в том, что в обработку не передается форма, из которой она открыта. Но автор нашел нужное окошко, молодец.
29. Сергей Серов (serov_sergey) 12.12.11 09:10
Насторожила эта строчка:

Форма = ОткрытьФорму("Документ.СчетФактураВыданныйАванс.Форма.ФормаДокумента",КлючПоиска,,,Окно);

А если этой обработкой нужно заполнять не один вид документов, а несколько? Надо чтобы данные вписывались в уже открытую форму объекта.
30. Алексей Иванов (iaa) 19.12.11 12:42
а как быть, если мне необходимо открыть форму обработки, выполнить в форме ряд действий, потом нажать кнопку типа "Заполнить табличную часть документа"?
как попасть в этом случае в эту процедуру?
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт


и где брать значения для переменных?
31. Андрей Чунихин (ApocalypseNTC) 20.12.11 03:18
serov_sergey пишет:

Насторожила эта строчка:



Форма = ОткрытьФорму("Документ.СчетФактураВыданныйАванс.Форма.ФормаДокумента",КлючПоиска,,,Окно);



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


Предоставьте выполнение этой задачи богу Шиве.
32. Алекс Ю (AlexO) 05.01.12 23:25
(28)(26) 123456,
т.е. в каких-то релизах и типовых работает, в каких-то - нет?
где и как в 8.2 теперь подключаются все внешние отчеты, обработки, обработки ТЧ, ВПФ?
33. Алекс Ю (AlexO) 06.01.12 02:59
(0) и все эти сложности шаг 1-3 (вызов команды внешней обработки и т.д.) только из-за того, что внесенные данные внеслись в ТЧ формы, но не отображаются на форме динамически (т.к. записи вновь созданного дока не было)? в результате, делаем кучу манипуляций, создаем новый экзепляр формы, заполняем его ТЧ данными, и уже его даем пользователю на редактирование?
35. Александр Гладких (yku) 28.02.12 00:07
(0) Сегодня с товарищем разбирали данную задачку. И нашли-таки решение:

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

&НаКлиенте
Процедура ПроцедураОбработкиОбъектов() 
	
	ЭтаФорма.Закрыть();
		
	ОбъектыНазначенияМассив = СписокЭлементов.ВыгрузитьЗначения();
	
	Окна = ПолучитьОкна();
	
	Для Каждого Элемент из ОбъектыНазначенияМассив Цикл
		
		Для Каждого Окно из Окна Цикл
			
			Если НЕ Окно.Основное Тогда
				
				Форма = Окно.ПолучитьСодержимое();
				
				ОбъектФормы = Неопределено;
				
				Попытка
					ОбъектФормы = Форма.Объект;
				Исключение
				КонецПопытки;
				
				Если ОбъектФормы <> Неопределено 
					И ОбъектФормы.Ссылка = Элемент Тогда
						
						ОбъектФормы.Комментарий = формат(ТекущаяДата());
						
					КонецЕсли;
				КонецЕсли;
				
		КонецЦикла;	
   			
	КонецЦикла;
	
КонецПроцедуры
...Показать Скрыть


СписокЭлементов - в форму обработки добавлен реквизит типа "список значений".
И есть недостаток - ненадолго открывается форма обработки.
Огонек; Val300; БольшойЧайник; Поручик; new1c; +5 Ответить 2
36. Александр Гладких (yku) 28.02.12 01:05
Дальнейшее, может быть, является очевидным. Однако, у меня на разбор полётов ушло около часа.

----
[ Всё, что далее написано, относится к получению формы через "Окно.ПолучитьСодержимое()", а не ОткрытьФорму(...) ]

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

Способ в (35) как раз обходит этот момент. Так как, после всего этого форма обработки у нас остается открытой, и вызывает подключенный обработчик. И при вызове его закрывается.

Примечательно, что у команды вызова печатных форм, такой галочки нет. И данные на форме должны оставаться такими, какими мы и хотим без всяких финтов ушами.
37. Евгений Мазай (salus) 16.08.12 09:55
(35) yku,
Начиная с УТ 11.0.8.13 данный механизм обновления формы перестал работать. Что изменилось?
38. Александр Гладких (yku) 20.08.12 10:36
(37) salus,
С УТ 11 я сталкиваюсь крайне редко. А так, не разбирался.
39. Евгений Мазай (salus) 20.08.12 10:54
(38) yku,
Посмотрите, пожалуйста, вот это http://infostart.ru/public/148039/. Все прекрасно работала на старом релизе, а на новом до закытия формы обработки.
40. Александр Гладких (yku) 20.08.12 11:11
(39) salus,
Не верю что это связано с обновлением УТ. Ваш код и в более ранних версиях УТ должен работать точно так же как и сейчас.
Достоверность (37) ставится под сомнение.

PS. Не нашел своего кода в вашей обработке (точнее, ключевой "фишки"). Так что вопрос не ко мне. Либо вопрос не так сформулирован.
41. Евгений Мазай (salus) 20.08.12 11:25
(40) yku,
"Не нашел своего кода в вашей обработке (точнее, ключевой "фишки")"
Если можно, то расшифруйте Вашу фразу. Хоть какая-то дополнительная информация.

"Не верю что это связано с обновлением УТ. Ваш код и в более ранних версиях УТ должен работать точно так же как и сейчас.
Достоверность (37) ставится под сомнение. "

Это же можно легко проверить. Вся инфомация доступна.
42. Евгений Мазай (salus) 20.08.12 11:28
(40) yku,
И еще. Оно и работает на более ранних версиях.
43. Александр Гладких (yku) 20.08.12 11:31
(42) salus,
Как всегда, время - вот чего не хватает.
Но заинтригован. Скачаю. Проверю на 11.0.7
44. Евгений Мазай (salus) 20.08.12 11:41
(41) salus,
"Не нашел своего кода в вашей обработке (точнее, ключевой "фишки")"
Если можно, то расшифруйте Вашу фразу. Хоть какая-то дополнительная информация. И все это много времени не требует...
45. Александр Гладких (yku) 20.08.12 12:47
Разобрался.
(37) salus,
По крайней мере в УТ 11.0.7.18 присутствует ошибка в конфигурации. И видимо, в следующих релизах её исправили.
В коих механизм из моего комментария вполне работает.

PS. По поводу нежелания разжевывать детально. У вас интерес денежный, у меня же интерес... просто интерес.
46. Евгений Мазай (salus) 20.08.12 14:24
(45) yku,

Если Ваш код в следующих конфигурациях работает, то это уже информация. Спасибо.
47. Андрей Артюхов (AndiA) 20.12.12 16:35
По-моему лучше делать по другому
1. Перенаправить на открытие формы обработки
ДобавитьКоманду(ТаблицаКоманд,
"...",
"...",
"ОткрытиеФормы",
Истина,
"");
2. При создании формы обработки из параметров найти ссылку на вызывающий объект и сохранить куда-нибудь ссылку
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЗагрузкаИзExel.ОбъектСсылка = Документы.УстановкаЦенНоменклатуры.ПустаяСсылка();
попытка
парам = ЭтаФорма.Параметры;
если парам.ОбъектыНазначения.Количество()>0 Тогда
ЗагрузкаИзExel.ОбъектСсылка = парам.ОбъектыНазначения[0];
КонецЕсли;
Исключение
КонецПопытки;
КонецПроцедуры
3. Заполнить форму документа интерактивно (либо если форма обработки не нужна в модуле ПриОткрытии)
&НаКлиенте
Процедура УстановитьЦены(Команда)

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

ДокФорма.Объект.Комментарий = "Загрузка из файла "+ЭтаФорма.ЗагрузкаИзExel.ИмяФайла;
ДокФорма.Объект.Ответственный = Пользователи.ТекущийПользователь();
найденацена = ложь;
если ВСуществующийДокумент тогда
для каждого стр из ДокФорма.Объект.ВидыЦен цикл
если стр.ВидЦены = ЭтаФорма.ЗагрузкаИзExel.ВидЦены тогда
найденацена = истина;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;

если не найденацена тогда
новстр = ДокФорма.Объект.ВидыЦен.Добавить();
новстр.ВидЦены = ЭтаФорма.ЗагрузкаИзExel.ВидЦены;
КонецЕсли;

для каждого стр из ЭтаФорма.ЗагрузкаИзExel.СписокРезультата цикл
если стр.НоменклатураСсылка<>ПустаяСсылкаСправочника("Номенклатура") Тогда
новстр = ДокФорма.Объект.Товары.Добавить();
новстр.Номенклатура = стр.НоменклатураСсылка;
новстр.Цена = стр.Цена;
новстр.ВидЦены = ЭтаФорма.ЗагрузкаИзExel.ВидЦены;
новстр.ЦенаИзмененаВручную = истина;
новстр.Характеристика = ВернутьХарактеристику(стр.Характеристика,стр.НоменклатураСсылка);
новстр.Упаковка = ВернутьУпаковку(стр.НоменклатураСсылка,стр.ЕдИзм);
КонецЕсли;
КонецЦикла;
ДокФорма.ПриСозданииНаСервере(Ложь, истина); // это чтобы форма этого заморочного документа правильно построилась
ДокФорма.Модифицированность = Истина;
ДокФорма.Открыть();
ЭтаФорма.Закрыть();
КонецПроцедуры
4. Не забыть в параметрах формы обработки создать параметр "ОбъектыНазначения"
kashafeev; Kaval88; +2 Ответить
48. vovlulus septium (volvulus) 18.02.13 16:40
Почему-то никак не получается запустить обработку в управляемой форме в обычном приложении.
Постоянно выдает вот такую ошибку:

{ОбщийМодуль.ДополнительныеОтчетыИОбработки.Модуль(201)}: Ошибка при вызове метода контекста (Подключить)
Возврат ВнешниеОбработки.Подключить(АдресВоВременномХранилище,, БезопасныйРежим);
по причине:
Ошибка подключения внешних метаданных
по причине:
Неправильный путь к файлу 'e1cib/tempstorage/49c11b29-ff5d-4612-aee4-7f8d785c2cda'
49. Андрей Чунихин (ApocalypseNTC) 19.02.13 06:52
Добавь обработку в состав конфигурации. Внешняя обработка на управляемых формах не запустится в обычном приложении.
50. Алексей Алексеев (Aleksey_3) 11.03.13 14:18
А подскажите почему может не вызываться форма обработки. Т.е. сделал обработку заполнения как тут написано, подключил её к БП 3.0. Она появилась в документе. Нажимаю заполнить ... и ничего, т.е. совсем нечего форма обработки не вызывается.

Я уже даже прописал

&НаСервере
Процедура ПриСозданииНаСервере()
Сообщить("ПриСозданииНаСервере");
1;
КонецПроцедуры

Т.е. модуль с ошибками - вообще никакой реакции. Скачал обработку, которая в статье - аналогично.

Что еще можно проверить?
51. Алексей Алексеев (Aleksey_3) 11.03.13 17:04
вообщем так и не понял почему, но методом научного тыка скопировал в форму реализацию 2 процедуры
&НаКлиенте
Процедура Подключаемый_ВыполнитьНазначаемуюКоманду(Команда)
    
    Если НЕ ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьНазначаемуюКомандуНаКлиенте(ЭтаФорма, Команда.Имя) Тогда
        РезультатВыполнения = Неопределено;
        ДополнительныеОтчетыИОбработкиВыполнитьНазначаемуюКомандуНаС­ервере(Команда.Имя, РезультатВыполнения);
        ДополнительныеОтчетыИОбработкиКлиент.ПоказатьРезультатВыполненияКоманды(ЭтаФорма, РезультатВыполнения);
    КонецЕсли;
    
КонецПроцедуры

&НаСервере
Процедура ДополнительныеОтчетыИОбработкиВыполнитьНазначаемуюКомандуНаС­ервере(ИмяЭлемента, РезультатВыполнения)
    
    ДополнительныеОтчетыИОбработки.ВыполнитьНазначаемуюКомандуНаСервере(ЭтаФорма, ИмяЭлемента, РезультатВыполнения);
    
КонецПроцедуры
...Показать Скрыть



и всё заработало.
52. Angry (Angry) 29.03.13 12:35
Пробовал в УТ 11.1 не работает. Исследования показали, что во всем виноват кусок кода в общей форме форме "ДополнительныеОтчетыИОбработки"

// Обновить форму владельца
Если ТипЗнч(ВладелецФормы) = Тип("УправляемаяФорма") Тогда
Попытка
ВладелецФормы.Прочитать();
Исключение
КонецПопытки;
КонецЕсли;

Закомментировав выделенное всё заработало.
53. Николай Зайков (Mortiferus) 12.07.13 15:36
Спасибо. Помогло. Все сработало без проблем.
54. Игорь Юндин (kereo) 08.08.13 18:26
Попробуйте заменить
             //Зададим ключ поиска документа, из которого вызвана данная обработка,
             //чтобы получить ссылку на редактирумый документ в удобном виде для
             //функции ОткрытьФорму()
             КлючПоиска = Новый Структура("Ключ", Элемент);

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

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

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

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

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

на
Объект = ВладелецФормы.Объект;
ЗаполнитьОбъект(Объект);
DedMoroz1983; Spacer; yku; Val300; +4 Ответить
55. Дмитрий Ярославцев (DimanYa) 14.08.13 10:38
Теперь такая морока стала с заполнением табличных частей по сравнению с обычными формами.
Раньше действие было простое, а теперь занимает в 10 раз больше времени.
И я может не нашёл, но факт если у человека много табличных частей на форме все внешнии обработки их заполнения будут лежать в общей кучи через кнопку "Заполнить"
56. Игорь Юндин (kereo) 16.08.13 11:44
(55) DimanYa, А зачем вам в документе много табличных частей, которые заполняются обработкой?
57. Дмитрий Ярославцев (DimanYa) 16.08.13 12:14
Ну на данном этапе в данном мне это не нужно. Но чисто гипотетически такая необходимость может возникнуть.

Представим, что у нас существует допустим 3-4 табличные части. Для каждой у нас есть своя внешняя обработка. Раньше пользователь видел под кнопокй заполнить кнопку для этой конкретной таблицы. Теперь же будет одна общая кнопка "Заполнить" и лишь по их названию можно понять, что и куда.

Я не говорю, что это сверх неудобно, просто чисто с точки удобства это ухудшение.

Кстати взять типой документ "Поступление товаров и услуг" у него 7 различных табличных части: Оборудование, ОбъектыСтроительства, Товары, Услуги, ВозвратнаяТара, ЗачетАвансов, АгентскиеУслуги.
58. Евгений Плешивцев (infosoft-v) 21.08.13 12:12
Добрый день, коллеги.
Спасибо за всю информацию, которая помогла получить результат.
У меня обработка заполнения должна заполнять табличную часть документа "Заказ покупателя"
Обработка запускается из открытой формы существующего заказа это значит, что мне не нужно перебирать аргумент "ОбъектыНазначенияМассив" и я сразу беру первый элемент массива.

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


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



&НаКлиенте
// Команда для кнопки формы внешней обработки
Процедура ЗагрузитьЗаказ(Команда)
	
	// Закрываю форму внешней обработки
	ЭтаФорма.Закрыть();
	
	// Повторно открываю форму нужного объекта, 
	// в моём случае это Документ "Заказ клиента"
	// Если форма уже открыта, то повторного открытия не происходит,
	// но возвращается объект "Управляемая форма"
	Параметр = Новый Структура("Ключ", Объект.СсылкаНаОбъект); 
	Форма = ОткрытьФорму("Документ.ЗаказКлиента.ФормаОбъекта",Параметр);
	ОбъектФормы = Форма.Объект;
	
	// Далее ваша функциональность
	ОбъектФормы.Комментарий = формат(ТекущаяДата());
	
КонецПроцедуры
...Показать Скрыть
el-gamberro; +1 Ответить
59. Alister (Alister) 09.09.13 13:33
Спасибо, помогло разобраться, как сделать у себя.
60. Irina L (IrinaL___) 11.10.13 10:27
61. Вячеслав Круглов (Slava.62.ru) 16.10.13 15:37
Благодарю мучился сам долго. (
62. Людмила Вальская (Вальская Людмила) 17.10.13 10:42
63. Виталий Долматов (VADol) 24.10.13 15:24
Спасибо! Тоже долго маялся! Помогло!
65. Андрей Малышев (AndrewM) 28.10.13 17:07
66. ghOst Bu (ilonnaa) 29.10.13 14:46
Спасибо огромное! Очень помогло!

"...в модуле формы обработки, а значит создадим любую форму обработки, пользователь её всеравно не увидит...:"

Вот это был ключевой момент)
67. Михаил Скряга (PRO100_NigGaZ) 31.10.13 08:33
У меня открывает новое окно :( (перед этим я открываю форму печформы модально)
68. Татьяна (svetanik) 11.11.13 06:03
Очень помогла статья, а также комментарий infosoft-v. СПАСИБО!
Заполняю Заказ (УТ11.1) данными из внешнего файла, сохраняю, но Состояние Обеспечения не видит данных для анализа. В чем может быть дело?
69. Евгений Добрынин (CTDEVIce) 18.02.14 10:01
Отлично все отработало. Только вот возникла проблема - документ остался незаполненным. Начал разбираться. Сразу после команды КопироватьДанныеФормы(НовыйОбъект, Форма.Объект); объект заполнен, из цикла выходит, а потом форма чистится. Такое ощущение, что чистится в методе конфиги, который вызвал метод клиента ВыполнитьКоманду().

Конфигурация Розница 2.0, полугодовой давности.
70. Евгений Добрынин (CTDEVIce) 18.02.14 10:13
Еще одна особенность. В вызове клиента открываю форму для ввода данных от пользователя. Открываю модально. В остальном вроде все то же самое. Щас конфигу посмотрел - не увидел чтобы форма чистилась или обновлялась после вызова клиентского метода.
71. Александр Филь (filterhouse) 01.04.14 09:44
Отличная статья, долго искал, хоть какое то описания, а тут прям готовый пример.
72. Леван Иремадзе (IRLes) 09.04.14 23:36
Как-то сложно написано, можно же проще. Я не вникал как там со счетами-фактурами, но заполнить таблицу можно очень просто и не нужно столько кода.
Если это общеобразовательный пример, а не частный случай, то, возможно вариант ниже будет более понятным?
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения) Экспорт

	Для каждого СсылкаНаОбъект Из ОбъектыНазначения Цикл

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

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

Но все-равно спасибо, навело на мысль сделать проще :)
svilsa; jmi; +2 Ответить 1
73. Александр Злобин (elian) 03.05.14 22:02
Мне одному кажется, что поиск открытых окон - это явный колхоз? Кто ни будь подскажет ссылку на документацию по БСП или пример обработки из лабораторий 1С, где делается именно так? Вот обработка _ДемоДополнительнаяОбработкаЗаполненияНазначаемая из БСП, в ней нет никакого поиска открытых окон...
74. Андрей Чунихин (ApocalypseNTC) 21.05.14 08:00
(72) Правильное решение.
Сейчас эта публикация не должна быть актуальна, так как она создавалась еще на первых релизах УТ 11. Когда БСП только появлялась, когда не хватало информации из общих источников.
(73) Поэтому спустя 3 года после публикации говорить, что это колхоз бессмысленно. На тот момент это была единственная известная мне публикация с необходимым решением. Сейчас можно книжку купить или в любой конфигурации на управляемых формах подсмотреть.
svilsa; UnsavedSoul; kyrasol; dimaster; +4 Ответить
75. Оля Белозерова (XelOla) 02.08.14 23:20
76. Анна Ни (Anyu-n) 02.12.14 16:00
Ребят, все эпик.... обработка классная... вроде все понятно, но столкнулось с засадой РЕКВИЗИТ ТАБ.ЧАСТИ КОЛИЧЕСТВО..
уТ 11.1.9.51 Пытаюсь по кнопке изменить колонку количество (в доп.реквизитах лежит число, его нужно кинуть в таблицу) Причем так же меняю цену - все делается как мне нужно! А количество - никак....

Это моя функция действия:
Процедура ЗаполнитьДокумент(ДокументОбъект)

ТЗ=ДокументОбъект.Товары.Выгрузить();
ДокументОбъект.Товары.Очистить();
ном=0;
кол= ДокументОбъект.ДополнительныеРеквизиты.Количество();
Пока ном < кол цикл
Если ДокументОбъект.ДополнительныеРеквизиты.Получить(ном).свойство.заголовок="Кол-во ЛИТРОВ" тогда
ТЗ[0].количество = ДокументОбъект.ДополнительныеРеквизиты[ном].значение;
КонецЕсли;
Если ДокументОбъект.ДополнительныеРеквизиты.Получить(ном).свойство.заголовок="Цена ЛИТРАЖ" тогда
ТЗ[0].цена = ДокументОбъект.ДополнительныеРеквизиты[ном].значение;
КонецЕсли;

ном=ном+1;
КонецЦикла;
ДокументОбъект.Товары.Загрузить(ТЗ);


Потом загружаю....

&НаКлиенте
Процедура Загрузить(Команда)

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

// Закрываем форму обработки
ЭтаФорма.Закрыть();

КонецПроцедуры
В итоге цена меняется, а количество прежнее..... :'(
Уже и отладчиком проходила вроде цифра из доп.реквизитов стоит... а в форме не обновляется... помогите.... я же делала по вашей методике
77. Анна Ни (Anyu-n) 03.12.14 11:15
Жесть.. методом проб и ошибок выяснила, что менять нужно реквизит ФормаДокумента.Объект.товары[0].количествоупаковок
Причем в настройках Номенклатуры галочка с "упаковок номенклатуры" СНЯТА
Я может что пропустила... зачем тогда в табличной части реквизит "КОЛИЧЕСТВО"? если есть Реквизит "КоличествоУпаковок"
78. Кирилл Ширинский (el-gamberro) 15.02.15 18:41
Спасибо за общение. Покурил. Общее решение нашел такое:

Парам = Новый Структура("Ключ", Объект.СсылкаНаОбъект); //это передали в форму заполнения
Форма = ПолучитьФорму("Документ.ОтчетКомитентуОПродажах.Форма.ФормаДокументаОПродажах",Парам); //окна не ищем, переполучаем уже открытое
Форма.ЭтотОбъект.Прочитать(); //обновляем нашу форму, перед этим сам объект-документ в базе уже заполнен и сохранен (записан, проведен)
igor-pn; sg12; Magnastrag; +3 Ответить 1
79. Igor Provotorov (ivprovotorov) 20.02.15 08:32
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт 
	типц = ПолучитьТипЦенДляВозвратов();
	
	для каждого воз из ОбъектыНазначенияМассив цикл

		Сообщить(""+ТипЗнч(воз)+" "+воз+" "+ТекущаяДата());  // тут нормально выходит сообщение

		УстановитьСебестоимость(типц, воз);

	КонецЦикла;

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


&Насервере
Функция УстановитьСебестоимость(типц, воз)
	Сообщить(""+ТипЗнч(воз)+" "+воз);  // тут тишина

	сообщ = ""; 
	объ = воз.ссылка.получитьобъект();
	для каждого тов из объ.товары цикл
		..............................................
	КонецЦикла;
	
	Попытка
		объ.записать();
	Исключение
		сообщ = сообщ + "Не удалось записать документ " + воз.ссылка + " " + ОписаниеОшибки();
	КонецПопытки;
	
	Возврат сообщ;
КонецФункции
...Показать Скрыть


Обработка заполнения нормально подключилась. Кнопка "Заполнение" появилась. При нажатии на кнопку сообщение из процедуры ВыполнитьКоманду нормально выходит. А из функции УстановитьСебестоимость полная тишина, ни моих сообщений, ни сообщений об шибках, как будто в функции ни одной строчки кода.

Когда запустил обработку через меню "Файл - Открыть" и вручную вызвал процедуру ВыполнитьКоманду, всё отработало без замечаний.

&НаКлиенте
Процедура тест(Команда)  //запускается кнопкой на форме
	мас = новый Массив;

	для каждого воз из элементы.список.ВыделенныеСтроки цикл
		мас.Добавить(элементы.список.данныестроки(воз).Ссылка);
	КонецЦикла;

	ВыполнитьКоманду("",мас);

КонецПроцедуры
...Показать Скрыть

1С:Предприятие 8.3 (8.3.5.1460)
1С:Предприятие 8. Общепит (3.0.33.19)
80. Dexter Morgan (DexterMorgan777) 29.04.15 16:40
81. Рифат Нурмухаметов (rif-nrr) 13.06.15 14:31
Полезная статья, автор, спасибо за труд! Сделал свою на основе статьи - все получилось.
82. Оля Белозерова (XelOla) 05.09.15 00:51
Будьте добры
я пытаюсь создать заполнение Авизо по расчетам исходящее на основании Поступление товаров и услуг
использую вашу СведенияОВнешнейОбработке
ругается на
{ОбщийМодуль.ДополнительныеОтчетыИОбработкиКлиент.Модуль(505)}: Недостаточно фактических параметров
ФормаВнешнегоОбъекта.ВыполнитьКоманду(ПараметрыВызоваСервера.ИдентификаторКоманды, ПараметрыВызоваСервера.ОбъектыНазначения);
откуда эта ошибка идет из модуля объекта или модуля формы?
83. Андрей Чунихин (ApocalypseNTC) 07.09.15 07:29
84. Валера Мартиков (valeriy-vm) 16.09.15 22:23
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| УстановкаСебестоимостиТовары.Номенклатура,
| МАКСИМУМ(УстановкаСебестоимостиТовары.Цена) КАК Цена
|ИЗ
| Документ.УстановкаСебестоимости.Товары КАК УстановкаСебестоимостиТовары
|ГДЕ
| УстановкаСебестоимостиТовары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| УстановкаСебестоимостиТовары.Номенклатура";
Запрос.УстановитьПараметр("Ссылка",Объект.СсылкаДок);
ОбДок = Объект.СсылкаДок.ПолучитьОбъект();
ОбДок.Товары.Загрузить(Запрос.Выполнить().Выгрузить());
ОбДок.Записать();
85. Aleksandr Shilov (Magnastrag) 20.10.15 16:56
(78) el-gamberro, Спасибо огромное, выручил.
86. Сергей Беленченко (svbel85) 30.01.16 10:36
Спасибо за статью, я уже голову себе сломал как из одного документа заполнять другой не записывая заполняемый, это так легко делалась раньше без БСП, а теперь окна приходится открытые перебирать.... очень странно
87. Игорь Вахнин (Vahnin) 14.02.16 22:31
Если использовать ВызовКлиентскогоМетода, выполняется процедура ВыполнитьКоманду в модуле формы.
У формы обработки есть реквизит ВладелецФормы. Через него и можно редактировать все, что вашей душе угодно. Если конечно не запускать обработку из формы списка.
88. Сергей Иванов (o3ophuk) 11.03.16 00:07
Спасибо автору поста.
Если актуально - в результате у меня получился такой код(Задача была изменить цену на определенный коэффициент без записи документа для розницы 2.1.4):

////////////////////////////////////////////////////////////////////////////////
// Клиент - Программный интерфейс

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

	Открыть();
	
КонецПроцедуры

////////////////////////////////////////////////////////////­////////////////////
// Клиент

&НаКлиенте
Процедура ИзменитьЦену(Команда)
	// Вставить содержимое обработчика.
	
	Если НЕ ЗначениеЗаполнено(Коэффициент) Тогда
		Возврат;
	КонецЕсли;
	
    Для каждого Элемент из ОбъектыНазначения Цикл

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

&НаСервере
Функция ЗаполнитьОбъект(Форма)
	
	ТЧ = Форма.Товары;
	Для Каждого Строка Из ТЧ Цикл
		
		Строка.Цена = Строка.Цена * Коэффициент;
		Строка.Сумма = Строка.Цена*Строка.Количество;
		
	КонецЦикла;
	
	Форма.СуммаДокумента = ТЧ.Итог("Сумма");
	
КонецФункции
...Показать Скрыть
89. Алексей Че (dklp) 21.04.16 12:17
подскажите, как отключить проверку записанности объекта перед вызовом обработки заполнения? это только через Конфигуратор можно сделать?
90. Михаил (mikl79) 29.04.16 11:42
Спасибо, впервые сегодня написал обработку заполнения табл.части на базе вашей обработки.
Было бы круто если бы был пример вызова окна перед заполнением, в котором можно выбрать какие-нибудь параметры заполнения (например, другой документ).
91. Михаил (mikl79) 29.04.16 11:44
Почему обработка не передает признак модифицированности?
92. Эдуард Назыров (alabuga) 19.05.16 10:58
(90) mikl79, там тоже самое. Но лучше сделать так
1) в функции СведенияОВнешнейОбработке() ставишь "ОткрытиеФормы" вместо "ВызовКлиентскогоКетода"
2) кидаешь на форму нужные параметры и кнопку "заполнить" привязываешь к ней процедуру "ВыполнитьКоманду" (можешь назвать по своему)
и все.
P.S. очевидно команда Открыть() уже не нужна, сразу можно заполнять
93. Игорь П.Н. (igor-pn) 30.05.16 00:34
Пример, на основе БСП, который мне помог.Текст просто вставляем в модуль объекта, форму в обработку вообще не добавляем. В итоге меняем реквизиты формы объекта (в нашем случае справочник "Склады"), но не записываем ее.


////////////////////////////////////////////////////////////­////////////////////
// ПРОГРАММНЫЙ ИНТЕРФЕЙС

#Область ПрограммныйИнтерфейс

// Возвращает сведения о внешней обработке.
Функция СведенияОВнешнейОбработке() Экспорт
	
	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("1.1");
	
	ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
	ПараметрыРегистрации.Версия = "1.3";
	ПараметрыРегистрации.Назначение.Добавить("Справочник.Склады");
	
		
	НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
	НоваяКоманда.Представление = НСтр("ru = 'Заполнить наименование ""Склады"" не записывая объект (заполнение формы)'");
	НоваяКоманда.Идентификатор = "ЗаполнитьНаименование";
	НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыЗаполнениеФормы();
	НоваяКоманда.ПоказыватьОповещение = Ложь;
	НоваяКоманда.Скрыть = Истина;
	
	Возврат ПараметрыРегистрации;
	
КонецФункции

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

#КонецОбласти

////////////////////////////////////////////////////////////­////////////////////
// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ

#Область СлужебныеПроцедурыИФункции

// Обработчик команды.
Процедура ЗаполнитьНаименование(Форма, РезультатВыполнения)
	
	Форма.Объект.наименование = "111111111111111111111111111111111111111111111111111111";
	Форма.Модифицированность = Истина;
	
	СтандартныеПодсистемыКлиентСервер.ВывестиСообщение(
		РезультатВыполнения,
		НСтр("ru = 'Поле ""Наименование"" успешно заполнено'"),
		"Объект.Наименование");
	
КонецПроцедуры

#КонецОбласти
...Показать Скрыть
94. Вячеслав Павелко (slawanix) 18.08.16 11:44
Прочитал статью вместе с комментариями. Изначально тема неправильно раскрыта, поэтому и вопросов много.
По существу нет никаких проблем с блокировками. Достаточно к табличной части обратиться через свойство ВладелецФормы. Делается это примерно так (демо):

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


Тип значения свойства ВладелецФормы - УправляемаяФорма.
Все отлично отрабатывает. При этом у обработки должен быть Вид = ЗаполнениеОбъекта, а у Команды тип = ВызовКлиентскогоМетода.
Весь модуль объекта у меня выглядит так:
#Область РегистрацияОбработки

Функция СведенияОВнешнейОбработке() Экспорт
	
	Назначения = Новый Массив ;
	Назначения.Добавить("Документ.ОтражениеЗарплатыВУчете") ;
	
	ПараметрыРегистрации = Новый Структура ;
	ПараметрыРегистрации.Вставить("Вид","ЗаполнениеОбъекта");
	ПараметрыРегистрации.Вставить("Назначение",Назначения);
	ПараметрыРегистрации.Вставить("Наименование","Корректировка счетов учета, подразделений и видов платежей");
	ПараметрыРегистрации.Вставить("Версия","1.0");
	ПараметрыРегистрации.Вставить("Информация","Дополнительная обработка табличной части документа ""Зарплата (ЗУП 2.5, ЗиК 7.7)""");
	ПараметрыРегистрации.Вставить("БезопасныйРежим",Истина);
	
	Команды = ПолучитьТаблицуКоманд() ;
	ДобавитьКоманду(Команды, "Скорректировать счета учета, подразделения и виды платежей","ИзменитьДокумент","ВызовКлиентскогоМетода",Ложь);
	
	ПараметрыРегистрации.Вставить("Команды",Команды) ;
	
	Возврат ПараметрыРегистрации;
	
КонецФункции

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

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

#КонецОбласти
...Показать Скрыть


У обработки должна быть создана Форма, на которой не нужно создавать никаких команд, объектов и элементов управления. В ней должна быть только Экспортная процедура ВыполнитьКоманду, текст команды см. выше.
Хочу отметить отдельно и заострить на этом внимание: Не смотря на то, что у добавляемой Команды (см. текст МодуляОбъектов) устанавливается тип ВызовКлиентскогоМетода, в модуле формы можно, при необходимости, создавать процедуры и функции, исполняемые на сервере и обращаться к ним из процедуры Выполнить(). Никаких ограничений я не обнаружил.
95. Евгений я (DedMoroz1983) 02.11.16 08:53
Полезно. Статья помогла сделать свою обратотку, заполнения дополнительных реквизитов, без изменения основной формы, а с помощью формы отбработки.