Четверг, 02.05.2024, 23:36
Приветствую Вас Гость | RSS
Главная Что означает "Индекс находится за границами массива" ?? - Форум Регистрация Вход
[Новые сообщенияУчастникиПравила форумаПоискRSS ]

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

  • Страница 1 из 1
  • 1
Модератор форума: MainGuru  
Форум » Раздел для разработчиков и внедренцев продуктов 1С » Программирование на 1С:Предприятие 8 » Что означает "Индекс находится за границами массива" ??
Что означает "Индекс находится за границами массива" ??
asd34Дата: Среда, 10.06.2009, 15:38 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 5
Репутация: 0
Статус: Offline
Подскажите, пожалуйста, что означает "Индекс находится за границами массива"? Ситуация такая был док-нт (начисление резерва отпусков), которым пользовались уже 2 года. Теперь он ругается (на тот самый индекс). Зашел в конфигуратор, там такая штука:

Процедура СформироватьДвиженияПоРезервуОтпусков(ВыборкаПоШапкеДокумента, НаборДополнительныеНачисления) Экспорт

//// календарные дни компенсации отпуска
//Если ВыборкаПоШапкеДокумента.ДнейКомпенсацииУдержанияОтпуска > 0 Тогда
// ДнейМесяцевКОплате = ВыборкаПоШапкеДокумента.ДнейКомпенсацииУдержанияОтпуска;
//ИначеЕсли ВыборкаПоШапкеДокумента.ДнейКомпенсацииУдержанияОтпуска < 0 Тогда
// ДнейМесяцевКОплате = - ВыборкаПоШапкеДокумента.ДнейКомпенсацииУдержанияОтпуска;
//Иначе
// Возврат;
//КонецЕсли;

// компенсация отпуска или удержание за неотработанные дни отпуска
ВидРасчета = ПланыВидовРасчета.ДополнительныеНачисленияОрганизаций.РезервОтпусков;//КомпенсацияОтпуска;

Для каждого Стр Из РаботникиОрганизации Цикл
Если Стр.Дней > 0 Тогда
ДнейМесяцевКОплате = Стр.Дней;
Иначе
Продолжить;
КонецЕсли;


//НакопленныйРезервДней = 0;
//НакопленныйРезервСумма = 0;
Движение = НаборДополнительныеНачисления.Добавить();

Движение.ПодразделениеОрганизации = ВыборкаПоШапкеДокумента.ПодразделениеОрганизации;

Движение.ПериодРегистрации = ПериодРегистрации;
Движение.ВидРасчета = ВидРасчета;
Если ДатаНачалаОсновногоОтпуска = Дата("00010101")Тогда
//Движение.ПериодДействияНачало = НачалоМесяца( Дата );
//Движение.ПериодДействияКонец = КонецМесяца( Дата );
Движение.ПериодДействияНачало = НачалоМесяца( ПериодРегистрации );
Движение.ПериодДействияКонец = КонецМесяца( ПериодРегистрации );
Иначе
Движение.ПериодДействияНачало = НачалоМесяца( ДатаНачалаОсновногоОтпуска );
Движение.ПериодДействияКонец = КонецМесяца( ДатаНачалаОсновногоОтпуска );
КонецЕсли;

Движение.ФизЛицо = Стр.ФизЛицо;
Движение.Приказ = Стр.Приказ;
Движение.Организация = ВыборкаПоШапкеДокумента.ГоловнаяОрганизация;

Движение.Размер = ДнейМесяцевКОплате;
Движение.ГрафикРаботы = ВыборкаПоШапкеДокумента.ГрафикРаботы;
Движение.ДатаНачалаСобытия = ВыборкаПоШапкеДокумента.ДатаНачалаОсновногоОтпуска;

КоличествоМесяцевРасчета = ВидРасчета.ЧислоМесяцев;

//Движение.ПериодРасчетаСреднегоЗаработкаНачало = ВыборкаПоШапкеДокумента.ПериодРасчетаСреднегоЗаработкаНачало;

ДатаПриемаСотрудника = Стр.Приказ.РаботникиОрганизации.НайтиСтроки(Новый Структура("Физлицо",Стр.Физлицо))[0].ДатаПриема;

