Примеры кода для 1С 8.x. Часть 2.

Часть2. Универсальные коллекции

Массив

Как создать массив?

СозданныйМассив = Новый Массив ();

СозданныйМассив = Новый Массив (10);

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

ДвумерныйМассив = Новый Массив (2, 8);

ДвумерныйМассив = Новый Массив;
МассивВторогоПорядка = Новый Массив(8);
ДвумерныйМассив.Добавить(МассивВторогоПорядка);
ДвумерныйМассив.Добавить(МассивВторогоПорядка);

Значение = ДвумерныйМассив[2][5];
Значение = ДвумерныйМассив.Получить(2).Получить(5);

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

НашМассив.Добавить(НовоеЗначение);

Массив = Новый Массив;
Массив.Вставить(5, "ООО ""Лабан""");

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

Размер = НашМассив.Количество();

Как обратиться к элементу массива?

ПервоеЗначение = НашМассив[0];
НашМассив[9] = ДесятоеЗначение;

ПервоеЗначение = НашМассив.Получить(0);
НашМассив.Установить(9, ДесятоеЗначение);

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

Для Каждого ЭлементМассива Из МассивЭлементов Цикл
Если ТипЗнч(ЭлементМассива) = Тип("Число") Тогда
Сообщить(ЭлементМассива);
КонецЕсли;
КонецЦикла;

Для Сч = 0 по МассивЭлементов.ВГраница() Цикл
Если ТипЗнч(МассивЭлементов[Сч]) = Тип("Число") Тогда
МассивЭлементов[Сч] = 0;
КонецЕсли;
КонецЦикла;

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

МассивЭлементов.Удалить(0);

Индекс = МассивЭлементов.ВГраница();
Пока Индекс >= 0 Цикл
Если ТипЗнч(МассивЭлементов[Индекс]) = Тип("Число") Тогда
МассивЭлементов.Удалить(Индекс);
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;

Как удалить все элементы массива?

Массив.Очистить();

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

Процедура УдалитьПовторяющиесяЭлементы(Массив)

ТекущийИндекс = 0;
ВсегоЭлементов = Массив.Количество();
Пока ТекущийИндекс < ВсегоЭлементов Цикл
Индекс2 = ТекущийИндекс + 1;
Пока Индекс2 < ВсегоЭлементов Цикл
Если Массив[Индекс2] = Массив[ТекущийИндекс] Тогда
Массив.Удалить(Индекс2);
ВсегоЭлементов = ВсегоЭлементов - 1;
Иначе
Индекс2 = Индекс2 + 1;
КонецЕсли;
КонецЦикла;
ТекущийИндекс = ТекущийИндекс + 1;
КонецЦикла;

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

Как скопировать массив?

Функция СкопироватьМассив(ИсходныйМассив)

МассивКопия = Новый Массив;
Для Каждого Элемент Из ИсходныйМассив Цикл
МассивКопия.Добавить(Элемент);
КонецЦикла;

Возврат МассивКопия;

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

Как проверить, что два массива идентичны?

Функция ПроверитьИдентичностьМассивов(ПервыйМассив, ВторойМассив)

НаибольшийИндекс = ПервыйМассив.ВГраница();
Если НаибольшийИндекс > ВторойМассив.ВГраница () Тогда
Возврат Ложь;
КонецЕсли;

Для Счетчик = 0 По НаибольшийИндекс Цикл
Если ПервыйМассив[Счетчик] <> ВторойМассив[Счетчик] Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;

Возврат Истина;

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

В массив выгружены данные, содержащие наименования контрагентов. Как их отсортировать?

СписокЗначений = Новый СписокЗначений;
СписокЗначений.ЗагрузитьЗначения(МассивНаименований);
СписокЗначений.СортироватьПоЗначению();
МассивНаименований = СписокЗначений.ВыгрузитьЗначения();

СписокЗначений.СортироватьПоЗначению(НаправлениеСортировки.Убыв);

Есть массив, в который выгружены значения типа СправочникСсылка.Номенклатура. Как удалить все пустые значения массива?

Процедура УдалитьПустыеЭлементы(МассивНоменклатуры)

Счетчик = 0;
КоличествоЭлементов = МассивНоменклатуры.Количество();
Пока Счетчик < КоличествоЭлементов Цикл
Если МассивНоменклатуры [Счетчик].Пустая() Тогда
МассивНоменклатуры.Удалить(Счетчик);
КоличествоЭлементов = КоличествоЭлементов - 1;
Иначе
Счетчик = Счетчик + 1;
КонецЕсли;
КонецЦикла;

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

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

МассивНоменклатуры = СсылкаНаДокумент.Товары.ВыгрузитьКолонку("Номенклатура");
МассивНоменклатурыТара = СсылкаНаДокумент.ВозвратнаяТара.ВыгрузитьКолонку("Номенклатура");
Для Каждого ЭлементМассиваТара Из МассивНоменклатурыТара Цикл
МассивНоменклатуры.Добавить(ЭлементМассиваТара);
КонецЦикла;

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

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

Как в запросе сделать отбор по нескольким вариантам заполнения реквизита типа "ПеречислениеСсылка"?

Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| ОтпускаОрганизацииРаботникиОрганизации.ФизЛицо,
| ОтпускаОрганизацииРаботникиОрганизации.ДатаНачала,
| ОтпускаОрганизацииРаботникиОрганизации.ДатаОкончания
|ИЗ
| Документ.ОтпускаОрганизации.РаботникиОрганизации КАК ОтпускаОрганизацииРаботникиОрганизации
|ГДЕ
| ОтпускаОрганизацииРаботникиОрганизации.ПричинаОтсутствия В (&МассивПричин)";

МассивПричин = Новый Массив;
МассивПричин.Добавить(Перечисления.ПричиныОтсутствияНаРаботеВОрганизации.ОтпускБезСохраненияЗарплаты);
МассивПричин.Добавить(Перечисления.ПричиныОтсутствияНаРаботеВОрганизации.ОтпускУчебный);
Запрос.УстановитьПараметр("МассивПричин", МассивПричин);

Как из регистра сведений "РасчетчикиЗарплатыОрганизации" получить в виде массива всех расчетчиков зарплаты определенного подразделения организации?

Функция ПолучитьМассивРасчетчиков(Подразделение)

НаборЗаписей = РегистрыСведений.РасчетчикиЗарплатыОрганизации.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ПодразделениеОрганизации.Установить(Подразделение);
НаборЗаписей.Прочитать();
МассивРасчетчиков = НаборЗаписей.ВыгрузитьКолонку("Пользователь");

Возврат МассивРасчетчиков;

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

Функция ПолучитьМассивРасчетчиков(Подразделение)

Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| РасчетчикиЗарплатыОрганизации.Пользователь КАК Расчетчик
|ИЗ
| РегистрСведений.РасчетчикиЗарплатыОрганизации КАК РасчетчикиЗарплатыОрганизации
|ГДЕ
| РасчетчикиЗарплатыОрганизации.ПодразделениеОрганизации = &Подразделение";

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

МассивРасчетчиков = Новый Массив;
Пока Выборка.Следующий() Цикл
МассивРасчетчиков.Добавить(Выборка.Расчетчик);
КонецЦикла;

Возврат МассивРасчетчиков;

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

Структура

Как создать структуру?

СозданнаяСтруктура = Новый Структура;

Оппонент = Новый Структура ("Фамилия, Имя, Отчество, Возраст"
, "Иванов"
, "Иван"
, "Иванович"
, 7);

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

Оппонент = Новый Структура ("Фамилия, Имя, Отчество, Возраст",

"Иванов", "Иван", "Иванович", 30);
Оппонент.Вставить("Обращение", "Господин");
Оппонент.Вставить("Возраст", 32);

Как обратиться к элементу структуры?

ТекущийВозраст = Оппонет.Возраст;

КлючСтруктуры = "Возраст";
ТекущийВозраст = Оппонет[КлючСтруктуры];

