Неверный идентификатор колонки!

Новая тема
Показывать по 10 20 40 сообщений
"Объясните пожалуйста где у меня ошибка... и что означает строка УстановитьЗначение? почему выводит ошибку
тзПроцедуры.УстановитьЗначение(тзПроцедуры.НомерСтроки, "к" + СокрЛП(КодПроцедуры), 1);

   Т = СоздатьОбъект("Таблица");
   тзПроцедуры = СоздатьОбъект("ТаблицаЗначений");
   тзПроцедуры.НоваяКолонка("Контрагент");
   тзПроцедуры.НоваяКолонка("ФИО");
   тзПроцедуры.НоваяКолонка("Цена", "Число");
   СпрТарифы.ВыбратьЭлементы();
   Пока СпрТарифы.ПолучитьЭлемент() = 1 Цикл
       Колонка = "к" + СокрЛП(СпрТарифы.Код);
       тзПроцедуры.НоваяКолонка(Колонка, "Число");
   КонецЦикла;
   //тзПроцедуры.Выгрузить(ТТТ);

   Док = СоздатьОбъект("Документ.СтатКартаПациента");
   Если ПустоеЗначение(Контрагент) = 1 Тогда
       Док.ВыбратьДокументы(НачДата, КонДата);
       Пока Док.ПолучитьДокумент() = 1 Цикл
           //Сообщить(Док.НомерДок);
           Док.ВыбратьСтроки();
           Пока Док.ПолучитьСтроку() = 1 Цикл
               Если СокрЛП(Док.КодПроцедуры) = """" Тогда
                   Продолжить;
               КонецЕсли;
               тзПроцедуры.НоваяСтрока();
               тзПроцедуры.ФИО         = Док.Пациент;
               тзПроцедуры.Контрагент    = Док.Авиакомпания;
               тзПроцедуры.Цена        = Док.Цена;
               КодПроцедуры = СокрЛП(Док.КодПроцедуры.Код);
               //Сообщить(КодПроцедуры);
               тзПроцедуры.УстановитьЗначение(тзПроцедуры.НомерСтроки, "к" + СокрЛП(КодПроцедуры), 1);
           
           КонецЦикла;
       КонецЦикла;
   Иначе
       Док.ВыбратьДокументы(НачДата, КонДата);
       Пока Док.ПолучитьДокумент() = 1 Цикл
           Если Док.Авиакомпания <> Контрагент Тогда
               Продолжить;
           КонецЕсли;
           Док.ВыбратьСтроки();
           Пока Док.ПолучитьСтроку() = 1 Цикл
               Если СокрЛП(Док.КодПроцедуры) = """" Тогда
                   Продолжить;
               КонецЕсли;
               тзПроцедуры.НоваяСтрока();
               тзПроцедуры.ФИО         = Док.Пациент;
               тзПроцедуры.Контрагент    = Док.Авиакомпания;
               тзПроцедуры.Цена        = Док.Цена;
               КодПроцедуры = СокрЛП(Док.КодПроцедуры.Код);
               //Сообщить(КодПроцедуры);
               тзПроцедуры.УстановитьЗначение(тзПроцедуры.НомерСтроки, "к" + СокрЛП(КодПроцедуры), 1);    - вот на эту строчку постоянно ругается
           
           КонецЦикла;
       КонецЦикла;
   КонецЕсли;"
