Выгоды от использования механизма вспомогательных таблиц.
Данный механизм дает выигрыш в при частых доработках системы, благодаря предложенной мной системе возможно быстро и удобно "нарисовать" любую таблицу, сохранить ее в системе. Далее использовать таблицу как "сырую" таблицу значений, так и преобразовать в более удобную форму для работы с помощью встроенных функций. Таблица сохраняется с поддержкой ссылочной целостности, что не приведет к битым ссылкам, при попытке удаления используемых элементов. При внедрении данного механизма в вашу систему больше не возникнет таких вопросов:
- Как будем получать ссылку на элемент ("Организацию", "Валюту", "Номенклатуру", "Склад" и т.д.)?
- Где будем хранить настройки для новой обработки, чтобы они были общими для всех?
- Где будем хранить маппинг?
- Где будем хранить начальные настройки заполнения?
- и множество других вопросов, которые неизбежно возникают при разработке.
Любой из вопросов можно решить буквально за 5 минут (не учтено время ввода информации и проектирование структуры таблицы). Необходимо 3 шага:
- Создать новый элемент вспомогательной таблицы (далее ВСПТ).
- Заполнить структуру колонок.
- Заполнить созданную таблицу.
Техническая информация.
- Протестировано на платформе 8.3.13.1513.
- Не зависит от конфигурации.
Быстрый старт!
Так как данный механизм призван сохранить время при реализации рутинных операций, то не буду долго и старательно описывать каждую команду (это будет сделано ниже), а постараюсь акцентировать внимание на основных моментах с которыми часто приходится сталкиваться в работе, чтобы уже сейчас вы могли начать использование, а уже потом при желании прочесть более подробную информацию.
Пример #1
Условия задачи.
Необходимо хранить константные значения системы как соответствие "Ключ" -> "Значение".
Решение.
Необходимо создать 2 колонки, одна должна быть с типом строка, вторая позволять выбрать любой тип. Так же желательно константы разбить по группам к примеру "Организации", "Контрагенты", "Склады", "Валюты" и т.д.
Реализация.
1. Создание нового элемента
2. Заполнение структуры колонок и применение изменений
3. Заполнение созданной таблицы
Примечание.
Если предполагается ввод в колонку определенного типа данных, удобно выбрать тип колонки. Например в нашем примере можно сразу ограничить тип колонок "Класс" и "Имя". Для колонки "Значение" не ограничиваем тип, так как константам могут соответствовать различные значения (не забываем применять изменения).
Данные мы сохранили, но теперь как-то необходимо их использовать. Для этого в модуле менеджера ВСПТ предусмотрены функции, которые позволяют извлекать данные в удобном для нас виде.
В данной задаче можно использовать следующий код
менВспТаблицы = Справочники.XLY_ВспомогательныеТаблицы;
ВспТаблицаКонстантныеЗначения = менВспТаблицы.ПолучитьСсылкуПоИдентификатору("КонстантныеЗначенияСистемы");
Если ВспТаблицаКонстантныеЗначения.Пустая() Тогда
Возврат;
КонецЕсли;
ИменаИтогов = "Класс"; //Группирует по значениям колонки "Класс"
ИмяКолонкиКлючаДетЗаписей = "Имя"; //Ключ в конечном соответствии
ИмяКолонкиЗначенийДетЗаписей = "Значение"; //Значение в конечном соответствии
ПовторноеИспользование = Ложь; //Всп. таблица будет формироваться при каждом вызове
соотКонстантныеЗначенияСистемы = менВспТаблицы.СформироватьСоответствиеРазделовПоВспомогательнойТаблице(ИменаИтогов,
ВспТаблицаКонстантныеЗначения,
ИмяКолонкиКлючаДетЗаписей,
ИмяКолонкиЗначенийДетЗаписей,
ПовторноеИспользование);
Результатом работы кода будет вложенное соответствие следующего вида:
Для удобства получения значения из вложенных соответствий можно воспользоваться функцией модуля менеджера:
менВспТаблицы = Справочники.XLY_ВспомогательныеТаблицы;
ВспТаблицаКонстантныеЗначения = менВспТаблицы.ПолучитьСсылкуПоИдентификатору("КонстантныеЗначенияСистемы");
Если ВспТаблицаКонстантныеЗначения.Пустая() Тогда
Возврат;
КонецЕсли;
ИменаИтогов = "Класс"; //Группирует по значениям колонки "Класс"
ИмяКолонкиКлючаДетЗаписей = "Имя"; //Ключ в конечном соответствии
ИмяКолонкиЗначенийДетЗаписей = "Значение"; //Значение в конечном соответствии
ПовторноеИспользование = Ложь; //Всп. таблица будет формироваться при каждом вызове
соотКонстантныеЗначенияСистемы = менВспТаблицы.СформироватьСоответствиеРазделовПоВспомогательнойТаблице(ИменаИтогов,
ВспТаблицаКонстантныеЗначения,
ИмяКолонкиКлючаДетЗаписей,
ИмяКолонкиЗначенийДетЗаписей,
ПовторноеИспользование);
//Извлечение данных из сформированного соответствия
ТекстОшибки = ""; //если значение будет равно Неопределено, в переменную устанавливается текст ошибки
ПутьКЗначению = "Организации.Основная"; //указывается путь по которму необходимо получить значение
ОсновнаяОрганизация = менВспТаблицы.ПолучитьЗначениеИзСоответствия(ПутьКЗначению, соотКонстантныеЗначенияСистемы, ТекстОшибки);
Результат работы функции:
Для наглядности несколько изменим пример:
Добавим новую колонку, в пределах значений новой колонки необходимо формировать группировку соответствия
Код изменится следующим образом:
Изменения произошли в значении переменной "ИменаИтогов".
менВспТаблицы = Справочники.XLY_ВспомогательныеТаблицы;
ВспТаблицаКонстантныеЗначения = менВспТаблицы.ПолучитьСсылкуПоИдентификатору("КонстантныеЗначенияСистемы");
Если ВспТаблицаКонстантныеЗначения.Пустая() Тогда
Возврат;
КонецЕсли;
ИменаИтогов = "Раздел,Класс"; //Группирует по значениям колонки "Раздел и Класс"
ИмяКолонкиКлючаДетЗаписей = "Имя"; //Ключ в конечном соответствии
ИмяКолонкиЗначенийДетЗаписей = "Значение"; //Значение в конечном соответствии
ПовторноеИспользование = Ложь; //Всп. таблица будет формироваться при каждом вызове
соотКонстантныеЗначенияСистемы = менВспТаблицы.СформироватьСоответствиеРазделовПоВспомогательнойТаблице(ИменаИтогов,
ВспТаблицаКонстантныеЗначения,
ИмяКолонкиКлючаДетЗаписей,
ИмяКолонкиЗначенийДетЗаписей,
ПовторноеИспользование);
Результат работы
Таким образом можно создавать соответствия различной вложенности.
Пример #2
Условия задачи.
Реализовать заполнение по умолчанию для нового элемента справочника.
Решение.
Создадим новую таблицу с колонками "Ключ", "Значение", получить структуру, заполнить новый объект.
Реализация.
Создадим отдельную таблицу для заполнения договоров
Примечание. Так же можно создать один элемент, разбить на группы и использовать для заполнения различных объектов или создать различные алгоритмы заполнения. (см. пример #1.)
менВспТаблицы = Справочники.XLY_ВспомогательныеТаблицы;
ВспТаблицаКонстантныеЗначения = менВспТаблицы.ПолучитьСсылкуПоИдентификатору("ЗаполнениеНовогоДоговора");
Если ВспТаблицаКонстантныеЗначения.Пустая() Тогда
Возврат;
КонецЕсли;
ИмяКолонкиКлюча = "Ключ"; //Значения колонки будут помещены в ключ коллекции
ИмяКолонкиЗначения = "Значение"; //Значения колонки будут помещены в значение коллекции
ФормироватьСтруктуру = Истина; //Возвращаемое значение будет иметь тип "Структура"
СтруктураЗаполнения = менВспТаблицы.ПолучитьКоллекциюКлючЗначениеИзСохраненнойТаблицы(ВспТаблицаКонстантныеЗначения,
ИмяКолонкиКлюча,
ИмяКолонкиЗначения,
ФормироватьСтруктуру);
НовыйДоговор = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
ЗаполнитьЗначенияСвойств(НовыйДоговор, СтруктураЗаполнения);
Результат:
На выходе получается коллекция типа "Структура"
Результат заполнения нового объекта:
Пример #3
Условия задачи.
Если склад присутствует в списке, тогда разрешать отгрузку.
Решение.
Создадим таблицу с колонками "Ключ", "Значение". Для значения разрешим сохранение списка значений.
Реализация.
При выборе типа ячейки указываем, что значение хранит список значений
Примечание. Так же можно вызвать контекстное меню для ячейки, чтобы включить или отключить список значений.
Результат заполнения таблицы:
менВспТаблицы = Справочники.XLY_ВспомогательныеТаблицы;
ВспТаблицаКонстантныеЗначения = менВспТаблицы.ПолучитьСсылкуПоИдентификатору("ПроверкаЭлементов");
Если ВспТаблицаКонстантныеЗначения.Пустая() Тогда
Возврат;
КонецЕсли;
ИмяКолонкиКлюча = "Ключ"; //Значения колонки будут помещены в ключ коллекции
ИмяКолонкиЗначения = "Значение"; //Значения колонки будут помещены в значение коллекции
ФормироватьСтруктуру = Истина; //Возвращаемое значение будет иметь тип "Структура"
СтруктураЗаполнения = менВспТаблицы.ПолучитьКоллекциюКлючЗначениеИзСохраненнойТаблицы(ВспТаблицаКонстантныеЗначения,
ИмяКолонкиКлюча,
ИмяКолонкиЗначения,
ФормироватьСтруктуру);
Результат работы кода:
Одному ключу соответствует несколько значений
Описание функциональности.
Данный раздел находится в разработке. По мере возможности буду добавлять описание функционала.
Важно!
- Большинство функций по извлечению значений из всп. таблиц уже реализованы в модуле менеджера, см. область "Получение_данных".
- При обнаружении ошибок большая просьба сообщать, по мере возможности буду устранять.
- Если вы находитесь в ситуации, когда не знаете какую функцию применить, для реализации своей задачи, так же можете связаться со мной по почте, постараюсь ответить.