ТекущийВозраст = Неопределено;
Оппонет.Свойство("Возраст", ТекущийВозраст);

Оппонет.Возраст = 32;

Оппонет["Возраст"] = 32;

Оппонент.Вставить("Возраст", 32);

Как перебрать элементы структуры?

Для Каждого Элемент из СтруктураПараметров Цикл
Сообщить(Элемент.Ключ + ": " + Элемент.Значение);
КонецЦикла;

Как удалить элемент структуры?

СтруктураПараметров.Удалить("Номенклатура");

СтруктураПараметров. Очистить();

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

Структура = Новый Структура;

// Добавить новый элемент.
Структура.Вставить("Цвет", WebЦвета.Белый);

// Установить значение для элемента с ключом "Цвет".
Структура.Вставить("Цвет", WebЦвета.Синий);

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

СтруктураОтборов = Новый Структура;
СтруктураПараметровОтбора = Новый Структура;

Для Каждого ЭлементОтбора из ЖурналДокументовСписок.Отбор Цикл
Если ЭлементОтбора.Использование Тогда
СтруктураПараметровОтбора.Очистить();
СтруктураПараметровОтбора.Вставить("Имя", ЭлементОтбора.Имя);
СтруктураПараметровОтбора.Вставить("ВидСравнения",

ЭлементОтбора.ВидСравнения);
СтруктураПараметровОтбора.Вставить("Значение",

ЭлементОтбора.Значение);
СтруктураПараметровОтбора.Вставить("ЗначениеПо",

ЭлементОтбора.ЗначениеПо);
СтруктураПараметровОтбора.Вставить("ЗначениеС",

ЭлементОтбора.ЗначениеС);
СтруктураПараметровОтбора.Вставить("Представление",

ЭлементОтбора.Представление);
СтруктураПараметровОтбора.Вставить("ПутьКДанным",

ЭлементОтбора.ПутьКДанным);
СтруктураПараметровОтбора.Вставить("ТипЗначения",

ЭлементОтбора.ТипЗначения);

СтруктураОтборов.Вставить(ЭлементОтбора.Имя, СтруктураПараметровОтбора);
КонецЕсли;
КонецЦикла;

Как определить, есть ли в структуре элемент с ключом "Контрагент", и если есть, но содержит пустое значение справочника или Неопределено - удалить этот элемент?

Если Структура.Свойство("Контрагент", ЗначениеЭлемента) Тогда
Если ЗначениеЭлемента = Неопределено ИЛИ ЗначениеЭлемента.Пустая() Тогда
Структура.Удалить("Контрагент");
КонецЕсли;
КонецЕсли;

Структура.Контрагент

Структура["Контрагент"]

Как из табличной части "Товары" документа получить все строки, где значение реквизита "Цена" равно нулю, а значение реквизита "СтавкаНДС" равно значению "НДС18" перечисления "СтавкиНДС"?

СтруктураДляПоиска = Новый Структура("Цена, СтавкаНДС", 0,

Перечисления.СтавкиНДС.НДС18);
МассивСтрок = Товары.НайтиСтроки(СтруктураДляПоиска);

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

// Подготовить отбор по измерению "Организация".
СтруктураОтбора = Новый Структура("Организация", ЮрЛицо);

// Получить данные, актуальные на указанную дату.
СтруктураДанных =

РегистрыСведений.УчетнаяПолитикаБухгалтерскийУчет.ПолучитьПоследнее(ДатаПолучения,

СтруктураОтбора);

// Прочитать данные из структуры данных.
СпособОценкиМпзЮрЛица = СтруктураДанных.СпособОценкиМПЗ;
ДиректКостингЮрЛица = СтруктураДанных.ДиректКостинг;

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

Функция СформироватьСтруктуруТабличнойЧастиДокумента(Документ, ИмяТабличнойЧасти)

СтруктураТабличнойЧастиДокумента = Новый Структура;
Для Каждого Реквизит из

Документ.Метаданные().ТабличныеЧасти[ИмяТабличнойЧасти].Реквизиты Цикл
СтруктураТабличнойЧастиДокумента.Вставить(Реквизит.Имя, Реквизит.Имя);
КонецЦикла;

