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