helpf.pro
Регистрация

v8.2 УП: Табличный документ, ввод данных и управляемые формы

IKSparrow
16.07.2013 09:29Прочитано: 11899
Не могу найти пример вот какого рода - нужно сделать документ, у которого ввод данных будет осуществляться в подготовленный макет. Всё это будет происходить в управляемых формах.
Собственно интересует пример с нуля. Как это, примерно, сделано с регламентированной отчётностью в бухгалтерии. Как на зло нет ни одной штатной конфы с таким механизмом, чтобы посмотреть.
Может кто-нибудь разжуёт подробно?
Yandex
Возможно, вас также заинтересует
Реклама на портале
E_Migachev
16.07.2013 10:45Ответ № 1
(0) IKSparrow, делал такое недавно, вот посмотри эту обработку - Скачивать файлы может только зарегистрированный пользователь!

Принцип такой:
1. создаешь макет
2. добавляешь на форму поле табличного документа
3. выводишь его кодом:
Код 1C v 8.2 УП
           
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ВывестиМакет(ТД);
КонецПроцедуры

&НаСервере
Процедура ВывестиМакет(ТД)
Макет = Обработки.ОбработкаВводБланкЗаказа.ПолучитьМакет("Макет");
ТД.Вывести(Макет);

//Если ДокумБланк заполнен, то это песать бланка
ТекДок = Объект.ДокументБланк;
Если ЗначениеЗаполнено(ТекДок) Тогда
тд.Области.Клиент.Значение = ТекДок.Клиент;
тд.Области.DS.Значение = ТекДок.DS;
ТД.Области.КодА.Значение = ?(СокрЛП(ТекДок.Агент.Артикул)="","**",СокрЛП(ТекДок.Агент.Артикул));
ТД.Области.КодЛ.Значение = ?(СокрЛП(ТекДок.Учреждение.Код)="","***",СокрЛП(ТекДок.Учреждение.Код));
ТД.Области.КодВ.Значение = ?(СокрЛП(ТекДок.Врач.Артикул)="","***",СокрЛП(ТекДок.Врач.Артикул));
КонецЕсли;
КонецПроцедуры


4. события обработки выбора и изменения табличного документа
Код 1C v 8.2 УП
 &НаКлиенте
Процедура ТДВыбор(Элемент, Область, СтандартнаяОбработка)
Перем ВыбЭлемент;
Если Область.Имя = "Клиент" Тогда
СтандартнаяОбработка = Истина;
////ФормаВыбораКлиента=Справочники.Клиенты.ПолучитьФормуВыбора();
////ФормаВыбораКлиента.Открыть();
ИначеЕсли Область.Имя = "ДатаРождения" Тогда
//ФормаВводаВозраста = Обработки.ВводВозраста.ПолучитьФорму("Форма",ЭтаФорма);
//ФормаВводаВозраста.Открыть();
ИначеЕсли Лев(Область.Имя,3) = "Доп" Тогда
СтандартнаяОбработка = Ложь;
Если ВвестиЗначение(ВыбЭлемент,,Тип("СправочникСсылка.Исследования")) Тогда
//Область.Расшифровка = ВыбЭлемент;
Область.Значение = ВыбЭлемент;//?(ЗначениеЗаполнено(ВыбЭлемент.ПолНаименование),ВыбЭлемент.ПолНаименование,ВыбЭлемент.Наименование);
ЦенаИсследования = 123;//ОбщегоНазначенияСервер.ПоказатьЦенуИсследования(ВыбЭлемент, Объект.ТипЦен, Объект.ДатаЦен, Объект.Автор);
ТД.Область(Лев(Область.Имя,3)+"Цена"+Прав(Область.Имя,1)).Значение = ЦенаИсследования;
ВыбЭлементКод = КодИсследования(ВыбЭлемент);
ТД.Область(Лев(Область.Имя,3)+"Код"+Прав(Область.Имя,1)).Значение = ВыбЭлементКод;
НоваяСтрока = ТаблицаИсследований.Добавить();
НоваяСтрока.Код = ВыбЭлементКод;
НоваяСтрока.Наименование = ВыбЭлемент;
//НоваяСтрока.Срок = ВыбЭлемент.ДнейВыполнения;
НоваяСтрока.Цена = ЦенаИсследования;
КонецЕсли;
Иначе
Попытка
КодПоиска = Число(Сред(Область.Имя,2));
Исключение
КодПоиска = Неопределено;
КонецПопытки;
Если КодПоиска <> Неопределено Тогда
НайденыйЭлемен = НайтиИсследование(КодПоиска);
Если НайденыйЭлемен = ПредопределенноеЗначение("Справочник.Исследования.ПустаяСсылка") Тогда
Предупреждение("Нет исследования с таким кодом!");
ИначеЕсли Область.Значение = 0 Тогда
ЦенаИсследования = 123;//ОбщегоНазначенияСервер.ПоказатьЦенуИсследования(НайденыйЭлемен, Объект.ТипЦен, Объект.ДатаЦен, Объект.Автор);
Область.Значение = ЦенаИсследования;
если ЦенаИсследования>0 тогда
НоваяСтрока = ТаблицаИсследований.Добавить();
НоваяСтрока.Код = КодПоиска;
НоваяСтрока.Наименование = НайденыйЭлемен;
//НоваяСтрока.Срок = НайденыйЭлемен.ДнейВыполнения;
НоваяСтрока.Цена = ЦенаИсследования;
конецЕсли;
Иначе
// Область.Значение = 0;
// НайденнаяСтрока = ТаблицаИсследований.Найти(НайденыйЭлемен.Код,"Код");
// ТаблицаИсследований.Удалить(НайденнаяСтрока);
КонецЕсли;
КонецЕсли;
КонецЕсли;

//Расчет Итоговой суммы
ТД.Области.ВСЕГО.Значение = "Без скидки: " + Строка(СуммуБланка(Истина))+" руб.";
ТД.Области.СКИДКА.Значение = "Скидка: " + Строка(СуммуБланка(Истина)-СуммуБланка())+" руб.";
ТД.Области.ИТОГО.Значение = Строка(СуммуБланка())+" руб.";
ТД.Области.Прописью.Значение = СформироватьСуммуПрописью(СуммуБланка());


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

&НаКлиенте
Процедура ТДПриИзмененииСодержимогоОбласти(Элемент, Область)
Если Тип("Строка") = ТипЗнч(Область) Тогда
ОбластьИмя = Область;
Иначе
ОбластьИмя = "R" + Область.Верх + "C" + Область.Лево;
КонецЕсли;
Если ОбластьИмя = "R9C3" Тогда
ТД.Области.ДатаРождения.Значение = ПолучитьДанныеОбъекта(ТД.Области.Клиент.Значение, "ДатаРождения");
ТД.Области.Пол.Значение = ПолучитьДанныеОбъекта(ТД.Области.Клиент.Значение, "Пол");
ТД.Области.Телефон.Значение = ПолучитьДанныеОбъекта(ТД.Области.Клиент.Значение, "Сотовый");
ИначеЕсли ОбластьИмя = "R1C30" Тогда
ИскКод = ТД.Области.КодВ.Значение;
ПолученыйКодВ = Лев(СокрЛП(ИскКод),?(Найти(ИскКод,"/")=0,СтрДлина(СокрЛП(ИскКод)),Найти(ИскКод,"/")-1));
НайдЭлем = НайтиДанныеОбъектаАртикул("Врачи", ПолученыйКодВ);
НайдЭлемАген = ПолучитьДанныеОбъекта(НайдЭлем, "Агент");
НайдЭлемАгенКод = ПолучитьДанныеОбъекта(НайдЭлемАген, "Артикул");
НайдЭлемАгенМестоРаботы =ПолучитьДанныеОбъекта(НайдЭлем, "МестоРаботы");
НайдЭлемАгенМестоРаботыКод =ПолучитьДанныеОбъекта(НайдЭлемАгенМестоРаботы, "Код");
Если (НайдЭлемАгенКод <> ТД.Области.КодА.Значение) ИЛИ (НайдЭлемАгенМестоРаботыКод <> ТД.Области.КодЛ.Значение) Тогда
Если Вопрос("Агент и(или) ЛПУ выбраны не верно!
|Заполнить автоматически?",РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да Тогда
ТД.Области.КодА.Значение = НайдЭлемАгенКод;
ТД.Области.КодЛ.Значение = НайдЭлемАгенМестоРаботыКод;
КонецЕсли;
КонецЕсли;

Если НЕ ЗначениеЗаполнено(Объект.МестоЗабора) тогда
Объект.МестоЗабора=ПолучитьДанныеОбъекта(НайдЭлемАгенМестоРаботы, "МестоЗабора");
КонецЕсли;
ИначеЕсли ОбластьИмя = "R1C28" Тогда

КонецЕсли;
КонецПроцедуры
IKSparrow
16.07.2013 11:46Ответ № 2
(1) Вот спасибо! То, что нужно!
А ещё вопрос - у меня же это на форме документа располагаться будет. И мне надо сохранять содержимое ТД и восстанавливать при открытии документа. Это как лучше организовать?
IKSparrow
16.07.2013 14:31Ответ № 3
Попробовал так. Но вот не восстанавливается значение.
Хотя исправно пишется. Что делаю не так?

Код 1C v 8.2 УП
 
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если ЭтоНовый() Тогда
ВывестиМакет(ТД);
Иначе
ПолучитьМакет(ТД);
КонецЕсли;
КонецПроцедуры


&НаСервере
Функция ЭтоНовый()
Возврат НЕ ЗначениеЗаполнено(Объект.Ссылка);
КонецФункции

&НаСервере
Процедура ВывестиМакет(ТД)
Макет = Документы.ЗаявлениеОРегистрацииККТ.ПолучитьМакет("Макет");
ТД.Вывести(Макет);

//ТекДок = Объект.ДокументБланк;
//Если ЗначениеЗаполнено(ТекДок) Тогда
// тд.Области.Клиент.Значение = ТекДок.Клиент;
// тд.Области.DS.Значение = ТекДок.DS;
// ТД.Области.КодА.Значение = ?(СокрЛП(ТекДок.Агент.Артикул)="","**",СокрЛП(ТекДок.Агент.Артикул));
// ТД.Области.КодЛ.Значение = ?(СокрЛП(ТекДок.Учреждение.Код)="","***",СокрЛП(ТекДок.Учреждение.Код));
// ТД.Области.КодВ.Значение = ?(СокрЛП(ТекДок.Врач.Артикул)="","***",СокрЛП(ТекДок.Врач.Артикул));
//КонецЕсли;
КонецПроцедуры

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

&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
СохранитьМакет(ТД);
КонецПроцедуры

&НаСервере
Процедура СохранитьМакет(ТД)
РеквизитыОбъекта = РеквизитФормыВЗначение("Объект");
РеквизитыОбъекта.ХранилищеТД = Новый ХранилищеЗначения(ТД);
КонецПроцедуры
dolgopa
02.10.2019 09:50Ответ № 4

Спасибо, нужный пример.

Подсказка: Для редактирования своего ответа щелкните по значку (справа)
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.