Если ДобавитьМесяц(НачалоМесяца(ПолучитьДатуНачалаСобытия()), -КоличествоМесяцевРасчета) >= ДатаПриемаСотрудника Тогда
Движение.ПериодРасчетаСреднегоЗаработкаНачало = ДобавитьМесяц(НачалоМесяца(ПолучитьДатуНачалаСобытия()), -КоличествоМесяцевРасчета)
ИначеЕсли ДатаПриемаСотрудника = НачалоМесяца(ДатаПриемаСотрудника) Тогда
Движение.ПериодРасчетаСреднегоЗаработкаНачало = ДатаПриемаСотрудника;
Иначе
Движение.ПериодРасчетаСреднегоЗаработкаНачало = КонецМесяца(ДатаПриемаСотрудника)+1;
КонецЕсли;


Если Не ЗначениеНеЗаполнено(ВыборкаПоШапкеДокумента.ПериодРасчетаСреднегоЗаработкаКонец) Тогда
Движение.ПериодРасчетаСреднегоЗаработкаКонец = ВыборкаПоШапкеДокумента.ПериодРасчетаСреднегоЗаработкаКонец;
Иначе
Движение.ПериодРасчетаСреднегоЗаработкаКонец = НачалоМесяца(Дата);
КонецЕсли;

ПереписатьДополнительныеНачисленияВТабличнуюЧастьДокумента(Движение);
КонецЦикла;
КонецПроцедуры

{Документ.НачислениеРезерваОтпусковОрганизаций(163)}: Индекс находится за границами массива
ДатаПриемаСотрудника = Стр.Приказ.РаботникиОрганизации.НайтиСтроки(Новый Структура("Физлицо",Стр.Физлицо))[0].ДатаПриема;

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

 
ИгорёхаДата: Среда, 10.06.2009, 23:08 | Сообщение # 2
Полковник
Группа: Администраторы
Сообщений: 3
Репутация: 0
Статус: Offline
Ошибка, скорее всего, возникает в этой стоке:
Quote
ДатаПриемаСотрудника = Стр.Приказ.РаботникиОрганизации.НайтиСтроки(Новый Структура("Физлицо",Стр.Физлицо))[0].ДатаПриема;

Суть ошибки очень простая: ожидается, что в табличной части "РаботникиОрганизации" документа "Стр.Приказ" есть реквизит "Физлицо" в котором производится поиск всех сток, содержащих физлицо (Стр.Физлицо). Таких строк должно быть более 0 (не менее 1). Выражение [0] означает, что нужно получить первую строку из найденных, однако в Вашем случае результат отбора пуст!

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

А вообще написано жутко коряво sad . Я заменил бы эту строку на конструкцию:

Code
НайдСтр=Стр.Приказ.РаботникиОрганизации.НайтиСтроки(Новый Структура("Физлицо",Стр.Физлицо));
Если НайдСтр.Количество()=0 Тогда
    Если Не ЗначениеЗаполнено(Стр.Физлицо) Тогда
       Сообщить("Не указан сотрудник в стоке "+Стр.НомерСтроки);Продолжить;
    КонецЕсли;
    Сообщить("Не найден сотрудник "+Стр.Физлицо+" в документе "+Стр.Приказ+" в стоке "+Стр.НомерСтроки);Продолжить;
КонецЕсли;
ДатаПриемаСотрудника=НайдСтр[0].ДатаПриема;

Здесь есть ещё момент - если Процедура СформироватьДвиженияПоРезервуОтпусков предназначена для выполнения на сервере или в режиме внешнего соединения, тогда строки с командой Сообщить нужно взять в скобки препроцессора:
#Если Клиент Тогда
...
#КонецЕсли

 
asd34Дата: Четверг, 11.06.2009, 11:35 | Сообщение # 3
Рядовой
Группа: Пользователи
Сообщений: 5
Репутация: 0
Статус: Offline
Да, спасибо тебе, Игорёха!
Так и не смог найти, где же та самая ошибка, пока не поправил программный код в модуле док-та на тот, который ты предложил. И все стало ясно! Оказывается один уникальнейший человек, просто убрал одного из работников с док-та "Прием на работу" (при этом док-нт "Кадровое перемещение" оставив, как осн. док-нт о приеме), когда уже зарплата по нему была рассчитана... Учи учи - одни двойки... Так и живем... smile
P.S.: Чет, не понял, как повысить репутацию?..
 
ИгорёхаДата: Четверг, 11.06.2009, 12:11 | Сообщение # 4
Полковник
Группа: Администраторы
Сообщений: 3
Репутация: 0
Статус: Offline
Рад был помочь, если что - обращайтесь cool
 
