d9e5a92d

Как таблицу значений «ТаблицаПолучатель» заполнить данными таблицы значений «ИсходнаяТаблица»?

Замечание: если нужно заполнить несколько колонок значением - их имена указывают через запятую во втором параметре. Если не указать второй параметр - значением заполнятся все поля таблицы.

Если «ТаблицаПолучатель» на момент выполнения операции еще не существует, или ее предыдущие колонки сохранять не нужно, можно создать ее, как полную копию исходной:

ТаблицаПолучатель = ТаблицаИсхолная.Скопировать!)

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

Тогда можно так:

Для Каждого СтрокаИсходнойТаблицы Из ИсходнаяТаблица Цикл Новая Строка = ТаблицаПолучатель.Добавить(); ЗаполнитьЗначеішяСвойств! НоваяСтрока. СтрокаИсходнойТаблицы) КонецЦикла:



Для каждой строки исходной таблицы добавляется новая строка в таблицу получатель и выполняется заполнение значений в тех колонках новой таблицы, имена которых совпадают с именами колонок в исходной таблице.

Замечание: если у таблиц не будет колонок с одинаковыми именами - таблица-получатель будет в результате содержать столько же строк с пустыми значениями, сколько строк было в таблице-источнике.

Если у каких-то одноименных колонок тип значения данных из таблицы-источника не попадет в массив разрешенных типов колонки таблицы-получателя - в таких полях получим пустые значения.

Рассмотрим третий случай. В случае одноименных колонок - колонку таблицы-получателя нужно привести в полное соответствие колонке таблицы-источника.

ОдноимсннысКолонки = Новый Массив!):

Для каждого Колонка Из ИсходнаяТаблица.Колонкн Цикл СовпадающаяКолонка = ТаблицаПолучатсль.Колонкн.Найти(Колонка.Имя)

Если СовпадающаяКолонка о Неопределено Тогда // Получить свойства колонки.

Индекс = ТаблнцаПолучатель. Колонки. Нндекс<СовпадаюшаяКолонка); Имя = Колонка.Имя:

ТипЗначсния = Колоика.ТипЗначення;

Заголовок = Колонка. Заголовок;

Ширина = Колонка.Ширииа:

// Заменить колонки в таблице-получаетеле.

ТаблнцаПолучатель. Колонки. Удал ить( Индекс); ТаблицаПолучатель.Колонки.Вставить(Индекс.

Имя,

ТипЗначения,

Заголовок.

Ширина):

//Добавить очередное имя совпадающих колонок в массив. ОдноименныеКолонки .Добавить) Колонка. Имя);

КонецЕсли:

КонецЦикла;

// Цикл перебора строк исходной таблицы.

Для каждого СтрокаИсходнойТаблицы Из ИсходнаяТаблица Цикл

// Добавить новую строку в таблицу-получатель.

НоваяСтрока = ТаблицаПолучатель.Добавить();

// Заполнить значения в совпадающих ячейках.

Для каждого ИмяКолонки Из ОдноименныеКолонкн Цикл

НоваяСтрока|ИмяКолонкн| = СтрокаИсходнойТаблицы! ИмяКолонки): КонецЦикла:

КонецЦикла:

Нам придется заменить колонку в таблице получателе на новую, чьи свойства полностью будут соответствовать колонке таблицы-источника.

Поэтому в случае обнаружения в таблице-получателе одноименной колонки собираем в переменных все свойства для новой колонки. Далее удаляем старую и создаем новую колонку.

Далее выполняем цикл перебора строк исходной таблицы.

В цикле добавляем к таблице-получателю новую строку и открываем цикл перебора имен колонок в массиве совпадающих колонок.

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

Как добавить колонки к таблице значений «ТаблицаЗначений» с ограничениями по типу?

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

//Добавить колонку без ограничений по типу. ТаблицаЗначений. Колонки. ДобавитМ "Объект");

Можно заполнить значение второго параметра. Туда необходимо передавать описание разрешенного для колонки типа. Само описание можно получить при помощи конструктора, передав последнему в качестве параметра строковое название типа (если много типов - через запятую) или массив допустимых типов.

// Ограничения но типам данных колонки:

//Только элементы справочника "Контрагенты1’.

ТаблицаЗначений

.Колонки

.Добавить! "Контрагент”,

Новый ОписаниеТиповССправочникСсылка.Контраіенты"))

Если среди типов разрешенных к заполнению данных колонки есть строка - можно ограничить ее разрядность (длину), указать использование неременной или фиксированной длинны. Все это обеспечивается созданием объекта при помощи конструктора КвалификаторыСтроки. Далее этот объект будет использован в качестве одного из параметров конструктора ОписаниеТипов.

// Подготовка и установка оіраничсний для данных типа Строка. КвалификаторыСтроки = Новый КвалификаторыСтроки! 20,

Допустимая/ Ілина. Переменная);

ДопустимыеТнпы = Новый ОнисаниеТиіюв("Строка".. КвалификаторыСтроки); ТаблицаЗначений. Колон ки.Добавить("ПримечанисСтроковоеКороткое”,

Допу сти м ыеТи п ы):

Аналогичные действия можно осуществлять в отношении квалификаторов числа и даты.

Обратите внимание, описание типов можно строить конструктором как «с нуля», так и использовать как основу уже существующее описание типов.

// Расширение уже использованного ранее описания типов.

КвалификаторыЧисла = Новый КвалификаторыЧисла(Н), 2,

ДопустимыйЗнак. Неотрицательный): КвалификаторыДаты = Новый КвалификаторыДаты(ЧастиДаты.Дата); РасшпреннысДопустимыеТипы = Новый ОписанисТипов(ДопустимыеТипы.

"Число. Дата",, КвалификаторыЧисла., КвалификаторыДаты);

ТаблицаЗначений.Колонки.ДобавитьС'Прнмечание".

РасшнренныеДопустимысТ ины);

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

Запросом собираются данные по документам

«Посту плениеТоваров Услуг» PI выгружаются в таблицу значений «ТаблицаСсылок» (колонка «Ссылка»). Впоследствии к этой таблице значений будут добавляться еще строки. Как обеспечить возможность добавления в полученную таблицу значений в колонку «Ссылка» документов других видов («ОприходованиеТоваров»,

« ВозвратОтПокупателя» ) ?

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

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

// Создать пустые ссылки.

ПустоеОприходованне = Документы. ОприходованиеТоваров. ПустаяСсылка)): Пустой Возврат = Докумен гы.ВозвратТоваровОтПокупателя.ПустаяСсылкаО;

// Выполнить запрос.

Запрос — Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ

I Ссылка

/ИЗ

I Документ.ПоступлениеТоваровУслуг /ОБЪЕДИНИТЬ ВСЕ

ІВЫЬРАТЬ ПЕРВЫЕ 0 &ПустойДокументОприходованне (ОБЪЕДИНИТЬ ВСЕ

ІВЫЬРАТЬ ПЕРВЫЕ 0 &ПустойДокументВозвраг

I";

Запрос.УстановитьПарамезрСПустойДокументОприходование",

ПустоеОприхолование);

Запрос. УстановитьПараметрГ'ПустонДокументВозвра г". IІустой Возврат):

// Выгрузить в таблицу значений.

ТаблицаСсылок = Запрос.Выполнить().Выгрузить();

Создаем пустые ссылки на документы «ОприходованиеТоваров» и «ВозвратОтПокупателя».

Далее в запросе делаем объединение с записями, содержащими эти пустые ссылки. Причем в объединяемых запросах по пустым ссылкам применяем ПЕРВЫЕ 0 для того, чтобы впоследствии не удалять строки с пустыми ссылками из таблицы выгруженного результата запроса

После выполнения и выгрузки запроса в таблицу значений «ТаблицаСсылок» тип значения колонки «Ссылка» будет составным: «NULL, ДокументСсылка ЛоступлениеТ оваровУ слуг,

ДокументСсылка. ОприходованиеТ оваров, ДокументСсылка.ВозвратОтПокупателя».

То есть - то, что и требовалось.

Как самостоятельно заполнить дерево значений?

Для иллюстрации данной возможности создадим обработку, в которой определен реквизит «Дерево» (тип ДеревоЗначениЙ). В диалоге определено табличное поле, связанное через свойство данные с реквизитом «Дерево» (имя элемента управления «Дерево»).

Следующая процедура произведет запись данных в дерево значений.

Процедура ЗаполнениеДерева(Кнопка)
Дерево.Колонки.ОчиститьО;

Дерево. Колонки. ДобавитьГ ИмяКолонки");
// Создать первую строку. Правильнее сказать создать элемент //коллекции. Он помешается в переменную «СтрокаВерхнегоУровня».
СтрокаВерхнегоУровня = Дерево.Строкн.ДобавитьО;
// В колонку «ИмяКолонки» записать значение «Старшая». СтрокаВерхнегоУровня.ИмяКолонки = "Старшая";

// Создать строку подчиненную «Старшей».

ПодчиненнаяСтрока =СтрокаВерхнегоУ ровня.Строки.Добавить(); ПодчнненнаяСтрока.ИмяКолонки = "Первая подчиненная";

Подчиненная ВторогоУ ровня = ПодчиненнаяСтрока.Строки.Добавить(): ПодчиненнаяВторогоУровня.ИмяКолонки = "Первая нижняя";

ПодчиненнаяВторогоУровня = ПодчнненнаяСтрока.Строки.Добавить(): ПодчиненнаяВторогоУровня.ИмяКолонки = "Вторая нижняя";

ПодчиненнаяСтрока = СтрокаВерхнегоУровня.Строки.ДобавитьО; ПодчнненнаяСтрока.ИмяКолонки = "Вторая подчиненная";

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

ЭлементыФормы. Дерево. СоздатьКолонкиО;

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

Следующая процедура показывает один из вариантов установки текущего значения в элементе управления, связанного с деревом (табличном поле).

Процедура ОткрытнеВеткиІ Кнопка)

// Сделать текущим именно элемент коллекции «Строки». РезультатПоиска = Дерево.Строки.НайтнСПервая нижняя".

"ИмяКолонки",

Истина);

Если РезультатПоиска о Неопределено Тогда ЭлементыФормы.Дерево.ТекущаяСтрока = РезультатПоиска; КонецЕсли;

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

Прикладные объекты

Справочники

© Как создать элемент (группу) справочника?

Создание нового элемента в неиерархическом справочнике можно выполнить при помощи следующего кода:

НовыйЭлемент = Справочники

.ДокументыУдостоверяюшиеЛичность

.СоздатьЭлементО;

НовыйЭлемент.Наименование = "военный билет";

// Установить другие реквизиты.

НовыйЭлемент.ЗапнсатьО;

Если справочник иерархический, то выполнение этого кода приведет к созданию нового элемента в корне справочника. Для того чтобы создать новый элемент в определенной группе иерархического справочника, необходимо также указать родителя создаваемого элемента:

НовыйЭлемент = Справочники. Банки.СоздатьЭлемент();

// Получить ссылку на группу, в которой будет находиться новый элемент. Родитель = Справочники.Банки.НайтиПоКодуС'ООООООООГ);

НовыйЭлемент.Наименование = "АКБ";

НовыйЭлемент.Код = "0000000 И";

НовыйЭлемент. Родитель = Родитель;

// Установить другие реквизиты.

НовыйЭлемент.ЗапнсатьО;

Если требуется создать новую группу в иерархическом справочнике, то для этого следует использовать метод менеджера справочника Создать Груп пу (). Если группа должна находиться внутри

определенной группы справочника, также следует указать и родителя создаваемой группы:

НоваяГруппа = Справочники. Номенклатура.СоздатьГ руппуО;

// Получить ссылку на группу, в которой должна находиться создаваемая группа. Родитель = Справочники.Номенклатура.НайтиПоНанменовашіюГОбуві,". Истина):

НоваяГруппа.Наимснование = "Модельная обувь":

НоваяГруппа.Родитель = Родитель;

// Установить другие реквизиты.

НоваяГруппа.Записать();

Следует обратить внимание на тот факт, что у реквизитов, в которые будет производиться запись значений в свойстве «Использование» должно стоять одно из перечисленных ниже значений:

• Для группы

• Для группы и элемента

Если для справочника установлен вид иерархии Иерархия элементов, то для создания новых элементов следует использовать метод СоздатьЭлемент() менеджера справочника, а иерархия создаваемых элементов будет определяться значением свойства Родитель объекта справочника:

// Создать новый элемент в корне справочника.

НовыйЭлемент = Спра вочннки. Подразделения.СоздатьЭлемент(); НовыйЭлемент.Наименованис = "IT отдел”;

НовыйЭлемент.ЗаписатьО:

// Получить ссылку на родителя добавляемых элементов.

Родитель = НовыйЭлемент.Ссылка;

// Создать дочерний элемент.

НовыйЭлемент = Справочники. Подразделения.СоздатьЭлемент(); НовыйЭлемент Наименование = "Группа разработки"; НовыйЭлемент.Родитель = Родитель;

НовыйЭлемент.ЗаписатьО:

Как найти элемент справочника?

Для поиска элемента справочника можно использовать несколько способов. По коду:

РезультатПоиска = Справочники.Номенклагура.НайтиПоКодуГ'ОООЗО”);

Если РезультатПоиска.ПустаяО Тогда

// Выполнить действия, предусмотренные в случае, когда элемент не найден. КонецЕсли;

При организации поиска по коду обращайте внимание на тип кода

справочника (Число или Строка).

По наименованию:

РезультатПоиска = Справочники .Номенклатура

.НаитиПоНаименованию("Кроссовки")

По реквизиту:

РезультатПоиска = Справочники .Номенклатура

.НайтиПоРеквизитуСАртикул", "К-120002”)

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

Как удалить элемент справочника?

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

Например, в переменной «СсылкаНаУдаляемыйЭлемент» содержится ссылка на удаляемый элемент справочника:

И Найти ссылки на удаляемый элемент.

МассивСсылок = Новый Массив;

МасснвСсылок.Добавить(СсылкаНаУдаляемыйЭлемент); НайдснныеСсылки = НайтиПоСсылкам(МассивСсылок);

Если НайдснныеСсылки.КоличествоО > 0 Тогда СообщитьС'Нельэя удалять элемент, на него имеются ссылки");

Иначе

УдаляемыйЭлемент = СсылкаНаУдаляемыйЭлемент.ПолучитьОбъект(): У даляемыйЭлемент.Удалить!);

КонецЕсли:

Для пометки элемента справочника на удаление можно использовать метод УстановитьПометкуУдаления() объекта справочника:

УдаіясмыйЭлемент.УстановнтьПометкуУдаления! Истина);

Использование этого метода позволяет установить или снять пометку на удаление элемента справочника, причем будут инициированы события Перед записью и При записи объекта справочника, поскольку выполняется сохранение измененного свойства ПометкаУдаления объекта справочника.

Как перебрать элементы справочника?

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

Например, для перебора всех элементов справочника «Номенклатура» в иерархическом порядке, можно использовать следующий код:

Выборка = Справочники.Номенклатура.ВыбратьИерархически():

Пока Выборка.СлсдуюшийО Цикл Наименование = Выборка.Нанменованне;

// Обращение к другим данным справочника.

КонсцЦикла:

Аналогичного результата можно добиться, используя запрос:

Запрос = Новый Запросе ІВЫБРАГЬ I Ссылка,

I Наименование |ИЗ

I Справочник.Номенклатура ІАВТОУПОРЯДОЧ И ВАНИ Е");

Результат = Запрос.ВыполнитьО.Выбрать():

Пока Результат.СледующийО Цикл Наименование = Результат.Наименование;

КонецЦикла;

Благодаря использованию запроса можно формировать выборку элементов справочника более «гибко», поскольку запрос позволяет задать произвольные условия на выбираемые данные.

® Как выбрать все элементы из определенной группы?

Организуем выборку элементов справочника из группы, ссылка на которую определена в переменной «ПолеВводаРодитель»:

Выборка = Справочники.Номенклатура.Выбрать (ПолеВводаРодитель):

Пока Выборка.СледующийО Цикл Наименование = Выборка.Наименование;

КонецЦикла;

В результате работы этого кода будут получены все дочерние элементы выбранного элемента справочника. Аналогичное действие, выполняемое с помощью запроса, будет выглядеть следующим образом:

Запрос = Новый ЗапросГ ІВЫЬРАТЬ I Ссылка.

I Наименование |ИЗ

I Справочник.Номенклатура

|ГДЕ

I Родитель = &Роднтель ІАВТОУПОРЯДОЧИВАНИЕ");

Запрос.УстановитьПараметрГРодитель”, ПолеВводаРодитель): Результат = Запрос.Выполнить().Выбрать():

Пока Результат.СледуюшинО Цикл Наименование = Результат.Наименование;

КонецЦикла:

Если необходимо получить не только дочерние элементы, но и все элементы, находящиеся в иерархии выбранного элемента, следует, при использовании объектной техники, выполнять метод ВыбратъИерархически() менеджера справочника:

Выборка=Справочникн.Номенклатура.ВыбратьИерармічески(ПолеВводаРодитель); Пока Выборка.СледующийО Цикл Наименование = Выборка.Наименование;

КонецЦикла;

а при использовании запроса применять условие В ИЕРАРХИИ:

Запрос = Новый ЗапросС ІВЫБРАТЬ I Ссылка.

I Наименование |ИЗ

I Справочник.Номенклатура ІСДЕ

I Родитель В ИЕРАРХИИ(&Родитель) ІАВТОУПОРЯДОЧИВАНИЕ");

Запрос.УстановитьПараметрГРодитель", ПолеВводаРодитель); Результат = Запрос. Выполнит ь().Выбрать();

Пока Результат.СледуюшийО Цикл Наименование = Результат.Наименование;

КонецЦикла;

® Как перебрать элементы подчиненного справочника с помощью запроса?

Справочник «КонтактныеЛица» подчинен справочнику «Контрагенты».

Требуется перебрать всех контактных лиц определенного контрагента. Ссылка на данного контрагента находится в переменной «Контрагент».

Процедура ПсреборПодчнненых'Элементов( Контрагент)

Запрос = Новый Запрос:

Запрос.Текст = "ВЫБРАТЬ I КонтактныеЛица.Ссылка |ИЗ

I Справочник.КонтактныеЛица КАК КонтактныеЛица

I

|ГДЕ

I КонтактныеЛнца.Владелец = & Владелец";

Запрос.УстановитьПараметрС'Владелец", Контрагент);

Результат = Запрос.ВыполнитьО:

Выборка = Результат.Выбрать();

Пока Выборка.СледующінК) Цикл ОчереднойПодчиненый = Выборка.Ссылка; КонецЦикла;

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

Делаем запрос по таблице справочника «Контактные лица» с отбором по полю «Владелец». В качестве владельца передаем ссылку на элемент справочника «Контрагенты».

® Как перебрать элементы подчиненного справочника с помощью выборки справочника?

Справочник «КонтактныеЛица» подчинен справочнику «Контрагенты».

Требуется перебрать всех контактных лиц определенного контрагента. Ссылка на данного контрагента находится в переменной «Контрагент».

Процедура ПереборПодчинемыхЭлементов(Контрагент)

// Получить выборку по указанному контрагенту.

Выборка = Справочники.КонтактныеЛица.Выбрать(. Контрагент)

Пока Выборка.СледующийО Цикл ОчереднойПодчиненый = Выборка.Ссылка;

КонецЦикла;

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

ф Как открыть форму списка (элемента) справочника?

Для того чтобы открыть форму списка справочника, можно воспользоваться методом ПолучитьФормуСписка() менеджера справочника:

Форма = Справочники. Номенклатура.ПолучнтьФормуСпискаО; Форма.ОткрытЫ);

Для того чтобы открыть произвольную форму справочника, можно использовать метод ПолучитьФормуО менеджера справочника:

Форма = Справочники

. X ран ил и щеДопол н ител ьнон И нформаци и .ПолучитьФормуС'ФормаСпискаФайловИИзображенин”); Форма.ОткрытьО;

Однако следует помнить, что если методом ПолучитьФорму() выполняется получение формы элемента или группы справочника, то будет получена форма нового элемента (группы).

Для того чтобы открыть форму существующего элемента или группы справочника, следует использовать метод ПолучитьФорму() ссылки или объекта справочника:

Элемент = Справочники. Номенклатура. НайтиПоКолуГОООЗО”); Форма = Элемент.ПолучитьФормуО;

Форма. Оікрыіьр;_

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

Имеется ссылка на элемент справочника «Контрагенты». Как добавить запись в табличную часть «ВидыДеятельности» этого элемента? Модифицировать можно только объект справочника.

Поэтому так:

ЭлементОбъект = СсылкаКонтрагент.ПолучнтьОбъектО; НоваяСтрока = ЭлементОбъект. ВидыДеятельности. Добавить():

// Заполнить реквизиты.

НоваяСтрока.ВилДеятельности = ПолеВводаВидДеятельности: ЭлементОбъект.ЗаписатьО:

Получаем объект справочника от ссылки на элемент.

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

Записываем измененный элемент справочника.

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

Для того чтобы полностью очистить табличную часть элемента справочника, можно воспользоваться методом ОЧИСГИТЬ() табличной части справочника:

Элементе правочника = С правочнн кн. Контрагенты. НантиПоКоду(" Ю0006''); ОбъектСправочника = ЭлементСправочиика.ПолучитьОбъект(); ОбъектСправочника.ВидыДсятельности.ОчнститьО; ОбъектСправочника.ЗанисатьО;

Если требуется выборочное удаление строк табличной части (например, в зависимости от значения их реквизитов), можно сначала отобрать строки, удовлетворяющие условию, а затем удалить каждую из них методом Удалить() табличной части справочника. В следующем примере подразумевается, что переменная «ВыбранныйЭлемент» содержит ссылку на обрабатываемый элемент справочника, а переменная «ВыбранныйВидДеятельности» содержит ссылку на вид деятельности, который не должен присутствовать у обрабатываемого элемента:

ОбъектС’правом ника = ВыбранныйЭлемент. ПолучитьОбъс кт():
// Создать структуру для отбора удаляемых строк.
СтруктураОтбора = Новый СтруктураС'ВидДеятельности'
ВыбранныйВидДеятельности);

// Получить массив удаляемых строк.

ПодходяшиеСтроки = ОбъсктСнравочника .ВидыДеятельности .НайтиСтроки(СтруктураОтбора);
II Удалить строки.
Для Каждого ОчерсднаяСтрока Из ПодходящиеСгроки Ці пел
ОбъектСправочника.ВидыДеятелыюсти.Удалить(Очсрс

КонецЦикла;

ОбъектСправочника. Записать)):
інаяСтрока);

ф Как перебрать строки табличной части справочника?

Табличная часть справочника представляет собой коллекцию строк, которую можно перебрать в цикле. Реквизиты табличной части будут доступны как свойства строки табличной части.

Например, перебор строк табличной части «ВидыДеятельности» справочника «Контрагенты» может быть выполнен следующим образом:

ЭлсмснтСправочннка = Справочники. Контрагенты. НайтиІ ІоКоду("КХХХ)6");

Для Каждого ТекущаяСтрока Из ЭлементСправочника.ВндыДеятельности Цикл Сообщить(ТекушаяСтрока.ВидДеятельностн);

КонецЦикла;

® Как создать элемент в нужной группе?

Необходимо создать элемент справочника номенклатура, так чтобы при этом он попал в нужную группу. Если группы с указанным кодом нет, то тогда такая группа должна быть создана.

КодГруппы = "ЗЗОІОО";

ПоискПоПолномуКоду = Ложь; // значение по умолчанию Группа = Справочники.Номенклатура

.НайтиПоКоду(КодГруппы. ПоискПоПолномуКоду)

Если Группа.ПустаяО Тогда Группа = Справочники.Номенклатура.СоздатьГруппуО:

Группа.Код = КодГруппы;

Г рунпа.Наименование = "Загруженные";

Г руппа.3аписать();

ИначеЕсли Не Группа.ЭтоГруппа Тогда СообіцитьС'Найден элемент справочника с указанным кодом!");

// Предусмотреть прерывание алгоритма.

КонсцЕсли;

Спр = Справочники.Номенклатура.СоздатьЭлемент(); Сир.Наименование = "Программно созданный":

// Реквизиты заполняются в соответствии с задачей.

Спр.Родитель = Группа.Ссылка;

Спр.ЗаписатьО;

Можно использовать предопределенную группу, в этом случае вместо поиска и создания новой группы можно использовать строку:

Группа = Справочники.Номенклатура.Загруженные:

Обратите внимание на тот факт, что механизм работает, только если в справочнике установлен вид иерархии «Иерархия групп и элементов». В противном случае код будет выглядеть следующим образом:

КодЭлемента = "330100";

ПомскПоПолномуКоду = Ложь; //Значение по умолчанию Родитель = Справочники.Номенклатура

.НайтиГ1оКоду(КодЭлемента, ПонскІІоПолномуКоду);

Если Родитель.ПустаяО Тогда Родитель = Справочники. Номенклатура.СоздатьЭлемент():

Родитель.Код = КодЭлемента:

Родитель.Наименованне = "Загруженные”;

Родитель. За писать/);

КонецЕсли;

Спр = Справочники.Номенклатура.СоздатьЭлемент():

Спр.Наименование = 'Программно созданный";

// Реквизиты заполняются в соотвествии с задачей.

Спр.Родитель = РоднтельСсылка: Спр.ЗаписатьО;

Если вид иерархии справочника «Иерархия элементов», то понятие группы в нем отсутствует.

Как узнать, есть ли у текущего элемента подчиненные?

Пусть ссылка на текущий элемент справочника содержится в переменной «Владелец». Необходимо узнать, есть ли в справочнике «Единицы измерения» элементы, подчиненные текущему элементу.

Если использовать объектную модель доступа:

Как таблицу значений «ТаблицаПолучатель» заполнить данными таблицы значений «ИсходнаяТаблица»?


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

Лучше всего подобную проверку можно выполнить, используя возможности запросов:

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ I

I ЕдиницыИзмереішя.Ссылка

|ИЗ

I Справочник.ЕдиницыИзмерения КАК Единицы Измерения |ГДЕ

I Единицы Измерения.Владелец = &Владелец"';

Запрос.УстановитьПараметрС'Владелец". Владелец);

Если НЕ Запрос.Выполнить) ).Пустой() Тогда // Есть подчиненные элементы!

КонсцЕсли

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

Как узнать количество подчиненных элементов у выбранного элемента справочника?

Необходимо определить количество элементов в справочнике «ЕдиницыИзмерения» подчиненных элементу справочника, ссылка на который находится в переменной «Владелец». С помощью объектной модели:

Выборка — Справочники.Единицы Измерения.Выбрать) , Владелец): КоличествоЭлементов = О;

Пока Выборка.СледующиГц) Цикл КоличествоЭлементов = КоличествоЭлементов + I;

КонецЦикла;

Данное решение в общем случае является не эффективным. Связано это с тем, что выборка фактически получает все данные о подчиненных элементах справочника, а в рамках данной задачи нужно только количество элементов.

Если решать задачу с помощью запроса, то решение выглядит следующим образом:

Запрос = Новый Запрос;

Зал рос. Текст = "ВЫБРАТЬ I КОЛИЧЕСТВО»*) КАК Количествозаписей |ИЗ

I Справочник.ЕдиницыИзмереиия КАК Единицы Измерения |ГДЕ

I ЕдиницыИзмерения.Владелец = &Владелец";

Запрос.УстановитьПараметрС'Владелец”. Владелец); Выборка = Запрос.Выполнить»).Выбрать));

Если Выборка.СледуюшийО Тогда КоличествоЗаписей = Выборка.КоличествоЗаписей: КонецЕсли;

В результате в переменной «КоличествоЗаписей» будет находиться нужная нам величина.

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

Если у справочника есть несколько подчиненных справочников, то запрос может выглядеть следующим образом:

ВЫБРАТЬ

СУММА(КолнчествоПодчиненных) КАК КоличествоПодчиненныхЭлементов ИЗ

(ВЫБРАТЬ

КОЛИЧЕСТВО^) КАК КоличествоПодчинеішых ИЗ

Справочник.ЕдиницыИтмерения КАК ЕдиницыИтмерсння ГДЕ

ЕдиницыИтмерения. Владелец = & Владелец

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ

КОЛИЧЕСТВО)*)

ИЗ

Справочннк.СерииНоменклатуры КАК СерииНоменклатуры ГДЕ

СерииНоменклатуры.Владелец = & Владелец ) КАК ВложенныйЗапрос

Данный запрос позволяет получить количество записей в двух подчиненных справочниках. В качестве источника данных в основном запросе используется подзапрос («ВложенныйЗапрос»). Сам подзапрос состоит из двух запросов (происходит их объединение). Каждый из объединяемых запросов получает данные о количестве записей в одном из подчиненных справочников.

В выборке результата запроса (в случае если у элемента справочника, ссылка на который находится в переменной «Владелец», есть подчиненные элементы) будет одна строка, в поле «КоличествоПодчиненныхЭлементов» которой содержится количество подчиненных элементов.

Как получить всех родителей выбранного элемента справочника?

В переменной «СсылкаНаЭлемент» находится ссылка на элемент справочника. Необходимо получить всех родителей данного элемента

МассивРоднтелей = Новый Массив; Родитель = СсылкаНаЭлемсн і .Родитель;

Пока Не Родитель.Г1устая() Цикл МассивРодителей.Добавить(Родитель): Родитель = Родитель.Родитсль: КонецЦикла:

Перебрать всех родителей можно используя строки кода:

Для Каждого ТекущийРодитель Из МасснвРодитслей Цикл // Работа с текущим родителем.

КонецЦикла:

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

Как таблицу значений «ТаблицаПолучатель» заполнить данными таблицы значений «ИсходнаяТаблица»?


Результат запроса будет содержать одну «лишнюю» запись, которую легко «отсеять» проверкой свойства «ЭтоГруппа».

Однако получение иерархических итогов оптимизировано для построения итогов большого количества записей, и не вполне эффективно для получения родителей одного элемента. Для более эффективного получения всех родительских записей элемента, рекомендуется перебирать в цикле его родителей небольшими порциями, например, так:

ТекущийЭлементНомснклатуры = ЭлементНомснклатура;

Запрос = Новый ЗапросОВЫБРАТЬ I Номенклатура.Родитель,

I Номенклатура.Родитель.Родитель.

I Номен клатура. Родитель. Родител ь. Родител ь,

I Номенклатура.Родитель.Роднтель.Родитель.Роди гель.

I Номенклатура.Родитель.Роднтсль.Родитель.Роднтель. Родитель |ИЗ

I Справочник.Номенклатура КАК Номенклатура |ГДЕ

I Номенклатура.Ссылка = &ТекушийЭлементНомснклатуры";

Пока Истина Цикл

Запрос.УстановитьПарачетр("ТекуіцийЭлеменгНоменклатуры'\ ТекуіцийЭлемеіп Номенклатуры); Ретультат = Запрос.Выполнить!);

Если Результат.ПустойО Тогда Прервать;

КонецЕсли;

Выборка = Ретультат. Выбрать!);

Выборка.СледующийО;

Для НомерКолонки = 0 По Рстулмат.Колонки.Количоство!) - I Цикл ТекущийЭлемент I Іомснклаі уры = Выборка) I ІомерКолонки);

Если ТекушнйЭлементНоменклатуры = Справочники

.Номенклатура .ПустаяСсылкаО Тогда

Прервать:

Иначе

Сообшить(ТекушийЭлсментНомснклатуры);

КонецЕсли;

КонецЦикла;

Если ТекущийЭлементНоменклагуры = Справочники

.Номенклатура ПустаяСсылкаО Тогда

Прервать:

КонецЕсли;

КонецЦикла;

В данном примере в окно служебных сообщений выводятся все родители для ссылки, записанной в переменную «ЭлементНоменклатура». В цикле выбирается по 5 родителей ссылки.

Если число уровней в справочнике ограничено и невелико, то возможно получение всех родителей одним запросом без цикла.

Как получить запросом «полный» код элементов справочника, если тип кода -Строка?

Понятие «Полный код» соответствует объектной модели системы. Это свойство объектов «СправочникСсылка» и «СправочникОбъект», содержащее указание кодов элемента и всех родителей его иерархии. Представляет собой строку, в которой указаны коды всех вышестоящих элементов иерархии, начиная с самого верхнего уровня и разделяемые символом «/» заканчивая кодом самого элемента.

В табличной модели хранения информации никакого поля «ПолныйКод» для таблиц справочника не существует.

Однако можно говорить о значении поля «Родитель» каждой из записей таблиц справочников и о значении поля «Код».

Поэтому запрос по трехуровневому справочнику «Контрагенты» будет выглядеть следующим образом:

ВЫБРАТЬ

Контрагенты .Ссыл ка,

ВЫБОР

КОГДА (Контрагенты.Родитель.Код ЕСТЬ NULL ) ТОГДА Контрагенты.Код КОГДА (Контрагенты.Роднтель.Родитель.Код ЕСТЬ NULL )

ТОГДА Контрагенты.Родитель.Код + "/" + Контрагенты.Код ИНАЧЕ Контрагенты.Родитель.Родитель.Код + 7“

+ Контрагенты.Родитель.Код + "Г + Контрагенты.Код КОНЕЦ КАК ПолныйКод ИЗ

Справочник.Контрагенты КАК Контрагенты

Источником является таблица справочника. Из нее выбираем поле «Ссылка» и вычисляемое поле «ПолныйКод».

Вычисление полного кода производим путем сборки его из значений кодов самого элемента и кодов всех вышестоящих родителей. Для этого для каждой записи сначала определяем ее уровень.

Уровень определяем следующим образом: для записей корневого уровня поле «Родитель» содержит пустую ссылку на элемент справочника, поэтому значение поля «Код» этого «Родителя» будет NULL. Если это условие выполнилось - значит, элемент находится на корневом уровне, и в качестве полного кода достаточно указать код.

Если условие не выполнилось - проверяем аналогичным способом элемент на принадлежность к первому уровню. В случае выполнения условия — выводим уже код родителя и код самого элемента через «/».

Таким же образом можно построить «сборку» поля «ПолныйКод» для случаев 4-х, 5-ти и т.д. уровневых справочников.

В отношении возможных возражений о «неуниверсальности» подобного подхода: хотя, в общем случае, количество уровней справочника может быть не ограничено, сложно представить себе реальную практику использования справочника более чем с 10 уровнями вложенности из-за явного неудобства работы пользователя с таким «глубоким» справочником.

Как получить все элементы справочника, содержащие в наименовании определенную подстроку, со всей иерархией, в которую они входят?

Допустим, речь идет о справочнике «Контрагенты».

Лучше всего с данной задачей справится запрос со следующим текстом:

Запрос = Новый ЗапросС'ВЫБРАТЬ I Контрагенты.Ссылка КАК Ссылка |ИЗ

I Справочник.Контрагенты КАК Контрагенты |ГДЕ

I (Контрагенты.Наименование ПОДОБНО &ЧастьНаимснования) I И

I (НЕ Контрагенты.ЭтоІ руппа)

I

Іитоги по

I Ссылка ТОЛЬКО ИЕРАРХИЯ");

Запрос. УстановитьПараметрС'ЧастьНаименования",

+ ПолеВводаПодстрока +

Источником запроса является таблица справочника. Делаем отбор по наименованиям, в составе которых присутствует значение параметра «ЧастьНаименования». Условие отбора обеспечивается посредством оператора проверки строки на подобие шаблону. В шаблоне служебными символами «%» обозначается, что перед и после части строки, считанной из «ПолеВводаПодстрока», может встречаться произвольное количество других символов.

Как найти все элементы справочника, в которых не заполнен строковый реквизит?

Получить желаемое можно таким запросом:

Как таблицу значений «ТаблицаПолучатель» заполнить данными таблицы значений «ИсходнаяТаблица»?


ВЫБРАТЬ

ФизнческиеЛица.Ссылка

ИЗ

Справочник.ФизическисЛица КАК Фи жческиеЛица ГДЕ

(ФизическиеЛица.ИНН =

Проверка пустой строки выполняется за счет операции сравнения «=». В данном случае будут отобраны и элементы, в которых пользователь ничего не вводил и даже те, в которые он ввел только пробел (или пробелы). Но на некоторые реквизиты при работе с формой накладывают маску. В таких случаях случайный ввод хотя бы одного пробела уже не позволяет данному реквизиту быть пустым. Его значение будет содержать маску с пробелами.

Для того, чтобы «защитить пользователя от самого себя» в подобных случаях запрос лучше немножко изменить. Например, для реквизита с маской «999-999-999 99» запрос будет выглядеть таким образом:

ВЫБРАТЬ

ФизнческиеЛица.Ссылка

ИЗ

Справочник.ФизическнсЛица КАК ФизичеекиеЛица ГДЕ

(ФнзическиеЛица.СтраховойНомерПФР = "") ИЛИ (ФизическиеЛица.СтраховонНомерПФР = ” - -")

Количество пробелов перед и между символами «-» должно соответствовать маске.

Как перенести все элементы справочника «Контрагенты» из одной группы в другую?

Для этого необходимо перезаполнить значением нового родителя реквизит «Родитель» у элементов, непосредственно являющихся «потомками» исходного родителя.

Итак, пусть переменная «СтарыйРодитель» содержит старого, а «НовыйРодитель» - нового родителя.

Получение элементов справочника, которым нужно поменять родителя, производим следующим образом:

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ I Контрагенты.Ссылка |НЗ

I Справочник.Контрагенты КАК Контрагенты |ГДЕ

I Контрагенты.Родитель = &СтарыйРодитель";

Запрос.УстановитьПараметрІ"СтарыйРодитель". СтарыйРодитель) Результат = Запрос. Выполнить));

