Имя: Пароль:
1C
1С v8
Ошибки в 1С платформе 8.3.14.1630 управляемое приложение
,
0 koshka1967
 
14.03.19
07:52
Если в любой конфигурации(в т.ч.самописной) в обработке создается табличная часть и в ней,если мы загрузили данные в нее, то при удалении этих данных методами Очистить() или Удалить(индекс)производится неправильный расчет индексов данных этой табличной части.Когда удаления или после полной очистки табличной части добавляются новые данные (методом Добавить()), то они имеют несуществующий индекс(он просто плюсуется).В табличной части имеется только одна строка, а индекс имеет значение > 1.При первичной загрузке данных методом Загрузить() такого нет.
Текст обработки для управляемого приложения:
&НаКлиенте
Процедура КомандаУдалитьВсе(Команда)
    ЭтаФорма.Объект.ТабличнаяЧасть1.Очистить();
КонецПроцедуры
&НаКлиенте
Процедура КомандаУдалить(Команда)
    Для i=0 по ЭтаФорма.Объект.ТабличнаяЧасть1.Количество()-1  Цикл
        ЭтаФорма.Объект.ТабличнаяЧасть1.Удалить(0);
    КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура КомандаЗаполнить(Команда)
    Стр = ЭтаФорма.Объект.ТабличнаяЧасть1.Добавить();
    Стр.ЗначСтрока = "1 строка";    
    Стр = ЭтаФорма.Объект.ТабличнаяЧасть1.Добавить();
    Стр.ЗначСтрока = "2 строка";
    Стр = ЭтаФорма.Объект.ТабличнаяЧасть1.Добавить();
    Стр.ЗначСтрока = "3 строка";
    Стр = ЭтаФорма.Объект.ТабличнаяЧасть1.Добавить();
    Стр.ЗначСтрока = "4 строка";
    Стр = ЭтаФорма.Объект.ТабличнаяЧасть1.Добавить();
    Стр.ЗначСтрока = "5 строка";
//либо использовать метод  ЭтаФорма.Объект.ТабличнаяЧасть1.Загрузить(ПеремТаблицаЗначений);
КонецПроцедуры
&НаКлиенте
Процедура КомандаИндекс(Команда)
    ВрИндекс = ЭтаФорма.Элементы.ТабличнаяЧасть1.ТекущаяСтрока;
    сообщить("Текущий индекс="+Строка(ВрИндекс));
    сообщить("Значение 1 строки="+ЭтаФорма.Объект.ТабличнаяЧасть1.Получить(0).ЗначСтрока);
    сообщить("Значение текущей строки=ошибка");
    сообщить(ЭтаФорма.Объект.ТабличнаяЧасть1.Получить(ВрИндекс).ЗначСтрока);
КонецПроцедуры
1 catena
 
14.03.19
08:28
А почему вы решили, что текущая строка таблицы на форме вернет индекс табличной части?
2 SilentMan
 
14.03.19
09:22
(0) Абсолютно нормальное поведение. Индекс - это не номер. Есть метод получения строки по индексу.
3 d4rkmesa
 
14.03.19
09:26
(0) Это нормально. Во типовых обычно есть функция получения максимального индекса таблицы формы.
4 d4rkmesa
 
14.03.19
09:32
(3) К примеру, таким образом:
МаксимальныйИдентификатор = Объект.ТабличнаяЧасть1.Получить(Объект.ТабличнаяЧасть1.Количество() - 1).ПолучитьИдентификатор()
5 Smile 8D
 
14.03.19
09:51
(0) Это нормальное поведение системы и появилось оно задолго до 8.3. Нужно просто понять, что есть два отдельных понятия "Номер строки" и "Идентификатор строки". Соответственно, почитать чем они отличаются, в каком случае что следует использовать.
6 koshka1967
 
14.03.19
11:31
А Вы проверяли обработку на попытку удаления строки и добавления новой строки? И как обратиться к строке как не по ее индексу, а не по идентификатору.А индекс строки  формируется по ее номеру.
7 craxx
 
14.03.19
11:32
(0) Это штатное поведение.
8 sqr4
 
14.03.19
11:33
(6) пишите в 1с, пусть исправляют)
9 sieben
 
14.03.19
11:45
(4) Ужас-то какой...
Сам-то пробовал? Ну там, строку ввести/удалить, вверх/вниз поперемещать?
10 d4rkmesa
 
14.03.19
12:04
(9) Зависит от задачи, если требуется определить макс. идентификатор до интерактивных пользовательских действий, то норм.
11 sieben
 
14.03.19
12:11
(10) То есть разные программные .Вставить, .Сортировать и прочие .Сдвинуть ты в принципе не рассматриваешь. Ну ок. Сопровождающие твой код поставят тебе памятник.
12 catena
 
14.03.19
12:21
(6)Все потому, что ТекущаяСтрока возвращает Индентификатор, по нему и надо связываться.
Объект.ТабличнаяЧасть1.НайтиПоИдентификатору(Элементы.ТабличнаяЧасть1.ТекущаяСтрока)


ТаблицаФормы (FormTable)
ТекущаяСтрока (CurrentRow)
Использование:

Чтение и запись.
Описание:

Тип: Произвольный.
Идентификатор текущей строки таблицы.
13 d4rkmesa
 