ArlandДата: Вторник, 24.11.2009, 13:11 | Сообщение # 5
Рядовой
Группа: Пользователи
Сообщений: 4
Репутация: 0
Статус: Offline
У меня аналогичная проблема, при выгрузке на КПК выходит такая ощибка "Индекс находится за границами массива"

Сообщить(Наим);
Точка останова тут Ед = Единицы[PriceUnit];
Если ЕдЦены <> Ед Тогда
Сообщить(Ед);
//Сообщить(ЕдЦены);

Может кто нибудь помочь?

 
MainGuruДата: Вторник, 24.11.2009, 18:37 | Сообщение # 6
Admin
Группа: Администраторы
Сообщений: 17
Репутация: 0
Статус: Offline
В Вашем случае ситуация аналогична описанной выше. Массив "Единицы" не содержит элемента с индексом "PriceUnit".

Для проверки, перед указанной строкой вставьте:

Code
Сообщить("Всего единиц: "+Единицы.Количество()+"; Получаем: "+PriceUnit);

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

 
ArlandДата: Среда, 25.11.2009, 11:31 | Сообщение # 7
Рядовой
Группа: Пользователи
Сообщений: 4
Репутация: 0
Статус: Offline
Привет MainGuru!

Вот служебное сообщение и код (код целиком не помещается в одном соощении)

Всего единиц: 3; Получаем: 0
"Я" 1,0л Нектар из мандаринов с доб апельсина д.п
Всего единиц: 3; Получаем: 0
"Я" 1,0л Нектар из мандаринов с доб апельсина д.п
Всего единиц: 3; Получаем: 0
"Я" 0,2л Сок апельсиновый с мяк. д.п. СТЕКЛО
Всего единиц: 3; Получаем: -1 Здесь выгруска останавливается

Сообщить(Наим);
Сообщить("Всего единиц: "+Единицы.Количество()+"; Получаем: "+PriceUnit);
Ед = Единицы[PriceUnit];
Если ЕдЦены <> Ед Тогда
Сообщить(Ед);

Код1

Процедура ВыгрузкаНоменклатуры()

тзОписаниеКартинок.Очистить();

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

ВыгрузкаСтруктурыТиповЦен(тзКатегорииЦен);
КоличествоТиповЦен = тзКатегорииЦен.Количество();
Если КоличествоТиповЦен = 0 Тогда
Сообщить("Номенклатура не выгружена, не найдено ни одного типа цен для выгрузки!", СтатусСообщения.ОченьВажное);
Возврат;
КонецЕсли;

Добавлено (25.11.2009, 11:28)
---------------------------------------------
Код продолжение

//Выгружаем значение константы GUID_SYSTEM_PRICECOUNT - количество типов цен
Текст.ДобавитьСтроку("<Begin>" + Т_ + "Ref_System" + Т_ + "Struct:ObjID,Value");
Текст.ДобавитьСтроку(GUID_SYSTEM_PRICECOUNT + Т_ + Строка(КоличествоТиповЦен));
Текст.ДобавитьСтроку("<End>" + Т_ + "Ref_System");

Поз = 0;
СтрВидовЦен = "";
Для Каждого КЦСтр Из тзКатегорииЦен Цикл
Поз = Поз + 1;
СтрВидовЦен = СтрВидовЦен + "=Price" + Строка(Поз) + ",";
КонецЦикла;

НачСтрокаСтруктуры = "<Begin>" + Т_ + "Ref_Price" + Т_ + "Mode:Full" + Т_
+ "Struct:GoodsID,FolderID,IsFolder,Name,=Code,=NameUnits,=Unit0,=Unit1,=Unit2,"
+ СтрВидовЦен + "Rest,=VAT,=Comment,=StockUnit,=PriceUnit,_STRANA";
ТекстЗапроса = "ВЫБРАТЬ различные
|ТоварыОстатки.Номенклатура КАК ТМЦ,
|ТоварыОстатки.ХарактеристикаНоменклатуры КАК Характеристика,
|ТоварыОстатки.КоличествоОстаток КАК КоличествоОстаток
//|ПартииОстатки.СтоимостьОстаток
|
|ИЗ
| РегистрНакопления.ОстаткиТоваровКомпании.Остатки((&парДата), (Номенклатура В ИЕРАРХИИ (&Ассортимент)) И (СкладКомпании В (&СкладыКомпании))) КАК ТоварыОстатки
|
|ГДЕ
| ТоварыОстатки.КоличествоОстаток > 0
|
|УПОРЯДОЧИТЬ ПО
| ТМЦ,
| Характеристика
|ИТОГИ СУММА(КоличествоОстаток) ПО
| ТМЦ ИЕРАРХИЯ
| Характеристика";

