helpf.pro
Регистрация

v8.2 УП: Массивы

Viki
29.08.2012 13:34Прочитано: 3424
У меня вопрос про массивы. Есть какой нибудь пример с циклами по массиву?
Yandex
Возможно, вас также заинтересует
Реклама на портале
harmless
29.08.2012 13:45Ответ № 1
https://help1c.com/faq82/view/677.html
Изменено 29.08.12 13:47:25
asdfr1
29.08.2012 13:50Ответ № 2
думаю список значений тоже пойдёт :
Врачь = ЭтаФорма.ЭлементыФормы.ПолеВвода1.Значение;
//СписокВрачей = Новый Массив;
СписокВрачей = Новый СписокЗначений;

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Врачи.Наименование
|ИЗ
| Справочник.Врачи КАК Врачи";

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

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

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

КонецЦикла;
ТЗ = Результат.Выгрузить();
//ОткрытьЗначение(ТЗ);
Для каждого Строка Из ТЗ Цикл

Стр = СокрЛП(Строка.Наименование);
СписокВрачей.Добавить(Стр);

КонецЦикла;

//+ по каждому врачу

Таблица = СписокВрачей.Скопировать();
Для каждого СтрВрачь Из Поле1 Цикл

//СтрВ1 = СтрВрачь;
СтрВ1 = СтрВрачь.Значение;

СтрВ = СокрЛП(СтрВ1);
Запрос5 = Новый Запрос;
Запрос5.Текст =
"ВЫБРАТЬ
..... ";

Запрос5.УстановитьПараметр("ВрачЁпта", СтрВрачь.Значение);
asdfr1
29.08.2012 13:58Ответ № 3
или как то так:
Строка = ЭтаФорма.ЭлементыФормы.ВрачиПоСменам.ТекущиеДанные;
ВремяНачала = Строка.НачалоРабочегоВремени;
ВремяНачала1 = Строка.НачалоРабочегоВремени;
ВремяКонца = Строка.КонецРабочегоВремени;

ВосемьВечера = Дата(0001, 1, 1, 20, 00, 00);
ВосемьУтра = Дата(0001, 1, 1, 08, 00, 00);

ТабДок = Новый ТабличныйДокумент;
Дата = ЭлементыФормы.ВрачиПоСменам.ТекущиеДанные.Период;
Список = Новый Массив;


Пока ВосемьУтра <= ВосемьВечера Цикл
ВосемьУтра = ВосемьУтра + 1800;
Список.Добавить(ВосемьУтра - 1800);

КонецЦикла;
Viki
29.08.2012 14:00Ответ № 4
Код 1C v 8.2 УП
 Для Каждого СтрокаТаблицыЗначений из ТЗОтрВрДляСравненияСРН Цикл
ПерСотрудник=СокрЛП(СтрокаТаблицыЗначений.Сотрудник);
ПерВидВремени=СокрЛП(СтрокаТаблицыЗначений.ВидВремени);
ПерЧас=СтрокаТаблицыЗначений.Часов ;
ОтборПоТабелюВРН=Новый Структура;
ОтборПоТабелюВРН.Вставить("Сотрудник",СтрокаТаблицыЗначений.Сотрудник);
ОтборПоТабелюВРН.Вставить("ВидИспользованияРабочегоВремени",СтрокаТаблицыЗначений.ВидВремени);
//сообщить(ОтборПоТабелюВРН.Количество());
НайденныеСтроки=КопРабочееВремяРаботниковОрганизаций.НайтиСтроки(ОтборПоТабелюВРН);

Если КопРабочееВремяРаботниковОрганизаций.Найти(СтрокаТаблицыЗначений.Сотрудник,"Сотрудник")<> Неопределено Тогда
сообщить(1);

Если НайденныеСтроки<>Неопределено ТОгда
сообщить(2);
// Цикл поиска по массиву
Для Каждого ЭлементМассива из НайденныеСтроки Цикл
сообщить(3);
Если Часов<> ПерЧас тогда
сообщить(4);

...
у меня проблема как из массива вытащить значение его элемента
asdfr1
29.08.2012 14:18Ответ № 5
конфа самописная, делал так:
ТЗ1=Новый ТаблицаЗначений;
Для Каждого ЗначениеМассива из Список Цикл
ТЗ1.Добавить();
КонецЦикла;
*01
harmless
29.08.2012 14:22Ответ № 6
у меня проблема как из массива вытащить значение его элемента

