helpf.pro
Регистрация
 +8 
Распечатать

Как заполнить табличную часть на основании документа

В форме документа счет-фактура выданный аванс заполнить табличную часть Авансы на основании документа поступление безналичных денежных средств.
Условия:
1) Перед заполнением табличной части документа получить от пользователя подтверждение на это действие;
2) Обработку создания документа сделать внешней и подключаемой к форме документа счет-фактура на аванс выданный;
3) После заполнения табличной части не записывать документ, а разрешить пользователю продолжить редактирование изменной табличной части или самостоятельно записать документ.
Решение:
Пункты 1 и 2 не представляют особой сложности, но пункт 3 заставил меня задуматься и написать, по-моему мнению, топорный, но исправно действующий код.

Понятно, что от нас требуется создать внешнюю обработку вида "ЗаполнениеОбъекта" и подключить её в информационную базу.
Приведу код в модуле обработки:
Код 1C v 8.2 УП
 Функция СведенияОВнешнейОбработке() Экспорт

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ниже приведу код, который у вас может быть совершенно другим и делать, какие-либо другие манипуляции с объектом формы:
Код 1C v 8.2 УП
 &НаСервере
Функция ЗаполнитьОбъект(НовыйОбъект)

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

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

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

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

Автор ApocalypseNTC
Разместил:   Версии: | 8.2 УП |  Дата:   Прочитано: 54229
 +8 
Распечатать
Возможно, вас также заинтересует
Как заполнить табличную часть формы программно? 8
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 50
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ
1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш
1С 8.x : Как убрать лидирующие нули в номере Документа (вариант2) 0
Скопировать строку с номером, с лидирующими нулями, в числовом поле (с форматом без групп, без группировки), и вернуть(скопировать) обратно в строковом поле с номером. Возвращает без нулей.
Google maps : вывод точек на карту и режим панорамы 9
В отличие от яндекс карт в GMaps можно использовать панорамы - за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают! Для клиента нужно было сделать вывод объектов на карту С возможностью просмотра панора
Посмотреть все результаты поиска похожих
Комментарии
Ser
30.01.2014 17:04Комментарий: 11
Ser
Сделал все по инструкции а они пишет
метод обьекта не обнаружен "ВыполнитьКоманду"

Хотя вот так написал

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


Код 1C v 8.2 УП
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
Цитата
Ser
30.01.2014 17:00Комментарий: 10
Ser
mrDen, mrDen, mrDen,
bssorsk
12.04.2013 04:09Комментарий: 9
bssorsk
Если кому интересно , мне помогло замена метода Получить/ОткрытьФорму , на код представленный здесь http://infostart.ru/public/148039/


Код 1C v 8.2 УП
 
ОбъектыНазначенияМассив = СписокЭлементов.ВыгрузитьЗначения();

Окна = ПолучитьОкна();
Для Каждого Элемент из ОбъектыНазначенияМассив Цикл

Для Каждого Окно из Окна Цикл

Если НЕ Окно.Основное Тогда

Форма = Окно.ПолучитьСодержимое();

ОбъектФормы = Неопределено;

Попытка
ОбъектФормы = Форма.Объект;
Исключение
КонецПопытки;
Если ОбъектФормы <> Неопределено Тогда
Попытка
ОбъектСсылка = ОбъектФормы.Ссылка
Исключение
ОбъектСсылка = Неопределено;
КонецПопытки;

Если ОбъектСсылка <> Неопределено Тогда
Если ОбъектСсылка = Элемент Тогда

Попытка
ОбъектыНазначения = Форма.Объект;
ОбъектыНазначения.Комментарий = формат(ТекущаяДата());

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

Исключение
КонецПопытки;


КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;

КонецЦикла;
КонецЦикла;

bssorsk
12.04.2013 02:40Комментарий: 8
bssorsk
Yura063, это в весии УТ свежей 11.0.7,
Код ОбщаяФорма.ДополнительныеОтчетыИОбработки.Форма.Модуль(432, 4) :
Код 1C v 8.2 УП
 ВладелецФормы.Прочитать();   