//Если флДетализировать Тогда
// Текстзапроса = ТекстЗапроса + "ИТОГИ СУММА(КоличествоОстаток) ПО
// | Характеристика";
//Иначе
// Текстзапроса = ТекстЗапроса + "ИТОГИ СУММА(КоличествоОстаток) ПО
// | ТМЦ ИЕРАРХИЯ";
//КонецЕсли;

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

НачСтрокаСтруктуры = НачСтрокаСтруктуры + СтрВидовЦен + "Rest";

Если НЕ Ном.ЭтоГруппа Тогда
Единицы = Новый Массив;
ОсновнаяЕдиница = Ном.ЕдиницаХраненияОстатков;
Единицы.Добавить(ОсновнаяЕдиница);
СтрЕдиницы = СокрЛП(Лев(ОсновнаяЕдиница.Наименование, 3)) + ",";
СтрКоэффициенты = СокрЛП(ОсновнаяЕдиница.Коэффициент) + Т_;
ВыборкаЕд = Справочники.ЕдиницыИзмерения.Выбрать( , Ном, , "Коэффициент");
НомИд = СокрЛП(Ном.УникальныйИдентификатор());
СчетчикЕд = 1;
StockUnit = "0";//Gri++ (08.06.07)
// Выгрузка Штрих-кода для основной единицы
ШКСтр = тзШтрихКоды.Добавить();
ШКСтр.ИДТовара = НомИД;
ШКСтр.ШтрихКод = СокрЛП(ВыборкаЕд.ШтрихКод);
ШКСтр.КодЕдиницы = СчетчикЕд - 1;
НомИД = "*";
// Выгрузка еще двух единиц и их штрих-кодов
Пока ВыборкаЕд.Следующий() Цикл
Если ВыборкаЕд.Ссылка = ОсновнаяЕдиница Тогда
Продолжить; // Чтобы повторно не выгрузить основную единицу
КонецЕсли;
СтрЕдиницы = СтрЕдиницы + СокрЛП(Лев(ВыборкаЕд.Наименование, 3)) + ",";
СтрКоэффициенты = СтрКоэффициенты + СокрЛП(ВыборкаЕд.Коэффициент) + Т_;
СчетчикЕд = СчетчикЕд + 1;
Единицы.Добавить(ВыборкаЕд.Ссылка);

ШКСтр = тзШтрихКоды.Добавить();
ШКСтр.ИДТовара = НомИД;
ШКСтр.ШтрихКод = СокрЛП(ВыборкаЕд.ШтрихКод);
ШКСтр.КодЕдиницы = СчетчикЕд - 1;

Если СчетчикЕд = 3 Тогда
Прервать;
КонецЕсли;
КонецЦикла;

Добавлено (25.11.2009, 11:28)
---------------------------------------------
Код продолжение

Если СчетчикЕд <> 3 Тогда
Пока СчетчикЕд <> 3 Цикл
СтрЕдиницы = СтрЕдиницы + ",";
СтрКоэффициенты = СтрКоэффициенты + Т_;
СчетчикЕд = СчетчикЕд + 1;
Единицы.Добавить();
КонецЦикла;
КонецЕсли;
СтрЕдиницы = Лев(СтрЕдиницы, СтрДлина(СтрЕдиницы) - 1); // Убрали последнюю запятую

