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