Покажите весь код,от начала до конца процедуры или функ или он и есть?
">   Если СокрЛП(Док.КодПроцедуры) = """" Тогда
>                     Продолжить;
>                 КонецЕсли;
>                 тзПроцедуры.НоваяСтрока();
>                 тзПроцедуры.ФИО         = Док.Пациент;
>                 тзПроцедуры.Контрагент    = Док.Авиакомпания;
>                 тзПроцедуры.Цена        = Док.Цена;
>                 КодПроцедуры = СокрЛП(Док.КодПроцедуры.Код);
>                
Почему в одном случае проверяем на КодПроцедуры, а в другом берем КодПроцедуры.Код?"
"я исправила, но все равно выдает ошибку
тзПроцедуры.УстановитьЗначение(тзПроцедуры.НомерСтроки, "к" + СокрЛП(КодПроцедуры), 1);
{Отчет.ОтчетПоАвиакомпаниям12.Форма.Модуль(63)}: Неверный идентификатор колонки!"
"Процедура Сформировать()

   СпрПрейскурант = СоздатьОбъект("Справочник.Прейскуранты");  
       СпрТарифы = СоздатьОбъект("Справочник.Тарифы");  
       ДокСтатКарты = СоздатьОбъект("Документ.СтатКартаПациента");
   СпрПрейскурант.НайтиПоКоду(1);
   СпрПрейскурант.НайтиПоКоду(2);  
   СпрПрейскурант.НайтиПоКоду(3);
   СпрПрейскурант.НайтиПоКоду(4);
   СпрПрейскурант.НайтиПоКоду(5);;
   СпрТарифы.ИспользоватьВладельца(СпрПрейскурант.ТекущийЭлемент());  
   

   Т = СоздатьОбъект("Таблица");
   тзПроцедуры = СоздатьОбъект("ТаблицаЗначений");
   тзПроцедуры.НоваяКолонка("Контрагент");
   тзПроцедуры.НоваяКолонка("ФИО");
   тзПроцедуры.НоваяКолонка("Цена", "Число");
   СпрТарифы.ВыбратьЭлементы();
   Пока СпрТарифы.ПолучитьЭлемент() = 1 Цикл
       Колонка = "к" + СокрЛП(СпрТарифы.Код);
       тзПроцедуры.НоваяКолонка(Колонка, "Число");
   КонецЦикла;
   //тзПроцедуры.Выгрузить(ТТТ);

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

   //Сообщить(тзПроцедуры.КоличествоКолонок());

   // формируем список колонок для свертки *************************************************************
   //тзПроцедуры.Выгрузить(ТТТ);
   СписокКолонок = "Цена";
   Для а = 4 По тзПроцедуры.КоличествоКолонок() - 3 Цикл
       СписокКолонок = СписокКолонок + "," + СокрЛП(а);
   КонецЦикла;
   тзПроцедуры.Свернуть("ФИО,Контрагент", СписокКолонок);
   тзПроцедуры.Сортировать("Контрагент,ФИО");
   //тзПроцедуры.Выгрузить(ТТТ);

   // удаляем лишние колонки без итогов
   а=4;
   Пока а <= тзПроцедуры.КоличествоКолонок() Цикл
       Если тзПроцедуры.Итог(а) = 0 Тогда
           тзПроцедуры.УдалитьКолонку(а);        //удаляем строку, но "а" не увеличиваем, т.к. следующая строка у нас и есть "а"
       Иначе
           а = а + 1;                         //увеличиваем а (для перехода на след. строку)
       КонецЕсли;
   КонецЦикла;
   //тзПроцедуры.Выгрузить(ТТТ);

   // выводим на печать ********************************************************************************
   // шапка
   Т.ВывестиСекцию("Шапка|ФИО");
   Т.ПрисоединитьСекцию("Шапка|Контрагент");
   Для а = 4 По тзПроцедуры.КоличествоКолонок() Цикл
       КодПроцедуры = тзПроцедуры.ПолучитьПараметрыКолонки(а);
       КодПроцедуры = Прав(КодПроцедуры, 6);
       СпрТарифы.НайтиПоКоду(КодПроцедуры);
       КодПроцедуры = СпрТарифы.ТекущийЭлемент().ПолноеНаименование;
       
   
   
       //Итог = тзПроцедуры.Итог(а);
       //Если Итог <> 0 Тогда
           Т.ПрисоединитьСекцию("Шапка|Процедуры");
       //КонецЕсли;

   КонецЦикла;
   Т.ПрисоединитьСекцию("Шапка|Цена");
   Т.ПрисоединитьСекцию("Шапка|ИтогоПоПациенту");

   // строки
   тзПроцедуры.ВыбратьСтроки();
   Пока тзПроцедуры.ПолучитьСтроку() = 1 Цикл
       Т.ВывестиСекцию("Строка|ФИО");
       Т.ПрисоединитьСекцию("Строка|Контрагент");

       ИтогоПоПациенту = 0;
       Для а = 4 По тзПроцедуры.КоличествоКолонок() Цикл
           Посещения = тзПроцедуры.ПолучитьЗначение(тзПроцедуры.НомерСтроки, а);
           Т.ПрисоединитьСекцию("Строка|Процедуры");
           ИтогоПоПациенту = ИтогоПоПациенту + Посещения;
       КонецЦикла;

       Т.ПрисоединитьСекцию("Строка|Цена");
       Т.ПрисоединитьСекцию("Строка|ИтогоПоПациенту");
   КонецЦикла;
   // подвал
   Т.ВывестиСекцию("Подвал|ФИО");
   Т.ПрисоединитьСекцию("Подвал|Контрагент");
   //Т.ПрисоединитьСекцию("Шапка|Контрагент");
       Для а = 4 По тзПроцедуры.КоличествоКолонок() Цикл
       ИтогоПосещений = тзПроцедуры.Итог(а);
       КодПроцедуры = тзПроцедуры.ПолучитьПараметрыКолонки(а);
       КодПроцедуры = Прав(КодПроцедуры, 6);
       СпрТарифы.НайтиПоКоду(КодПроцедуры);
     Цена =СпрТарифы.Цена.получить(НачДата);
     сумма = Цена*ИтогоПосещений;
   Т.ПрисоединитьСекцию("Подвал|Процедуры");
     ИтогоПосещений=0;
     Цена=0;
КонецЦикла;    
   Т.ПрисоединитьСекцию("Подвал|Цена");
   Т.ПрисоединитьСекцию("Подвал|ИтогоПоПациенту");

   Т.Опции(0);
   Т.Показать();
   Т.Напечатать(0);  
КонецПроцедуры"
Раскомментируйте //Сообщить(КодПроцедуры), который перед ошибкой и посмотрите чему равен КодПроцедуры.
Скорее всего этого кода нет в справочнике Тарифов, т.к. имена колонок берутся из этого справочника.
"раскомментировала... ошибка та же
000001
000002
000005
000007
000002
0000­02
000078
тзПроцедуры.УстановитьЗначение(тзПроцедуры.НомерСтроки,"к" + СокрЛП(КодПроцедуры),1);
{Отчет.ОтчетПоАвиакомпаниям12.Форма.Модуль(62)}: Неверный идентификатор колонки!

что означает 1?"
"Это все потому что справочник СпрТарифы у вас является подчиненным справочнику Прейскуранты.
Как ваш алгоритм работает?
1. Берется справочник Прейскуранты
2. Зачем то в нем делается поиск по кодам 1, 2, 3, 4, 5  элементов. Первые четыре поиска выполняются, но результат поиска никак не используется.
3. По отношению к последнему найденному элементу (с кодом 5) из справочника Прейскуранты происходит добавление в таблицу тзПроцедуры кучи колонок с идентификаторами, соответствующими кодам элементов справочника Тарифы, подчиненных элементу справочника Прейскуранты с кодом 5 (это ключевое место, которое и есть причина ошибки).
4. Далее идет перебор каких то документов вида СтатКартаПациента и значения оттуда уходят в таблицу  тзПроцедуры.
И вот теперь сами смотрите. В документе в реквизит "КодПроцедуры" занесена какая то ссылка на элемент из справочника Тарифов и она не пустая, но! Элемент, на который сделана ссылка не подчинен  элементу справочника Прейскуранты с кодом 5 (наверное тариф принадлежит другому прейскуранту?), поэтому в таблице тзПроцедуры колонка с нужным идентификатором конечно же не находится.

Если не вникать в суть алгоритма, то как решение:

СпрТарифы.ВыбратьЭлементы(); 


заменить на

СпрТарифы.ВыбратьЭлементы(0);  


но будет ли это корректным, можно судить только зная конечную цель задачи, зачем то же написано все таки

 СпрТарифы.ИспользоватьВладельца(СпрПрейскурант.ТекущийЭлемент());  



P.S.
Странная конструкция:

Если СокрЛП(Док.КодПроцедуры) = """" Тогда
    Продолжить;
КонецЕсли;


Я даже не думал что такое вообще работает. Для верности заменил бы на:

Если ПустоеЗначение(Док.КодПроцедуры) = 1 Тогда
    Продолжить;
КонецЕсли;  
"
спасибо огромное за уделенное время, за то что все разложили по полкам... очень признательна Вам! до этого у меня тоже возникали вопросы именно по этой конструкции... здесь я выложила скрины, для полного разъяснения моего вопроса, если интересно можете посмотреть, возможно я неправильно излагаю свои мысли https://buh.ru/forum/thread.jsp?id=634257
завтра посмотрю, а то у меня уже это "завтра" почти наступило, время 23:58 на часах
Читают тему
(гостей: 1)

Быстрый переход