СтрЦены = "";
PriceUnit = -1; //Gri++ (08.06.07)
Для Каждого Стр Из тзКатегорииЦен Цикл
ТипЦены = Стр.Тип;
ЕдЦены = ПолучитьЕдиницуИзмеренияДляТипаЦеныНоменклатуры(ТипЦены, Ном, Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка());
Если ТипЦены.Рассчитывается Тогда
СтОтборЦены.Вставить("ТипЦен", ТипЦены.БазовыйТипЦен);
СтОтборЦены.Вставить("Номенклатура", Ном);
ЦенаНом = РегистрыСведений.ЦеныКомпании.ПолучитьПоследнее(ТекущаяДата(), СтОтборЦены);
БазоваяЦена = ЦенаНом.Цена;
Цена = БазоваяЦена + (БазоваяЦена * ТипЦены.ПроцентСкидкиНаценки / 100);
Иначе
СтОтборЦены.Вставить("ТипЦен", ТипЦены);
СтОтборЦены.Вставить("Номенклатура", Ном);
ЦенаНом = РегистрыСведений.ЦеныКомпании.ПолучитьПоследнее(ТекущаяДата(), СтОтборЦены);
Цена = ЦенаНом.Цена;
КонецЕсли;
//Gri++ (08.06.07) { нужно определить какую единицу измерения считать привязанной к цене
Если PriceUnit = -1 Тогда
Если ЕдЦены = Единицы[0] Тогда
PriceUnit = 0;
ИначеЕсли ЕдЦены = Единицы[1] Тогда
PriceUnit = 1;
ИначеЕсли ЕдЦены = Единицы[2] Тогда
PriceUnit = 2;
КонецЕсли;
КонецЕсли;
Сообщить(Наим);
Сообщить("Всего единиц: "+Единицы.Количество()+"; Получаем: "+PriceUnit);
Ед = Единицы[PriceUnit];
Если ЕдЦены <> Ед Тогда
Сообщить(Ед);
//Сообщить(ЕдЦены);
Цена = Цена * Ед.Коэффициент / ЕдЦены.Коэффициент;
КонецЕсли;

СтрЦены = СтрЦены + Строка(Формат(Цена, "ЧРД='.'; ЧРГ=''")) + Т_;
КонецЦикла;

// Формирование таблицы для выгрузки описания картинок товаров
Если (Ном.ОсновноеИзображение <> Неопределено) И (НЕ Ном.ОсновноеИзображение.Пустая()) Тогда
КСтр = тзОписаниеКартинок.Добавить();
КСтр.ИДТовара = СокрЛП(Ном.УникальныйИдентификатор());
КСтр.Картинка = Ном.ОсновноеИзображение.Хранилище.Получить();
КСтр.Наименование = СокрЛП(Ном.Наименование);
КСтр.Описание = СокрЛП(Ном.ОсновноеИзображение.Наименование);
КонецЕсли;

Добавлено (25.11.2009, 11:29)
---------------------------------------------
Код продолжение

Комментарий = СокрЛП(Ном.Комментарий);

Страна = Ном.СтранаПроисхождения.Код;
СтавкаНДС = рцПолучитьСтавкуНДС(Ном.СтавкаНДС);

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

Если (НЕ флДетализировать) ИЛИ (Характеристики.Количество() = 0) Тогда
Текст.ДобавитьСтроку(СокрЛП(Строка(ИдНом)) + Т_ + СокрЛП(Строка(ИдРодителя)) + Т_ + Строка(ПризнакГруппы) + Т_
+ Наим + Т_ + Строка(Код) + Т_ + СтрЕдиницы + Т_ + СтрКоэффициенты + СтрЦены + Остаток + Т_ + СтавкаНДС + Т_ + Комментарий + Т_ + Строка(StockUnit) + Т_ + Строка(PriceUnit) + Т_ + Страна);
Продолжить;
КонецЕсли;

Текст.ДобавитьСтроку(СокрЛП(Строка(ИдНом)) + Т_ + СокрЛП(Строка(ИдРодителя)) + Т_ + Строка(2) + Т_
+ Наим + Т_ + Строка(Код) + Т_ + СтрЕдиницы + Т_ + СтрКоэффициенты + СтрЦены + Остаток + Т_ + СтавкаНДС + Т_ + Комментарий + Т_ + Строка(StockUnit) + Т_ + Строка(PriceUnit) + Т_ + Страна);

СтОтборЦеныХар = новый Структура("ТипЦен, Номенклатура, ХарактеристикаНоменклатуры");
Пока Характеристики.Следующий() Цикл
Хар = Характеристики.Характеристика;
//ХарНаим = Хар.Наименование;
//Если НЕ ПустаяСтрока(ХарНаим) Тогда
// ХарНаим = "(" + ХарНаим + ")";
//КонецЕсли;
//Наим = Ном.Наименование + ХарНаим;
ИдХар = Хар.УникальныйИдентификатор();
//ПустойИД = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000");
//ИдНом = ?(ИдХар = ПустойИД, ИдНом, ИдХар);

Если Хар.Пустая() Тогда
Продолжить;
КонецЕсли;

Добавлено (25.11.2009, 11:30)
---------------------------------------------
Код продолжение

Если НЕ Хар.Пустая() Тогда
Наим = Ном.Наименование + "(" + Хар.Наименование + ")";
ИдНом = ИдХар;
КонецЕсли;

ИдРодителя = Ном.УникальныйИдентификатор();

Остаток = Строка(Формат(Характеристики.КоличествоОстаток, "ЧГ=0"));
// Записываем найденные цены в таблицу категорий
СтрЦены = "";
PriceUnit = -1; //Gri++ (08.06.07)
Для Каждого Стр Из тзКатегорииЦен Цикл
ТипЦены = Стр.Тип;
ЕдЦены = ПолучитьЕдиницуИзмеренияДляТипаЦеныНоменклатуры(ТипЦены, Ном, Хар);
Если ТипЦены.Рассчитывается Тогда
СтОтборЦеныХар.Вставить("ТипЦен", ТипЦены.БазовыйТипЦен);
СтОтборЦеныХар.Вставить("Номенклатура", Ном);
СтОтборЦеныХар.Вставить("ХарактеристикаНоменклатуры", Хар);
ЦенаНом = РегистрыСведений.ЦеныКомпании.ПолучитьПоследнее(ТекущаяДата(), СтОтборЦеныХар);
БазоваяЦена = ЦенаНом.Цена;
Цена = БазоваяЦена + (БазоваяЦена * ТипЦены.ПроцентСкидкиНаценки / 100);
Иначе
СтОтборЦеныХар.Вставить("ТипЦен", ТипЦены);
СтОтборЦеныХар.Вставить("Номенклатура", Ном);
СтОтборЦеныХар.Вставить("ХарактеристикаНоменклатуры", Хар);
ЦенаНом = РегистрыСведений.ЦеныКомпании.ПолучитьПоследнее(ТекущаяДата(), СтОтборЦеныХар);
Цена = ЦенаНом.Цена;
КонецЕсли;
//Gri++ (08.06.07) { нужно определить какую единицу измерения считать привязанной к цене
Если PriceUnit = -1 Тогда
Если ЕдЦены = Единицы[0] Тогда
PriceUnit = 0;
ИначеЕсли ЕдЦены = Единицы[1] Тогда
PriceUnit = 1;
ИначеЕсли ЕдЦены = Единицы[2] Тогда
PriceUnit = 2;
КонецЕсли;
КонецЕсли;

Добавлено (25.11.2009, 11:31)
---------------------------------------------
Конец кода

Ед = Единицы[PriceUnit];
Если ЕдЦены <> Ед Тогда
Цена = Цена * Ед.Коэффициент / ЕдЦены.Коэффициент;
КонецЕсли;

СтрЦены = СтрЦены + Строка(Формат(Цена, "ЧРД='.'; ЧРГ=''")) + Т_;
КонецЦикла;

Текст.ДобавитьСтроку(СокрЛП(Строка(ИдНом)) + Т_ + СокрЛП(Строка(ИдРодителя)) + Т_ + Строка(ПризнакГруппы) + Т_
+ Наим + Т_ + Строка(Код) + Т_ + СтрЕдиницы + Т_ + СтрКоэффициенты + СтрЦены + Остаток + Т_ + СтавкаНДС + Т_ + Комментарий + Т_ + Строка(StockUnit) + Т_ + Строка(PriceUnit) + Т_ + Страна);
КонецЦикла;

Иначе // У группы нет единиц
СтрЕдиницы = ",,";
СтрКоэффициенты = "0" + Т_ + "0" + Т_ + "0" + Т_;
Комментарий = "";

Страна = "";
СтавкаНДС = рцПолучитьСтавкуНДС(Ном.СтавкаНДС);

Текст.ДобавитьСтроку(СокрЛП(Строка(ИдНом)) + Т_ + СокрЛП(Строка(ИдРодителя)) + Т_ + Строка(ПризнакГруппы) + Т_
+ Наим + Т_ + Строка(Код) + Т_ + СтрЕдиницы + Т_ + СтрКоэффициенты + СтрЦены + Остаток + Т_ + СтавкаНДС + Т_ + Комментарий + Т_ + Строка(0) + Т_ + Строка(0) + Т_ + Страна);
КонецЕсли;