Источником для запроса является таблица справочника «Контрагенты». Делаем отбор непосредственно по полю «Родитель» и получаем таблицу ссылок на нужные нам элементы справочника.

Далее:

Выборка = Результат.ВыбратьО;

Пока Выборка.СледующийО Цикл Контрагент = Выборка.Ссылка. Получит ьОбъектО; Контрагент.Родитель = НовыйРодитель; Контрагент. Записать));

КонецЦикла:

В цикле обработки результата запроса производим получение объекта по ссылке. Для каждого полученного объекта производим запись нового родителя в реквизит «Родитель» и непосредственную запись объекта с измененными данными.

Как организовать программный выбор элемента справочника?

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

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

ФормаВыбора = Справочники.Номенклатура.ПолучитьФормуВыбора( . ЭтаФорча):

// Открыть полученную форму ФормаВыбора Открытій):

Для получения выбранного значения используется обработчик события Обработка выбора формы владельца (в нашем случае формы документа).

Процедура ОбработкаВыбора(ЗначениеВыбора, Источник)

ПолученноеЗначение = ЗначениеВыбора:

// Дальнейшая обработка значения.

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

Вместо метода Открыть() объекта Форма Выбора в ряде случаев можно использовать метод ОткрытьМодально(). В этом случае окно откроется в модальном режиме и пока данная форма не будет закрыта, работать с другими формами, объектами в рамках данного клиентского приложения будет нельзя. Выполнение процедуры также будет остановлено на данном месте и продолжрггся после закрытия формы.

ФормаВыбора = Справочники.Номенклатура.ПолучитьФормуВыбораІ . ЭтаФорма): Выбрано = ФормаВыбора.ОткрытьМодальноО;

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

Процедура ПолеВводаІ ІачалоВыбора(Элемент, СтандартнаяОбработка)

// Запретить стандартную обработку.

СтандартнаяОбработка = Ложь;

// Получить форму выбора справочника как подчиненную полю ввода ФормаВыбора = Справочники .Номенклатура

.ПолучитьФормуВыбора(, Элемент);

// Открыть полученную форму ФормаВыбора.Открыть();

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

Если есть необходимость в использовании собственного алгоритма обработки выбранного значения, его следует размещать в обработчике события Обработка выбора поля ввода:

Процедура ПолеВводаОбработкаВыбораІ Элемент,

ВыбранноеЗначенне,

СтандартнаяОбработка)

//Отключить стандартную обработку (при необходимости). СтандартнаяОбработка = Ложь;

ПолученносЗначснне = ВыбранноеЗначенне;

// Дальнейшая обработка значения.

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

Как сохранить фотографию сотрудника в справочнике «Сотрудники»?

Необходимо создать реквизит справочника «Фотография» и определить у него тип ХранилИЩеЗначения. Далее в форме элемента определить кнопку (либо использовать кнопку командной панели), при нажатии на которую, будет выполняться следующий обработчик события:

Процедура ЗагрузитьФотографию(Элемент)

Режим = РсжимДиалогаВыбораФайла.Открытие;

ДиалогОткрытияФайла = Новый ДиалогВыбораФайлаі Режим); ДиалогОткрытияФайла.ПолноеИмяФайла =

Фильтр = "Текст (*,*)|*.*”;

ДиалогОткрытияФайла.Фильтр = Фильтр; ДиалогОткрытияФайла.МножественныйВыбор = Ложь; ДиалотОгкрытняФайла.Заголовок = "Выберите картинк)”;

Если ДиалогОткры гияФанла.ВыбратьО Тогда ВыбранмаяКартинка =

Новый Картннка(ДиалогОткрытияФанла.ПолноеИмяФанла) 'Элемені Хранилища = Новый Хранил ищсЗначсннЖ ВыпраннаяКартинка): Фотография = ЭлементХранилища;

КонецЕсли;

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

В данной процедуре первоначально создается объект ДиалогВыбораФаЙла. Метод Выбрать() открывает данный диалог и в случае выбора возвращает значение Истина.

В приведенном примере в объект ХранилищеЗначения помещается объект Картинка. Это удобно в том случае, если предполагается, что после извлечения, картинка будет отображаться в элементе управления ПолеКартинки диалога какой-либо формы. .В противном случае в реквизит можно помещать не значение, имеющее тип Картинка, а значение с типом ДвоичныеДанные.

ВыбФайл = Новый ДвоичныеДанные(ДиалоіОткрытияФапла.ГІолноеИмяФайла); элХранилища = Новый ХранилищеЗначения(ВыбФайл);

Фотография = элХранилища;

Можно сказать, что в реквизит справочника записывается объект ХранилищеЗначения, в который помещен указанный файл.

Замечание: при разработке структуры данных прикладного решения следует внимательно относиться к использованию полей, имеющих тип ХранилищеЗначения. В качестве общей рекомендации можно посоветовать создавать структуры данных, которые обеспечат отдельное от основной информации хранение таких полей. Например, фотографию сотрудника лучше хранить не в реквизите самого справочника «Сотрудники», а в отдельном справочнике или регистре сведений. Объекты системы (в данном случае элементы справочника «Сотрудники») считываются системой всегда целиком, поэтому хранение больших объемов информации непосредственно в полях объектов может существенно замедлить работу системы.

Документы

© Как создать новый документ?

Если создание нового документа должно пройти без участия пользователя, можно сделать так:

НовыйДокумемт = Документы. ПриходныйКассовыйОрдер.СоздатьДокумснтО НовыйДокумент.Дата = ТекущаяДатаО:

Переменная «НовыйДокумент» в таком случае имеет тип значения ДокументОбъект - мы сразу получаем объект нового документа. А значит, обращаясь к ней, впоследствии можно заполнить реквизиты документа и записать его.

Если нам нужно не просто создать новый документ, но и дать возможность пользователю поучаствовать в процессе его заполнения и записи, то лучше сделать так:

ФормаНовогоПКО = Документы

.ПриходныйКассовыйОрдер .ПолучитьФормуНовогоДокуменгаО; ФормаНовогоПКО.Открыть():

В данном случае после создания документа мы открываем основную форму этого документа для редактирования его пользователем.

Как найти документ?

Например, нужно найти в 2005 году документ

«РеализацияТоваровУслуг» по номеру «НомерДок» (периодичность нумерации - «в пределах года»). Тогда так:

ИскомыйДокумент = Документы

.РеализацияТоваровУслуг НайтиПоНомеру(НомерДок, Дата(2005, I, 1));

Если НЕ ИскомыйДокумент.ПустаяО Тогда

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

КонецЕсли: ]

Второй параметр метода НаЙТИПоНомеру() используется в случаях периодических нумерациый документов и может содержать любую дату из того периода, в рамках которого нужно искать документ.

Если же поиск нужно выполнять по реквизиту, то можно, конечно, использовать объектную модель работы с данными - метод НаЙТиПоРеквизиту() менеджера документа. Однако в результате будет получен только один из документов с искомым значением реквизита.

Гораздо удобнее для выполнения операций поиска использовать запросы. Например, с таким текстом:

ВЫБРАТЬ

РеализацияТоваровУслуг.Ссылка

ИЗ

Документ. РеализацияТоваровУслуг КАК РеализацияТоваровУслуг ГДЕ

РеализацняТоваровУслуг.Контрагент = &Контрагент И (РеализацияТоваровУслуг.Номср < 100 ИЛИ

РеализацияТоваровУслуг.Дата < ДАТАВРЕМЖ2005. 1, I))

И РеалнзацияТоваровУслуг.Товары.Номенклатура _В ИЕРАРХИИ(&Номенклатура)

Такой запрос позволяет получить все документы «РеализацияТоваровУслуг» по указанному контрагенту, закупавшему товары из указанной номенклатурной группы ранее 1 января 2005 года или позже, но с номерами документа менее «100».

Как открыть форму документа?

В переменной «ИскомыйДокумент» содержится ссылка на документ. Если требуется открыть основную форму этого документа, это можно выполнить так:

Форма = ИскомыйДокумснт.ПолучитьФорму(); Форма. Открыть();

Ф Как изменить значение реквизита и записать документ?

Например, переменная «СсылкаНаДокумент» содержит ссылку на тот документ, который необходимо изменить. Сначала по ссылке нужно получить объект ДокументОбъект. Потом можно установить значение нужного реквизита, и записать измененный документ.

ДокОбъект = С'сылкаНаДокумент.ПолучитьОбъект(); ДокОбъект.Ответственнын = г л Те ку щи й П oj і ыовател ь:

ДокОбъект.Записать»);

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

Если необходимо при этом провести документ, то:

ДокОбъект.Записать» РежимЗаписнДокумента. Проведение);

Первым параметром метода передается значение Проведение системного перечисления РежимЗаписиДокумента, а вторым параметром можно указать режим проведения

(оперативный/неоперативный, так же выбирается из соответствующего системного перечисления).

Если же наоборот, нужно отменить проведение документа, то:

ДокОбъскг.Записать» РежимЗаписиДокумента. ОтмснаПро ведения);

Во всех перечисленных случаях система передаст управление соответствующим ситуации обработчикам событий (Перед записью, При записи, Обработка проведения, Обработка удаления проведения).

Замечание: В языке системы нет специальной команды для инициализации выполнения проведения или отмены проведения документа. Все выполняется при соответствующем способе записи документа.

® Как добавить строку в табличную часть документа, имея ссылку на документ?

Допустим переменная «Док» содержит ссылку на документ. Имя табличной части этого документа - «Товары». Тогда:

ОбъектДок = Док.ПолучитьОбъектО: НоваяСтрока = ОбъектДок. Товары. Добавить!);

// Заполнить значения реквизитов. НоваяСтрока.Количество = 10; НоваяСтрока.Цена = 55;

// Записать документ.

ОбъектДок.ЗаписатьО;

Сначала получаем объект документа. Потом добавляем новую строку в табличную часть «Товары» документа. Результат метода Добавить() и есть новая строка. Теперь можно заполнить значения ее реквизитов.

В конце нужно не забыть записать документ.

ф Как удалить строки из табличной части документа?

В переменной «Документ» содержится ссылка на документ. Если требуется модифицировать этот документ - удалить строки из табличной части «Товары» этого документа, - это можно выполнить так:

ОбъектДокумента = Документ.ПолучитьОбъекгО; ОбъектДокумента.Товары.Очистить();_

По окончании всех модификаций, если это требуется, не забудьте записать документ.

ОбъектДокумента. ЗаписатьО;

В данном случае документ записан без проведения. Подробнее о записи документа с проведением смотри вопрос «Как провести документ?» на странице 109.

Какперебрать строки документа?

У документа может быть несколько табличных частей.

Перебор строк каждой табличной части проще производить в цикле перебора элементов коллекции или при помощи «цикла-счетчика».

Например, чтобы перебрать строки табличной части «Товары» документа «Документ», можно сделать так:

Для Каждого ТекущаяСтрока Из Документ.Товары Цикл //Действия со строкой табличной части.

КонецЦикла;

А можно так:
Как таблицу значений «ТаблицаПолучатель» заполнить данными таблицы значений «ИсходнаяТаблица»?

ф Как выгрузить табличную часть документа?

Чтобы выгрузить табличную часть «Товары» документа «Документ» в таблицу значений, можно сделать так:

ТаблицаТоваровДокумента = Докумснт.Товары.Выг руіні ь():

В результате система создаст таблицу значений с колонками, соответствующими колонкам табличной части и заполнит ее данными.

® Как посчитать итог в табличной части документа?

Итог по колонке «Сумма» табличной части «Товары» документа «Документ» можно посчитать следующим образом:

ВсегоПоКолонкеСумма = Документ.Товары.Итог( "Сумма"):

Как провести документ?

Как таблицу значений «ТаблицаПолучатель» заполнить данными таблицы значений «ИсходнаяТаблица»?


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

• Запись;

• ОтменаПроведения;

• Проведение

В нашем случае - это Проведение. Теперь при выполнении этой команды управление будет передано в обработчик события Обработка проведения записываемого документа.

Обратите внимание - нет отдельной команды на проведение, есть только запись документа, с проведением или без.

Какперебратьдокументы?

Для перебора всех документов, например «РеализацияТоваровУслуг», можно использовать выборку.

Выберем, например, документы за текущий год.

ВыборкаДокументов = Документы. Расходная. Выбраі ьІНачалоГода(ТекущаяДата()).

КонецГ ода(ТекущаяДата()));

Пока ВыборкаДокументов.СледуюшийО Цикл

// Действия с документом - элементом выборки.

// его значение содержится в переменной ВыборкаДокументов

КонецЦикла

В теле цикла можно работать с каждым отдельным элементом выборки.

Однако, в случаях, когда требуется перебрать документы, соответствующие ряду условий - гораздо удобнее получать нужные документы при помощи запроса:

Запрос = Новый Запрос;

Запрос.Текст ="

ІВЫЬРАТЬ

I РеализацияТоваровУслуг.Ссылка |ИЗ

I Документ. РеализацияТоваровУслуг КАК Реализация! оваровУслуг ІІ'ДЕ

I РеализацияТоваровУслуг.Контрагент = &Контрагент

I И

I (РеализацияТоваровУслуг.Номер < ИХ)

I ИЛИ

I РеализацияТоваровУслуг.Дата < ДАТАВРЕМЯ(2005, I, I))

I И

I РеализацияТоваровУслуг.Товары.Номенклатура В ИЕРАРХИИ(&Номенклатура)"

Запрос.УстановитьПарамстрС'Контрагент '. ОтбКонтрагент); Запрос.УстановитьПараметрС’Номенклатура". ОтбНоменклатура);

Результат = Запрос.Выполнить();

Выборка = Результат.ВыбратьО:

Пока Выборка.Следующий() Цикл

// действия с документом - элементом выборки.

// его значение содержится в переменной Выборка

КонецЦикла;

В данном пример организован перебор всех документов «РеализацияТоваровУслуг» по указанному контрагенту, закупавшему товары из указанной номенклатурной группы ранее 1 января 2005 года или позже, но с номерами документа менее «100».

ф Как пометить на удаление все приходные накладные?

ДокументыВида= Документы.ПоступлениеТоваровУслуг.Выбрать();

Пока ДокумснтыВида.СледующийО Цикл ДокОбъект = ДокументыВида.ПолучитьОбъект(); ДокОбъект.УсгановитьПометкуУдаления(Истина);

Конеці Іикла:

Выполняем выборку приходных накладных. Обходим ее в цикле. Внутри цикла получаем объект документа по каждой из ссылок на накладную. Теперь помечаем документ на удаление при помощи метода УстановитьПометкуУдаления(). В результате документ будет помечен на удаление с вызовом обработчика Перед ЗЭПИСЬЮ

Замечание: как альтернативный вариант - можно было бы внутри цикла просто присваивать реквизиту «ПометкаУдаления» объекта документа значение Истина. Но в этом случае пришлось бы еще обеспечивать и запись документа.

(D Как, имея ссылку на документ, создать в базе его копию?

ДокументКопия = ИсходныйДокумент.СкопироватьО; ДокументКопия.Дата = РабочаяДата;

ДокументКопия.ЗаписатьО;_

При применении метода Скопироватьл) все реквизиты нового документа получают свои значения из переменной «ИсходныйД оку мент». Исключение составляют значения реквизитов «Дата» и «Проведен».

Поэтому, если копирование документа не сопровождается открытием его формы, дату нового документа лучше установить самостоятельно.

В нашем примере в качестве значения реквизита «Дата» устанавливаем дату, которую обычно используют для случаев создания новых документов (получаем из свойства глобального контекста РабочаяДата).

Но если Вам нужно и дату скопировать из документа - источника, то эта строка должна выглядеть следующим образом:

ДокументКопня.Дата = ИсходныйДокумент.Дата:

Ну а потом уже записывать новый документ в базу. В данном случае мы записываем его без проведения.

® Как, имея ссылку на документ, прочитать его движения по регистру?

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

Запрос - Новый Запрос;

Запрос.Текст ="ВЫБРАТЬ *

|ИЗ

I РегистрНакопления.ОстаткиНоменклатуры КАК ОстаткнНоменклатуры |ГДЕ

I ОстаткиНоменклатуры.Регистратор = &Регистратор";

Запрос.УстановитьПараметрС'Рсгистратор”. ПолеВводаРегистратор);

В запросе выбираем все поля (кроме виртуальных) из таблицы регистра «РегистрНакопления.ОстаткиНоменклатуры» с отбором по регистратору. Значением параметра «Регистратор» нужно будет установить ссылку на документ.

Если же нужно чтение с последующей модификацией движений -следует воспользоваться объектной моделью представления информации: в свойстве Движения объекта документа обратиться к нужному регистру (в нашем случае это регистр «ОстаткиНоменклатуры») и прочитать набор записей регистра:

НаборЗаписейРегнстра = Движения.ОстаткиНоменклатуры; НаборЗап исей Регистра. П рочитать();

Для Каждого Запись из НаборЗаписейРегнстра Цикл

// Чтение и модификация очередного движения.

КонецЦнкла;

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

Движения.

Например:

Для Каждого НаборЗапнсейРегисгра из Движения Цикл НаборЗаписейРегистра.ПрочитатьО;

Для Каждого Запись из НаборЗапнсейРегисгра Цикл

// Чтение и модификация очередного движения.

КонецЦикла;

КонецЦикла;

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

Далее читаем наборы записей каждой коллекции и открываем цикл перебора записей данного набора записей.

Как определить, по каким регистрам документ выполнил движения?

Например, требуется определить, по каким регистрам выполнил движения документ «ВнутреннийЗаказ». Наиболее производительным решением этой задачи будет выполнение следующего запроса к регистрам:

ВЫБРАТЬ ПЕРВЫЕ I

"Внутренние заказы" КАК Регистр ИЗ

РегистрНакопления.ВнутренниеЗаказы КАК ВнутренниеЗаказы

ГДЕ

ВнутренниеЗаказы.Регистратор = &Регистратор

ОБЪЕДИНИТЬ

ВЫБРАТЬ ПЕРВЫЕ 1

"Заказы поставщикам" КАК Регистр ИЗ

РегистрНакопления.ЗаказыПоставщикам КАК ЗаказыПоставщикам

ГДЕ

ЗаказыПоставщикам.Регистратор = &Реі истратор

ОБЪЕДИНИТЬ ВЫБРАТЬ ПЕРВЫЕ 1

"Размещение заказов покупателей" КАК Регистр ИЗ

РегистрНакопления.РазмещеннеЗаказовПокупателеіі КАК РазмешениеЗаказовПокупателей

ГДЕ

РазмешениеЗаказовПокупателей. Регистратор = &Регнстратор

ОБЪЕДИНИТЬ

ВЫБРАТЬ ПЕРВЫЕ 1

"Товары в резерве на складах" КАК Регистр ИЗ

РегистрНакоплсния.ТоварыВРезсрвсНаСкладах КАК ТоварыВРезервеНаСкладах

ГДЕ

ТоварыВРезервеНаСкладах.Регнстратор = &Регистратор

Для каждого регистра, по которому документ «ВнутрениийЗаказ» может выполнять движения, выполняется получение одной первой записи этого регистра, для которой выбранный документ является регистратором (ссылка на выбранный документ должна быть передана в параметр «Регистратор» запроса). В качестве значения выбранного поля получается строка с названием регистра. Результаты всех запросов объединяются.

В результате работы этого запроса может быть получена, например, такая таблица:

Как таблицу значений «ТаблицаПолучатель» заполнить данными таблицы значений «ИсходнаяТаблица»?


Как в табличной части документа удалить строки с нулевым значением реквизита «Количество»?

Если у нас есть ссылка на некоторый уже записанный документ, тогда можно поступить следующим образом:

ОбъектДок = СсылкаДок.ПолучмтьОбъектО;

СтруктураДляПоиска = Новый Структура("Количество", 0);

ТабличнаяЧастьДок = ОбъектДок.Товары;

МассивІ ІустыхСтрок = ТаблнчнаяЧастьДок.НайтиСтроки(СтруктураДляІІоиска);

Для каждого Строка Ил МассивПустыхСтрок Цикл ТабличнаяЧастьДок.Удалить(Строка);

КонецЦнкла;

ОбъектДок. Зашісать();

Получаем по ссылке объект документа. Создаем структуру для поиска. В качестве ключа указываем название реквизита, в качестве значения - искомое значение. Обращаемся к табличной части «Товары» данного документа. Посредством метода НаЙТиСтроки() получаем массив строк соответствующих нашей структуре для поиска. В цикле перебираем эти строки и удаляем их из табличной части документа. После выхода из цикла записываем документ-объект с обработанной табличной частью.

Если же речь идет о еще не записанном документе, и работа выполняется в форме документа, реализация задачи незначительно изменяется:

СтруктураДляПоиска = Новый СтруктураСКоличество”. 0);

МассивПустыхСтрок = Товары.НантиСтроки(СтруктураДляПоиска):

Для каждого Строка Из МассивПустыхСтрок Цикл Товары.Удалить(Строка);

КонецЦнкла;

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

Как очистить колонку «СтавкаНДС» в табличном поле «Товары» уже заполненного документа?

Для этого нужно «обнулить» значения реквизита «СтавкаНДС» в строках табличной части «Товары» документа. Именно она «отвечает» за данные, представляемые в табличном поле.

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

Например, текст процедуры обработчика:

Процедура ТоварыСтавкаНДСПриИзменении(Элемент)

// Рассчитать реквизиты табличной части. РассчитатьСуммуНДСТабЧастн(ЭлемснтыФормы.Товар

ЭтотОбъект);

КонецПроцедуры // ТоварыСтавкаНДСПрнИзмененннО
ы.ТекущиеДанные,
Тогда решение нашей задачи будет выглядеть следующим образом:
Для Каждого Строка из Товары Цикл
Строка.СтавкаНДС = Неопределено;
// Передать управление на процедуру, вызываемую
// из обработчика события "ПриИзменении" для поля ввода "СтавкаНДС"
ЭлементыФормы.Товары.ТекущаяСтрока = Строка:
РассчитатьСуммуНДСТабЧастнОлементыФормы.Товары.ТекущисДанные.
ЭтотОбъект):
КонецЦикла:
Открываем цикл перебора строк табличной части «Товары». В цикле устанавливаем значение «Неопределено» для реквизита «СтавкаНДС».

Теперь необходимо выполнить те же действия, что выполнял обработчик интерактивного изменения ставки НДС. И поскольку одним из параметров процедуры РассчитатьСуммуНДСТабЧастиО передается свойство Текущие Да иные табличного поля - сначала позиционируемся на нужной строке табличного поля. Теперь передаем управление нужной процедуре.

Какзаполнитьзначения свойств нового документа на основании существующего?

Для этого можно воспользоваться методом глобального контекста ЗаполнитьЗначенияСвоЙСТВ(), который позволяет копировать значения свойств одного объекта в свойства другого объекта:

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

// Заполнить табличную часть Товары.

Для Каждого СтрокаТоваровЗаката Из ДокументЗаказа.Товары Цикл ЗамолнитьЗначснияСвойствІ НовынСчет.Товары.ДобавитьІ).

СтрокаТоваровЗаказа);

КонецЦикла;

// Заполнить табличную часть ВозвратнаяТара

Для Каждого СтрокаТарыЗаказа Из ДокументЗаказа. ВозвратнаяТара Цикл ЗаполнитьЗначенияСвойств(НовыйСчет.ВозвратнаяТара.Добавить(),

СтрокаТары Заказа);

КонецЦикла;

// Заполнить табличную часть Услуги

Для Каждого СтрокаУслугЗаказа Из ДокументЗаказа.Услуги Цикл ЗаполннтьЗначснняСвойствШовынСчет.Услуги.ДобавнтьО. СтрокаУслугЗаказа): КонецЦикла;

НовынСчет.ЗаказПокупателя = ДокументЗаказа;

Форма = НовыйС'чет.ПолучитьФормуО: Форма.ОткрытьО;

Как получить перечень приходных накладных, в которых не заполнены номенклатурные позиции?

Запрос = Новый Запрос:

Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ

1 ПриходпаяТовары.Ссылка как Накладные |ИЗ

1 Документ.ПоступлениеТоваровУслуг.Товары КАК ПрмходнаяТовары і
|ГДЕ

1 ПрмходнаяТовары.Номенклатура = &ПустаяНоменкла
ура";
Запрос.УстановитьПараметр( "ПустаяНоменклатура",

Справочники.Номенклатура
.ПустаяСсылкаО);
ТаблицаНакладных = Запрос.ВыполнитьО;
Выполняем запрос по табличной части «Товары» приходных накладных. Делаем отбор по равенству поля «Номенклатура» параметру « ПустаяНоменклатура».

В качестве значение параметра устанавливаем пустую ссылку справочника «Номенклатура».

Результат запроса будет состоять из единственной колонки «Накладные».

Обратите внимание - выбираем не повторяющиеся записи (ВЫБРАТЬ РАЗЛИЧНЫЕ). наличия

нескольких строк с незаполненной номенклатурой в одном документе.

Как на дату расходной накладной определить курс валюты управленческого учета? Валюта управленческогоучета храниться в периодическом регистре сведений.

Информацию о валюте управленческого учета хранит регистр сведений «УчетнаяПолитика» - периодический, с периодичностью год:

'Ш УчетнаяПолип#;а . . Иэмере**<я В-1 Ресурсы

I |— I ВалютаУправпемческая I '— § М етааСписаміяП артий h-f Реквизиты

Регистр сведений «КурсыВалют» - так же периодический, но с периодом «день»:

- $ Курсыбалют ? . Измерения

L-t. Ва/юта В т Ресурсы hi Курс '— I Кратность « Реквизиты

Данную информацию можно получить посредством запроса:

ВЫБРАТЬ

КурсыВалютСреіПоследних.Валюта как ВалютаУпр,

Курсы Вал ютС реч Пос;іедн и х. Ку ре как КурсУпр ИЗ

Реі исгрСвелений. КурсыВал ют.СретПоследних(&ДатаДокумента. Валюта В ( ВЫБРАТЬ

У чегн аяПолитикаСретПоследних.Вал ютаУ правлен чес кая ИЗ

РсгнстрСведений.УчетнаяПолитнка.СрезПоследних(&ДатаДокумснта, ) КАК УчетнаяПолнтикаСрезПоследних)

) КАК КурсыВалютСретПоследних

Во вложенном запросе осуществляем определение управленческой валюты на дату документа. Результатом будет таблица с единственной валютой. Данную таблицу используем при построении отбора на параметрах виртуальной таблицы

«РегистрСведений. Курсы Валют. СрезПоследних». Поскольку

управленческих валют - только одна, на выходе запроса получим таблицу из единственной записи с двумя полями «ВалютаУпр» и «КурсУпр».

Как из формы документа вызвать его неоперативное проведение?

В форме документа кнопке «ОК» обычно назначается действие «записать и закрыть», обеспечивающее выполнение стандартных операций по записи, проведению документа и закрытию формы. Одной из таких операций, при определенном перечне условий, является уточнение у пользователя режима проведения документа (оперативно или неоперативно).

В случае если для проведения документа это никакой роли не играет, и пользователя раздражает подобная «любознательность» системы, можно сделать следующее:

-удалить стандартную кнопку;

- создать свою кнопку;

- в качестве действия назначить нижеприведенную процедуру.

Процедура ОсновныеДействияФормыОК(Кнопка)

ЭтаФорма. Испод ьзоватьРежимПроведения — Испод ьзованиеРсжимаПровелсння

.Неоперативный:

ЗаписатьВФорме(РежимЗаписиДокумента.Про ведение):

Закрыть();

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

В процедуре свойству ИспользоватьРежимПроведения

расширения формы документа назначаем значение Неоперативный из соответствующего системного перечисления.

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

Последней командой процедуры форма документа закрывается.

Как в обработке проведения получить остатки, актуальные на позицию документа?

Корректно вопрос решается за счет использования параметра «Период» виртуальной таблицы:

Для запроса вида:

Запрос.Текст = " ВЫБРАТЬ

I ВзаиморасчетыСКонтрагентамиОстаткн.СуммаВзаиморасчетовОстаток,

I ВзаиморасчетыСКонтрагентамиОстатки.СуммаУпрОстаток |ПЗ

I РегистрНакоплення.ВзаиморасчетыСКонтраіентами.Остатки(&1ІараметрПериод.

ДоговорКонтрагснта = &Договор И Сделка =&Сделка) ( КАК ВзаиморасчетыСКонтрагентамиОстатки";

он должен устанавливаться следующим образом:

Запрос.УілановіпьПараметрГПараметрПериод". МомеитВремениО):

Необходимо обеспечить расчет данных по всем активным записям документов, введенных ДО текущего. Именно поэтому в качестве параметра передается момент времени документа, а не дата документа. Точность реквизита «Дата» - дата (минимальная дробность - секунда). А у момента времени - дата и ссылка.

То есть, если есть несколько документов с одной и той же датой система за счет метода МоментВремени() точно определит - кто из них первый, кто второй, кто - следующий.

Замечание: обратите внимание на применение условий отбора данных по значениям измерений именно за счет параметров виртуальной таблицы уже при ее построении. Это обеспечивает большую скорость построения запроса, нежели применение ГДЕ.

Как определить количество документов и количество разных значений реквизита в таблице записей документа?

По данным документа «РегистрацияПростоевВОрганизации»

- Z РегистрацияЛростоеевОргамизацж ?з Реквизиты

—— Организация — Комментарий

- Ответственный

— ПермодРегист рации - — Физлицо

- Приказ

— ВиоПростоя — Дат «Начала

- Дат «Окончания В і.:2, Т абличные части

© ЕІ] На-аслеиия В ііІ, Расчет Среднее о

ВЫБРАТЬ

КОЛИЧЕСТВО(РегистрацняПростосвВОрганитации.Ссылка) КАК Случаев. КОЛИЧЕСТВО!РАЗЛИЧНЫЕ РегистраиняПростоевВОрганизации.ФнхПицо) КАК Работников ИЗ

Доку мент. РегистрацияПростосвВОрганиіации КАК Реі истрацияПростоевВОрганизации

ГДЕ

(РегистрацияПростоевВОрганизации.Проведен)

Источником является таблица документа

«РегистрацияПростоевВОргнаизации».

В качестве выходных полей получим значения агрегатной функции КОЛИЧЕСТВОО по отношению к полям «Ссылка» и «ФизЛицо». Причем подсчитываются только различные значения поля «ФизЛицо».

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

Значения этой строки по каждой из колонок и дадут требуемые данные.

В последовательность «ПартионныйУчет» добавлено измерение «Организация». Как теперь получить данные по границам последовательности для каждого значения этого измерения?

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

ПолучитьГраницы():

ТаблицаГраниц = Последовательности .ПартионныйУчет . ПолучитьГраннцы( "Организация");

Для Каждого СтрокаТаблицыГраниц из ТаблицаГраниц Цикл Организация = СтрокаТаблицыГраниц.Организация; ДатаГП = СтрокаТаблицыГраниц.Граница.Дата:

СсылкаГП = СтрокаТаблицыГ раннц. Граница.Ссылка: КонецЦнкла;

В качестве параметра методу достаточно передать название измерения (если нужно несколько - можно через запятую).

Далее в цикле перебираем полученную таблицу значений, считывая данные из колонки «Граница» и колонки «Организация».

Замечание: если границы нужны не все (по организациям), а только наименьшая из них - лучше применять метод ПолучитьГраницу(). Он возвращает уже не таблицу, а именно - момент времени.

Хранение сведений

Ф Как добавить запись в непериодический независимый регистр сведений?

Для непериодического регистра сведений:

% Зиаче»«4яСк>йсте Измерения ь-t. Номег* оатурз ! ‘—L Свойство

0 Ресурсы

1 *— I Значение з Реквизиты

НаборЗаписей = РегистрыСведений.ЗначенияСвойств.Сі здатьНаборЗаписей():
НаборЗаписей.Отбор.Номенклатура.Установить(ТекущаяНоменклатура); НаборЗаписей. Отбор.Свойство. У становить(ТекущееСвойство);
НоваяЗапись = НаборЗаішсей.ДобавитьО;

Новая Запись. Номенклатура = ТскущаяНоменклатура; НоваяЗапись.Свойство = ТекущееСвойство:

Новая Запись. Значение = ТекущееЗначсние;
НаборЗаписей.ЗаписатьО;
Создаем набор записей нашего регистра сведений.

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

Создаем новую запись, заполняем ее поля.

Записываем новый набор записей с замещением всех записей, соответствующих отбору. Параметр «Замещение» метода Записать() по умолчанию имеет значение Истина.

Для чего нужно замещение?

Дело в том, что в любом регистре запись с конкретным ключом записи всегда уникальна. Для непериодического независимого регистра сведений ключом записи является конкретная комбинация значений измерений.

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

Кроме того, в подобной работе можно удариться в другую крайность.

Если не применить отбор, то при записи система попытается заместить все существующие записи регистра. В результате, добавляя новый набор записей с замещением, - мы бы удалили все ранее введенные записи регистра!

ф Как считать содержимое непериодического независимого регистра сведений? «СобственныеКонтрагенты»?

НаборЗаписей = РегистрыСведений

.СобственныеКонтрагенты .Создать!! аборЗаписей!): НаборЗаписей.Прочитать! I;

// Перебрать записи в цикле...

Для Каждого Запись из НаборЗаписей Цикл РегистрКонтрагснт = Заиись.Контрагент; РегистрВидСвязи = Запись.ВидСвязи; РеіистрОбъекг = Запись.Объект: КонецЦикла

И ... или выгрузить записи в таблицу значений ТаблицаЗаписей = НаборЗаписей.Выгрузить!):

Сначала создаем переменную «НаборЗаписей», в которую считываем все записи регистра. Считанные записи можно выгрузить в таблицу значений или перебрать в цикле перебора коллекции. Внутри цикла переменная «Запись» предоставит доступ к самой записи. Например, для считывания содержимого полей записи.

Кроме того, эти же данные можно получить посредством запроса со следующим текстом:

ВЫБРАТЬ

*

ИЗ

РегистрыСведений.СобствешіыеКонтрагенты

В дальнейшем результат выполнения запроса можно также выбрать или выгрузить на таблицу значений.

(D Как удалить все записи из независимого регистра сведений?

НаборЗаписей = РепістрыСвсдснпй.ТоріовоеОборудование.СогдатьНаборЗапнсей(): НаборЗаписей.Запнсать();

Создаем переменную «НаборЗаписей» как набор записей регистра сведений. Поскольку мы не прочитали данные из регистра - в этот момент это пустой набор записей.

Записываем новый набор записей (пустой) с замещением всех предыдущих записей (по умолчанию параметр «Замещать» метода Записать() имеет значение Истина).

Замечание: данную технологию можно применять только для регистров сведений с независимым режимом записи.

<Э Как удалить записи независимого регистра сведений с отбором по конкретной организации?

Структура независимого регистра сведений

«ОбъектыСтроительстваОрганизаций» следующая:

ОбьектыСтроигельстваОргаиизацмй

ЁНІ-. Измерения

I ' - Организация

' . ОбъегтСтроительства Q- *и Ресурсы

|~ I СчетБухга/ттерскогоУчета I— I СчетБухга/тгерскогоУчетаНДС

НаборЗаписей = РегистрыСведеннй

.ОбъектыСтронтельстваОргашпаций .Соідаі ьі ІаборЗаписейІ);

НаборЗаписей.ОтборОргашпация.Усі ановить(УдаляемаяОрганизация): НаборЗаписей.Записать();

Создаем переменную «НаборЗаписей», устанавливаем для нее отбор по значению организации равный «УдаляемаяОрганизация». Кстати, отбор набора записей регистра всегда может устанавливаться только на равенство.

Далее записываем полученный пустой набор записей с замещением.

В результате все записи, соответствовавшие отбору, будут замещены пустым набором записей.

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

© Как добавить запись в периодический независимый регистр сведений?

Для периодического независимого регистра сведений так же актуально все сказанное про непериодический регистр сведений (см. вопрос «Как добавить запись в непериодический независимый регистр сведений?» на странице 124). Только по другому строится ключ записи -добавляем еще один отбор по полю «Период».

Ь КурсыВалют

В-Д-* Измерения *— і— Валюта

в- г* Psc*>c4 к**

I— I Кратность Реквизиты

НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписсйО:

НаборЗаписей.Отбор. ІЗалюта.У становить(Т екущая Валюта): НаборЗаписей. Отбор.Периол.Установить(ТекущаяДата):

НовЗапись = НаборЗаписей.ДобавитЦ):

НовЗапись.Валюта = ТекущаяВалюта:

НовЗапись. Период = ТекущаяДата:

НовЗапись.Курс = ТекущийКурс:

НовЗапнсь.Кратность = ТскушаяКратность:

НаборЗаписей.Записать(Истииа);

ф Как прочитать (изменить) записи в периодическом независимом регистре сведений?

Отличие технологии чтения (изменения) записей периодического регистра сведений от непериодического только в работе с полем «Период».

В примере ниже представлен вариант чтения данных периодического регистра сведений «Валюты» на дату «ДатаЗаписи», сообщение данных полей каждой записи и обнуление значения курса попавших в отбор записей:

НаборЗаиисей = РегистрыСведений.Валюты.СоздатьНаборЗаписей!) НаборЗаписей.Отбор.Период.Установить(ДатаЗаинсн);

НаборЗаписей.Прочитать!);

Для Каждого Запись Из НаборЗаиисей Цикл

// Чтение и сообщение данных полей записи. Сообщить(Строка(Запись.Период) + ”" +

Строка(Запись.Валюта) + " " +



Содержание раздела