1c пример за външна обработка на попълване на таблични части. Създаване на външна обработка

В тази статия ще разгледаме процеса на писане на най-простата външна обработка за попълване на табличната част 1C 8за конфигурации, използващи обикновено приложение. Вземете например следната задача: „В конфигурацията 1C:Счетоводство 2.0създаване на външна обработка за попълване на раздела на таблицата Стокидокумент Продажба на стоки и услуги, данните за попълване се вземат от табличния раздел Стокидокумент Получаване на стоки и услуги" По този начин трябва да попълним артикулите за продажба въз основа на получените стоки; тази задача е доста често срещана в реалната практика на 1C програмист.

2. Създайте външна обработка

Хайде да отидем до 1C 8в режим Конфигуратор. Използване на менюто Файл -> Новили пиктограми нов документнека създадем нов външна обработка.

В полето Имепосочете: „Най-простото попълване на табличната част“ и запазете външната обработка на твърдия диск, като използвате менюто Файл -> Запазванеили пиктограма Запазванеили клавишна комбинация Ctrl+S.

Избор на клон Реквизитив дървото с метаданни за обработка и щракнете върху бутона Добавете(бутон със зелен плюс) създайте нов атрибут за външна обработка - Разписки за документи, изберете вид за него DocumentLink. Получаване на стоки и услуги, имаме нужда от този атрибут, за да изберем документ Получаване на стоки и услуги, въз основа на които ще се попълва изпълнението.

За да изберем документ за получаване, ще ни е необходим отделен формуляр. Избор на клон Формии използвайки същия бутон - ДобаветеНека създадем форма за външна обработка. Ще се отвори прозорецът на дизайнера на формуляри; не е необходимо да правите промени на първата страница на дизайнера, така че просто щракнете върху бутона По-нататък.

На втората страница на дизайнера трябва да изберем реквизита Разписки за документи(така че да се появи на създадения формуляр) и натиснете бутона Готов.

След това създаденият формуляр ще се отвори, трябва потребителят да избере документа за разписка върху него и да го затвори. Така че, когато натиснете бутона ИзпълниФормата трябва просто да се затвори. За да реализирате това, изберете бутона Изпълни, щракнете с десния бутон върху него и изберете Имоти. В свойствата на бутона, в реда Действиеизберете действие - Близо. Това завършва работата с формата, нека я затворим.

3. Програмиране

Нека започнем да програмираме обработката на попълване на табличната част. Хайде да отидем до Обектен модулвъншна обработка (на долния панел за обработка има бутон Действия -> Отваряне на обектен модул).

В него трябва да създадем процедура за експортиране Инициализиране.

Процедура Инициализиране Експортиране EndProcedure

забележи, че процедура Инициализиране, както и всички негови параметри, са задължителни за външна обработка на попълване на табличната част, ако не го създадете или не посочите всички параметри, вашата обработка просто няма да работи.

Сега нека започнем да пишем програмен код. Първо, нека създадем променлива за табличната част на документа Продажба на стоки и услугикоито ще попълним.

TabularPart = Обект [TabularPartName];

При изпълнение на процедура в параметър Предметще съдържа обекта на документа, който попълваме, и параметъра TabularPartNameред с името на табличната част, която попълваме. По този начин този ред код получава табличната част на документа, която се попълва от неговото име.

Необходимо е потребителят да избере документ Получаване на стоки и услуги, така че нека напишем кода за отваряне на формуляра за избор на документ. Първо, нека преведем тази форма в променлива, използвайки метода на външна обработка GetForm(<Форма>, <Владелец>, <КлючУникальности>) . Просто трябва да попълним първия параметър на този метод, като подадем там низ с името на нашата форма.

ReceiptSelectionForm = GetForm("Формуляр");

Сега нека отворим получения формуляр с помощта на модално отваряне (докато формулярът е отворен, всички останали 1C прозорци са недостъпни), тъй като с този метод на отваряне нашият допълнителен код в процедурата Инициализираненяма да се изпълни, докато потребителят не затвори формуляра.

ReceiptSelectionForm.OpenModal();

След като потребителят затвори формата, трябва да проверим дали данните са попълнени Разписки за документи(в случай че документът за получаване не е избран). Ако след проверка Разписки за документие празен, тогава по-нататъшната обработка няма смисъл и трябва да бъде прекратена.

If NOT ValueFilled(ReceiptDocument) Then Report(); Връщане ; EndIf ;

За да проверите дали подробностите са пълни, тук се използва функцията за глобален контекст ValueFilled(<Значение>) , той проверява дали стойността, предадена в параметъра, се различава от стойността по подразбиране от същия тип. Процедура Докладвампоказва посочения текст в прозореца на съобщението на 1C 8 Връщанепрекъсва изпълнението на процедурата.

Нека започнем да пишем заявка, която ще избере данни от табличния раздел Стокидокумент Получаване на стоки и услуги. Нека създадем нова заявка:

Заявка = Нова заявка;

Request.SetParameter( "Получавания на документи",Документ за получаване);

Нека напишем текста на заявката и да го направим с помощта на Конструктор на заявки. Не се препоръчва да пишете текста на заявката ръчно, това е неефективно и отнема много време. Първо, нека напишем реда:

Request.Text = "" ;

Поставете курсора между кавичките, натиснете десния бутон на мишката и изберете елемента Конструктор на заявки.... След това ще бъдете подканени да създадете нова заявка, щракнете върху бутона „OK“. Ще се отвори прозорецът на дизайнера, от лявата страна има всички налични таблици на база данни, имаме нужда от документ Получаване на стоки и услуги. Нека го намерим и разширим с помощта на символа „+“, изберете табличната част Стокии го плъзнете до втората част на екрана на дизайнера, която се извиква Маси(Можете също да преместите желаната таблица с помощта на бутона “>”).

Сега нека разширим избраната от нас таблица с „+“( Получаване на СтокиУслугиСтоки) и плъзнете полетата, необходими за нашето таблично попълване в третата част на екрана на дизайнера, която се нарича - Полета. Няма да избираме всички налични полета; ще се ограничим до следния набор: Номенклатура, Количество, Цена, Сума, Ставка на ДДС, Размер на ДДС.

Тъй като се нуждаем от данните само на един документ за разписка (който избрахме преди да започнем попълването), тогава в раздела „Условия“ ще наложим условие за връзката на документа, като използваме параметъра, който сме предали.

Създаването на текста на заявката в дизайнера е завършено; щракнете върху бутона „OK“. В резултат на това получихме следния текст на заявката:

Query.Text = "ИЗБЕРЕТЕ |ОТ |КЪДЕ ;

Създадената заявка просто трябва да бъде изпълнена и качена в променлива:

Резултат = Request.Run().Upload();

В променлива Резултатсе съхранява таблица със стойности с редове от табличната част Стокидокумента, който сме избрали Получаване на стоки и услуги. Сега можете да започнете да попълвате табличната част Стокинашето изпълнение. Но преди да попълните данните, трябва да ги изчистите, в случай че там вече има редове.

TablePart.Clear();

Използване на цикъл За всекиНека да преминем през таблицата със стойности с резултатите от заявката.

За всеки резултатен елемент от резултатен цикъл EndCycle;

В този цикъл ще създадем и попълним редовете на табличната част на документа Продажба на стоки и услуги. Можем да създадем нов ред с помощта на променлива TabularPart, чрез който можете да извършвате всякакви действия с него.

NewRowTC = TabularPart.Add();

Нека попълним създадения ред в таблицата. части от данните от низа с резултат от заявката, използвайки процедурата Глобален контекст - Попълнете PropertyValues(<Приемник>, <Источник>) .

FillPropertyValues(NewRowTC, ResultElement);

Но данните, които попълнихме, не са достатъчни, за да бъде обработен документът, трябва да попълним още т. счетоводни сметки. За да направим това, ще използваме експорта

процедура Попълнете AccountingInLineTabPartsот модул обект на документ Продажба на стоки и услуги. Нека го извикаме с помощта на параметъра Предмет(трябва да се отбележи

че можем само да се обадим износпроцедури от модула обект на документ).

Object.FillAccountingInLineTabPart(NewRowTCH, TabularPartName, True);

Това завършва програмирането на попълване на табличната част за 1C 8завършен. Може да се използва обработка. Пълен текст на процедурата Инициализиране, изглежда така:

Процедура Инициализиране (Обект, TablePartName = Недефинирано, ObjectTableField = Недефинирано) Експортиране TabularPart = Обект [TabularPartName]; ReceiptSelectionForm = GetForm("Формуляр"); ReceiptSelectionForm.OpenModal(); Ако НЕ е ValueFilled(ReceiptDocument), тогава докладвайте ( „Документът за получаване не е избран“); Връщане ; EndIf ; Заявка = Нова заявка; Request.SetParameter( "Получавания на документи",Документ за получаване); Query.Text = "ИЗБЕРЕТЕ | Номенклатура за получаване на стоки и услуги. | Получаване на стоки и услуги Стоки. | Ставка на ДДС при получаване на стоки и услуги. | Получаване на стоки и услуги Стоки,. | Получаване на стоки и услуги Стоки Сума на ДДС,. | Получаване на стоки и услуги Стоки| ОТ | Документ. Получаване на стоки и услуги. КАК Получаване на стоки и услуги|КЪДЕ | Получаване на GoodsServicesProducts.Link = &DocumentReceipts"; Резултат = Request.Run().Upload(); TablePart.Clear(); За всеки резултатен елемент от резултатен цикъл NewRowTC = TabularPart.Add(); FillPropertyValues(NewRowTC, ResultElement); Object.FillAccountingInLineTabPart(NewRowTCH, TabularPartName, True); Краен цикъл; EndProcedure

Следващата част от статията ще ви каже как да отстраните грешките при обработката на попълването на табличната част и как да я свържете с документа.

4. Отстраняване на грешки

Доста често трябва да дебъгвате кода, който пишете. За да се коригира обработката на попълване на табличната част 1C 8нека създадем подпори за нея Обектна справкаТип DocumentLink Продажби на стоки и услуги

Нужен ни е, за да изберем документа за внедряване, който ще попълним по време на отстраняване на грешки. След това трябва да създадете формуляр за отстраняване на грешки и да поставите създадените атрибути там Обектна справка, процесът на създаване на формуляр за отстраняване на грешки не се различава от създаването на формуляр за избор на документ за получаване, така че няма да се спираме подробно на него.

След като формулярът е създаден, нека преминем към неговия модул. Там ще намерим автоматично създадена процедура ButtonExecutePress. Тази процедура се изпълнява при натискане на бутона Изпълни. Нека извикаме процедура от него Инициализиране, който се намира в модула за обработка, ще предадем обекта документ към параметрите Продажба на стоки и услуги(което ще получим от реквизита Обектна справка) и ред с името на табличната част за попълване (в нашия случай Стоки).

Процедура ButtonExecutePress(Button) Initialize(Ref.Object.GetObject(), "Продукти"); EndProcedure

Сега трябва да направите създадения формуляр основен формуляр за обработка. За да направите това, изберете го в полето „Формуляр за обработка“.

Сега можете да зададете точка на прекъсване на желаното място в процедурата Инициализиранеили процедури ButtonExecutePressотстраняване на грешки във формуляри и стартиране на обработка на попълване на табличната част в режим на отстраняване на грешки 1C: Предприятия.

5. Свържете се с документ

След като обработката на попълване е написана и отстранена грешка, трябва да я свържете с документа, от който ще бъде изпълнена. За да направите това, нека отидем на 1C 8в режим Компания, да отидем в менюто Услуга -> Допълнителни отчети и обработка -> Допълнителна външна обработка на таблични частии добавете нов елемент на директория. С помощта на бутона Замяна на външен файл за обработкаНека добавим файла за обработка на запълването на табличната част, която създадохме.

Нека попълним аксесоара за обработка с помощта на бутона Изборизберете документ Продажба на стоки и услуги

И посочваме, че пълнежът е предназначен за табличната част Стоки.

Натисни бутона Добреи това е всичко, обработката на пълнене ще бъде достъпна в менюто Напълнететаблична част Стокидокумент Продажба на стоки и услуги. Можете да изтеглите обработката, използвана за този пример, в долната част на статията.

За отчитане на пари и стоки в бизнеса широко се използват различни таблици. Почти всеки документ е таблица.

Една таблица изброява стоките, които трябва да бъдат изпратени от склада. Друга таблица показва задълженията за плащане на тези стоки.

Следователно в 1C работата с таблици заема видно място.

Таблиците в 1C се наричат ​​още „таблични части“. Справочници, документи и други ги има.

Когато се изпълни, заявката връща таблица, която може да бъде достъпна по два различни начина.

Първият - по-бърз - избор, получаването на редове от него е възможно само по ред. Второто е качване на резултата от заявката в таблица със стойности и след това произволен достъп до нея.

//Вариант 1 – последователен достъп до резултатите от заявката

//вземете таблицата
Изберете = Query.Run().Select();
// преминаваме по ред през всички редове на резултата от заявката
Докато Select.Next() цикъл
Доклад(Име на селекция);
EndCycle;

//Вариант 2 – качване в таблица със стойности
Заявка = Нова заявка ("ИЗБЕРЕТЕ име ОТ Директория. Номенклатура");
//вземете таблицата
Таблица = Query.Run().Unload().
//по-нататък можем също да итерираме през всички редове
За всеки ред от цикъла на таблицата
Доклад(Име на низ);
EndCycle;
//или произволен достъп до низове
Ред = Table.Find("Лопата", "Име");

Важна особеност е, че в таблицата, която се получава от резултата от заявката, всички колони ще бъдат строго типизирани. Това означава, че като поискате полето Name от директорията Nomenclature, ще получите колона от типа String с допустима дължина не повече от N знака.

Таблица във формуляра (дебел клиент)

Потребителят работи с таблицата, когато е поставена във формата.

Обсъдихме основните принципи на работа с формуляри в урока по и в урока по

И така, нека поставим таблицата върху формуляра. За да направите това, можете да плъзнете таблицата от контролния панел. По същия начин можете да изберете контрола Form/Insert от менюто.

Данните могат да се съхраняват в конфигурацията - тогава трябва да изберете съществуващата (предварително добавена) таблична част от конфигурационния обект, чиято форма редактирате.

Щракнете върху бутона "..." в свойството Данни. За да видите списъка с таблични части, трябва да разгънете клона Обект.

Когато изберете табличната част, 1C сам ще добави колони към таблицата във формуляра. Редовете, въведени от потребителя в такава таблица, ще бъдат запазени автоматично заедно със справочника/документа.

В същото свойство на данни можете да въведете произволно име и да изберете типа таблица със стойности.

Това означава, че е избрана произволна таблица със стойности. Няма да добавя автоматично колони, нито ще се запазва автоматично, но можете да правите каквото искате с него.

Като щракнете с десния бутон върху таблицата, можете да добавите колона. В свойствата на колона можете да посочите нейното име (за справка в 1C кода), заглавието на колоната във формуляра, връзката с атрибута на табличната част (последното - ако не е избрана произволна таблица, а таблична част).

В свойствата на таблицата във формуляра можете да посочите дали потребителят може да добавя/изтрива редове. По-разширена форма е квадратчето за отметка „Само преглед“. Тези свойства са удобни за използване за организиране на таблици, предназначени за показване на информация, но не и за редактиране.

За да управлявате таблицата, трябва да покажете команден панел във формата. Изберете елемента от менюто Form/Insert Control/Command Bar.

В свойствата на командната лента поставете отметка в квадратчето за автоматично попълване, така че бутоните на панела да се показват автоматично.

Таблица във формуляр (тънък/управляван клиент)

В управлявана форма тези действия изглеждат малко по-различно. Ако трябва да поставите таблична част във формуляра, разгънете клона Обект и плъзнете една от табличните части наляво. Това е всичко!

Ако трябва да поставите таблица със стойности, добавете нов атрибут на форма и в свойствата му посочете типа – таблица със стойности.

За да добавите колони, използвайте менюто с десен бутон върху този атрибут на формуляр, изберете Добавяне на колона на атрибут.

След това също плъзнете таблицата наляво.

За да има таблица с командна лента, в свойствата на таблицата изберете стойностите в секцията Използване – Позиция на командната лента.

Качване на таблица в Excel

Всяка таблица 1C, разположена във формуляра, може да бъде отпечатана или качена в Excel.

За да направите това, щракнете с десния бутон върху празно място в таблицата и изберете Списък.

В управляван (тънък) клиент подобни действия могат да се извършват с помощта на елемента от менюто Всички действия/Списък за показване.

Здравей отново.

По-рано говорих за създаване на външен печатен формуляр в управлявано приложение, използвайки примера на конфигурацията за заплати и управление на персонала 3.0, сега искам да ви кажа как да създадете обработка за попълване на таблични части в управляван интерфейс.

защото Вече сме приблизително запознати с основите на инициализацията, няма да се фокусирам върху това, ако сте забравили нещо, вижте. Разбира се, ще има малки разлики, но на първо място.

Например, нека вземем един прост проблем:

Имаме конфигурация 1C Enterprise Accounting във версия 3.0
съдържа документа Отчет за изплащане на заплати в касата
Този документ може да се попълни с всичко начислено на служители с селекция за избраното направление, но при плащане на аванс все още няма начисления и трябва да го попълните ръчно. Базата данни обаче има място за съхранение на планирани начисления и е напълно възможно да се организира попълването на документа като процент от заплатата. Разбира се, няма график за анализиране на дела на отработеното време, но само малки офиси поддържат заплати в 1C Accounting и тогава коригирането на два реда от дори петдесет не е проблем.

Задачата е ясна, документът ще има команда за попълване, която ще отвори диалог за въвеждане на процент, след което документът ще бъде попълнен.

Да започваме!

Нека създадем нова обработка и да й дадем име. В полето за формуляр за обработка щракнете върху „обектив“, като по този начин създадете формуляр.

Сега нека временно напуснем формуляра и да преминем към модула за обработка. Нека напишем в него функцията GetCommandTable() и процедурата AddCommand(CommandTable, View, Identifier, Usage, ShowAlert = False, Modifier = ""). Техният текст ще намерите в предишната статия.

Сега пишем експортната функция InformationInExternalProcessing(). Ето текста му:

Функция InformationOnExternalProcessing() Експортиране
Параметри за регистрация = Нова структура;
ArrayDestinations = Нов масив;
Array of Assignments.Add("Документ. Справка за изплащане на заплати в каса");
Параметри за регистрация.Insert("Изглед","Попълване на обект");
Параметри за регистрация. Вмъкване ("Дестинация", масив от дестинация);
Параметри за регистрация.Insert("Версия", "1.0");
Parameters.Insert("Име", "Попълнете предварително"+Parameters.Version);
Параметри за регистрация.Insert("SafeMode", False);
Parameters.Insert("Информация", "Допълнителна обработка на табличната част на документа Извлечение за изплащане на заплати в каса");
CommandTable = GetCommandTable();
AddCommand(CommandTable,

"Попълнете предварително"+Регистрационни параметри.Версия,
„Отваряне на формуляр“, вярно);
Параметри за регистрация.Insert("Команди", CommandTable);
ReturnRegistrationParameters;
EndFunction

Задайте "дестинация" на документа " Отчет за изплащане на заплати в касата". Вид обработка "FillingObject".Използване - "OpenForm". Нямаме нужда от безопасен режим.

Разликите от печатната форма са минимални. Сега да се върнем във форма.

На теория параметрите на формуляра ще съдържат обекти, които трябва да бъдат попълнени. Можете да ги получите чрез достъп до свойството „Обекти на местоназначение“. На теория може да има много от тях, т.к командата за попълване ще се появи не само във формуляра на документа, но и във формуляра на списъка и там е наличен многократен избор. Собственик на формата е и прозорецът, в който се натиска бутонът „попълване“. Това може да бъде форма на документ или форма на списък.

Това е теория, на практика не е необходимо клиентът да попълва три формуляра за авансово плащане наведнъж :)) следователно в нашия пример от формата за списък обработката ни ще се провали с грешка. Не ви насърчавам да правите това, просто основното в статията е да предадете същността, а основното за клиента е резултатът.

И така, разбрахме се, че винаги има един списък и натискаме бутона в документа, а не в списъка. Завършете сами случая на изстискване от списъка))

Във формуляра ще ни трябват подробностите: „изявление“ и „процент“

Нуждаем се и от командата "Попълване". Плъзнете атрибута „процент“ и командата „попълване“ във формуляра.

Добавяме манипулатор „CreateOnServer“ към формуляра и пишем там, за да получим обект за попълване.

&На сървъра
Процедура при създаване на сървър (неуспех, стандартна обработка)
Ако Parameters.Property("Destination Objects") тогава
Изявление = Parameters.AssignmentObjects;
endIf;
EndProcedure

Всъщност, тук е флаг в ръцете ви и анализирайте броя на прехвърлените обекти)), ако искате, разбира се.

В манипулатора "When CreatedOnServer" имаме масив от връзки. Имаме и гаранция, че обектът е заснет преди попълване. Ако документът е променен, ще ни бъде предложено да го запишем преди да го попълним или да откажем да го попълним. Не ми харесва, защото... Всяко зареждане изисква запис, но какво ще стане, ако не е необходимо да записваме? Доброто подпълване трябва да работи с данни от формуляри, а не с данни за писмен обект. но за да отмените контрола на модификацията, трябва да премахнете конфигурацията от поддръжката и да коментирате тази проверка. Поради цялото това объркване ние сме на кръстопът: можем да модифицираме обект в базата данни и след това да актуализираме формуляра (препрочитаме данните в него) или можем да модифицираме данните на формуляра, който в нашия контекст е собственикът на формуляра за обработка.

Вероятно би било правилно да направите това:

Когато създавате формуляр за обработка на сървъра, анализирайте откъде се стартира обработката: от списък или от формуляр на документ. Ако от списъка, тогава работим с базата данни, ако от формуляра на документа, тогава работим със собственика на формуляра за обработка.

При първия вариант (когато работим с обект в базата данни) ще трябва да го запишем след изпълнение, което не винаги е приемливо. Това не ни позволява да погледнем резултата от пълненето и да го откажем. Но във формата на списък няма други опции.

Като цяло, анализирането на източника за стартиране на команда ни принуждава да напишем две различни процедури за попълване, защото един на сървъра, а другият на клиента.

Но, както вече казах, пропуснах опцията за отваряне от формуляр със списък, така че работя с данни от формуляр. От това следва, че напразно написах подробностите за формуляра „изявление“ и манипулатора „when CreatedOnServer“)))

Ето действителната процедура за пълнене:

&На клиент

Процедура Попълване (Команда)
m = GetData(FormOwner.Object.RegistrationPeriod);
FormOwner.Object.Salary.Clear();
FormOwner.Object.PaymentMethod = PaymentMethod();
За всеки ред от данни от m цикъл
DocumentStr = FormOwner.Object.Salary.Add();
Documentstr.Employee = Datastring.Employee;
Documentstr.Department = Datastring.Department;
Documentstr.KPayment = Datastring.Size / 100 * Процент;
EndCycle;
ThisForm.Close();
EndProcedure

Първият ред съдържа целия смисъл на тази статия. Ние осъществяваме достъп до данните на формуляра чрез конструкцията FormOwner.Object. От него се обръщаме към табличната част и към заглавката, четем и пишем.

Процедурата “GetData()” се изпълнява на сървъра и събира сумите за попълване според планираните начисления. защото Таблиците със стойности не могат да се прехвърлят от сървъра към клиента; използвам масив от структури.

Ето текста на процедурата за събиране на данни:

&На сървъра
Функция GetData(Точка)
Заявка = Нова заявка ("ИЗБЕРЕТЕ
|PlannedAccrualsCut to Latest.Employee,
|PlannedAccrualsCut of Latest.Individual,
| История на персонала на служителите, раздел на последния отдел,
|PlannedAccrualsCut of Latest.Size
| ОТ
|Регистър на информацията. Планирани натрупвания. Отрязък от последния (&период,) КАТО планирани натрупвания Отрязък от последния
| ЛЕВА ВРЪЗКА Регистър на информацията за персонала на служителите
|. Софтуерни планирани начисления отрязък от Latest.Employee = HRHistory of Employees Slice of Latest.Employee
|КЪДЕ
| История на персонала на служителите Моментна снимка на най-новите. Преглед на събития<>СТОЙНОСТ(Изброяване.Видове събития, свързани с персонала.Уволнение)
|
|ПОРЪЧАЙТЕ ПО
|PlannedAccrualsSliceLast.Individual.Name");
Query.SetParameter("Период", Период);
res = Request.Run();
m = Нов масив;
изберете = res.Select();

Докато select.Next() цикъл
Структура на данните = Нова структура ("Служител, Лице, Подразделение, Размер");
FillPropertyValues(Datastructure, select);
m.Add(Datastructure);
EndCycle;
Връщане m;
EndFunction

Тук всичко трябва да е ясно; единственото НОУ-ХАУ е начинът за прехвърляне на резултатите от заявка от сървъра към клиента. Искането тук е просто, защото... За разлика от ZUP, в Бухия няма крайна дата в регистрите, това опростява задачата за получаване на данни.

Освен табличната част, попълвам и реквизита „Начин на плащане“, който също трябва да получа на сървъра:

&На сървъра
FunctionPaymentMethod()
Справочници за връщане. Начини на изплащане на заплатата. Търсене по име("Аванс");
EndFunction

Това е всичко.

Сега резюмето:

1. Ако вашата конфигурация вече не се поддържа, тогава деактивирайте проверката дали обектът е записан, преди да извикате обработка на подплата.

2. Не променяйте обекта на базата данни, ако можете да промените данните на формуляра. Докато потребителят щракне върху запис, неговите действия трябва да могат да бъдат отменени.

3. Ако имате време и енергия, напишете обработка и за двата случая: извикване от формата за списък и от формата за обект. За формуляр на обект, променете данните на формуляра; за формуляр на списък, променете данните на базата данни. В моя случай командата се проваля от списъка с грешка, това не е правилно.

Благодаря на всички, чао!

Табличните части съществуват за много обекти в 1C:

  • Справочници
  • Документация
  • Справки и обработка
  • Сметкопланове
  • Характерни типови планове
  • Планове от калкулационен тип
  • Бизнес процеси и задачи

Табличните части ви позволяват да съхранявате неограничено количество структурирана информация, принадлежаща на един обект.

Нека да разгледаме някои техники за работа с таблични части.

Как да заобиколите табличната част

За да преминете през частта на масата, можете да използвате цикъл За всеки

За всеки ред от табличната част на цикъла

Доклад(Низ. Атрибут TabularPart) ;

Краен цикъл;

При всяка итерация в променливата Линиясе предава следващият ред от табличния раздел. Стойностите на детайлите на реда могат да бъдат получени чрез израза Line.AttributeName.

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

За да изведете информация от табличната част на обект, използвайте елемент на формуляр Поле за таблица. За да активирате възможността за избиране на няколко реда в поле на таблица, трябва да зададете стойността Многократнив неговия имот Режим на избор.

За да получите списък с избрани редове, използвайте следния код:

Използва се цикъл за преминаване през избраните редове. За всеки:

SelectedRows = FormElements. TableFieldName. SelectedRows;

За всеки ред от цикъла на избраните редове

//съдържание на цикъл

Краен цикъл;

Как програмно да изберете редове от таблична част (поле на таблица) и да премахнете избора им

За програмно премахване на избора на редове от поле на таблица:

Елементи на формата. TableFieldName. Избрани редове. Clear() ;

За да изберете програмно всички редове на поле на таблица:

За всеки CurrentRow From TabularPart Loop
Елементи на формата. TableFieldName. Избрани редове. Add(CurrentRow) ;
Краен цикъл;

Как да изчистите частта от масата

TabularPart. Clear() ;

Как да получите текущия ред на раздел на таблица

Текущият ред е времевата линия, в която потребителят в момента има курсора. За да го получите, трябва да получите достъп до контролния елемент във формуляра, който е свързан с табличната част.

За обикновените форми кодът ще изглежда така:

Елементи на формата. TableFieldName. CurrentData;

За управлявани формуляри:

Елементи. TableFieldName. CurrentData;

Как да добавите нов ред към раздел на таблица

Добавяне на нов ред в края на раздела на таблицата:

NewRow = TablePart. Добавяне();

Добавяне на нов ред навсякъде в раздела на таблицата (следващите редове ще бъдат изместени):

NewRow = TablePart. Вмъкване (индекс)
//Индекс - номер на добавения ред. Номерацията на редовете започва от нула.

Нова линия. Props1 = "Стойност" ;

Как програмно да попълните детайлите на ред от таблица

Ако трябва програмно да попълните подробностите за ред на раздел на таблица, който е добавен от потребителя, трябва да използвате манипулатора на събитие на раздел на таблица Когато започнете да редактирате.

Процедурата, създадена от манипулатора, има три параметъра:

  • елемент- съдържа контролен елемент TableField.
  • Нова линия- булев. Съдържа стойност Вярно, ако се добави нов ред в таблицата и лъжа,ако потребителят е започнал да редактира вече съществуващ ред.
  • Копиране- булев. Съдържа стойност Вярно, ако потребителят копира реда и Лъжав други случаи.

Нека разгледаме един пример. Да кажем, че трябва да попълним детайлите на табличния раздел акаунт акаунт, в случай че се добави нов ред. Когато редактирате съществуващ ред, не е необходимо да променяте счетоводната сметка.

Процедура TabularPartAtStartEditing(Element, NewRow, Copy)

//Ако потребителят редактира съществуващ ред, ние не правим нищо
Ако НЕ NewRow Тогава
Връщане;
EndIf ;

//Ако редът е нов, задайте счетоводната сметка
TechString = Елемент. CurrentData; //Вземете текущия ред от табличната част
TechString. Счетоводство = Сметкопланове. Самоподдържащ се. RequiredAccount;
EndProcedure

Блог на компанията 1C GOODWILL

Тук ще научим как да създадем външна обработка за попълване на табличната част на документ в 1C 8.3 (за управлявани формуляри) от нулата. Разгледаният пример за обработка може да бъде изтеглен от връзката.

Да вземем най-простия пример: в табличния раздел „Материали“ на документа „Заявка-фактура“ присвояваме стойност 100 на количеството във всички редове.

Подготовка на външна обработка в 1C 8.3

И така, нека създадем външна обработка. Записваме го на диск.

В базата данни 1C трябва да се регистрира външна обработка или отчет. Това се прави с помощта на структурата, съдържаща се във функцията за експортиране на информация за външна обработка.

Щракнете върху бутона „Действия“, за да отидете до обектния модел, където създаваме функцията:

Функция InformationOnExternalProcessing() Дестинация за експортиране = нов масив; Assignments.Add("Document.RequirementInvoice") ; Параметри за регистрация = Нова структура; Parameters.Insert("Изглед", "Попълване на обект") ; Parameters.Insert("Destination" ,Destinations) ; Parameters.Insert("Име", "Попълване на документ"); Параметри за регистрация.Insert("Version" , "1.0" ) ; Registration Parameters.Insert("Информация" , "Допълнителна обработка на табличната част на изискването"); Параметри за регистрация.Insert("SafeMode" , True) ; Команди = GetCommandTable() ; AddCommand(Команди, "Попълване на документ" , "Попълване на документ" , "Извикване на клиентски метод" , False,) ; Параметри за регистрация.Insert("Команди" ,Команди) ; ReturnRegistrationParameters; EndFunction

Нека поговорим малко за значението на полетата.

Тип - в зависимост от целта на обработка може да приема следните стойности:

Доклад Попълване на формуляр за печат на обект Допълнителна обработка Създаване на свързани обекти Допълнителен отчет

В нашия случай, за да обработим попълването на табличната част, се нуждаем от типа обработка „Попълване на обект“.

Цел - в това поле се изброяват документите, за които е предназначена тази обработка (в които ще се появи след регистрация в информационната база). За да изброим тези документи, нека създадем масив „Задачи“ и да добавим документа „Фактура за изискване“ към него.

Име - това име ще бъде показано в списъка с допълнителни лечения.

Версия - версията на нашия нов софтуерен продукт.

Информация - Този ключ от нашата структура съдържа допълнителна информация за нашата обработка.

Безопасен режим - приема стойност True/False. Ще използваме безопасен режим.

Команди - Този структурен ключ съдържа списък с команди, предоставени от нашата обработка. За команди ще създадем функция GetCommandTable() и процедура AddCommand().

Нека разгледаме малко по-отблизо полетата на таблицата с командни стойности.

Изгледът е представянето на командата на потребителя, какво име ще бъде представено за нея в интерфейса.

ID е вътрешният идентификатор на командата в нашата обработка

Използване - в зависимост от използването на командата, тя може да приема следните стойности:

Call of ServerMethod - сървърната процедура се извиква от модула за обработка Form Opening - използва се за отваряне на формуляра за обработка Call of Client Method - за извикване на клиентската процедура от модула за обработка Script в Safe Mode - сървърна процедура в безопасен режим

В нашия случай работим с обектна форма 1C 8.3, така че трябва да използваме CallClientMethod, за да извикаме външната команда за обработка.

Показване на предупреждение - има една от двете стойности: True/False

Модификатор - допълнителен модификатор за командата. Окончателният списък на нашата обработка в обектния модул приема следната форма:

Функция InformationOnExternalProcessing() Дестинация за експортиране = нов масив; Assignments.Add("Document.RequirementInvoice") ; Параметри за регистрация = Нова структура; Parameters.Insert("Изглед", "Попълване на обект") ; Parameters.Insert("Destination" ,Destinations) ; Parameters.Insert("Име", "Попълване на документ"); Параметри за регистрация.Insert("Version" , "1.0" ) ; Registration Parameters.Insert("Информация" , "Допълнителна обработка на табличната част на изискването"); Parameters.Insert("SafeMode" , True) ; Команди = GetCommandTable() ; AddCommand(Команди, "Попълване на документ" , "Попълване на документ" , "Извикване на клиентски метод" , False,) ; Параметри за регистрация.Insert("Команди" ,Команди) ; ReturnRegistrationParameters; EndFunction Функция GetTableCommands() Команди = NewValueTable; Commands.Columns.Add("View", NewTypeDescription("Row")); Commands.Columns.Add("Identifier", New TypeDescription("String")) ; Commands.Columns.Add("Usage", NewTypeDescription("Row")); Commands.Columns.Add("Show Alert" , New TypeDescription("Boolean")) ; Commands.Columns.Add("Modifier" , New TypeDescription("Row")) ; Екип за връщане; EndFunctions Процедура AddCommand(CommandTable, View, Identifier, Usage, ShowAlert = False, Modifier = "") NewCommand = CommandTable.Add() ; NewCommand.View = Изглед; NewCommand.Identifier = Идентификатор; NewCommand.Use = Използване; NewCommand.ShowAlert = Покажи предупреждение; NewCommand.Modifier = Модификатор; Край на процедурата Създаване на команда за попълване на табличната част

В полето Обработващ формуляр щракнете върху лещата, за да създадете форма:

Добавете командата ExecuteCommand към формуляра.

В тялото на обработка на командата за попълване ние осъществяваме достъп до данните на формуляра чрез FormOwner и променяме стойността на количеството в табличната част на материалите:

&В процедурата на клиента Изпълнение на команда (ИД на команда, масив от обекти за присвояване) Експортиране за всеки CurrentRow от FormOwner.Object.Materials Loop CurrentRow.Count = 100 ; Доклад(ТекущРед.Количество) ; EndCycle; Край на процедурата Регистрация на външна обработка в 1C 8.3 и нейната проверка

Сега в корпоративния режим 1C ще регистрираме нашата външна обработка, за да попълним табличната част:

В списъка с външни лечения щракнете върху бутона Създаване:

В новия формуляр за външна обработка, който се отваря, заредете външната обработка от файла и след това запишете новата обработка:

Сега в документа „Заявка-фактура“ можем да видим резултата от регистриране на нашата обработка в информационната база. И като щракнете върху бутона „Попълване на документ“, можем да наблюдаваме работата по нашата обработка, за да попълним табличната част.

Публикацията Обработка на попълване на табличната част на управлявани формуляри 1C 8.3 с помощта на пример се появи за първи път в блога на компанията 1C GOODWILL.