//Остаток = Строка(Формат(Выборка.КоличествоОстаток, "ЧГ=0"));
//Страна = ?(Ном.ЭтоГруппа, "", Ном.СтранаПроисхождения.Код);
//СтавкаНДС = ПолучитьСтавкуНДС(Ном.СтавкаНДС);
//
//Текст.ДобавитьСтроку(СокрЛП(Строка(ИдНом)) + Т_ + СокрЛП(Строка(ИдРодителя)) + Т_ + Строка(ПризнакГруппы) + Т_
//+ Наим + Т_ + Строка(Код) + Т_ + СтрЕдиницы + Т_ + СтрКоэффициенты + СтрЦены + Остаток + Т_ + СтавкаНДС + Т_ + Комментарий + Т_ + Страна);
КонецЦикла;
Текст.ДобавитьСтроку("<End>" + Т_ + "Ref_Price");

ВыгрузкаШтрихКодов();

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

 
MainGuruДата: Среда, 25.11.2009, 17:58 | Сообщение # 8
Admin
Группа: Администраторы
Сообщений: 17
Репутация: 0
Статус: Offline
Привет Arland.

Все понятно, но для общности не хватает функции ПолучитьЕдиницуИзмеренияДляТипаЦеныНоменклатуры

Докинь её, и я расскажу что делать дальше.

 
ArlandДата: Четверг, 26.11.2009, 10:03 | Сообщение # 9
Рядовой
Группа: Пользователи
Сообщений: 4
Репутация: 0
Статус: Offline
Привет Main Guru!

Вот код ТЦ:

Функция ПолучитьЕдиницуИзмеренияДляТипаЦеныНоменклатуры(ТЦ, Товар, Хар)
Рез = Справочники.ЕдиницыИзмерения.ПустаяСсылка();
СтОтбор = Новый Структура;
СтОтбор.Вставить("ТипЦен", ТЦ);
СтОтбор.Вставить("Номенклатура", Товар);
Если НЕ Хар.Пустая() Тогда
СтОтбор.Вставить("ХарактеристикаНоменклатуры", Хар);
КонецЕсли;
Выборка = РегистрыСведений.ЦеныКомпании.ПолучитьПоследнее(ТекущаяДата(), СтОтбор);
Рез = Выборка.ЕдиницаИзмерения;
Возврат Рез;
КонецФункции

 
MainGuruДата: Четверг, 26.11.2009, 11:31 | Сообщение # 10
Admin
Группа: Администраторы
Сообщений: 17
Репутация: 0
Статус: Offline
Привет Arland.

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

Напишу по сути, если этого будет мало, скажи - напишу подробнее.

Суть проблемы в том, что единица измерения цены для одной из категорий цен не совпадает ни с
одной из единиц номенклатуры: ЕдиницаХраненияОстатков и дополнительные единицы (единица с
наименьшим коэффициентом и единица со 2-м наименьшим коэффициентом, т.к. используется 3 единицы
одна из которых ЕдиницаХраненияОстатков, а выборка дополнительных сортируется в порядке возрастания
коэффициентов).

Нужно сверить единицы в номенклатуре <"Я" 0,2л Сок апельсиновый с мяк. д.п. СТЕКЛО> и в ценах
на эту номенклатуру. Возможно цены не заданы вообще, или в последней (по времени) записи единица пустая.
Короче возможностей завалить такой алгоритм очень много. sad

С практической точки зрения все такие ситуации - некорректное заполнение данных пользователем
и эту информацию нельзя передавать агентам на КПК. Я бы заменил внутри цикла по тзКатегорииЦен

Вместо

Code
Ед = Единицы[PriceUnit];

Указать:
Code
Попытка Ед=Единицы[PriceUnit];
Исключение Сообщить("Проверьте единицы измерения цен и номенклатуры "+Наим);Продолжить;
КонецПопытки;
 
ArlandДата: Суббота, 28.11.2009, 19:25 | Сообщение # 11
Рядовой
Группа: Пользователи
Сообщений: 4
Репутация: 0
Статус: Offline
Привет MainGuru!

Спасибо огромное за помошь!!! Как ты и говорил в ценах номенклатуры небыли занесены цены!
Спасибо еще раз!!!

 
Форум » Раздел для разработчиков и внедренцев продуктов 1С » Программирование на 1С:Предприятие 8 » Что означает "Индекс находится за границами массива" ??
  • Страница 1 из 1
  • 1
Поиск:

Copyright MyCorp © 2024 Конструктор сайтов - uCoz