Имя: Пароль:
1C
1С v8
Программное заполнение табличной части документа
,
0 pavel1982
 
23.03.18
16:01
Здравствуйте. Подскажите как справиться с такой задачей. 1С 8.3 управляемые формы конф ЗУП 3.0. Пишу обработку, которая загружает некоторые данные в документ(список сотрудников в документ Премия в данном случае).
1. Как сделать это более правильно - программным заполнением реквизитов самого документа или программным заполнением реквизитов формы или программным заполнением элементов формы? Первый и второй способ в принципе работает, все заполняется, но в таких случаях не срабатывают обработчики событий, которые срабатывают в случае интерактивного ввода строк таблицы. Нет уверенности что эти обработчики не меняют что то, что важно для дальнейшей логики работы программы.
2. Не пойму как заполнить строки таблицы по 3 варианту.

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

После этого открывается документ нужный - форма и есть добавленная строка, просит сохранить при закрытии. А как в эту строку что то внести? Спасибо
1 xxTANATORxx
 
23.03.18
16:25
(0)после заполнения предполагается открытие формы?
2 xxTANATORxx
 
23.03.18
16:25
(1)+ и нужно ли открывать форму?
3 Alexandr_U1982
 
23.03.18
16:27
НоваяСтрока = Форма.Объект.Начисления.ДобавитьСтроку();
НоваяСтрока.Сотрудник = Сотрудник;
4 pavel1982
 
23.03.18
17:02
1. Открытие формы не обязательно. Нет никаких спец требований. Кроме того, что в итоге документ должен быть полностью эквивалентен как если бы его заполняли вручную.

2. Alexandr_U1982: Этот вариант работает. Только функция Добавить() вместо ДобавитьСтроку(); Вот так работает

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

Только пара ньюансов. Работает только если есть Форма.Открыть(); иначе документ пустой. Это в принципе и понятно. Но главное что после отработки кода когда заполнено естественно только сотрудник, а если сотрудника вводить интерактивно, автоматом заполняется еще и подразделение. Подразделение то заполнить тоже не сложно, но где уверенность что не работают еще какие то важные обработчики?
5 pavel1982
 
23.03.18
17:06
Вопрос как программно при заполнении полностью сымитировать интерактивный ввод? Не очень то и охота с элементами управления возиться, а есть ли другой выход? В конфигураторе смотришь - что в документе Премия что в его форме кроме той ТЧ что видно еще куча ТЧ, реквизитов и еще много чего. При интерактивном вводе все заполниться как задумано в логике работы дока.
6 Alexandr_U1982
 
23.03.18
17:14
(5)Если бы процедуры в модуле формы были экспортными, то их можно было бы вызвать через переменную "Форма". Остается только посмотреть код в форме документа и перенести его в свою обработку.
7 Alexandr_U1982
 
23.03.18
17:15
(4)Конечно же "Добавить()", а не "ДобавитьСтроку()")))
"ДобавитьСтроку()" скопировал из 0.
8 Alexandr_U1982
 
23.03.18
17:20
А вообще в ЗУП 3.1 включена стандартная подсистема "Загрузка данных из файла".
http://its.1c.ru/db/bsp245doc#content:33:1

Можно ее подключить к документу "Премия" и использовать для загрузки данных. Правда для этого придется снимать конфу с поддержки и вносить изменения в модуль формы и модуль менеджера.
9 xxTANATORxx
 
23.03.18
17:21
(4)создавай объект, заполняй, анализируй обработчики формы, переноси нужные алгоритмы в свою обработку. С открытием формы и вызовом обработчиков вообще не связывайся
10 xxTANATORxx
 
23.03.18
17:22
(9)+ посмотри мошт можно использовать обработку заполнения, подсунуть ей структуру
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс