Имя: Пароль:
1C
1С v8
v8: Пропадают строки при выводе на форму
, ,
0 Neznayka_5
 
09.08.12
06:36
пишу внешнюю обработку заполнения табличных частей документа Установка цен номенклатуры. Когда ее открываю как внешнюю, все нормально. Из запроса все помещается в ТЧ документа, а оттуда на форму (как выполняется это и в программе). Когда прикрепляю к документу непосредственно, пропадает несколько строк (которые есть в запросе и ТЧ документа, но на форме почему то не отображаются). Из-за чего это может происходить? Код могу скинуть
1 DMLangepas
 
09.08.12
06:38
кидай код
2 Neznayka_5
 
09.08.12
06:38
Процедура Инициализировать(Объект, ИмяТабличнойЧасти, ТабличноеПолеОбъекта) Экспорт
   Форма = Объект.ПолучитьФорму("ФормаДокумента");
   Если Объект.Товары.Количество() > 0 Тогда
       ТекстВопроса = "Перед заполнением табличная часть будет очищена. Заполнить?";
       Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , , Метаданные().Представление());
       Если Ответ <> КодВозвратаДиалога.Да Тогда
           Возврат;
       КонецЕсли;
       Объект.Товары.Очистить();
       Форма.ТаблицаЦен.Очистить();
   КонецЕсли;
   
   ФормаНастроек = ПолучитьФорму("ФормаВыбораПараметров", Форма);
   Если Не ТипЗнч(ФормаНастроек.ОткрытьМодально()) = Тип("Структура") Тогда
       Возврат
   Иначе
       Организация = ФормаНастроек.Организация;
       ОкончаниеПериода = СсылкаНаОбъект.Дата;
       Наценка = ФормаНастроек.Наценка;
       НДС = ФормаНастроек.НДС;
       Запрос = Новый Запрос;
       Запрос.УстановитьПараметр("Счет", ПланыСчетов.Хозрасчетный.ТоварыНаСкладах);
       Запрос.УстановитьПараметр("Организация", Организация);
       Запрос.УстановитьПараметр("ТоварыСопутствующие", Справочники.НоменклатурныеГруппы.НайтиПоНаименованию("Товары сопутствующие"));
       Запрос.УстановитьПараметр("НачалоПериода", ПланыСчетов.Хозрасчетный.ТоварыНаСкладах);
       Запрос.УстановитьПараметр("ОкончаниеПериода", ОкончаниеПериода);
       Запрос.Текст =
       "ВЫБРАТЬ
       |    ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Номенклатура,
       |    ВЫБОР
       |        КОГДА ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстаток = 0
       |            ТОГДА 0
       |        ИНАЧЕ (ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстаток / ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстаток) * (100 +" + Наценка + ")/100" + " * (100 +" + НДС + ")/100" + "
       |    КОНЕЦ КАК Цена,
       |    ХозрасчетныйОстаткиИОбороты.Субконто1.ЕдиницаХраненияОстатков как ЕдиницаИзмерения
       |ИЗ
       |    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(, &ОкончаниеПериода, , , , , ) КАК ХозрасчетныйОстаткиИОбороты
       |ГДЕ
       |    ХозрасчетныйОстаткиИОбороты.Счет = &Счет
       |    И ХозрасчетныйОстаткиИОбороты.Организация = &Организация
       |    И (НЕ ХозрасчетныйОстаткиИОбороты.Субконто1.ВестиУчетПоХарактеристикам)
       |    И ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстаток >= 0
       |    И ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстаток >= 0
       |    И ХозрасчетныйОстаткиИОбороты.Субконто1.НоменклатурнаяГруппа = &ТоварыСопутствующие" + ?(НЕ Форма.НеПроводитьНулевыеЗначения, "", "  
       |   И ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстаток <> 0") + "
       |   УПОРЯДОЧИТЬ ПО
       |       ХозрасчетныйОстаткиИОбороты.Субконто1.Наименование";
       РезультатЗапроса = Запрос.Выполнить().Выбрать();                          
       
       КолонкиТаблицыЦен = Форма.ТаблицаЦен.Колонки;
       КурсВалУпр = МодульВалютногоУчета.ПолучитьКурсВалюты(мВалютаУправленческогоУчета, Объект.Дата);
       КурсыВалют = Новый Соответствие;
       
       Тмп = 0;
       Пока РезультатЗапроса.Следующий() Цикл
           Тмп=Тмп+1;
           Для Каждого СтрокаТипаЦен Из Объект.ТипыЦен Цикл    
               НоваяСтрока = Объект.Товары.Добавить();
               НоваяСтрока.ИндексСтрокиТаблицыЦен     = Тмп;
               НоваяСтрока.Номенклатура               = РезультатЗапроса.Номенклатура;
               НоваяСтрока.ТипЦен                     = СтрокаТипаЦен.ТипЦен;
               НоваяСтрока.Цена                       = РезультатЗапроса.Цена;
               НоваяСтрока.Валюта                     = СтрокаТипаЦен.ТипЦен.ВалютаЦены;
               НоваяСтрока.ЕдиницаИзмерения           = РезультатЗапроса.ЕдиницаИзмерения;
               НоваяСтрока.ПроцентСкидкиНаценки       = СтрокаТипаЦен.ТипЦен.ПроцентСкидкиНаценки;
           КонецЦикла;
       КонецЦикла;
       
       мСоответствиеТиповЦен = Новый Соответствие;
       //Сформируем и заполним таблицу цен.
       Для Каждого СтрокаТипаЦен Из Объект.ТипыЦен Цикл
           НомерСоответствияТекущейКолонки = Объект.ТипыЦен.Индекс(СтрокаТипаЦен);
           мСоответствиеТиповЦен.Вставить(СтрокаТипаЦен.ТипЦен, НомерСоответствияТекущейКолонки);
           ТаблицаЦен = Форма.ТаблицаЦен;

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

               НоваяСтрока.Номенклатура = СтрокаТаблицыТоваров.Номенклатура;
               ТекущийИндексСтрокиТаблицыЦен = СтрокаТаблицыТоваров.ИндексСтрокиТаблицыЦен;
           КонецЕсли;
           
           НомерСоответствияТекущейКолонки = мСоответствиеТиповЦен[СтрокаТаблицыТоваров.ТипЦен];

           НоваяСтрока["цена" + НомерСоответствияТекущейКолонки] = СтрокаТаблицыТоваров.Цена;
           НоваяСтрока["СпособРасчета" + НомерСоответствияТекущейКолонки] = СтрокаТаблицыТоваров.СпособРасчетаЦены;
           НоваяСтрока["валюта" + НомерСоответствияТекущейКолонки] = СтрокаТаблицыТоваров.Валюта;
           НоваяСтрока["единица" + НомерСоответствияТекущейКолонки] = СтрокаТаблицыТоваров.ЕдиницаИзмерения;
           НоваяСтрока["процент" + НомерСоответствияТекущейКолонки] = СтрокаТаблицыТоваров.ПроцентСкидкиНаценки;
       КонецЦикла;
               
       Если РезультатЗапроса.Количество()=0 Тогда
           ОбщегоНазначения.СообщитьОбОшибке("Нет данных для заполнения цен. Возможно в типах цен контрагентов не указаны типы цен номенклатуры.");
       КонецЕсли;
       
   КонецЕсли;    
КонецПроцедуры
3 Cashtane
 
09.08.12
06:39
(2) Оперативно.
4 Neznayka_5
 
09.08.12
06:39
Для Каждого СтрокаТаблицыТоваров Из Объект.Товары Цикл
           Если ТекущийИндексСтрокиТаблицыЦен <> СтрокаТаблицыТоваров.ИндексСтрокиТаблицыЦен
               Или НоваяСтрока.Номенклатура <> СтрокаТаблицыТоваров.Номенклатура
               Или НоваяСтрока.ХарактеристикаНоменклатуры <> СтрокаТаблицыТоваров.ХарактеристикаНоменклатуры Тогда
               НоваяСтрока = Форма.ТаблицаЦен.Добавить();

               НоваяСтрока.Номенклатура = СтрокаТаблицыТоваров.Номенклатура;
               ТекущийИндексСтрокиТаблицыЦен = СтрокаТаблицыТоваров.ИндексСтрокиТаблицыЦен;
           КонецЕсли;
           
           НомерСоответствияТекущейКолонки = мСоответствиеТиповЦен[СтрокаТаблицыТоваров.ТипЦен];

           НоваяСтрока["цена" + НомерСоответствияТекущейКолонки] = СтрокаТаблицыТоваров.Цена;
           НоваяСтрока["СпособРасчета" + НомерСоответствияТекущейКолонки] = СтрокаТаблицыТоваров.СпособРасчетаЦены;
           НоваяСтрока["валюта" + НомерСоответствияТекущейКолонки] = СтрокаТаблицыТоваров.Валюта;
           НоваяСтрока["единица" + НомерСоответствияТекущейКолонки] = СтрокаТаблицыТоваров.ЕдиницаИзмерения;
           НоваяСтрока["процент" + НомерСоответствияТекущейКолонки] = СтрокаТаблицыТоваров.ПроцентСкидкиНаценки;
       КонецЦикла;


Предполагаю, что ошибка тут..
5 Neznayka_5
 
09.08.12
06:39
да я просто вчера вечером думала на эту тему, но сегодня с у тра ничего не прояснилось)
6 Neznayka_5
 
09.08.12
06:46
ну что, никто не знает??
7 iceman2112
 
09.08.12
06:54
хм, а разве при заполнение табличных частей, нужно вообще форму трогать?
8 iceman2112
 
09.08.12
06:54
и зачем?
9 iceman2112
 
09.08.12
06:55
на скидку, ошибку в этом, можете поправить если не прав или что то недопонял.
10 Neznayka_5
 
09.08.12
08:54
ссылка на обхъект не должна использоваться) надо было Объект))
11 Serg_1960
 
09.08.12
09:02
Интересно стало: "СсылкаНаОбъект.Дата" - должен быть ругаться что не найдено "СсылкаНаОбъект". Аналогично и по строке "Форма.ТаблицаЦен.Добавить()"...

Можно ЭтотОбъект, ЭтаФорма...
12 Serg_1960
 
09.08.12
09:04
(11) + Вероятно вы скомиуниздили алгоритм из внешней обработки и не везде исправили обращения.
Ошибка? Это не ошибка, это системная функция.