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

05.07.20

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Заполнение табличной части документа счет-фактура на аванс
.epf 8,27Kb
876
876 Скачать (1 SM) Купить за 1 850 руб.

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

Условия:

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

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

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

Решение:

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

Шаг 1.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Шаг 2.

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

 

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

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

См. также

SALE! 15%

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

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

10000 руб.

02.09.2020    159513    874    399    

862

SALE! 15%

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

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя.

8400 7140 руб.

20.08.2024    7802    57    22    

67

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

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.

9360 руб.

17.05.2024    23449    68    45    

117

SALE! 15%

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

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

10000 8500 руб.

10.11.2023    10441    36    25    

61

SALE! 15%

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

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

22200 19980 руб.

06.10.2023    15407    35    7    

70

SALE! 35%

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

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

4800 3120 руб.

14.01.2013    188005    1140    0    

912

SALE! 15%

Инструментарий разработчика Программист 8.3.14 1С:Конвертация данных Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

15000 12750 руб.

07.10.2021    17307    6    32    

42

Инструментарий разработчика Программист Платные (руб)

Менеджер конфигураций 1С — альтернативный стартер информационных баз 1С:Предприятие.

1800 руб.

21.02.2023    7702    8    35    

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

Разница такая, что в этой статье описана методика заполнения объекта (аналог из УПП 1.2 или УТ 10.3 - заполнение табличных частей), а в другой - описание создания связанных объектов или ввода на основании.
Статья полезная, сам думал, как бы это сделать пооптимальней. Намудили Намудрили разработчики с БСП.
criptid; cheburashka; Denis_Lebedinsky; Serg3141; stoptime; Enyel; hromovanton; Dmitri93; Krasnyj; klmop; MarinaLed; Lo1jke; dbachinsky; Spacer; tkv44; shard; biz-intel; KazeNoYaida; ShyThun; kote; Cobalt River; Nuobu; Denizzz; +23 2 Ответить
2. Denizzz 15.04.11 08:09 Сейчас в теме
Вроде как в первом случае используется СозданиеСвязанныхОбъектов
а во втором ЗаполнениеОбъекта
в принципе задача то одна, а вот решения разные. Обратил внимание на ВыполнитьКоманду
4. Поручик 4692 15.04.11 08:18 Сейчас в теме
>>> в принципе задача то одна
Нет, это разные задачи.
5. Denizzz 15.04.11 08:21 Сейчас в теме
В данном контексте читать как "Результат один"
Понимаю, что основной задаче для автора является ее реализация.
6. Denizzz 15.04.11 08:23 Сейчас в теме
Поручик пишет:
Намудрили разработчики с БСП.

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

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

ЗЫ На будущее - Не лезь и не обсуждай работу Модераторов.
user1725319; Ляль Дикий; echo77; 1c.pro.fun; Lyolik; copperfox; pipetkabeatboo; www2000; altimait; +9 3 Ответить
8. 79044970523 934 15.04.11 12:16 Сейчас в теме
Разница публикаций очевидна из их названия.
Поясню:
1) Создание связанных объектов
2) Заполнение объекта

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

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

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

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

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

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


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

MAntaNA пишет:

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


Верно подмечено. Разбираюсь в этой проблемой в данный момент.
19. plevakin 19.08.11 16:12 Сейчас в теме
Так никто и не разобрался с
Ошибка блокировки объекта.
?
Не хочу троллить, но автор сам пользовался этой обработкой?
20. fsolution 11.10.11 17:51 Сейчас в теме
Сталкнулся с проблемой когда созданная внешняя обработка по загрузке прайса из XLS в док заказ клиента - выдавал в документе что он заблокирован, и в результате после заполнения таблич части документа нельзя было его не записать не сохранить - это безусловно баг УТ 11 и пофиксят непонятно в каких релизах потом - но проблема осталась!
21. 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 101 27.10.11 09:14 Сейчас в теме
Спасибо за пример работы с формами. Очень помогло.
24. curys 27.10.11 11:33 Сейчас в теме
Большое спасибо за обработку)
25. vasiliy_b 284 18.11.11 12:21 Сейчас в теме
Поставил, плюс, но все таки получается пример не рабочий...
Думаю стоит исправить... пока проблема будет не решена.
26. пользователь 21.11.11 11:39
Сообщение было скрыто модератором.
...
27. 79044970523 934 21.11.11 11:51 Сейчас в теме
Я знал, что так будет :)
happyden; +1 Ответить
28. starjevschik 22.11.11 21:24 Сейчас в теме
Отлично сделано. Автору полный зачет. Работает на платформе .528 без вопросов.
Незачет 1с. Собственно проблема в том, что в обработку не передается форма, из которой она открыта. Но автор нашел нужное окошко, молодец.
32. AlexO 135 05.01.12 23:25 Сейчас в теме
(28)(26) 123456,
т.е. в каких-то релизах и типовых работает, в каких-то - нет?
где и как в 8.2 теперь подключаются все внешние отчеты, обработки, обработки ТЧ, ВПФ?
29. serov_sergey 12.12.11 09:10 Сейчас в теме
Насторожила эта строчка:

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

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


и где брать значения для переменных?
user2089720; muzzombie; -I-; +3 Ответить
31. 79044970523 934 20.12.11 03:18 Сейчас в теме
serov_sergey пишет:

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



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



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


Предоставьте выполнение этой задачи богу Шиве.
33. AlexO 135 06.01.12 02:59 Сейчас в теме
(0) и все эти сложности шаг 1-3 (вызов команды внешней обработки и т.д.) только из-за того, что внесенные данные внеслись в ТЧ формы, но не отображаются на форме динамически (т.к. записи вновь созданного дока не было)? в результате, делаем кучу манипуляций, создаем новый экзепляр формы, заполняем его ТЧ данными, и уже его даем пользователю на редактирование?
34. пользователь 13.01.12 15:11
Сообщение было скрыто модератором.
...
35. yku 376 28.02.12 00:07 Сейчас в теме
(0) Сегодня с товарищем разбирали данную задачку. И нашли-таки решение:

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

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


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

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

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

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

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

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

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

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

PS. По поводу нежелания разжевывать детально. У вас интерес денежный, у меня же интерес... просто интерес.
46. salus 28 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. volvulus 21 18.02.13 16:40 Сейчас в теме
Почему-то никак не получается запустить обработку в управляемой форме в обычном приложении.
Постоянно выдает вот такую ошибку:

{ОбщийМодуль.ДополнительныеОтчетыИОбработки.Модуль(201)}: Ошибка при вызове метода контекста (Подключить)
Возврат ВнешниеОбработки.Подключить(АдресВоВременномХранилище,, БезопасныйРежим);
по причине:
Ошибка подключения внешних метаданных
по причине:
Неправильный путь к файлу 'e1cib/tempstorage/49c11b29-ff5d-4612-aee4-7f8d785c2cda'
49. 79044970523 934 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 11 29.03.13 12:35 Сейчас в теме
Пробовал в УТ 11.1 не работает. Исследования показали, что во всем виноват кусок кода в общей форме форме "ДополнительныеОтчетыИОбработки"

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

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

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

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

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

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

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

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

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

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

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

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


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



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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

	КонецЦикла;

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


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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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


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

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

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

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

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


У обработки должна быть создана Форма, на которой не нужно создавать никаких команд, объектов и элементов управления. В ней должна быть только Экспортная процедура ВыполнитьКоманду, текст команды см. выше.
Хочу отметить отдельно и заострить на этом внимание: Не смотря на то, что у добавляемой Команды (см. текст МодуляОбъектов) устанавливается тип ВызовКлиентскогоМетода, в модуле формы можно, при необходимости, создавать процедуры и функции, исполняемые на сервере и обращаться к ним из процедуры Выполнить(). Никаких ограничений я не обнаружил.
steaom; Rusel; samara04; Ariva; m1_1976; asp-1c; Alias; +7 Ответить
96. viktorinka777 04.01.17 12:23 Сейчас в теме
(94) Мне нужно сделать заполнение ТЧ результатом запроса. Вызываю серверную процедуру. Что в нее передать? и как тогда обновлять форму?
97. slawanix 9 04.01.17 20:17 Сейчас в теме
(96), что передать в серверную процедуру зависит от Вашей задачи, в некоторых случаях можно вообще ничего не передавать... Как вариант, можно в серверной функции выполнить запрос, результат запроса передать обратно на Клиент и там заполнить ТЧ. Форму никаким специальным образом обновлять не придется, при заполнении само все обновится.
viktorinka777; +1 Ответить
98. Alias 176 10.02.17 18:51 Сейчас в теме
(94) Большое спасибо. Действительно, всё просто... А я-то провозился с этой проблемой (открыть свою форму для выбора параметров заполнения и заполнить потом форму документа без записи).

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

чтобы открылась форма обработки заполнения. А там уже -- полная свобода, и общение с заполняемой формой как Вы и сказали, через ВладелецФормы.Объект

Помогли.
99. slawanix 9 10.02.17 20:29 Сейчас в теме
(98), пожалуйста, рад, что мое сообщение Вам помогло.
AxiomABC; +1 Ответить
105. mart-sha 296 28.01.18 19:37 Сейчас в теме
Оставьте свое сообщение