суббота, 21 июня 2014 г.

Быдло-1С. Интерактивная работа пользователя с таблицами.

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


Итого будет выглядеть как-то так:


Теперь о реализации.
В первой процедуре, где происходит запрос, выгружаем запрос в таблицу, копируем её (чтоб не парится с созданием колонок, и вообще), и очищаем. Итого имеем две одинаковые по структуре таблицы, но одну с данными, а другую – нет. Таблицы выводим в форму, в табличные поля.
                ТаблицаИсходняя      = Запрос.Выполнить().Выгрузить();//выгружаем в таблицу данные запроса
                ТаблицаНаУдаление = ТаблицаИсходняя.Скопировать();
                ТаблицаНаУдаление.Очистить();

                ТабличноеПоле         = ТаблицаИсходняя;
                ТабличноеПоле1       = ТаблицаНаУдаление;

                ЭлементыФормы.ТабличноеПоле.СоздатьКолонки();//вывели таблицу в форму в поле ТабличноеПоле

Ах да, не забываем вынести в глобальные переменные следующие вещи:

Перем ЗапомнитьСтроку; //расскажу ниже
Перем ЗапомнитьСтроку2; //расскажу ниже
Перем ТаблицаИсходняя; //таблица из запроса
Перем ТаблицаНаУдаление;//таблица, которую «создал» пользователь
Теперь идем в табличные поля и находим там событие «ПриАктивизацииСтроки» (см. рисунок)


В эту процедуру идет следующее:
                ТекущаяСтрока = ЭлементыФормы.ТабличноеПоле.ТекущаяСтрока;
               
                Если ТекущаяСтрока <> Неопределено Тогда //данное условие сделано для того, чтобы в случае пустой строки переменная ЗапомнитьСтроку имела тип «Неопределенно», а не «ошибка чтения значения»
                               ЗапомнитьСтроку = ТекущаяСтрока;
                Иначе
                               ЗапомнитьСтроку = Неопределено; //переменная ЗапомнитьСтроку будет перекидываться в другую таблицу
                КонецЕсли;

Ну и теперь, соответственно, событие на нажатие кнопки переноса:
Если ЗапомнитьСтроку <> Неопределено Тогда
                СтрокаТаблицыНаУдаление = ТаблицаНаУдаление.Добавить();
                ЗаполнитьЗначенияСвойств(СтрокаТаблицыНаУдаление, ЗапомнитьСтроку);//первый параметр – как можно догадаться, строка-приёмник, второй параметр – строка таблицы источника
                ТаблицаИсходняя.Удалить(ЗапомнитьСтроку);
                ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки();
                ЭлементыФормы.ТабличноеПоле.СоздатьКолонки();
                КонецЕсли;
Дальше я затупил и с кнопкой обратного переноса сделал точно такие же процедуры (ТабличноеПоле1ПриАктивизацииСтроки и Кнопка1 нажатие). Так как у меня выплыл какой-то косяк, то добавил переменную ЗапомнитьСтроку2.

Такие дела. Мысли вслух (но мне лениво их проверять) – полюбас можно избавится от переменной ЗапомнитьСтроку2, и, скорее всего, не обязательно при каждой итерации заново создавать на форме ТабличноеПоле и ТабличноеПоле1. Но мне лень думать.

Воюйте с 1с и побеждайте, а я пошел дальше эникеить.

P.S. Раскрашивать буковки - та еще морока.