т.е он перечитывает из объекта , полагая , что вы в свойе обработке записали объект.
bssorsk
12.04.2013 02:38Комментарий: 7
bssorsk
pa240775, Такая же проблема , пробовал по разному , всеравно объект заблокирован.
УТ 11.1
E_Migachev, не сработало, операция недостпна для неоткрытой формы
Yura063
21.03.2013 15:39Комментарий: 6
Yura063
У меня проблема! форма остается не заполненной! когда вставляю Форма.ОбновитьОтображениеДанных(); после копирование данных формы. тоданные выводятся и снова исчезают! что не так
E_Migachev
15.05.2012 18:44Комментарий: 5
E_Migachev
mrDen, смотри 2 код, как раз эта процедура
mrDen
13.05.2012 13:58Комментарий: 4
mrDen
Сделал все по инструкции а они пишет
метод обьекта не обнаружен "ВыполнитьКоманду"

Хотя вот так написал

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

Код 1C v 8.2 УП
 &НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
E_Migachev
11.04.2012 11:47Комментарий: 3
E_Migachev
pa240775, может Форма.Закрыть();
pa240775
10.04.2012 13:39Комментарий: 2
pa240775
объект заблокирован мной же. время = времени вывполнения обработки
pa240775
10.04.2012 13:24Комментарий: 1
pa240775
Сделал все как рекомендуется. Данные на форме обновляются. Но записать документ нет возможности. Пишет что Объект заблокирован...

Код 1C v 8.х
 

&НаКлиенте

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



//Если ИдентификаторКоманды = "Заполнить" Тогда

//

// Документ = ОбъектыНазначения[0];

// КонецЕсли;



//Спросим у пользователя разрешение на продолжение обработки

Режим = РежимДиалогаВопрос.ДаНет;

Текст = "Текущие данные документа будут заменены новыми без возможности восстановления.

|Продолжить?";

Ответ = Вопрос(Текст, Режим, 0);

Если Ответ = КодВозвратаДиалога.Да Тогда

ЦенаДляУстановки = 1;

Если ВвестиЧисло(ЦенаДляУстановки, "Введите цену для установки", 10, 2) Тогда





//Если пользователь дал разрешение на продолжение, то начнем перебирать все

//документы, у которых мы планируем заполнить табличную часть

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



//Зададим ключ поиска документа, из которого вызвана данная обработка,

//чтобы получить ссылку на редактирумый документ в удобном виде для

//функции ОткрытьФорму()

КлючПоиска = Новый Структура("Ключ", Элемент);



//Но нам не надо открывать новую форму (окно) для изменяемого документа, а

//Нам надо все изменения показать в уже открытых у клиента окнах

Окна = ПолучитьОкна();

Для каждого Окно из Окна Цикл



//Окно изменяемого документа будет точно не основным, а вспомогательным, поэтому

//сразу пропускаем основное окно, а далее идем на не очень хороший способ поиска открытого окна

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

//Наименование, номер и дата нужного документа - будем изменять

Если НЕ Окно.Основное

И Найти(Окно.Заголовок, Элемент) Тогда

//Передадим ключ поиска (можно сказать ссылку на объект) и данные о найденном открытом окне

//в функцию ОткрытьФорму()

//Код находится в цикле на тот случай, если открытых окон изменяемого документа больше одного

Форма = ОткрытьФорму("Документ.ПоступлениеТоваровУслуг.Форма.ФормаДокумента",КлючПоиска,,,Окно);



//Далее мы получаем объект только, что повторно открытой формы и помещаем её в переменную

//В объекте содержатся все реквизиты (элементы) формы

НовыйОбъект = Форма.Объект;



//Мы помещаем объект формы в переменную,

//так как должны передать её в процедуру на сервере,

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

ЗаполнитьОбъект(НовыйОбъект,ЦенаДляУстановки);

ТоварыЦенаПриИзменении(НовыйОбъект);



//После выполнения процедуры на сервере мы получаем изменную переменную НовыйОбъект,

//которую необходимо передать в уже полученную нами форму

КопироватьДанныеФормы(НовыйОбъект, Форма.Объект);



КонецЕсли;

КонецЦикла;



КонецЦикла;

КонецЕсли;

КонецЕсли;





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