Примеры кода для 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);
МассивСтрок = Товары.НайтиСтроки(СтруктураДляПоиска);
Как получить данные о текущей учетной политике бухгалтерского учета организации из периодического регистра сведений на заданную дату?
// Подготовить отбор по измерению "Организация".
СтруктураОтбора = Новый Структура("Организация", ЮрЛицо);
// Получить данные, актуальные на указанную дату.
СтруктураДанных =
РегистрыСведений.УчетнаяПолитикаБухгалтерскийУчет.ПолучитьПоследнее(ДатаПолучения,
СтруктураОтбора);
// Прочитать данные из структуры данных.
СпособОценкиМпзЮрЛица = СтруктураДанных.СпособОценкиМПЗ;
ДиректКостингЮрЛица = СтруктураДанных.ДиректКостинг;
Как сформировать структуру названий реквизитов табличной части произвольного документа?
Функция СформироватьСтруктуруТабличнойЧастиДокумента(Документ, ИмяТабличнойЧасти)
СтруктураТабличнойЧастиДокумента = Новый Структура;
Для Каждого Реквизит из
Документ.Метаданные().ТабличныеЧасти[ИмяТабличнойЧасти].Реквизиты Цикл
СтруктураТабличнойЧастиДокумента.Вставить(Реквизит.Имя, Реквизит.Имя);
КонецЦикла;
Возврат СтруктураТабличнойЧастиДокумента;
КонецФункции
Как получить запросом данные табличной части документа, имея структуру названий реквизитов табличной части?
Функция СформироватьЗапросПоТабличнойЧасти(Документ, ИмяТабличнойЧасти, СтруктураПолей) Экспорт
ПоляРеквизитов = "";
Для Каждого Реквизит Из СтруктураПолей Цикл
ПоляРеквизитов = ПоляРеквизитов + ", Док." + Реквизит.Значение + ?(ЗначениеНеЗаполнено(Реквизит.Ключ), "", " КАК " + СокрЛП(Реквизит.Ключ));
КонецЦикла;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Док.НомерСтроки " + ПоляРеквизитов + "
|ИЗ
| Документ." + Документ.Метаданные().Имя + "." + СокрЛП(ИмяТабличнойЧасти) + " КАК Док
|ГДЕ
| Док.Ссылка = &ДокументСсылка";
// Установить параметры запроса.
Запрос.УстановитьПараметр("ДокументСсылка", Документ.Ссылка);
Возврат Запрос.Выполнить();
КонецФункции
Соответствие
Как создать соответствие?
СозданноеСоответствие = Новый Соответствие();
Как добавить элементы в соответствие?
ВозрастСотрудников.Вставить(Сотрудник, ВозрастСотрудника);
ВозрастСотрудников[Сотрудник] = ВозрастСотрудника;
Как обратиться к элементу соответствия?
ВозрастСотрудника = ВозрастСотрудников.Получить(Сотрудник);
ВозрастСотрудника = ВозрастСотрудников [Сотрудник];
Как перебрать элементы соответствия?
Для Каждого Элемент из Замены Цикл
Сообщить(Элемент.Ключ + " - " + Элемент.Значение);
КонецЦикла;
Как удалить элемент соответствия?
Замены.Удалить(УдаляемыйТовар);
Замены.Очистить();
Как получить данные из соответствия?
Значение = КурсыВалютДокумента.Получить(УправленческаяВалюта);
Если Значение = Неопределено Тогда
Сообщить("Данная валюта в соответствии отсутствует");
Иначе
Курс = Значение["Курс"];
Кратность = Значение["Кратность"];
КонецЕсли;
Как получить многоуровневое соответствие видов расчетов, обладающих базовыми видами расчетов?
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ОсновныеНачисленияОрганизацииБазовыеВидыРасчета.Ссылка КАК Ссылка,
| ОсновныеНачисленияОрганизацииБазовыеВидыРасчета.ВидРасчета,
| ОсновныеНачисленияОрганизацииБазовыеВидыРасчета.ВидРасчета.Наименование,
| ОсновныеНачисленияОрганизацииБазовыеВидыРасчета.Предопределенный
|ИЗ
| ПланВидовРасчета.ОсновныеНачисленияОрганизации.БазовыеВидыРасчета КАК ОсновныеНачисленияОрганизацииБазовыеВидыРасчета
|ИТОГИ ПО
| Ссылка";
Результат = Запрос.Выполнить();
ВыборкаВидовРасчета = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
ВидыРасчета = Новый Соответствие;
БазовыеВидаРасчета = Новый Соответствие;
СвойстваВидаРасчета = Новый Структура("Наименование, Предопределенный");
// Цикл по видам расчета, обладающим базовыми.
Пока ВыборкаВидовРасчета.Следующий() Цикл
БазовыеВидаРасчета.Очистить();
ВыборкаБазовых = ВыборкаВидовРасчета.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
// Цикл по базовым видам расчета.
Пока ВыборкаБазовых.Следующий() Цикл
// Заполненить значения структуры "СвойстваВидаРасчета".
СвойстваВидаРасчета.Наименование = ВыборкаБазовых.Наименование;
СвойстваВидаРасчета.Предопределенный = ВыборкаБазовых.Предопределенный;
// Заполненить соответствие "БазовыеВидАРасчета".
БазовыеВидаРасчета.Вставить(ВыборкаБазовых.ВидРасчета, СвойстваВидаРасчета);
КонецЦикла;
// Заполнить соответствие "ВидыРасчета".
ВидыРасчета.Вставить(ВыборкаВидовРасчета.Ссылка, БазовыеВидаРасчета);
КонецЦикла;