Возврат СтруктураТабличнойЧастиДокумента;

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

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

Функция СформироватьЗапросПоТабличнойЧасти(Документ, ИмяТабличнойЧасти, СтруктураПолей) Экспорт

ПоляРеквизитов = "";
Для Каждого Реквизит Из СтруктураПолей Цикл
ПоляРеквизитов = ПоляРеквизитов + ", Док." + Реквизит.Значение + ?(ЗначениеНеЗаполнено(Реквизит.Ключ), "", " КАК " + СокрЛП(Реквизит.Ключ));
КонецЦикла;

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Док.НомерСтроки " + ПоляРеквизитов + "
|ИЗ
| Документ." + Документ.Метаданные().Имя + "." + СокрЛП(ИмяТабличнойЧасти) + " КАК Док
|ГДЕ
| Док.Ссылка = &ДокументСсылка";

// Установить параметры запроса.
Запрос.УстановитьПараметр("ДокументСсылка", Документ.Ссылка);

Возврат Запрос.Выполнить();

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

Соответствие

Как создать соответствие?

СозданноеСоответствие = Новый Соответствие();

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

ВозрастСотрудников.Вставить(Сотрудник, ВозрастСотрудника);

ВозрастСотрудников[Сотрудник] = ВозрастСотрудника;

Как обратиться к элементу соответствия?

ВозрастСотрудника = ВозрастСотрудников.Получить(Сотрудник);

ВозрастСотрудника = ВозрастСотрудников [Сотрудник];

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

Для Каждого Элемент из Замены Цикл
Сообщить(Элемент.Ключ + " - " + Элемент.Значение);
КонецЦикла;

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

Замены.Удалить(УдаляемыйТовар);

Замены.Очистить();

Как получить данные из соответствия?

Значение = КурсыВалютДокумента.Получить(УправленческаяВалюта);

Если Значение = Неопределено Тогда
Сообщить("Данная валюта в соответствии отсутствует");

Иначе
Курс = Значение["Курс"];
Кратность = Значение["Кратность"];
КонецЕсли;

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

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ОсновныеНачисленияОрганизацииБазовыеВидыРасчета.Ссылка КАК Ссылка,
| ОсновныеНачисленияОрганизацииБазовыеВидыРасчета.ВидРасчета,
| ОсновныеНачисленияОрганизацииБазовыеВидыРасчета.ВидРасчета.Наименование,
| ОсновныеНачисленияОрганизацииБазовыеВидыРасчета.Предопределенный
|ИЗ
| ПланВидовРасчета.ОсновныеНачисленияОрганизации.БазовыеВидыРасчета КАК ОсновныеНачисленияОрганизацииБазовыеВидыРасчета
|ИТОГИ ПО
| Ссылка";

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

ВидыРасчета = Новый Соответствие;
БазовыеВидаРасчета = Новый Соответствие;
СвойстваВидаРасчета = Новый Структура("Наименование, Предопределенный");

// Цикл по видам расчета, обладающим базовыми.
Пока ВыборкаВидовРасчета.Следующий() Цикл
БазовыеВидаРасчета.Очистить();
ВыборкаБазовых = ВыборкаВидовРасчета.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

// Цикл по базовым видам расчета.
Пока ВыборкаБазовых.Следующий() Цикл

// Заполненить значения структуры "СвойстваВидаРасчета".
СвойстваВидаРасчета.Наименование = ВыборкаБазовых.Наименование;
СвойстваВидаРасчета.Предопределенный = ВыборкаБазовых.Предопределенный;

// Заполненить соответствие "БазовыеВидАРасчета".
БазовыеВидаРасчета.Вставить(ВыборкаБазовых.ВидРасчета, СвойстваВидаРасчета);
КонецЦикла;

// Заполнить соответствие "ВидыРасчета".
ВидыРасчета.Вставить(ВыборкаВидовРасчета.Ссылка, БазовыеВидаРасчета);

КонецЦикла;
Добавить комментарий