14.03.19
12:24
(11) Еще раз, для недостаточно сообразительных. Если все что ты перечислил не используется, то оно не нужно. Ибо нефиг плодить сущности.
14 koshka1967
 
14.03.19
16:29
1.Метод ЭтаФорма.Элементы.ТабличнаяЧасть1.ТекущаяСтрока возвращает индекс текущей строки, а не идентификатор.
2.Метод Объект.ТабличнаяЧасть1.НайтиПоИдентификатору(Элементы.ТабличнаяЧасть1.ТекущаяСтрока) возвращает ДанныеФормыЭлементКоллекции, а мне нужно индекс, т.к.Метод ЭтаФорма.Объект.ТабличнаяЧасть1.Удалить(ИндексТекущейСтроки) удаляет строку по индексу, а если не удалять то и индексы методом ЭтаФорма.Элементы.ТабличнаяЧасть1.ТекущаяСтрока считаются правильно. А при удалении они не пересчитываются.
15 Garykom
 
гуру
14.03.19
17:02
Мне вот интересно как много еще "программистов 1С" не понимают что "Объект" и элементы на "Управляемой форме" это в тонком клиенте очень-очень разная штука?
16 Garykom
 
гуру
14.03.19
17:03
ЭтаФорма.Элементы.ТабличнаяЧасть1 vs ЭтаФорма.Объект.ТабличнаяЧасть1

юмористы
17 sqr4
 
14.03.19
17:04
(15) у них даже окошки разные, один справа а другие слева)
18 sieben
 
14.03.19
17:12
(15) "Ибо нефиг плодить сущности" (c) d4rkmesa
(:
19 Garykom
 
гуру
14.03.19
17:17
(18) Клиент-сервер полноценные заставляют плодить.
1С УФ это трехзвенка очень похожая на веб.
Страничка в браузере на html/js + серверная часть на чем то (php, nodejs и т.д.) + sql база на sql сервере
20 ssh2006
 
14.03.19
17:19
(0) всего то надо почитать документацию
21 sieben
 
14.03.19
19:34
(19) "Еще раз, для недостаточно сообразительных. Если все что ты перечислил не используется, то оно не нужно." (c) d4rkmesa
(:
22 d4rkmesa
 
14.03.19
20:13
(16) Допустим, нужно и то, и другое, идентификатор строки - единственное, посредством чего можно соотнести одно с другим.
(21) Хочешь еще поржать? Держи:

Процедура ПолеПоискаОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
    
    Если Не ЗначениеЗаполнено(Текст) Тогда
        Возврат
    КонецЕсли;
    
    ТекущийИдСтроки = ?(Элементы.ТаблицаДокументы.ТекущаяСтрока = Неопределено, 0, Элементы.ТаблицаДокументы.ТекущаяСтрока);
    МаксимальныйИдентификатор = Объект.ОбрабатываемыеДокументы.Получить(Объект.ОбрабатываемыеДокументы.Количество() - 1).ПолучитьИдентификатор();
    
    ПоискНеСНачала = (ТекущийИдСтроки <> 0);
    
    НайденныйИд = Неопределено;
    
    Для ид = ?(ПоискНеСНачала, ТекущийИдСтроки + 1, ТекущийИдСтроки) По МаксимальныйИдентификатор Цикл
        
        ТекСтр = Объект.ОбрабатываемыеДокументы.НайтиПоИдентификатору(ид);
        
        Если ТекСтр = Неопределено Тогда
            Продолжить
        КонецЕсли;        
        
        Если Найти(ТекСтр.Ссылка, Текст) > 0
            ИЛИ Найти(ТекСтр.Комментарий, Текст) > 0 Тогда
            
            НайденныйИд = ид;
            Прервать
            
        КонецЕсли;        
            
        Если ПоискНеСНачала И (ид = МаксимальныйИдентификатор) Тогда
            
            ПоказатьВопрос(Новый ОписаниеОповещения("ПовторитьПоискСНачала", ЭтаФорма), "Достигнута последняя строка, повторить поиск с начала?", РежимДиалогаВопрос.ДаНет);
            Возврат
            
        КонецЕсли;
        
    КонецЦикла;
    
    Если ЗначениеЗаполнено(НайденныйИд) Тогда
        Элементы.ТаблицаДокументы.ТекущаяСтрока = НайденныйИд;
    Иначе
        ПоказатьПредупреждение(,СтрШаблон("Строка ""%1"" не найдена!", Элементы.ПолеПоиска.ТекстРедактирования));
    КонецЕсли;
    
КонецПроцедуры
23 Новиков
 
14.03.19
20:39
(22) и что делает это дерьмо?
24 catena
 
15.03.19
05:15
(14)СП врет, наверное.

ТаблицаФормы (FormTable)
ТекущаяСтрока (CurrentRow)
Использование:

Чтение и запись.
Описание:

Тип: Произвольный.
Идентификатор текущей строки таблицы.


СП вообще полезная штука:

ДанныеФормыСтруктураСКоллекцией (FormDataStructureAndCollection)
Индекс (IndexOf)
Синтаксис:

Индекс(<Элемент>)
Параметры:

<Элемент> (необязательный)

Тип: ДанныеФормыЭлементКоллекции.
Элемент коллекции, индекс которого требуется получить.
25 Filippov
 
15.03.19
08:25
(0) Только зарегистрировался - и сразу же 3 ошибки 1С. То ли ещё будет?
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший