Добавление новой строки в табличную часть. Присвоение новой строке максимального номера

Номер строки табличной части (документа) присваивается исходя из максимального номера отобранных строк.

При этом программа 1С сама так «сдвигает» номера строк (номер которых БЫЛ больше либо равен номеру только что вставленной строки), чтобы не было совпадений номеров у разных строк.

Получается, что можно вставить новую строку в середину таблицы документа, если воспользоваться отбором строк табличной части. Или даже можно вставить новую строку на первую позицию табличной части 🙂 если отбор табличной части не будет содержать каких-либо строк.

Как присвоить новой строке номер исходя из максимального номера среди всех строк в табличной части? Оказалось, что реквизит НомерСтроки доступен только для чтения даже для вновь добавляемых строк, поэтому присвоить ему какое-либо значение для новой строки не представляется возможным.

Самое простое решение (и самое неудобное пользователям) — запретить добавлять строку, если наложен отбор на табличную часть 🙂 но для пользователей это ограничение выглядит довольно искусственным (непонятным, «притянутым за уши»).

Чуть более сложное решение — вызов метода Сбросить() у коллекции ОтборСтрок у табличного поля (связанного с табличной частью). Пользователи могут добавить строку, но у них «слетит» отбор. Это нелогично и потому не оправдано.

Я решил эту задачу («присвоить новой строке номер исходя из максимального номера среди всех строк в табличной части») программным сбросом и восстановлением отбора строк в табличной части. В модуле формы (в начале текста модуля) объявил локальную переменную локСтруктураОтбора1 , в самом конце модуля (в разделе инициализации переменных формы) — её инициализировал :

локСтруктураОтбора1 = Новый Структура;

Далее написал код :

Процедура РаботыПередНачаломДобавления(Элемент, Отказ, Копирование)

// при наложенном отборе на табличную часть номер строки присваивается исходя из максимума строк в видимой области!!!
// поэтому сначала сбросим отбор, а потом восстановим его
// локСтруктураОтбора1 работает как передаточное звено между процедурами РаботыПередНачаломДобавления и РаботыПриНачалеРедактирования

ОтборСтрок1 = ЭлементыФормы.Работы.ОтборСтрок;

локСтруктураОтбора1.Очистить();
Для каждого ЭлементОтбора1 Из ОтборСтрок1 Цикл
локСтруктураОтбора1.Вставить(ЭлементОтбора1.Имя, ЭлементОтбора1.Использование);
КонецЦикла;

ОтборСтрок1.Сбросить();

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

и

Процедура РаботыПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)

// при наложенном отборе на табличную часть номер строки присваивается исходя из максимума строк в видимой области!!!
// поэтому сначала сбросим отбор, а потом восстановим его
// локСтруктураОтбора1 работает как передаточное звено между процедурами РаботыПередНачаломДобавления и РаботыПриНачалеРедактирования

ОтборСтрок1 = ЭлементыФормы.Работы.ОтборСтрок;

Для каждого ЭлементОтбора1 Из локСтруктураОтбора1 Цикл
ОтборСтрок1[ЭлементОтбора1.Ключ].Использование = ЭлементОтбора1.Значение;
КонецЦикла;
локСтруктураОтбора1.Очистить();

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

Вся эта «кухня» интересна лишь тем программистам, которые не хотят, чтобы пользователи своими действиями меняли номера существующих строк в табличных частях документов/справочников в определенных ситуациях. А это, в свою очередь, встречается тогда, когда номер строки пишется в какой-нибудь регистр сведений или ещё куда-то (т.е. номер строки используется как ссылка на конкретную строку документа).

Толстый клиент — обычное приложение.

1С:Предприятие 8.2 (8.2.19.83)
Режим совместимости 1С 8.1

MS SQL Server одной из последних версий (чуть позже уточню, какой именно)

Запись опубликована в рубрике Дележка опытом с метками , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.