Тогда нужно смотреть здесь:
https://help1c.com/faq82/view/188.html
Viki
29.08.2012 14:59Ответ № 7
а можно как то посмотреть данные массива?
Viki
29.08.2012 15:01Ответ № 8
мне нужно понять его размерность,как НайденныеСтроки=КопРабочееВремяРаботниковОрганизаций.НайтиСтроки(ОтборПоТабелюВРН); записывает данные в массив. Построчно или по столбцам и по строкам?
Viki
29.08.2012 15:01Ответ № 9
мне нужно понять его размерность,как НайденныеСтроки=КопРабочееВремяРаботниковОрганизаций.НайтиСтроки(ОтборПоТабелюВРН); записывает данные в массив. Построчно или по столбцам и по строкам?
asdfr1
29.08.2012 15:12Ответ № 10
*01 скорее всего построчно - с двумя столбиками :Сотрудник,ВидИспользованияРабочегоВремени
asdfr1
29.08.2012 15:14Ответ № 11
опс! нет фигачит в один столбик!сотрудники заканчиваются за ними идёт ВидИспользованияРабочегоВремени *01
Viki
29.08.2012 15:16Ответ № 12
т.е. он выводит только те поля которые в структуре были? а мне то надо было то,что в регистре накоплений ...мне надо поле часы
asdfr1
29.08.2012 15:19Ответ № 13
попробуй открыть массив, яснее будет
Viki
29.08.2012 15:24Ответ № 14
Для ИндексЭлемента = 0 По НайденныеСтроки.ВГраница() Цикл

Код 1C v 8.2 УП
 Если НайденныеСтроки[ИндексЭлемента]<> ПерЧас тогда

сообщить(НайденныеСтроки[ИндексЭлемента]);

КонецЕсли ;
КонецЦикла;


Выдает мне : СтрокаТаблицыЗначений. А обращаться к ней чтоб получить элемент строки не дает как в ТЗ
*01 *01 *01 *01 *01
Viki
29.08.2012 15:25Ответ № 15
(13) asdfr1, как его открыть? в отладчике открыть его не дает
asdfr1
29.08.2012 15:33Ответ № 16
непонятно что на выходе получить надо, зачем создавать два столбика, они взаимосвязаны?
Viki
29.08.2012 15:40Ответ № 17
Задача в следующем: сравнить Документ ТабельУчетаРабочегоВремениОрганизации и РН РабочееВремяРаботниковОрганизаций. Найти значения, которых нет в РН, т.е. если нет сотрудника,нет сотрудника+видрабочеговремени,либо не совпалдают по часам работ. Эту задачу я сделала с помощью циклов. Все работает. Но медленно. Решила сделать через .НайтиСтроки()
Viki
29.08.2012 15:45Ответ № 18
Вот так я сделала с помощью циклов
Код 1C v 8.2 УП
 	    //*************************************************************************
// для сравнения с регистром накопления РабочееВремяРаботниковОрганизации
//*************************************************************************
Если СравнениеСРНРВРО=1 тогда
// создаем копию из выборки по табелю
ТЗОтрВр.Свернуть("Подр,ТабНомер,Сотрудник,ВидВремени","Часов");
ТЗОтрВр.Сортировать("Подр,ТабНомер,Сотрудник,ВидВремени");
ТЗОтрВрДляСравненияСРН=ТЗОтрВр.Скопировать();
ТЗОтрВрДляСравненияСРН.Индексы.Добавить("Сотрудник");
ТЗОтрВрДляСравненияСРН.Индексы.Добавить("ВидВремени");

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

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

Для Каждого СтрокаТаблицыЗначений из ТЗОтрВрДляСравненияСРН Цикл
// ПерПодр=СокрЛП(СтрокаТаблицыЗначений.Подр) ;
// ПерТабНом=СокрЛП(СтрокаТаблицыЗначений.ТабНомер);
ПерСотрудник=СокрЛП(СтрокаТаблицыЗначений.Сотрудник);
ПерВидВремени=СокрЛП(СтрокаТаблицыЗначений.ВидВремени);
ПерЧас=СтрокаТаблицыЗначений.Часов ;
флаг1=0;//Флаг для поиска совпадения по сотруднику и по виду времени
// Ищем в таблице КопРабочееВремяРаботниковОрганизаций строки по двум параметрам сотрудник и ВидИспользованияРабочегоВремени и сравниваем в найденной строке значение часов
Если КопРабочееВремяРаботниковОрганизаций.Найти(СтрокаТаблицыЗначений.Сотрудник,"Сотрудник")<> Неопределено Тогда
Для Каждого СтрокаТаблицыЗначений из КопРабочееВремяРаботниковОрганизаций Цикл
если СокрЛП(СтрокаТаблицыЗначений.Сотрудник) = ПерСотрудник тогда
если СокрЛП(СтрокаТаблицыЗначений.ВидИспользованияРабочегоВремени) = ПерВидВремени тогда
Если СтрокаТаблицыЗначений.Часов<> ПерЧас тогда
// макет
Область=Макет.ПолучитьОбласть("Строка");
Область.Параметры.ПарСотр = ПерСотрудник ;
Область.Параметры.ПарВремя =ПерВидВремени ;
Область.Параметры.ПарПрим="Данные не совпадают по количеству отработанных часов" ;
Область.Параметры.ПарЧасТ=ПерЧас;
Область.Параметры.ПарЧасРН=СтрокаТаблицыЗначений.Часов;
Таблица.Вывести(Область);
//выход из цикла
Прервать;
КонецЕсли;
флаг1=1;
КонецЕсли;
КонецЕсли;
конеццикла;
// определяем по флагу есть ли вообще запись в регистре накоплений
Если Флаг1=0 Тогда
Область=Макет.ПолучитьОбласть("Строка");
Область.Параметры.ПарСотр = ПерСотрудник ;
Область.Параметры.ПарВремя =ПерВидВремени ;
//Область.Параметры.ТекСсылка = Выборка.ссылка;
Область.Параметры.ПарПрим="Запись отсутствует в Регистре накоплений" ;
Область.Параметры.ПарЧасТ=ПерЧас;
Таблица.Вывести(Область);
конецЕсли;
Иначе
Область=Макет.ПолучитьОбласть("Строка");
Область.Параметры.ПарСотр = ПерСотрудник ;
Область.Параметры.ПарВремя =ПерВидВремени ;
Область.Параметры.ПарПрим="Сотрудник отсутствует в Регистре накоплений" ;
Область.Параметры.ПарЧасТ=ПерЧас;
Таблица.Вывести(Область);

конецЕсли ;

конеццикла;
конецЕсли ;
//ВЫВОД МАКЕТА
Таблица.ВерхнийКолонтитул.Выводить = Истина;
Таблица.ВерхнийКолонтитул.ТекстСлева=" "+глЗначениеПеременной("глТекущийПользователь")+" "+ТекущаяДата();
Таблица.НижнийКолонтитул.НачальнаяСтраница = 1;
Таблица.НижнийКолонтитул.Выводить = Истина;
Таблица.НижнийКолонтитул.ТекстСправа="страница [&НомерСтраницы] из [&СтраницВсего]";
Таблица.ТолькоПросмотр = Истина;
Таблица.Показать();


//***************************************************
asdfr1
29.08.2012 16:02Ответ № 19
лучше через ТаблицуЗначений
Viki
29.08.2012 16:27Ответ № 20
т.е. первый вариант лучше,чем через массивы?
asdfr1
29.08.2012 18:36Ответ № 21
не совсем, через список значений, думаю, будет проще
asdfr1
29.08.2012 18:40Ответ № 22
опс, незаметил, да через массив не гуд
Viki
30.08.2012 07:57Ответ № 23
(22) asdfr1, есть одна идея,как через массив сделать. Только подскажи как можно увидеть на экране структуру ТЗ (мне нужно поле в котором хранится ссылка)
Viki
30.08.2012 08:20Ответ № 24
Все работает.Всем спасибо за советы.
Код 1C v 8.2 УП
 	Для ИндексЭлемента = 0 По НайденныеСтроки.ВГраница() Цикл
поиск=НайденныеСтроки[ИндексЭлемента];
//Сообщить(поиск.часов);
поиск1=поиск.часов ;
Если поиск1<> ПерЧас тогда
// макет
Область=Макет.ПолучитьОбласть("Строка");
Область.Параметры.ПарСотр = ПерСотрудник ;
Область.Параметры.ПарВремя =ПерВидВремени ;
Область.Параметры.ПарПрим="Данные не совпадают по количеству отработанных часов" ;
Область.Параметры.ПарЧасТ=ПерЧас;
Область.Параметры.ПарЧасРН=СтрокаТаблицыЗначений.Часов;
Таблица.Вывести(Область);
сообщить(поиск1.Часы);
прервать;
КонецЕсли ;
КонецЦикла;
Подсказка: Для редактирования своего ответа щелкните по значку (справа)
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.